timbal 2.2.3__tar.gz → 2.2.4__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 (223) hide show
  1. {timbal-2.2.3 → timbal-2.2.4}/PKG-INFO +1 -1
  2. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/_version.py +2 -2
  3. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/flow.py +63 -0
  4. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/workflow.py +32 -8
  5. {timbal-2.2.3 → timbal-2.2.4}/.gitignore +0 -0
  6. {timbal-2.2.3 → timbal-2.2.4}/LICENSE +0 -0
  7. {timbal-2.2.3 → timbal-2.2.4}/README.md +0 -0
  8. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/chat-completions.mdx +0 -0
  9. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/create-from-workforce.mdx +0 -0
  10. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/jobs/cancel.mdx +0 -0
  11. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/jobs/get.mdx +0 -0
  12. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/jobs/list.mdx +0 -0
  13. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/jobs/retry.mdx +0 -0
  14. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/link.mdx +0 -0
  15. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/list-context-vars.mdx +0 -0
  16. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/list-policies.mdx +0 -0
  17. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/messages.mdx +0 -0
  18. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/responses.mdx +0 -0
  19. {timbal-2.2.3 → timbal-2.2.4}/docs/api-reference/ace/unlink.mdx +0 -0
  20. {timbal-2.2.3 → timbal-2.2.4}/pyproject.toml +0 -0
  21. {timbal-2.2.3 → timbal-2.2.4}/pyrightconfig.json +0 -0
  22. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/__init__.py +0 -0
  23. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/__init__.py +0 -0
  24. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/__main__.py +0 -0
  25. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/cli_utils.py +0 -0
  26. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/cst_utils.py +0 -0
  27. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/format.py +0 -0
  28. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/model_discovery.py +0 -0
  29. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/test.py +0 -0
  30. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/tool_discovery.py +0 -0
  31. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/__init__.py +0 -0
  32. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/add_edge.py +0 -0
  33. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/add_step.py +0 -0
  34. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/add_tool.py +0 -0
  35. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_edge.py +0 -0
  36. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_step.py +0 -0
  37. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/remove_tool.py +0 -0
  38. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/set_config.py +0 -0
  39. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/set_param.py +0 -0
  40. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/codegen/transformers/set_position.py +0 -0
  41. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/__init__.py +0 -0
  42. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/base.py +0 -0
  43. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/__init__.py +0 -0
  44. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/anthropic.py +0 -0
  45. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/default.py +0 -0
  46. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/message.py +0 -0
  47. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/openai.py +0 -0
  48. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/string.py +0 -0
  49. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/impl/timbal.py +0 -0
  50. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/collectors/registry.py +0 -0
  51. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/__init__.py +0 -0
  52. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/agent.py +0 -0
  53. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/fallback_model.py +0 -0
  54. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/llm_router.py +0 -0
  55. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/mcp.py +0 -0
  56. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/memory_compaction.py +0 -0
  57. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/models.py +0 -0
  58. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/runnable.py +0 -0
  59. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/skill.py +0 -0
  60. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/test_model.py +0 -0
  61. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/tool.py +0 -0
  62. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/core/tool_set.py +0 -0
  63. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/errors.py +0 -0
  64. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/__init__.py +0 -0
  65. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/cli.py +0 -0
  66. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/display.py +0 -0
  67. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/agent.py +0 -0
  68. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_examples.yaml +0 -0
  69. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_flow_validators.yaml +0 -0
  70. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_negations.yaml +0 -0
  71. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_parallel.yaml +0 -0
  72. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_subagent.yaml +0 -0
  73. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/eval_transforms.yaml +0 -0
  74. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/fixtures/test_invalid_validator.yaml +0 -0
  75. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/models.py +0 -0
  76. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/runner.py +0 -0
  77. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/utils.py +0 -0
  78. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/__init__.py +0 -0
  79. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/base.py +0 -0
  80. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/comparison_base.py +0 -0
  81. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/contains.py +0 -0
  82. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/contains_all.py +0 -0
  83. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/contains_any.py +0 -0
  84. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/context.py +0 -0
  85. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/email.py +0 -0
  86. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/ends_with.py +0 -0
  87. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/eq.py +0 -0
  88. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/gt.py +0 -0
  89. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/gte.py +0 -0
  90. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/json.py +0 -0
  91. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/language.py +0 -0
  92. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/length.py +0 -0
  93. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/llm_base.py +0 -0
  94. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/lt.py +0 -0
  95. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/lte.py +0 -0
  96. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/max_length.py +0 -0
  97. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/min_length.py +0 -0
  98. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/not_null.py +0 -0
  99. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/parallel.py +0 -0
  100. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/pattern.py +0 -0
  101. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/prompt.py +0 -0
  102. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/semantic.py +0 -0
  103. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/seq.py +0 -0
  104. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/starts_with.py +0 -0
  105. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/evals/validators/type.py +0 -0
  106. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/logs.py +0 -0
  107. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/models.yaml +0 -0
  108. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/__init__.py +0 -0
  109. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/integrations.py +0 -0
  110. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/knowledge_bases/__init__.py +0 -0
  111. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/knowledge_bases/query.py +0 -0
  112. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/tool_proxy.py +0 -0
  113. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/types.py +0 -0
  114. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/platform/utils.py +0 -0
  115. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/__init__.py +0 -0
  116. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/__main__.py +0 -0
  117. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/http.py +0 -0
  118. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/jobs.py +0 -0
  119. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/voice.html +0 -0
  120. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/server/voice.py +0 -0
  121. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/__init__.py +0 -0
  122. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/config.py +0 -0
  123. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/config_loader.py +0 -0
  124. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/context.py +0 -0
  125. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/dependency_analyzer.py +0 -0
  126. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/__init__.py +0 -0
  127. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/exporters/__init__.py +0 -0
  128. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/exporters/otel.py +0 -0
  129. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/__init__.py +0 -0
  130. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/base.py +0 -0
  131. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/in_memory.py +0 -0
  132. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/jsonl.py +0 -0
  133. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/platform.py +0 -0
  134. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/providers/sqlite.py +0 -0
  135. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/span.py +0 -0
  136. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/state/tracing/trace.py +0 -0
  137. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/__init__.py +0 -0
  138. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/_creds.py +0 -0
  139. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/asana.py +0 -0
  140. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/bash.py +0 -0
  141. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/cala.py +0 -0
  142. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/cloudflare.py +0 -0
  143. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/dynamics_business_central.py +0 -0
  144. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/dynamics_sales.py +0 -0
  145. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/edit.py +0 -0
  146. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/elasticsearch.py +0 -0
  147. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/elevenlabs.py +0 -0
  148. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/excel.py +0 -0
  149. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/fal.py +0 -0
  150. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/fathom.py +0 -0
  151. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/firecrawl.py +0 -0
  152. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/gemini_images.py +0 -0
  153. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/gmail.py +0 -0
  154. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_analytics.py +0 -0
  155. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_business.py +0 -0
  156. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_calendar.py +0 -0
  157. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_docs.py +0 -0
  158. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_drive.py +0 -0
  159. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_maps.py +0 -0
  160. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_merchant_center.py +0 -0
  161. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_search_console.py +0 -0
  162. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/google_sheets.py +0 -0
  163. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/happy_scribe.py +0 -0
  164. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/higgsfield.py +0 -0
  165. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/hubspot.py +0 -0
  166. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/interaction.py +0 -0
  167. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/jira.py +0 -0
  168. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/klaviyo.py +0 -0
  169. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/knowledge_base.py +0 -0
  170. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/krea.py +0 -0
  171. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/lancedb.py +0 -0
  172. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/linkedin.py +0 -0
  173. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/mongodb.py +0 -0
  174. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/netsuite.py +0 -0
  175. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/onedrive.py +0 -0
  176. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/outlook.py +0 -0
  177. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/pinecone.py +0 -0
  178. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/powerbi.py +0 -0
  179. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/quiver_ai.py +0 -0
  180. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/read.py +0 -0
  181. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/replicate.py +0 -0
  182. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/resend.py +0 -0
  183. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/salesforce.py +0 -0
  184. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/scraperapi.py +0 -0
  185. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/sharepoint.py +0 -0
  186. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/shopify.py +0 -0
  187. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/slack.py +0 -0
  188. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/stripe.py +0 -0
  189. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/tavily.py +0 -0
  190. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/web_search.py +0 -0
  191. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/write.py +0 -0
  192. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/xai.py +0 -0
  193. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/zendesk.py +0 -0
  194. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/tools/zoho_crm.py +0 -0
  195. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/__init__.py +0 -0
  196. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/approval.py +0 -0
  197. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/__init__.py +0 -0
  198. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/base.py +0 -0
  199. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/custom.py +0 -0
  200. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/file.py +0 -0
  201. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/text.py +0 -0
  202. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/thinking.py +0 -0
  203. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/tool_result.py +0 -0
  204. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/content/tool_use.py +0 -0
  205. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/__init__.py +0 -0
  206. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/approval.py +0 -0
  207. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/base.py +0 -0
  208. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/delta.py +0 -0
  209. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/interaction.py +0 -0
  210. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/output.py +0 -0
  211. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/events/start.py +0 -0
  212. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/file.py +0 -0
  213. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/message.py +0 -0
  214. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/types/run_status.py +0 -0
  215. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/__init__.py +0 -0
  216. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/import_spec.py +0 -0
  217. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/model.py +0 -0
  218. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/net.py +0 -0
  219. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/schema.py +0 -0
  220. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/utils/serialization.py +0 -0
  221. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/voice/__init__.py +0 -0
  222. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/voice/elevenlabs.py +0 -0
  223. {timbal-2.2.3 → timbal-2.2.4}/python/timbal/voice/session.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: timbal
