calfkit 0.3.1__tar.gz → 0.3.2__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.
- calfkit-0.3.2/.release-please-manifest.json +3 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/CHANGELOG.md +12 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/PKG-INFO +1 -1
- {calfkit-0.3.1 → calfkit-0.3.2}/ROADMAP.md +1 -0
- calfkit-0.3.2/calfkit/models/node_schema.py +32 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/agent.py +1 -1
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/base.py +34 -2
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/worker.py +12 -2
- {calfkit-0.3.1 → calfkit-0.3.2}/docs/calfkit-v1-design.md +894 -903
- calfkit-0.3.2/docs/calfkit-v1-dx-review.md +1432 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/pyproject.toml +1 -1
- calfkit-0.3.2/tests/test_co_tenant_tool_isolation.py +458 -0
- calfkit-0.3.1/.release-please-manifest.json +0 -3
- calfkit-0.3.1/calfkit/models/node_schema.py +0 -21
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/CODEOWNERS +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/dependabot.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/build.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/code-checks.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/release.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/security.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/test.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/.gitignore +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/LICENSE +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/Makefile +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/README.md +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_protocol.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_types.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/LICENSE +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/__main__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_a2a.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_agent_graph.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_cli/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_cli/web.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_function_schema.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_griffe.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_instrumentation.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_json_schema.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_mcp.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_otel_messages.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_output.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_parts_manager.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_run_context.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_system_prompt.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_thinking_part.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_tool_manager.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_utils.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ag_ui.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/abstract.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/wrapper.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/builtin_tools.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/duckduckgo.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/exa.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/tavily.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/direct.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_agent.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_fastmcp_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_mcp.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_mcp_server.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_model.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_utils.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_agent.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_cache_policies.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_function_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_mcp_server.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_model.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_types.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_agent.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_dynamic_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_fastmcp_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_function_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_logfire.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_mcp.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_mcp_server.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_model.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_run_context.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_toolset.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_workflow.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/base.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/cohere.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/google.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/instrumented.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/openai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/result.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/sentence_transformers.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/settings.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/test.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/voyageai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/wrapper.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/exceptions.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/aci.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/langchain.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/format_prompt.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/mcp.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/messages.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/anthropic.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/bedrock.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/cerebras.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/cohere.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/fallback.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/function.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/gemini.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/google.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/groq.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/huggingface.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/instrumented.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/mcp_sampling.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/mistral.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/openai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/openrouter.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/outlines.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/test.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/wrapper.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/xai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/output.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/amazon.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/anthropic.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/cohere.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/deepseek.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/google.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/grok.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/groq.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/harmony.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/meta.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/mistral.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/moonshotai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/openai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/qwen.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/zai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/alibaba.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/anthropic.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/azure.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/bedrock.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/cerebras.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/cohere.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/deepseek.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/fireworks.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/gateway.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/github.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google_gla.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google_vertex.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/grok.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/groq.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/heroku.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/huggingface.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/litellm.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/mistral.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/moonshotai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/nebius.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/ollama.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/openai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/openrouter.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/outlines.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/ovhcloud.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/sambanova.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/sentence_transformers.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/together.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/vercel.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/voyageai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/xai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/py.typed +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/result.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/retries.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/run.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/settings.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/tools.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/_dynamic.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/abstract.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/approval_required.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/combined.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/external.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/fastmcp.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/filtered.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/function.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/prefixed.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/prepared.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/renamed.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/wrapper.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_adapter.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_event_stream.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_messages_builder.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/api.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/app.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/_adapter.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/_event_stream.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/app.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_adapter.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_event_stream.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_models.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_utils.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/request_types.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/response_types.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/usage.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/vendor.txt +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/base.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/client.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/deserialize.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/invocation_handle.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/middleware.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/node_result.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/reply_dispatcher.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/exceptions.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/actions.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/envelope.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/payload.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/session_context.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/state.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/tool_context.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/consumer.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/node.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/tool.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/anthropic.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/model_client.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/openai.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/worker_config.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/codecov.yml +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/docs/hooks-design.md +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/agent_dispatcher.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/chat_node.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/chat_repl_cli.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/invoke_agent.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/router_node.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/tool_nodes.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/agent_service.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/invoke.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/weather_sink.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/weather_tool.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/examples/rpc_worker.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/release-please-config.json +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/conftest.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/__init__.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/test_agent_output_types.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/test_agent_workers.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/providers.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_concurrent_tool_calls.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_consumer.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_gates.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_headers.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_instructions.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_model_settings.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_overrides.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_serializable.py +0 -0
- {calfkit-0.3.1 → calfkit-0.3.2}/tests/utils.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.2](https://github.com/calf-ai/calfkit-sdk/compare/v0.3.1...v0.3.2) (2026-05-21)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* route tool returns to private inbox to prevent co-tenant leak ([#142](https://github.com/calf-ai/calfkit-sdk/issues/142)) ([197463f](https://github.com/calf-ai/calfkit-sdk/commit/197463f2f7f338bae53bf144e3a86cf27373e350))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Documentation
|
|
12
|
+
|
|
13
|
+
* integrate DX review into v1 design and add reviewer artifact ([#138](https://github.com/calf-ai/calfkit-sdk/issues/138)) ([29a7961](https://github.com/calf-ai/calfkit-sdk/commit/29a7961d5c2d4e46fcb7e2e4a81f43116c34feb3))
|
|
14
|
+
|
|
3
15
|
## [0.3.1](https://github.com/calf-ai/calfkit-sdk/compare/v0.3.0...v0.3.1) (2026-05-19)
|
|
4
16
|
|
|
5
17
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calfkit
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Build AI workflows and agents as fully-distributed and event-driven microservices.
|
|
5
5
|
Project-URL: Homepage, https://github.com/calf-ai/calf-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/calf-ai/calf-sdk
|
|
@@ -6,3 +6,4 @@ An index of potential features and changes under consideration for Calf SDK. Eac
|
|
|
6
6
|
|
|
7
7
|
- [Calfkit 1.0](docs/calfkit-v1-design.md) — 1.0 rewrite proposal covering node, agent, and result shape changes
|
|
8
8
|
- [Hook System](docs/hooks-design.md) — two-layer middleware proposal for pre/post-run extensibility on nodes
|
|
9
|
+
- [Durable Fan-Out Aggregator](docs/durable-fanout-aggregator.md) — replace in-process `_pending_batches` with a Kafka-backed compacted-state aggregator for parallel tool calls
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from dataclasses import KW_ONLY, dataclass
|
|
2
|
+
|
|
3
|
+
from calfkit._vendor.pydantic_ai.tools import ToolDefinition
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class BaseNodeSchema:
|
|
8
|
+
_: KW_ONLY
|
|
9
|
+
node_id: str
|
|
10
|
+
subscribe_topics: list[str]
|
|
11
|
+
publish_topic: str | None
|
|
12
|
+
|
|
13
|
+
def __post_init__(self) -> None:
|
|
14
|
+
if not isinstance(self.subscribe_topics, (list, tuple)):
|
|
15
|
+
self.subscribe_topics = [self.subscribe_topics]
|
|
16
|
+
# Reject empty subscribe_topics for every node kind (Agent, Consumer,
|
|
17
|
+
# Tool, …). Lives here rather than in ``BaseNodeDef.__init__`` because
|
|
18
|
+
# ``@dataclass`` subclasses like ``BaseToolNodeDef`` get an
|
|
19
|
+
# auto-generated ``__init__`` that bypasses ``BaseNodeDef.__init__``
|
|
20
|
+
# entirely; ``__post_init__`` is the one hook every subclass runs.
|
|
21
|
+
# Without this guard, ``Worker.register_handlers`` would still add
|
|
22
|
+
# ``_return_topic`` to the subscriber set (issue #141 fix), so the
|
|
23
|
+
# node would "register" successfully but have no public inbox — a
|
|
24
|
+
# silent zombie consumer.
|
|
25
|
+
if not self.subscribe_topics:
|
|
26
|
+
raise ValueError(f"node {self.node_id!r} requires at least one subscribe_topic; got empty list")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class BaseToolNodeSchema(BaseNodeSchema):
|
|
31
|
+
_: KW_ONLY
|
|
32
|
+
tool_schema: ToolDefinition
|
|
@@ -184,7 +184,7 @@ class BaseAgentNodeDef(
|
|
|
184
184
|
# TODO: maybe consider a node retry return type that doesn't require round trip to itself.
|
|
185
185
|
# Tailcall to itself is a roundtrip.
|
|
186
186
|
logger.debug("[%s] all tool calls invalid, TailCall retry node=%s", ctx.deps.correlation_id[:8], self.name)
|
|
187
|
-
return TailCall[State](target_topic=self.
|
|
187
|
+
return TailCall[State](target_topic=self._return_topic, state=ctx.state)
|
|
188
188
|
|
|
189
189
|
pending_tool_calls = [tc for tc in latest_tool_calls if tc.tool_call_id not in ctx.state.tool_results]
|
|
190
190
|
|
|
@@ -68,12 +68,22 @@ class BaseNodeDef(BaseNodeSchema):
|
|
|
68
68
|
Args:
|
|
69
69
|
node_id: Unique identifier for the node.
|
|
70
70
|
subscribe_topics: One or more topics the node consumes from.
|
|
71
|
+
Must be non-empty — a node with no public inbox cannot be
|
|
72
|
+
invoked by any client or peer. Without the validation in
|
|
73
|
+
:meth:`BaseNodeSchema.__post_init__`, ``Worker.register_handlers``
|
|
74
|
+
would still wire the node up to ``_return_topic`` (issue #141
|
|
75
|
+
fix), so the node would "register" successfully while being
|
|
76
|
+
functionally unreachable from the outside.
|
|
71
77
|
publish_topic: Optional default topic to publish results to.
|
|
72
78
|
gates: Optional list of predicates evaluated in ``handler()`` before
|
|
73
79
|
``run()``. Stack with AND semantics in registration order;
|
|
74
80
|
short-circuits on the first ``False``, exception, or non-bool.
|
|
75
81
|
Returning anything other than ``True`` rejects the message:
|
|
76
82
|
``run()`` is skipped and the envelope is returned unchanged.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
ValueError: If ``subscribe_topics`` is empty. Enforced uniformly
|
|
86
|
+
across all node kinds in :meth:`BaseNodeSchema.__post_init__`.
|
|
77
87
|
"""
|
|
78
88
|
super().__init__(
|
|
79
89
|
node_id=node_id,
|
|
@@ -168,7 +178,7 @@ class BaseNodeDef(BaseNodeSchema):
|
|
|
168
178
|
# Parallel fan-out: publish each Call with independent workflow_state
|
|
169
179
|
for call in output:
|
|
170
180
|
wf_copy = envelope.internal_workflow_state.model_copy(deep=True)
|
|
171
|
-
wf_copy.invoke_frame(call, self.
|
|
181
|
+
wf_copy.invoke_frame(call, self._return_topic)
|
|
172
182
|
publish_envelope = Envelope(
|
|
173
183
|
context=SessionRunContext(state=call.state, deps=envelope.context.deps),
|
|
174
184
|
internal_workflow_state=wf_copy,
|
|
@@ -184,7 +194,7 @@ class BaseNodeDef(BaseNodeSchema):
|
|
|
184
194
|
|
|
185
195
|
elif isinstance(output, Call):
|
|
186
196
|
# push to callstack and call the target topic
|
|
187
|
-
envelope.internal_workflow_state.invoke_frame(output, self.
|
|
197
|
+
envelope.internal_workflow_state.invoke_frame(output, self._return_topic)
|
|
188
198
|
publish_envelope = Envelope(
|
|
189
199
|
context=SessionRunContext(state=output.state, deps=envelope.context.deps),
|
|
190
200
|
internal_workflow_state=envelope.internal_workflow_state,
|
|
@@ -287,4 +297,26 @@ class BaseNodeDef(BaseNodeSchema):
|
|
|
287
297
|
|
|
288
298
|
@property
|
|
289
299
|
def _return_topic(self) -> str:
|
|
300
|
+
"""Framework-private return inbox for this node instance.
|
|
301
|
+
|
|
302
|
+
Used as the ``callback_topic`` written into the call frame when this
|
|
303
|
+
node issues a tool ``Call`` (so the tool's ``ReturnCall`` knows where
|
|
304
|
+
to route back), and as the ``target_topic`` for the framework's
|
|
305
|
+
built-in all-invalid ``TailCall`` self-retry in
|
|
306
|
+
:meth:`BaseAgentNodeDef.run`. Must be uniquely owned by this
|
|
307
|
+
``node_id`` — sharing it with another node's consumer group would
|
|
308
|
+
re-introduce the co-tenant tool-return leak (issue #141).
|
|
309
|
+
:meth:`Worker.register_handlers` automatically subscribes the node to
|
|
310
|
+
this topic under the worker's configured ``group_id`` (defaults to
|
|
311
|
+
the node's own ``node_id``).
|
|
312
|
+
|
|
313
|
+
The value is recomputed from ``node_id`` on every access. Do not
|
|
314
|
+
mutate ``node_id`` after the node has been registered with a worker:
|
|
315
|
+
the worker's subscription is bound to the old topic, so tool
|
|
316
|
+
``ReturnCall`` responses (which target the call frame's
|
|
317
|
+
``callback_topic``) and built-in ``TailCall`` self-retries (which
|
|
318
|
+
target ``_return_topic`` directly) would silently route into a topic
|
|
319
|
+
with no consumer. Ordinary tool ``Call`` publishes are unaffected —
|
|
320
|
+
they target the tool's input topic, not ``_return_topic``.
|
|
321
|
+
"""
|
|
290
322
|
return f"{self.node_id}.private.return"
|
|
@@ -36,14 +36,24 @@ class Worker:
|
|
|
36
36
|
else:
|
|
37
37
|
for node in self._nodes:
|
|
38
38
|
group_id = self._group_id or node.name
|
|
39
|
+
# Subscribe to the node's public inboxes plus its
|
|
40
|
+
# framework-private return inbox. The latter is where tool
|
|
41
|
+
# ``Call`` returns and ``TailCall`` self-retries are addressed
|
|
42
|
+
# exclusively to this node instance — see
|
|
43
|
+
# ``BaseNodeDef._return_topic`` (issue #141). ``dict.fromkeys``
|
|
44
|
+
# preserves declared order while removing duplicates, so a
|
|
45
|
+
# user who manually lists ``f'{node_id}.private.return'`` in
|
|
46
|
+
# ``subscribe_topics`` doesn't end up with a duplicate entry
|
|
47
|
+
# in registration logs / AsyncAPI / observability tooling.
|
|
48
|
+
topics = list(dict.fromkeys([*node.subscribe_topics, node._return_topic]))
|
|
39
49
|
logger.info(
|
|
40
50
|
"registering node=%s subscribe=%s publish=%s",
|
|
41
51
|
node.name,
|
|
42
|
-
|
|
52
|
+
topics,
|
|
43
53
|
node.publish_topic,
|
|
44
54
|
)
|
|
45
55
|
subscriber = self._client._connection.subscriber(
|
|
46
|
-
*
|
|
56
|
+
*topics,
|
|
47
57
|
group_id=group_id,
|
|
48
58
|
max_workers=self._max_workers,
|
|
49
59
|
**self._extra_subscribe_kwargs,
|