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.
Files changed (271) hide show
  1. calfkit-0.3.2/.release-please-manifest.json +3 -0
  2. {calfkit-0.3.1 → calfkit-0.3.2}/CHANGELOG.md +12 -0
  3. {calfkit-0.3.1 → calfkit-0.3.2}/PKG-INFO +1 -1
  4. {calfkit-0.3.1 → calfkit-0.3.2}/ROADMAP.md +1 -0
  5. calfkit-0.3.2/calfkit/models/node_schema.py +32 -0
  6. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/agent.py +1 -1
  7. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/base.py +34 -2
  8. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/worker.py +12 -2
  9. {calfkit-0.3.1 → calfkit-0.3.2}/docs/calfkit-v1-design.md +894 -903
  10. calfkit-0.3.2/docs/calfkit-v1-dx-review.md +1432 -0
  11. {calfkit-0.3.1 → calfkit-0.3.2}/pyproject.toml +1 -1
  12. calfkit-0.3.2/tests/test_co_tenant_tool_isolation.py +458 -0
  13. calfkit-0.3.1/.release-please-manifest.json +0 -3
  14. calfkit-0.3.1/calfkit/models/node_schema.py +0 -21
  15. {calfkit-0.3.1 → calfkit-0.3.2}/.github/CODEOWNERS +0 -0
  16. {calfkit-0.3.1 → calfkit-0.3.2}/.github/dependabot.yml +0 -0
  17. {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/build.yml +0 -0
  18. {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/code-checks.yml +0 -0
  19. {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/release.yml +0 -0
  20. {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/security.yml +0 -0
  21. {calfkit-0.3.1 → calfkit-0.3.2}/.github/workflows/test.yml +0 -0
  22. {calfkit-0.3.1 → calfkit-0.3.2}/.gitignore +0 -0
  23. {calfkit-0.3.1 → calfkit-0.3.2}/LICENSE +0 -0
  24. {calfkit-0.3.1 → calfkit-0.3.2}/Makefile +0 -0
  25. {calfkit-0.3.1 → calfkit-0.3.2}/README.md +0 -0
  26. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/__init__.py +0 -0
  27. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_protocol.py +0 -0
  28. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_types.py +0 -0
  29. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/__init__.py +0 -0
  30. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/LICENSE +0 -0
  31. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/__init__.py +0 -0
  32. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/__main__.py +0 -0
  33. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_a2a.py +0 -0
  34. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_agent_graph.py +0 -0
  35. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_cli/__init__.py +0 -0
  36. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_cli/web.py +0 -0
  37. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_function_schema.py +0 -0
  38. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_griffe.py +0 -0
  39. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_instrumentation.py +0 -0
  40. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_json_schema.py +0 -0
  41. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_mcp.py +0 -0
  42. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_otel_messages.py +0 -0
  43. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_output.py +0 -0
  44. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_parts_manager.py +0 -0
  45. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_run_context.py +0 -0
  46. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_system_prompt.py +0 -0
  47. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_thinking_part.py +0 -0
  48. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_tool_manager.py +0 -0
  49. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/_utils.py +0 -0
  50. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ag_ui.py +0 -0
  51. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/__init__.py +0 -0
  52. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/abstract.py +0 -0
  53. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/agent/wrapper.py +0 -0
  54. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/builtin_tools.py +0 -0
  55. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/__init__.py +0 -0
  56. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/duckduckgo.py +0 -0
  57. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/exa.py +0 -0
  58. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/common_tools/tavily.py +0 -0
  59. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/direct.py +0 -0
  60. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/__init__.py +0 -0
  61. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/__init__.py +0 -0
  62. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_agent.py +0 -0
  63. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_fastmcp_toolset.py +0 -0
  64. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_mcp.py +0 -0
  65. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_mcp_server.py +0 -0
  66. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_model.py +0 -0
  67. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/dbos/_utils.py +0 -0
  68. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/__init__.py +0 -0
  69. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_agent.py +0 -0
  70. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_cache_policies.py +0 -0
  71. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_function_toolset.py +0 -0
  72. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_mcp_server.py +0 -0
  73. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_model.py +0 -0
  74. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_toolset.py +0 -0
  75. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/prefect/_types.py +0 -0
  76. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/__init__.py +0 -0
  77. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_agent.py +0 -0
  78. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_dynamic_toolset.py +0 -0
  79. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_fastmcp_toolset.py +0 -0
  80. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_function_toolset.py +0 -0
  81. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_logfire.py +0 -0
  82. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_mcp.py +0 -0
  83. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_mcp_server.py +0 -0
  84. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_model.py +0 -0
  85. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_run_context.py +0 -0
  86. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_toolset.py +0 -0
  87. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/durable_exec/temporal/_workflow.py +0 -0
  88. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/__init__.py +0 -0
  89. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/base.py +0 -0
  90. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/cohere.py +0 -0
  91. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/google.py +0 -0
  92. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/instrumented.py +0 -0
  93. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/openai.py +0 -0
  94. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/result.py +0 -0
  95. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/sentence_transformers.py +0 -0
  96. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/settings.py +0 -0
  97. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/test.py +0 -0
  98. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/voyageai.py +0 -0
  99. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/embeddings/wrapper.py +0 -0
  100. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/exceptions.py +0 -0
  101. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/__init__.py +0 -0
  102. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/aci.py +0 -0
  103. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ext/langchain.py +0 -0
  104. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/format_prompt.py +0 -0
  105. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/mcp.py +0 -0
  106. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/messages.py +0 -0
  107. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/__init__.py +0 -0
  108. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/anthropic.py +0 -0
  109. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/bedrock.py +0 -0
  110. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/cerebras.py +0 -0
  111. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/cohere.py +0 -0
  112. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/fallback.py +0 -0
  113. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/function.py +0 -0
  114. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/gemini.py +0 -0
  115. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/google.py +0 -0
  116. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/groq.py +0 -0
  117. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/huggingface.py +0 -0
  118. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/instrumented.py +0 -0
  119. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/mcp_sampling.py +0 -0
  120. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/mistral.py +0 -0
  121. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/openai.py +0 -0
  122. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/openrouter.py +0 -0
  123. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/outlines.py +0 -0
  124. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/test.py +0 -0
  125. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/wrapper.py +0 -0
  126. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/models/xai.py +0 -0
  127. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/output.py +0 -0
  128. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/__init__.py +0 -0
  129. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/amazon.py +0 -0
  130. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/anthropic.py +0 -0
  131. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/cohere.py +0 -0
  132. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/deepseek.py +0 -0
  133. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/google.py +0 -0
  134. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/grok.py +0 -0
  135. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/groq.py +0 -0
  136. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/harmony.py +0 -0
  137. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/meta.py +0 -0
  138. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/mistral.py +0 -0
  139. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/moonshotai.py +0 -0
  140. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/openai.py +0 -0
  141. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/qwen.py +0 -0
  142. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/profiles/zai.py +0 -0
  143. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/__init__.py +0 -0
  144. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/alibaba.py +0 -0
  145. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/anthropic.py +0 -0
  146. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/azure.py +0 -0
  147. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/bedrock.py +0 -0
  148. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/cerebras.py +0 -0
  149. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/cohere.py +0 -0
  150. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/deepseek.py +0 -0
  151. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/fireworks.py +0 -0
  152. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/gateway.py +0 -0
  153. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/github.py +0 -0
  154. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google.py +0 -0
  155. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google_gla.py +0 -0
  156. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/google_vertex.py +0 -0
  157. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/grok.py +0 -0
  158. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/groq.py +0 -0
  159. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/heroku.py +0 -0
  160. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/huggingface.py +0 -0
  161. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/litellm.py +0 -0
  162. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/mistral.py +0 -0
  163. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/moonshotai.py +0 -0
  164. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/nebius.py +0 -0
  165. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/ollama.py +0 -0
  166. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/openai.py +0 -0
  167. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/openrouter.py +0 -0
  168. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/outlines.py +0 -0
  169. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/ovhcloud.py +0 -0
  170. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/sambanova.py +0 -0
  171. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/sentence_transformers.py +0 -0
  172. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/together.py +0 -0
  173. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/vercel.py +0 -0
  174. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/voyageai.py +0 -0
  175. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/providers/xai.py +0 -0
  176. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/py.typed +0 -0
  177. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/result.py +0 -0
  178. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/retries.py +0 -0
  179. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/run.py +0 -0
  180. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/settings.py +0 -0
  181. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/tools.py +0 -0
  182. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/__init__.py +0 -0
  183. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/_dynamic.py +0 -0
  184. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/abstract.py +0 -0
  185. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/approval_required.py +0 -0
  186. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/combined.py +0 -0
  187. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/external.py +0 -0
  188. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/fastmcp.py +0 -0
  189. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/filtered.py +0 -0
  190. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/function.py +0 -0
  191. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/prefixed.py +0 -0
  192. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/prepared.py +0 -0
  193. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/renamed.py +0 -0
  194. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/toolsets/wrapper.py +0 -0
  195. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/__init__.py +0 -0
  196. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_adapter.py +0 -0
  197. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_event_stream.py +0 -0
  198. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_messages_builder.py +0 -0
  199. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/__init__.py +0 -0
  200. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/api.py +0 -0
  201. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/_web/app.py +0 -0
  202. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/__init__.py +0 -0
  203. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/_adapter.py +0 -0
  204. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/_event_stream.py +0 -0
  205. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/ag_ui/app.py +0 -0
  206. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/__init__.py +0 -0
  207. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_adapter.py +0 -0
  208. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_event_stream.py +0 -0
  209. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_models.py +0 -0
  210. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/_utils.py +0 -0
  211. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/request_types.py +0 -0
  212. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/ui/vercel_ai/response_types.py +0 -0
  213. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/pydantic_ai/usage.py +0 -0
  214. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/_vendor/vendor.txt +0 -0
  215. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/__init__.py +0 -0
  216. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/base.py +0 -0
  217. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/client.py +0 -0
  218. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/deserialize.py +0 -0
  219. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/invocation_handle.py +0 -0
  220. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/middleware.py +0 -0
  221. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/node_result.py +0 -0
  222. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/client/reply_dispatcher.py +0 -0
  223. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/exceptions.py +0 -0
  224. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/__init__.py +0 -0
  225. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/actions.py +0 -0
  226. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/envelope.py +0 -0
  227. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/payload.py +0 -0
  228. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/session_context.py +0 -0
  229. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/state.py +0 -0
  230. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/models/tool_context.py +0 -0
  231. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/__init__.py +0 -0
  232. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/consumer.py +0 -0
  233. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/node.py +0 -0
  234. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/nodes/tool.py +0 -0
  235. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/__init__.py +0 -0
  236. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/__init__.py +0 -0
  237. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/anthropic.py +0 -0
  238. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/model_client.py +0 -0
  239. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/providers/pydantic_ai/openai.py +0 -0
  240. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/__init__.py +0 -0
  241. {calfkit-0.3.1 → calfkit-0.3.2}/calfkit/worker/worker_config.py +0 -0
  242. {calfkit-0.3.1 → calfkit-0.3.2}/codecov.yml +0 -0
  243. {calfkit-0.3.1 → calfkit-0.3.2}/docs/hooks-design.md +0 -0
  244. {calfkit-0.3.1 → calfkit-0.3.2}/examples/__init__.py +0 -0
  245. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/agent_dispatcher.py +0 -0
  246. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/chat_node.py +0 -0
  247. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/chat_repl_cli.py +0 -0
  248. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/invoke_agent.py +0 -0
  249. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/router_node.py +0 -0
  250. {calfkit-0.3.1 → calfkit-0.3.2}/examples/deprecated/tool_nodes.py +0 -0
  251. {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/agent_service.py +0 -0
  252. {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/invoke.py +0 -0
  253. {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/weather_sink.py +0 -0
  254. {calfkit-0.3.1 → calfkit-0.3.2}/examples/quickstart/weather_tool.py +0 -0
  255. {calfkit-0.3.1 → calfkit-0.3.2}/examples/rpc_worker.py +0 -0
  256. {calfkit-0.3.1 → calfkit-0.3.2}/release-please-config.json +0 -0
  257. {calfkit-0.3.1 → calfkit-0.3.2}/tests/__init__.py +0 -0
  258. {calfkit-0.3.1 → calfkit-0.3.2}/tests/conftest.py +0 -0
  259. {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/__init__.py +0 -0
  260. {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/test_agent_output_types.py +0 -0
  261. {calfkit-0.3.1 → calfkit-0.3.2}/tests/integration/test_agent_workers.py +0 -0
  262. {calfkit-0.3.1 → calfkit-0.3.2}/tests/providers.py +0 -0
  263. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_concurrent_tool_calls.py +0 -0
  264. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_consumer.py +0 -0
  265. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_gates.py +0 -0
  266. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_headers.py +0 -0
  267. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_instructions.py +0 -0
  268. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_model_settings.py +0 -0
  269. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_overrides.py +0 -0
  270. {calfkit-0.3.1 → calfkit-0.3.2}/tests/test_serializable.py +0 -0
  271. {calfkit-0.3.1 → calfkit-0.3.2}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.2"
3
+ }
@@ -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.1
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.subscribe_topics[0], state=ctx.state)
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.subscribe_topics[0])
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.subscribe_topics[0])
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
- node.subscribe_topics,
52
+ topics,
43
53
  node.publish_topic,
44
54
  )
45
55
  subscriber = self._client._connection.subscriber(
46
- *node.subscribe_topics,
56
+ *topics,
47
57
  group_id=group_id,
48
58
  max_workers=self._max_workers,
49
59
  **self._extra_subscribe_kwargs,