loom-kernel 2.13.0__tar.gz → 2.15.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/CHANGELOG.md +93 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/PKG-INFO +2 -2
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/pyproject.toml +1 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/__init__.py +4 -0
- loom_kernel-2.15.0/src/loom/ai/_paths.py +33 -0
- loom_kernel-2.15.0/src/loom/ai/bootstrap.py +120 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/_compiler.py +4 -0
- loom_kernel-2.15.0/src/loom/ai/compiler/_fingerprint.py +70 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/_plan.py +20 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_capabilities.py +5 -10
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/config.py +6 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/__init__.py +30 -6
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_limits.py +68 -15
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/provider.py +47 -6
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/errors.py +17 -2
- loom_kernel-2.15.0/src/loom/ai/etl/__init__.py +41 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_batch.py +98 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_columns.py +139 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_frames.py +169 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_ledger.py +61 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_runner.py +179 -0
- loom_kernel-2.15.0/src/loom/ai/etl/_validation.py +123 -0
- loom_kernel-2.15.0/src/loom/ai/pricing.py +77 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/registry.py +23 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_lifecycle.py +5 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/errors/codes.py +1 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/__init__.py +7 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/__init__.py +2 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_binding.py +22 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_compiler.py +36 -7
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_errors.py +66 -9
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_plan.py +20 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators.py +5 -1
- loom_kernel-2.15.0/src/loom/etl/compiler/_validators_agents.py +76 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_step.py +46 -13
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/__init__.py +2 -0
- loom_kernel-2.15.0/src/loom/etl/declarative/_with_agent.py +70 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/executor/__init__.py +2 -0
- loom_kernel-2.15.0/src/loom/etl/executor/_agents.py +58 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/executor/_executor.py +29 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step.py +17 -6
- loom_kernel-2.15.0/src/loom/etl/runner/_agents.py +51 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/_wiring.py +72 -3
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/config_loader.py +17 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/core.py +27 -3
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/__init__.py +12 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/contracts.py +95 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/auth/__init__.py +2 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/auth/abc.py +39 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/auth/middleware.py +46 -7
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/errors.py +22 -16
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/_errors.py +1 -1
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/auto.py +13 -40
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/.gitignore +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/LICENSE +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/README.md +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/cli/app.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/cli/schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/locator.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/_loom_type.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/symbols.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/transaction.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/py.typed +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-2.13.0 → loom_kernel-2.15.0}/src/loom/testing/runner.py +0 -0
|
@@ -137,9 +137,55 @@
|
|
|
137
137
|
library produced the answer, the hook payload, `/agents/{name}/run`, the
|
|
138
138
|
SSE `final` frame and the A2A output artifact all carry it as plain JSON
|
|
139
139
|
builtins, built from the plan's `LoomType`.
|
|
140
|
+
- **ai:** `ai.prices` declares model prices in USD per million tokens
|
|
141
|
+
(`input`, `output`, optional `cache_read`/`cache_write`, `source`,
|
|
142
|
+
`as_of`), keyed by the vendor model id (`loom.ai.ModelPrice`). The
|
|
143
|
+
compiler carries the bound model's price on the plan (`AgentPlan.price`)
|
|
144
|
+
and the pydantic-ai engine prices every response with it before
|
|
145
|
+
genai-prices, so `AgentUsage.cost`, `policies.max_usd` and
|
|
146
|
+
`on_unpriced_spend: refuse` work for a model the catalogue does not know
|
|
147
|
+
(a Bedrock inference profile such as `eu.anthropic.claude-haiku-5-5`):
|
|
148
|
+
`refuse` no longer fails after paying, and `serve` enforces the cap. The
|
|
149
|
+
start-up notice is skipped for a priced model. Engines may expose a
|
|
150
|
+
`prices_model(target)` oracle, read with
|
|
151
|
+
`loom.ai.registry.engine_prices_model`.
|
|
152
|
+
- **ai:** `loom.ai.build_agent_runtime(config, *, root, names=None, ...)`
|
|
153
|
+
assembles an unentered `AgentRuntime` from an `ai:` section: engine,
|
|
154
|
+
artifacts under `root`, compilation. `create_app` now builds its runtime
|
|
155
|
+
through it. `AgentRuntime.plans` exposes the compiled plans.
|
|
156
|
+
- **ai:** `AgentPlan.fingerprint`, a stable sha256 of what decides an
|
|
157
|
+
agent's answers: compiled instructions, output schema, output check (by
|
|
158
|
+
import path), policies, `spec_version`, the kind and name of every
|
|
159
|
+
capability and the bound provider, model, `output_mode` and `options`; not
|
|
160
|
+
the name, metadata, price, where a capability is served from, region,
|
|
161
|
+
endpoint, credentials or `streaming`.
|
|
162
|
+
- **ai:** `loom.ai.etl.PolarsAgentRunner` runs an agent over a Polars frame
|
|
163
|
+
for ETL steps (see `etl`): a runtime of its own per call that also sees the
|
|
164
|
+
caller's context variables, concurrency that waits instead of refusing, one
|
|
165
|
+
output row per input row with errors as rows (an unexpected exception is an
|
|
166
|
+
`UNEXPECTED_ERROR` row, never an aborted batch, and an answer value its
|
|
167
|
+
column cannot hold an `OUTPUT_UNREPRESENTABLE` row that keeps its cost),
|
|
168
|
+
answer columns typed by the declared output (`date` as `Date`, `datetime`
|
|
169
|
+
as UTC `Datetime`, `Decimal` as `Decimal(38, 9)`, string choices as
|
|
170
|
+
`String`, ...) even for a batch
|
|
171
|
+
without rows or with errors only, tokens, cost and version per row, and a
|
|
172
|
+
budget per call that reserves `policies.max_usd` per run and is exceeded
|
|
173
|
+
only by the elastic excess of the last response of each run in flight (at
|
|
174
|
+
most `max_concurrent_runs` responses); a budget without `policies.max_usd`
|
|
175
|
+
raises `ValueError`. A frame without rows compiles nothing; `validate` and
|
|
176
|
+
`version` compile each agent once per runner, and each `map` recompiles it
|
|
177
|
+
and leaves that compilation for `version`, so `version` always equals the
|
|
178
|
+
`agent_version` the last `map` wrote.
|
|
140
179
|
|
|
141
180
|
### rest
|
|
142
181
|
|
|
182
|
+
- **rest:** a single `RuleViolation(field, message)` now answers its `field`.
|
|
183
|
+
`HttpErrorMapper` dropped it, so two `rule_violation` 422s could only be
|
|
184
|
+
told apart by their message text. The body adds `field` (`ErrorField.FIELD`,
|
|
185
|
+
the key each `violations` item of `RuleViolations` already carries) next to
|
|
186
|
+
the unchanged `code`, `message` and `trace_id`; the status stays `422`. This
|
|
187
|
+
includes the SQL endpoint's 422s, whose `field` is `sql` or `body`. Every
|
|
188
|
+
other error body is unchanged.
|
|
143
189
|
- **rest:** a strict `pydantic.BaseModel` result, a `list` of them or an
|
|
144
190
|
envelope holding one now renders directly on a REST route, through
|
|
145
191
|
`MsgspecJSONResponse`'s `enc_hook`, and documents in OpenAPI
|
|
@@ -204,6 +250,34 @@
|
|
|
204
250
|
may quote the value. `ETLRunner`, `ETLRunner.from_config` and `ETLExecutor` take
|
|
205
251
|
`config_context=`; `PolarsStepRunner` and `SparkStepRunner` take
|
|
206
252
|
`with_config(mapping)` for fake values in tests.
|
|
253
|
+
- **etl:** a step may map rows through an agent of the runner's `ai:`
|
|
254
|
+
section. `WithAgent("seller_reply", output=SellerReply, max_usd=None)`
|
|
255
|
+
declared as a class attribute is passed to `execute()` as an `AgentMapper`
|
|
256
|
+
whose `map(frame, keys=..., prompt=...)` returns, per input row, the keys,
|
|
257
|
+
the fields of `output` and `agent_version`, `agent_status`, `agent_error`,
|
|
258
|
+
`agent_input_tokens`, `agent_output_tokens`, `agent_cache_read_tokens`,
|
|
259
|
+
`agent_cache_write_tokens` and `agent_cost_usd`; `version` is the agent's
|
|
260
|
+
fingerprint, for the anti-join. A failed run is an error row; with
|
|
261
|
+
`max_usd`, the rows past the budget come back as `BUDGET_EXHAUSTED`
|
|
262
|
+
unsent; a step budget needs `policies.max_usd` on the artifact and room for
|
|
263
|
+
one run's `policies.max_usd`, and is overshot only by the elastic excess of
|
|
264
|
+
the last response of each run in flight (at most `max_concurrent_runs`
|
|
265
|
+
responses). `ETLRunner.from_yaml`
|
|
266
|
+
resolves `ai.specs` against `ai.root`, a path relative to the YAML's
|
|
267
|
+
directory (the directory itself when absent), so a config kept in a
|
|
268
|
+
subfolder reaches artifacts elsewhere in the repository while no glob may
|
|
269
|
+
leave that root, and loads `loom.ai.etl` by module path only when `ai:` is
|
|
270
|
+
present and the engine is Polars: `loom.etl` never imports `loom.ai`.
|
|
271
|
+
`ETLRunner.run` validates every declaration through the new
|
|
272
|
+
`AgentBatchRunner` port before any step runs, with new codes
|
|
273
|
+
`AGENT_NOT_FOUND`, `AGENT_COMPILATION_FAILED`, `AGENT_OUTPUT_MISMATCH`,
|
|
274
|
+
`AGENT_UNPRICED_BUDGET`, `AGENT_BUDGET_UNENFORCEABLE` (a step budget with
|
|
275
|
+
no `policies.max_usd`, or below it),
|
|
276
|
+
`AGENT_COLUMN_COLLISION` (an output field named like an `agent_*` column)
|
|
277
|
+
and `AGENT_UNSUPPORTED_ENGINE` (a Spark runner); the shape reuses
|
|
278
|
+
`MISSING_CONFIG_PARAMS`, `CONFIG_ALIAS_CONFLICT` and
|
|
279
|
+
`UNSUPPORTED_CONFIG_VALUE`. `ETLRunner`, `ETLRunner.from_config`,
|
|
280
|
+
`ETLCompiler` and `ETLExecutor` take `agents=`. Polars only.
|
|
207
281
|
|
|
208
282
|
## ⚠ Behaviour changes
|
|
209
283
|
|
|
@@ -220,6 +294,12 @@
|
|
|
220
294
|
|
|
221
295
|
### ai
|
|
222
296
|
|
|
297
|
+
- **ai:** `load_specs`, and so `ai.specs`, refuses a glob that leaves the
|
|
298
|
+
root it resolves against — a `..` segment, an absolute pattern or a match
|
|
299
|
+
that resolves outside the root through a symlink — with
|
|
300
|
+
`AGENT_SPECS_ESCAPE_ROOT`, before reading any artifact. A deployment whose
|
|
301
|
+
`ai.specs` climbs out of the application root with `..` must move its
|
|
302
|
+
artifacts under it. Absolute patterns already failed.
|
|
223
303
|
- **ai:** `CompiledOutput.decoder` and `StateShape.decoder` are gone,
|
|
224
304
|
replaced by `loom_type: LoomType` (`LoomType | None` on `StateShape`); a
|
|
225
305
|
reader of either field must move to `loom_type.type` / `.decode_json()` /
|
|
@@ -363,6 +443,19 @@
|
|
|
363
443
|
capability does not recover yet; see "A session that died after it opened is
|
|
364
444
|
replaced by the next call" in `docs/ai/mcp.md`.
|
|
365
445
|
|
|
446
|
+
### rest
|
|
447
|
+
|
|
448
|
+
- **rest:** an authenticator can report an outage instead of answering `500`.
|
|
449
|
+
An exception raised inside `AuthenticationMiddleware` never reached
|
|
450
|
+
Starlette's exception handlers, so a custom authenticator whose identity
|
|
451
|
+
provider was unreachable answered a bare `500`. An authenticator now raises
|
|
452
|
+
`loom.rest.auth.AuthenticationUnavailable` and the request answers `503`
|
|
453
|
+
with the standard error body (`code: service_unavailable`, a fixed message,
|
|
454
|
+
`trace_id`) and no `WWW-Authenticate` challenge; the exception's message
|
|
455
|
+
and cause are logged at `WARNING`, never sent. `ErrorCode` gains
|
|
456
|
+
`SERVICE_UNAVAILABLE`, which `HttpErrorMapper` maps to `503`. Any other
|
|
457
|
+
exception from the authenticator, and the `401` refusal, are unchanged.
|
|
458
|
+
|
|
366
459
|
## ♻️ Refactor
|
|
367
460
|
|
|
368
461
|
### etl
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: loom-kernel
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.15.0
|
|
4
4
|
Summary: Loom Python project
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -16,7 +16,7 @@ Requires-Dist: msgspec<1.0,>=0.18
|
|
|
16
16
|
Requires-Dist: omegaconf<3.0,>=2.3
|
|
17
17
|
Requires-Dist: opentelemetry-api<2.0,>=1.27
|
|
18
18
|
Requires-Dist: prometheus-client>=0.20
|
|
19
|
-
Requires-Dist: structlog<
|
|
19
|
+
Requires-Dist: structlog<27.0,>=24.4
|
|
20
20
|
Requires-Dist: typing-extensions>=4.12
|
|
21
21
|
Provides-Extra: ai-a2a
|
|
22
22
|
Requires-Dist: a2a-sdk<2,>=1.1; extra == 'ai-a2a'
|
|
@@ -43,6 +43,7 @@ from loom.ai.abc import (
|
|
|
43
43
|
ToolsetContext,
|
|
44
44
|
ToolsetFactory,
|
|
45
45
|
)
|
|
46
|
+
from loom.ai.bootstrap import build_agent_runtime
|
|
46
47
|
from loom.ai.config import A2AConfig, AgentEndpointConfig, AiConfig
|
|
47
48
|
from loom.ai.errors import (
|
|
48
49
|
AgentCompilationError,
|
|
@@ -54,6 +55,7 @@ from loom.ai.errors import (
|
|
|
54
55
|
is_retriable,
|
|
55
56
|
)
|
|
56
57
|
from loom.ai.inference import InferenceTarget
|
|
58
|
+
from loom.ai.pricing import ModelPrice
|
|
57
59
|
from loom.ai.runtime import AgentHealth, AgentRuntime
|
|
58
60
|
|
|
59
61
|
__all__ = [
|
|
@@ -89,6 +91,7 @@ __all__ = [
|
|
|
89
91
|
"McpSession",
|
|
90
92
|
"McpToolCallResult",
|
|
91
93
|
"McpToolInfo",
|
|
94
|
+
"ModelPrice",
|
|
92
95
|
"NativeCapableEngine",
|
|
93
96
|
"OutputCheck",
|
|
94
97
|
"Prompt",
|
|
@@ -98,4 +101,5 @@ __all__ = [
|
|
|
98
101
|
"ToolResultEvent",
|
|
99
102
|
"ToolsetContext",
|
|
100
103
|
"ToolsetFactory",
|
|
104
|
+
"build_agent_runtime",
|
|
101
105
|
]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Containment of relative paths inside the directory they are anchored to."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path, PurePath
|
|
6
|
+
|
|
7
|
+
__all__ = ["escapes", "is_within"]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def escapes(relative: str) -> bool:
|
|
11
|
+
"""Report whether *relative* could name something outside its anchor.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
relative: Path or glob written relative to an anchor directory.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
``True`` when it is absolute or climbs with a ``..`` segment.
|
|
18
|
+
"""
|
|
19
|
+
path = PurePath(relative)
|
|
20
|
+
return path.is_absolute() or ".." in path.parts
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def is_within(path: Path, root: Path) -> bool:
|
|
24
|
+
"""Report whether *path*, symlinks resolved, stays inside *root*.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
path: Path found on disk.
|
|
28
|
+
root: Directory *path* must not leave.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
Whether the resolved *path* is *root* or below it.
|
|
32
|
+
"""
|
|
33
|
+
return path.resolve().is_relative_to(root.resolve())
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Assembly of an agent runtime from a deployment's ``ai:`` section.
|
|
2
|
+
|
|
3
|
+
The one path every transport takes from configuration to a live
|
|
4
|
+
:class:`~loom.ai.runtime.AgentRuntime`: resolve the engine, load and compile
|
|
5
|
+
the artifacts, and hand both to the runtime, which opens nothing until it is
|
|
6
|
+
entered.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import Collection, Mapping, Sequence
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from loom.ai.abc import AgentEngineProvider, DepsFactory
|
|
16
|
+
from loom.ai.compiler import AgentCompiler
|
|
17
|
+
from loom.ai.config import AiConfig
|
|
18
|
+
from loom.ai.declarative import DecodedSpec, load_specs
|
|
19
|
+
from loom.ai.registry import (
|
|
20
|
+
configure_engine_mcp_connect_timeout,
|
|
21
|
+
engine_client_factories,
|
|
22
|
+
engine_native_tool_support,
|
|
23
|
+
engine_supported_kinds,
|
|
24
|
+
resolve_engine_provider,
|
|
25
|
+
)
|
|
26
|
+
from loom.ai.runtime import AgentRuntime, UseCaseMcpGrant
|
|
27
|
+
from loom.core.di import LoomContainer
|
|
28
|
+
from loom.core.identity import Identity
|
|
29
|
+
from loom.core.sql.config import SqlConfig
|
|
30
|
+
from loom.core.use_case.registry import UseCaseRegistry
|
|
31
|
+
|
|
32
|
+
__all__ = ["build_agent_runtime"]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class _NoDependencies(DepsFactory):
|
|
36
|
+
"""Dependency factory of a runtime whose agents reach no application service."""
|
|
37
|
+
|
|
38
|
+
def build(
|
|
39
|
+
self,
|
|
40
|
+
identity: Identity,
|
|
41
|
+
container: LoomContainer,
|
|
42
|
+
state: Mapping[str, Any] | None = None,
|
|
43
|
+
) -> object:
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def build_agent_runtime(
|
|
48
|
+
config: AiConfig,
|
|
49
|
+
*,
|
|
50
|
+
root: Path | str,
|
|
51
|
+
names: Collection[str] | None = None,
|
|
52
|
+
specs: Sequence[str] | None = None,
|
|
53
|
+
engine_provider: AgentEngineProvider | None = None,
|
|
54
|
+
registry: UseCaseRegistry | None = None,
|
|
55
|
+
container: LoomContainer | None = None,
|
|
56
|
+
deps: DepsFactory | None = None,
|
|
57
|
+
sql: SqlConfig | None = None,
|
|
58
|
+
use_case_mcp: Sequence[UseCaseMcpGrant] = (),
|
|
59
|
+
) -> AgentRuntime:
|
|
60
|
+
"""Compile the declared artifacts and build the runtime that serves them.
|
|
61
|
+
|
|
62
|
+
Compilation is offline and complete: every issue of every artifact is
|
|
63
|
+
reported at once. No client opens until the returned runtime is entered.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
config: Parsed ``ai:`` section.
|
|
67
|
+
root: Directory the artifact globs are resolved against; no glob may
|
|
68
|
+
leave it.
|
|
69
|
+
names: Agents to serve; ``None`` serves every artifact found.
|
|
70
|
+
specs: Artifact globs replacing ``config.specs``.
|
|
71
|
+
engine_provider: Engine provider to build engines with; resolved from
|
|
72
|
+
``config.engine`` when omitted.
|
|
73
|
+
registry: Use cases ``usecase`` grants and hooks resolve against;
|
|
74
|
+
empty when omitted.
|
|
75
|
+
container: Application container engines resolve services from;
|
|
76
|
+
empty when omitted.
|
|
77
|
+
deps: Per-invocation dependency factory; when omitted every run gets
|
|
78
|
+
no dependency bundle.
|
|
79
|
+
sql: Data-layer configuration ``sql`` grants resolve against.
|
|
80
|
+
use_case_mcp: Compiled ``Mcp()`` marker grants of the application's
|
|
81
|
+
use cases.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The runtime, not yet entered.
|
|
85
|
+
|
|
86
|
+
Raises:
|
|
87
|
+
AgentCompilationError: When the engine cannot be resolved, a glob
|
|
88
|
+
leaves *root*, or an artifact does not compile.
|
|
89
|
+
"""
|
|
90
|
+
provider = engine_provider or resolve_engine_provider(config.engine)
|
|
91
|
+
configure_engine_mcp_connect_timeout(provider, config.startup_timeout_ms / 1000)
|
|
92
|
+
mcp_factory, a2a_factory = engine_client_factories(provider)
|
|
93
|
+
compiler = AgentCompiler(
|
|
94
|
+
config=config,
|
|
95
|
+
registry=registry or UseCaseRegistry.build([]),
|
|
96
|
+
supported_kinds=engine_supported_kinds(provider, config.engine),
|
|
97
|
+
sql=sql,
|
|
98
|
+
native_tools=engine_native_tool_support(provider),
|
|
99
|
+
)
|
|
100
|
+
decoded = load_specs(config.specs if specs is None else specs, root=root)
|
|
101
|
+
plans = compiler.compile_all(_named(decoded, names))
|
|
102
|
+
return AgentRuntime(
|
|
103
|
+
plans=plans,
|
|
104
|
+
config=config,
|
|
105
|
+
engine_provider=provider,
|
|
106
|
+
deps=deps or _NoDependencies(),
|
|
107
|
+
container=container or LoomContainer(),
|
|
108
|
+
sql_config=sql,
|
|
109
|
+
mcp_client_factory=mcp_factory,
|
|
110
|
+
a2a_client_factory=a2a_factory,
|
|
111
|
+
use_case_mcp=use_case_mcp,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _named(
|
|
116
|
+
decoded: Sequence[DecodedSpec], names: Collection[str] | None
|
|
117
|
+
) -> tuple[DecodedSpec, ...]:
|
|
118
|
+
if names is None:
|
|
119
|
+
return tuple(decoded)
|
|
120
|
+
return tuple(item for item in decoded if item.spec.name in names)
|
|
@@ -37,6 +37,7 @@ from loom.ai.errors import (
|
|
|
37
37
|
agent_name_duplicate,
|
|
38
38
|
)
|
|
39
39
|
from loom.ai.inference import InferenceTarget
|
|
40
|
+
from loom.ai.pricing import ModelPrice
|
|
40
41
|
from loom.core.sql.config import SqlConfig
|
|
41
42
|
from loom.core.use_case.registry import UseCaseRegistry
|
|
42
43
|
|
|
@@ -176,6 +177,7 @@ class AgentCompiler:
|
|
|
176
177
|
instructions,
|
|
177
178
|
state,
|
|
178
179
|
inference,
|
|
180
|
+
self._config.prices.get(inference.model),
|
|
179
181
|
output,
|
|
180
182
|
output_check,
|
|
181
183
|
capabilities,
|
|
@@ -191,6 +193,7 @@ class AgentCompiler:
|
|
|
191
193
|
instructions: tuple[CompiledInstruction, ...],
|
|
192
194
|
state: StateShape | None,
|
|
193
195
|
inference: InferenceTarget,
|
|
196
|
+
price: ModelPrice | None,
|
|
194
197
|
output: CompiledOutput,
|
|
195
198
|
output_check: OutputCheck | None,
|
|
196
199
|
capabilities: tuple[CompiledCapability, ...],
|
|
@@ -205,6 +208,7 @@ class AgentCompiler:
|
|
|
205
208
|
state=state,
|
|
206
209
|
spec_version=spec.spec_version,
|
|
207
210
|
inference=inference,
|
|
211
|
+
price=price,
|
|
208
212
|
output=output,
|
|
209
213
|
output_check=output_check,
|
|
210
214
|
capabilities=capabilities,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Fingerprint of the facts of a compiled plan that decide its answers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from types import MappingProxyType
|
|
8
|
+
from typing import TYPE_CHECKING, Final
|
|
9
|
+
|
|
10
|
+
import msgspec
|
|
11
|
+
|
|
12
|
+
from loom.ai.abc import OutputCheck
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from loom.ai.compiler._plan import AgentPlan, CompiledCapability
|
|
16
|
+
|
|
17
|
+
_CAPABILITY_NAMES: Final[Mapping[str, tuple[str, ...]]] = MappingProxyType(
|
|
18
|
+
{
|
|
19
|
+
"usecase": ("keys",),
|
|
20
|
+
"sql": ("connection",),
|
|
21
|
+
"mcp": ("server",),
|
|
22
|
+
"skills": ("library", "names"),
|
|
23
|
+
"python": ("factory_ref",),
|
|
24
|
+
"a2a": ("agent",),
|
|
25
|
+
"native": ("tool",),
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def plan_fingerprint(plan: AgentPlan) -> str:
|
|
31
|
+
"""Return the sha256 of what decides *plan*'s answers.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
plan: Compiled plan.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Hex digest over the instructions, output schema and check, policies,
|
|
38
|
+
format version, the kind and name of every capability and the model
|
|
39
|
+
binding, without the deployment details.
|
|
40
|
+
"""
|
|
41
|
+
facts = {
|
|
42
|
+
"spec_version": plan.spec_version,
|
|
43
|
+
"instructions": [[block.text, block.template] for block in plan.instructions],
|
|
44
|
+
"output_schema": plan.output.schema,
|
|
45
|
+
"output_check": _reference(plan.output_check),
|
|
46
|
+
"policies": plan.policies,
|
|
47
|
+
"capabilities": [_capability(capability) for capability in plan.capabilities],
|
|
48
|
+
"provider": plan.inference.provider,
|
|
49
|
+
"model": plan.inference.model,
|
|
50
|
+
"output_mode": plan.inference.output_mode,
|
|
51
|
+
"options": plan.inference.options,
|
|
52
|
+
}
|
|
53
|
+
encoded = msgspec.json.encode(facts, order="sorted", enc_hook=_as_dict)
|
|
54
|
+
return hashlib.sha256(encoded).hexdigest()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _as_dict(value: object) -> dict[object, object]:
|
|
58
|
+
if isinstance(value, Mapping):
|
|
59
|
+
return dict(value)
|
|
60
|
+
raise NotImplementedError(f"cannot fingerprint {type(value).__name__}")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _reference(check: OutputCheck | None) -> str | None:
|
|
64
|
+
if check is None:
|
|
65
|
+
return None
|
|
66
|
+
return f"{check.__module__}:{check.__qualname__}"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _capability(capability: CompiledCapability) -> list[object]:
|
|
70
|
+
return [capability.kind, *(getattr(capability, a) for a in _CAPABILITY_NAMES[capability.kind])]
|
|
@@ -24,8 +24,10 @@ from typing import Any, ClassVar, Final
|
|
|
24
24
|
import msgspec
|
|
25
25
|
|
|
26
26
|
from loom.ai.abc import OutputCheck, StateShape
|
|
27
|
+
from loom.ai.compiler._fingerprint import plan_fingerprint
|
|
27
28
|
from loom.ai.declarative import PolicySpec
|
|
28
29
|
from loom.ai.inference import InferenceTarget
|
|
30
|
+
from loom.ai.pricing import ModelPrice
|
|
29
31
|
from loom.core.engine.compilable import Compilable
|
|
30
32
|
from loom.core.model import LoomFrozenStruct, LoomType
|
|
31
33
|
from loom.core.sql.config import SqlConnectionConfig
|
|
@@ -391,6 +393,8 @@ class AgentPlan(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
391
393
|
artifact declares neither ``deps_type`` nor ``deps_schema``.
|
|
392
394
|
spec_version: Artifact format version, retained for self-description.
|
|
393
395
|
inference: Resolved model binding; one binding, no fallback (FR-019a).
|
|
396
|
+
price: Configured price of the bound model, from ``ai.prices``, or
|
|
397
|
+
``None`` when the deployment declares none for it.
|
|
394
398
|
output: Structured-output contract with its compiled boundary type.
|
|
395
399
|
output_check: Resolved predicate over the answer the engine parsed,
|
|
396
400
|
when the artifact declares ``output_check``; ``None`` otherwise.
|
|
@@ -402,12 +406,28 @@ class AgentPlan(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
402
406
|
source_path: Artifact provenance for error messages, when known.
|
|
403
407
|
"""
|
|
404
408
|
|
|
409
|
+
@property
|
|
410
|
+
def fingerprint(self) -> str:
|
|
411
|
+
"""Stable sha256 of everything that decides this agent's answers.
|
|
412
|
+
|
|
413
|
+
Covers the instructions as compiled, the output schema, the output
|
|
414
|
+
check, the policies, the format version, the kind and name of every
|
|
415
|
+
capability and the bound provider, model, output mode and options.
|
|
416
|
+
Leaves out the name, description, metadata, provenance, configured
|
|
417
|
+
price, where a capability is served from (URL, directory,
|
|
418
|
+
credentials, timeouts) and the binding's region, endpoint,
|
|
419
|
+
credentials and streaming flag. The output check enters by its import
|
|
420
|
+
path, so editing the check's body keeps the fingerprint.
|
|
421
|
+
"""
|
|
422
|
+
return plan_fingerprint(self)
|
|
423
|
+
|
|
405
424
|
name: str
|
|
406
425
|
description: str
|
|
407
426
|
instructions: tuple[CompiledInstruction, ...]
|
|
408
427
|
state: StateShape | None = None
|
|
409
428
|
spec_version: int
|
|
410
429
|
inference: InferenceTarget
|
|
430
|
+
price: ModelPrice | None = None
|
|
411
431
|
output: CompiledOutput
|
|
412
432
|
output_check: OutputCheck | None = None
|
|
413
433
|
capabilities: tuple[CompiledCapability, ...] = ()
|
|
@@ -21,6 +21,7 @@ from pathlib import Path
|
|
|
21
21
|
from typing import Any, Final
|
|
22
22
|
|
|
23
23
|
from loom.ai._filters import select_names
|
|
24
|
+
from loom.ai._paths import escapes, is_within
|
|
24
25
|
from loom.ai.abc import NativeToolSupport
|
|
25
26
|
from loom.ai.compiler._plan import (
|
|
26
27
|
CompiledA2ACapability,
|
|
@@ -354,12 +355,6 @@ def _compile_a2a(capability: A2ACapability, context: _Context) -> _HandlerResult
|
|
|
354
355
|
)
|
|
355
356
|
|
|
356
357
|
|
|
357
|
-
def _library_escapes(library: str) -> bool:
|
|
358
|
-
"""Report whether a library name would leave the directory it is anchored to."""
|
|
359
|
-
name = library.removeprefix(_LOCAL_LIBRARY_PREFIX)
|
|
360
|
-
return ".." in Path(name).parts
|
|
361
|
-
|
|
362
|
-
|
|
363
358
|
def _library_base(library: str, context: _Context) -> _ResolveResult:
|
|
364
359
|
"""Return the directory ``library`` is anchored to, or why it has none."""
|
|
365
360
|
if library.startswith(_LOCAL_LIBRARY_PREFIX):
|
|
@@ -373,15 +368,15 @@ def _library_base(library: str, context: _Context) -> _ResolveResult:
|
|
|
373
368
|
|
|
374
369
|
|
|
375
370
|
def _resolve_library(library: str, context: _Context) -> _ResolveResult:
|
|
376
|
-
if
|
|
371
|
+
if escapes(library.removeprefix(_LOCAL_LIBRARY_PREFIX)):
|
|
377
372
|
return None, [skills_library_escapes(context.component, library)]
|
|
378
373
|
base, issues = _library_base(library, context)
|
|
379
374
|
if base is None:
|
|
380
375
|
return None, issues
|
|
381
|
-
resolved =
|
|
382
|
-
if not resolved
|
|
376
|
+
resolved = base / library.removeprefix(_LOCAL_LIBRARY_PREFIX)
|
|
377
|
+
if not is_within(resolved, base):
|
|
383
378
|
return None, [skills_library_escapes(context.component, library)]
|
|
384
|
-
return resolved, []
|
|
379
|
+
return resolved.resolve(), []
|
|
385
380
|
|
|
386
381
|
|
|
387
382
|
def _discover_skills(directory: Path) -> tuple[tuple[str, ...], str | None]:
|
|
@@ -38,6 +38,7 @@ from loom.ai.errors import (
|
|
|
38
38
|
remote_clients_unknown,
|
|
39
39
|
)
|
|
40
40
|
from loom.ai.inference import OUTPUT_MODES, InferenceTarget
|
|
41
|
+
from loom.ai.pricing import ModelPrice
|
|
41
42
|
from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
|
|
42
43
|
from loom.core.model import LoomFrozenStruct
|
|
43
44
|
|
|
@@ -339,6 +340,10 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
339
340
|
one of the two declares the artifacts of an application, and
|
|
340
341
|
declaring both is a compilation error.
|
|
341
342
|
models: Model-role bindings; must contain every role an agent declares.
|
|
343
|
+
prices: Prices keyed by vendor model id (``InferenceTarget.model``).
|
|
344
|
+
A plan bound to a listed model is priced with these rates rather
|
|
345
|
+
than the engine's own, which is what keeps ``policies.max_usd``
|
|
346
|
+
enforceable for a model the engine cannot price.
|
|
342
347
|
skills_root: Filesystem root bare skill library names resolve against.
|
|
343
348
|
mcp_servers: Named remote MCP servers artifacts refer to by name.
|
|
344
349
|
a2a_agents: Named remote A2A agents artifacts refer to by name.
|
|
@@ -390,6 +395,7 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
390
395
|
engine: str
|
|
391
396
|
models: dict[str, InferenceTarget]
|
|
392
397
|
specs: tuple[str, ...] = ()
|
|
398
|
+
prices: dict[str, ModelPrice] = field(default_factory=dict)
|
|
393
399
|
skills_root: str | None = None
|
|
394
400
|
mcp_servers: dict[str, McpServerConfig] = field(default_factory=dict)
|
|
395
401
|
a2a_agents: dict[str, A2AAgentConfig] = field(default_factory=dict)
|
|
@@ -18,7 +18,13 @@ from pathlib import Path
|
|
|
18
18
|
from types import MappingProxyType
|
|
19
19
|
from typing import Final, TypeVar
|
|
20
20
|
|
|
21
|
-
from loom.ai.
|
|
21
|
+
from loom.ai._paths import escapes, is_within
|
|
22
|
+
from loom.ai.errors import (
|
|
23
|
+
AgentCompilationError,
|
|
24
|
+
AgentCompilationIssue,
|
|
25
|
+
agent_specs_escape_root,
|
|
26
|
+
spec_malformed,
|
|
27
|
+
)
|
|
22
28
|
|
|
23
29
|
from ._envelope import (
|
|
24
30
|
LATEST_SPEC_VERSION,
|
|
@@ -122,10 +128,24 @@ _LOADERS: Final[Mapping[str, Callable[[bytes, str], DecodedSpec]]] = MappingProx
|
|
|
122
128
|
)
|
|
123
129
|
|
|
124
130
|
|
|
131
|
+
def _glob(pattern: str, root: Path) -> tuple[set[Path], list[AgentCompilationIssue]]:
|
|
132
|
+
if escapes(pattern):
|
|
133
|
+
return set(), [agent_specs_escape_root(pattern)]
|
|
134
|
+
matches = {path for path in root.glob(pattern) if path.is_file()}
|
|
135
|
+
if not all(is_within(path, root) for path in matches):
|
|
136
|
+
return set(), [agent_specs_escape_root(pattern)]
|
|
137
|
+
return matches, []
|
|
138
|
+
|
|
139
|
+
|
|
125
140
|
def _resolve_paths(patterns: Sequence[str], root: Path) -> tuple[Path, ...]:
|
|
126
141
|
matches: set[Path] = set()
|
|
142
|
+
issues: list[AgentCompilationIssue] = []
|
|
127
143
|
for pattern in patterns:
|
|
128
|
-
|
|
144
|
+
found, pattern_issues = _glob(pattern, root)
|
|
145
|
+
matches.update(found)
|
|
146
|
+
issues.extend(pattern_issues)
|
|
147
|
+
if issues:
|
|
148
|
+
raise AgentCompilationError(issues)
|
|
129
149
|
return tuple(sorted(matches))
|
|
130
150
|
|
|
131
151
|
|
|
@@ -154,8 +174,11 @@ def load_specs(
|
|
|
154
174
|
) -> tuple[DecodedSpec, ...]:
|
|
155
175
|
"""Load every artifact matching a set of globs.
|
|
156
176
|
|
|
157
|
-
Patterns are resolved relative to ``root
|
|
158
|
-
|
|
177
|
+
Patterns are resolved relative to ``root`` and may not leave it: an
|
|
178
|
+
absolute pattern, a ``..`` segment or a match whose resolved path lies
|
|
179
|
+
outside ``root`` is refused before any artifact is read. Matches are
|
|
180
|
+
de-duplicated across patterns and returned sorted by path, so the result
|
|
181
|
+
is deterministic.
|
|
159
182
|
``.yaml``/``.yml`` files decode as YAML, ``.json`` files as JSON, and any
|
|
160
183
|
other extension is a failure.
|
|
161
184
|
|
|
@@ -172,8 +195,9 @@ def load_specs(
|
|
|
172
195
|
One decoded artifact per matched file, ordered by path.
|
|
173
196
|
|
|
174
197
|
Raises:
|
|
175
|
-
AgentCompilationError:
|
|
176
|
-
|
|
198
|
+
AgentCompilationError: With ``AGENT_SPECS_ESCAPE_ROOT`` for every
|
|
199
|
+
pattern that leaves ``root``; otherwise aggregating every fatal
|
|
200
|
+
issue found across all matched files.
|
|
177
201
|
|
|
178
202
|
Example:
|
|
179
203
|
>>> load_specs(["*.agent.yaml"], root="agents")
|