3
- Version: 2.2.3
3
+ Version: 2.2.4
4
4
  Summary: Simple, performant, battle-tested framework for building reliable AI applications
5
5
  Project-URL: Source, https://github.com/timbal-ai/timbal
6
6
  Author-email: Timbal <team@timbal.ai>
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.2.3'
22
- __version_tuple__ = version_tuple = (2, 2, 3)
21
+ __version__ = version = '2.2.4'
22
+ __version_tuple__ = version_tuple = (2, 2, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -203,6 +203,24 @@ def _build_node(runnable: Any, *, include_tools: bool = True) -> dict[str, Any]:
203
203
  return node
204
204
 
205
205
 
206
+ def _edge_kind(kinds: set[str] | None) -> str:
207
+ """Collapse a set of edge-origin kinds into a single label for JSON output.
208
+
209
+ A dependency can arise from several sources at once (e.g. an explicit
210
+ ``depends_on`` that also reads the step's output via a param map). Precedence
211
+ is ``ordering > when > param`` so explicit sequencing is never masked by
212
+ param wiring. Unknown/missing (e.g. edges from a direct ``_link``) default to
213
+ ``ordering`` — the safe choice, since ordering edges are never reduced away.
214
+ """
215
+ if not kinds:
216
+ return "ordering"
217
+ if "ordering" in kinds:
218
+ return "ordering"
219
+ if "when" in kinds:
220
+ return "when"
221
+ return "param"
222
+
223
+
206
224
  def get_flow(workspace_path: str | Path) -> dict[str, Any]:
207
225
  """Return a ReactFlow-compatible graph for the workspace entry point.
208
226
 
@@ -239,12 +257,14 @@ def get_flow(workspace_path: str | Path) -> dict[str, Any]:
239
257
 
240
258
  for _step_name, step in runnable._steps.items():
241
259
  when_source = _get_when_source(step) if step.when else None
260
+ kinds_map = getattr(step, "previous_steps_kinds", None) or {}
242
261
  for prev_name in step.previous_steps:
243
262
  prev_step = runnable._steps[prev_name]
244
263
  edge: dict[str, Any] = {
245
264
  "id": f"{prev_step._path}->{step._path}",
246
265
  "source": prev_step._path,
247
266
  "target": step._path,
267
+ "kind": _edge_kind(kinds_map.get(prev_name)),
248
268
  }
249
269
  if when_source is not None:
250
270
  edge["when"] = when_source
@@ -390,6 +410,48 @@ def _fmt_node_lines(node: dict, indent: str) -> list[str]:
390
410
  return lines
391
411
 
392
412
 
413
+ def _reduce_param_edges(edges: list[dict]) -> list[dict]:
414
+ """Drop param-induced edges that are transitively implied by another path.
415
+
416
+ A param dependency ``A → C`` (the handler/agent on C reads A's output) is a
417
+ real await-gate at runtime, but for an execution-order view it is redundant
418
+ when A already reaches C through some other path (e.g. ``A → B → C``). Left
419
+ in, such edges turn a linear pipeline into a misleading fan-out from the
420
+ first step.
421
+
422
+ Only edges whose single ``kind`` is ``param`` are eligible for removal —
423
+ explicit ordering (``depends_on`` / hooks) and ``when`` edges are always
424
+ kept so user-added structure never silently disappears from the compact
425
+ view. The full edge set (including these) is retained in the JSON output.
426
+ """
427
+ adj: dict[str, list[str]] = defaultdict(list)
428
+ for e in edges:
429
+ adj[e["source"]].append(e["target"])
430
+
431
+ def _reaches(start: str, goal: str, skip: tuple[str, str]) -> bool:
432
+ """True if ``goal`` is reachable from ``start`` without using the direct ``skip`` edge."""
433
+ stack = [start]
434
+ seen = {start}
435
+ while stack:
436
+ node = stack.pop()
437
+ for nxt in adj.get(node, []):
438
+ if (node, nxt) == skip:
439
+ continue
440
+ if nxt == goal:
441
+ return True
442
+ if nxt not in seen:
443
+ seen.add(nxt)
444
+ stack.append(nxt)
445
+ return False
446
+
447
+ kept: list[dict] = []
448
+ for e in edges:
449
+ if e.get("kind") == "param" and _reaches(e["source"], e["target"], (e["source"], e["target"])):
450
+ continue
451
+ kept.append(e)
452
+ return kept
453
+
454
+
393
455
  def _build_edge_lines(edges: list[dict]) -> list[str]:
394
456
  """Render edges grouped by source, one line per source node."""
395
457
  targets_of: dict[str, list[tuple[str, str | None]]] = defaultdict(list)
@@ -472,6 +534,7 @@ def format_compact(flow: dict) -> str:
472
534
  for line in _fmt_node_lines(node, indent=" "):
473
535
  lines.append(line)
474
536
 
537
+ edges = _reduce_param_edges(edges)
475
538
  if edges:
476
539
  lines.append("")
477
540
  lines.append("EDGES")
@@ -142,29 +142,53 @@ class Workflow(Runnable):
142
142
  self._steps[runnable.name] = runnable
143
143
  runnable.previous_steps = set()
144
144
  runnable.next_steps = set()
145
+ # Per-source edge kinds: maps a previous step name -> set of kinds
146
+ # ("ordering" | "when" | "param"). Used by introspection (get_flow) to
147
+ # distinguish explicit sequencing from param/when-induced dependencies.
148
+ # Runtime sequencing only ever looks at ``previous_steps``.
149
+ runnable.previous_steps_kinds = {}
145
150
  runnable.when = None
146
151
 
147
152
  # Explicit dependencies
148
153
  if depends_on and not isinstance(depends_on, list):
149
154
  raise ValueError("depends_on must be a list of step names")
150
- depends_on = set(depends_on or []) # Deduplicate here to avoid duplicate _is_dag calls
151
155
 
152
- depends_on.update(runnable._dependencies)
153
- depends_on.update(runnable._pre_hook_dependencies)
154
- depends_on.update(runnable._post_hook_dependencies)
156
+ # Track dependency origins so introspection can tell explicit ordering
157
+ # (depends_on / hooks) apart from param- and when-induced wiring. These
158
+ # all merge into ``previous_steps`` for execution, but the distinction is
159
+ # lossy once merged (a step can be both an explicit dep and a param dep),
160
+ # so we record it here while the sources are still separate.
161
+ ordering_deps = set(depends_on or [])
162
+ # Hooks read sibling outputs via step_span(); treat as ordering so they
163
+ # are never silently collapsed in compact views.
164
+ ordering_deps.update(runnable._pre_hook_dependencies)
165
+ ordering_deps.update(runnable._post_hook_dependencies)
166
+ # Handler-body step_span() references are data wiring, not explicit ordering.
167
+ param_deps = set(runnable._dependencies)
168
+ when_deps: set[str] = set()
155
169
 
156
170
  # Optional handler to determine whether to execute the step, and inspect it to automatically link steps
157
171
  if when:
158
172
  inspect_result = runnable._inspect_callable(when)
159
173
  runnable.when = {"callable": when, **inspect_result}
160
- depends_on.update(inspect_result["dependencies"])
174
+ when_deps.update(inspect_result["dependencies"])
161
175
 
162
176
  # Use kwargs as default params for the runnable, and inspect callables to automatically link steps
163
177
  runnable._prepare_default_params(kwargs)
164
178
  for v in runnable._default_runtime_params.values():
165
- depends_on.update(v["dependencies"])
166
-
167
- for dep in depends_on:
179
+ param_deps.update(v["dependencies"])
180
+
181
+ edge_kinds: dict[str, set[str]] = {}
182
+ for dep in ordering_deps:
183
+ edge_kinds.setdefault(dep, set()).add("ordering")
184
+ for dep in when_deps:
185
+ edge_kinds.setdefault(dep, set()).add("when")
186
+ for dep in param_deps:
187
+ edge_kinds.setdefault(dep, set()).add("param")
188
+ runnable.previous_steps_kinds = edge_kinds
189
+
190
+ # Deduplicate (set union) to avoid duplicate _is_dag calls per shared dep.
191
+ for dep in edge_kinds:
168
192
  logger.info("Linking steps", previous_step=dep, next_step=runnable.name)
169
193
  self._link(dep, runnable.name)
170
194
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes