hexdag 0.7.0.dev13__tar.gz → 0.8.0.dev1__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 (392) hide show
  1. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/PKG-INFO +4 -3
  2. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/__init__.py +4 -0
  3. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/processes.py +0 -89
  4. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/validation.py +68 -6
  5. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/vfs.py +0 -7
  6. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/main.py +2 -2
  7. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/__init__.py +0 -3
  8. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/macro_entity.py +4 -0
  9. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/node_entity.py +1 -1
  10. hexdag-0.8.0.dev1/hexdag/compiler/reference_resolver.py +282 -0
  11. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/system_builder.py +44 -1
  12. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/tag_discovery.py +1 -46
  13. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/yaml_builder.py +131 -12
  14. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/yaml_validator.py +629 -17
  15. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/executors/local_executor.py +15 -0
  16. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/pipeline_spawner/local.py +7 -5
  17. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/providers/__init__.py +0 -2
  18. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/__init__.py +4 -9
  19. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/context/__init__.py +2 -0
  20. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/context/execution_context.py +91 -0
  21. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/dag.py +30 -0
  22. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/pipeline_config.py +27 -0
  23. hexdag-0.8.0.dev1/hexdag/kernel/domain/pipeline_result.py +123 -0
  24. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/exceptions.py +0 -7
  25. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/expression_parser.py +137 -37
  26. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/lifecycle_runner.py +47 -22
  27. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/execution_coordinator.py +53 -19
  28. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/lifecycle_manager.py +23 -8
  29. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/node_executor.py +3 -1
  30. hexdag-0.8.0.dev1/hexdag/kernel/orchestration/event_correlation.py +184 -0
  31. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/events/__init__.py +5 -14
  32. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/events/events.py +62 -0
  33. hexdag-0.8.0.dev1/hexdag/kernel/orchestration/events/observers/__init__.py +16 -0
  34. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/hook_context.py +1 -0
  35. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/hooks.py +1 -1
  36. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/models.py +6 -0
  37. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/orchestrator.py +110 -13
  38. hexdag-0.8.0.dev1/hexdag/kernel/orchestration/suspension.py +49 -0
  39. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/pipeline_builder/__init__.py +0 -2
  40. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/pipeline_runner.py +136 -18
  41. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/__init__.py +10 -4
  42. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/detection.py +0 -5
  43. hexdag-0.8.0.dev1/hexdag/kernel/ports/dict_bridge.py +66 -0
  44. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/executor.py +1 -0
  45. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/llm.py +128 -0
  46. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/pipeline_spawner.py +6 -3
  47. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/resolver.py +4 -1
  48. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/schema/generator.py +2 -1
  49. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/service.py +9 -1
  50. hexdag-0.8.0.dev1/hexdag/kernel/system.py +383 -0
  51. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/system_runner.py +3 -3
  52. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/mcp_server.py +6 -2
  53. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/mock_llm.py +36 -0
  54. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/__init__.py +0 -14
  55. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/entity_state.py +31 -5
  56. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/observers/__init__.py +7 -17
  57. hexdag-0.8.0.dev1/hexdag/stdlib/lib/observers/core_observers.py +178 -0
  58. hexdag-0.8.0.dev1/hexdag/stdlib/lib/observers/state_transition_observer.py +146 -0
  59. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/__init__.py +4 -0
  60. hexdag-0.8.0.dev1/hexdag/stdlib/middleware/batch_generation.py +190 -0
  61. hexdag-0.8.0.dev1/hexdag/stdlib/middleware/round_robin.py +199 -0
  62. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/__init__.py +2 -4
  63. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/agent_node.py +5 -1
  64. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/base_node_factory.py +7 -1
  65. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/composite_node.py +4 -1
  66. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/service_call_node.py +72 -3
  67. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/transition_node.py +53 -20
  68. hexdag-0.8.0.dev1/hexdag/stdlib/nodes/wait_node.py +214 -0
  69. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/execute.py +1 -1
  70. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/validate.py +6 -0
  71. hexdag-0.8.0.dev1/hexdag_plugins/_ports.py +166 -0
  72. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/adapters/blob.py +2 -1
  73. hexdag-0.8.0.dev1/hexdag_plugins/email/__init__.py +13 -0
  74. hexdag-0.8.0.dev1/hexdag_plugins/email/adapters/__init__.py +11 -0
  75. hexdag-0.8.0.dev1/hexdag_plugins/email/adapters/graph.py +491 -0
  76. hexdag-0.8.0.dev1/hexdag_plugins/email/adapters/noop.py +43 -0
  77. hexdag-0.8.0.dev1/hexdag_plugins/email/tests/__init__.py +0 -0
  78. hexdag-0.8.0.dev1/hexdag_plugins/email/tests/test_noop_adapter.py +67 -0
  79. hexdag-0.8.0.dev1/hexdag_plugins/google/__init__.py +5 -0
  80. hexdag-0.8.0.dev1/hexdag_plugins/google/adapters/__init__.py +5 -0
  81. hexdag-0.8.0.dev1/hexdag_plugins/google/adapters/vertex.py +801 -0
  82. hexdag-0.8.0.dev1/hexdag_plugins/google/tests/__init__.py +0 -0
  83. hexdag-0.8.0.dev1/hexdag_plugins/google/tests/test_vertex_adapter.py +287 -0
  84. hexdag-0.8.0.dev1/hexdag_plugins/ollama/__init__.py +5 -0
  85. hexdag-0.8.0.dev1/hexdag_plugins/ollama/adapters/__init__.py +5 -0
  86. hexdag-0.8.0.dev1/hexdag_plugins/ollama/adapters/ollama.py +195 -0
  87. hexdag-0.8.0.dev1/hexdag_plugins/ollama/tests/__init__.py +0 -0
  88. hexdag-0.8.0.dev1/hexdag_plugins/ollama/tests/test_ollama_adapter.py +164 -0
  89. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/pyproject.toml +24 -2
  90. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/file/local.py +2 -1
  91. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/pyproject.toml +13 -12
  92. hexdag-0.7.0.dev13/hexdag/compiler/include_tag.py +0 -261
  93. hexdag-0.7.0.dev13/hexdag/compiler/reference_resolver.py +0 -157
  94. hexdag-0.7.0.dev13/hexdag/drivers/vfs/providers/proc_scheduled_provider.py +0 -95
  95. hexdag-0.7.0.dev13/hexdag/kernel/domain/scheduled_task.py +0 -64
  96. hexdag-0.7.0.dev13/hexdag/kernel/orchestration/events/observers/__init__.py +0 -37
  97. hexdag-0.7.0.dev13/hexdag/kernel/ports/file_storage.py +0 -121
  98. hexdag-0.7.0.dev13/hexdag/stdlib/lib/database_tools.py +0 -87
  99. hexdag-0.7.0.dev13/hexdag/stdlib/lib/observers/core_observers.py +0 -652
  100. hexdag-0.7.0.dev13/hexdag/stdlib/lib/observers/cost_profiler.py +0 -378
  101. hexdag-0.7.0.dev13/hexdag/stdlib/lib/observers/models.py +0 -111
  102. hexdag-0.7.0.dev13/hexdag/stdlib/lib/scheduler.py +0 -362
  103. hexdag-0.7.0.dev13/hexdag/stdlib/nodes/checkpoint_node.py +0 -175
  104. hexdag-0.7.0.dev13/hexdag/stdlib/nodes/tool_call_node.py +0 -174
  105. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/.gitignore +0 -0
  106. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/LICENSE +0 -0
  107. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/README.md +0 -0
  108. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/__main__.py +0 -0
  109. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/__init__.py +0 -0
  110. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/components.py +0 -0
  111. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/documentation.py +0 -0
  112. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/execution.py +0 -0
  113. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/export.py +0 -0
  114. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/logs.py +0 -0
  115. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/api/pipeline.py +0 -0
  116. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/__init__.py +0 -0
  117. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/__main__.py +0 -0
  118. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/__init__.py +0 -0
  119. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/build_cmd.py +0 -0
  120. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/create_cmd.py +0 -0
  121. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/docs_cmd.py +0 -0
  122. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/generate_types_cmd.py +0 -0
  123. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/init_cmd.py +0 -0
  124. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/lint_cmd.py +0 -0
  125. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/pipeline_cmd.py +0 -0
  126. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/plugin_dev_cmd.py +0 -0
  127. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/plugins_cmd.py +0 -0
  128. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/studio_cmd.py +0 -0
  129. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/cli/commands/validate_cmd.py +0 -0
  130. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/component_instantiator.py +0 -0
  131. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/config_loader.py +0 -0
  132. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/pipeline_config.py +0 -0
  133. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/__init__.py +0 -0
  134. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/adapter_definition.py +0 -0
  135. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/config_definition.py +0 -0
  136. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/macro_definition.py +0 -0
  137. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/plugins/middleware_definition.py +0 -0
  138. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/preprocessing/__init__.py +0 -0
  139. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/preprocessing/_type_guards.py +0 -0
  140. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/preprocessing/env_vars.py +0 -0
  141. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/preprocessing/include.py +0 -0
  142. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/preprocessing/template.py +0 -0
  143. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/compiler/py_tag.py +0 -0
  144. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/docs/__init__.py +0 -0
  145. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/docs/extractors.py +0 -0
  146. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/docs/generators.py +0 -0
  147. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/docs/models.py +0 -0
  148. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/executors/__init__.py +0 -0
  149. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/http_client/__init__.py +0 -0
  150. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/http_client/http_client.py +0 -0
  151. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/observer_manager/__init__.py +0 -0
  152. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/observer_manager/local.py +0 -0
  153. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/pipeline_spawner/__init__.py +0 -0
  154. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/__init__.py +0 -0
  155. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/local.py +0 -0
  156. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/providers/lib_provider.py +0 -0
  157. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/providers/proc_entities_provider.py +0 -0
  158. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/providers/proc_runs_provider.py +0 -0
  159. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/drivers/vfs/providers/sys_caps_provider.py +0 -0
  160. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/_alias_registry.py +0 -0
  161. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/config/__init__.py +0 -0
  162. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/config/loader.py +0 -0
  163. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/config/models.py +0 -0
  164. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/configurable.py +0 -0
  165. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/discovery.py +0 -0
  166. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/__init__.py +0 -0
  167. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/agent_tools.py +0 -0
  168. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/caps.py +0 -0
  169. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/entity_state.py +0 -0
  170. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/extraction_state.py +0 -0
  171. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/pipeline_run.py +0 -0
  172. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/system_config.py +0 -0
  173. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/domain/vfs.py +0 -0
  174. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/lib_base.py +0 -0
  175. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/linting/__init__.py +0 -0
  176. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/linting/models.py +0 -0
  177. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/linting/pipeline_rules.py +0 -0
  178. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/linting/rules.py +0 -0
  179. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/logging.py +0 -0
  180. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/models/__init__.py +0 -0
  181. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/models/base.py +0 -0
  182. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/__init__.py +0 -0
  183. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/body_executor.py +0 -0
  184. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/__init__.py +0 -0
  185. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/adapter_lifecycle_manager.py +0 -0
  186. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/checkpoint_manager.py +0 -0
  187. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/health_check_manager.py +0 -0
  188. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/input_mapper.py +0 -0
  189. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/components/secret_manager.py +0 -0
  190. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/constants.py +0 -0
  191. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/events/README.md +0 -0
  192. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/events/batching.py +0 -0
  193. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/events/decorators.py +0 -0
  194. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/orchestrator_factory.py +0 -0
  195. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/port_wrappers.py +0 -0
  196. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/prompt/__init__.py +0 -0
  197. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/orchestration/prompt/template.py +0 -0
  198. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/api_call.py +0 -0
  199. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/data_store.py +0 -0
  200. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/database.py +0 -0
  201. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/healthcheck.py +0 -0
  202. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/memory.py +0 -0
  203. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/observer_manager.py +0 -0
  204. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/secret.py +0 -0
  205. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/tool_router.py +0 -0
  206. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/vector_search.py +0 -0
  207. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports/vfs.py +0 -0
  208. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/ports_builder.py +0 -0
  209. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/protocols.py +0 -0
  210. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/schema/__init__.py +0 -0
  211. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/secrets.py +0 -0
  212. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/types.py +0 -0
  213. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/async_warnings.py +0 -0
  214. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/caching.py +0 -0
  215. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/input_normalization.py +0 -0
  216. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/node_timer.py +0 -0
  217. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/schema_conversion.py +0 -0
  218. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/serialization.py +0 -0
  219. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/utils/sql_validation.py +0 -0
  220. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/validation/__init__.py +0 -0
  221. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/validation/retry.py +0 -0
  222. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/validation/sanitized_types.py +0 -0
  223. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/validation/secure_json.py +0 -0
  224. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/kernel/yaml_macro.py +0 -0
  225. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/py.typed +0 -0
  226. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/__init__.py +0 -0
  227. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/__init__.py +0 -0
  228. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/_discovery.py +0 -0
  229. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/anthropic/__init__.py +0 -0
  230. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/anthropic/anthropic_adapter.py +0 -0
  231. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/base.py +0 -0
  232. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/__init__.py +0 -0
  233. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/csv/csv_adapter.py +0 -0
  234. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/pgvector/__init__.py +0 -0
  235. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/pgvector/pgvector_adapter.py +0 -0
  236. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/sqlalchemy/sqlalchemy_adapter.py +0 -0
  237. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/sqlite/__init__.py +0 -0
  238. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/database/sqlite/sqlite_adapter.py +0 -0
  239. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/local/README.md +0 -0
  240. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/local/__init__.py +0 -0
  241. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/__init__.py +0 -0
  242. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/collection_memory.py +0 -0
  243. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/file_memory_adapter.py +0 -0
  244. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/in_memory_memory.py +0 -0
  245. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/schemas.py +0 -0
  246. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/session_memory.py +0 -0
  247. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/sqlite_memory_adapter.py +0 -0
  248. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/memory/state_memory.py +0 -0
  249. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/README.md +0 -0
  250. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/__init__.py +0 -0
  251. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/hexdag.yaml +0 -0
  252. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/mock_database.py +0 -0
  253. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/mock_embedding.py +0 -0
  254. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/mock/mock_http.py +0 -0
  255. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/openai/__init__.py +0 -0
  256. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/openai/openai_adapter.py +0 -0
  257. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/redis/__init__.py +0 -0
  258. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/redis/redis_adapter.py +0 -0
  259. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/secret/__init__.py +0 -0
  260. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/adapters/secret/local_secret_adapter.py +0 -0
  261. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/extraction_job.py +0 -0
  262. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/observers/port_call_observers.py +0 -0
  263. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/pipeline_memory.py +0 -0
  264. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/process_registry.py +0 -0
  265. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/process_registry_observer.py +0 -0
  266. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib/vfs_tools.py +0 -0
  267. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/lib_base.py +0 -0
  268. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/macros/__init__.py +0 -0
  269. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/macros/_discovery.py +0 -0
  270. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/macros/conversation_agent.py +0 -0
  271. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/macros/llm_macro.py +0 -0
  272. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/macros/reasoning_agent.py +0 -0
  273. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/compose.py +0 -0
  274. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/distributed_cache.py +0 -0
  275. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/observable.py +0 -0
  276. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/observable_tool_router.py +0 -0
  277. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/rate_limiter.py +0 -0
  278. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/response_cache.py +0 -0
  279. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/retry.py +0 -0
  280. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/structured_output.py +0 -0
  281. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/middleware/timeout.py +0 -0
  282. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/_discovery.py +0 -0
  283. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/api_call_node.py +0 -0
  284. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/data_node.py +0 -0
  285. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/expression_node.py +0 -0
  286. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/function_node.py +0 -0
  287. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/llm_node.py +0 -0
  288. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/mapped_input.py +0 -0
  289. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/nodes/tool_utils.py +0 -0
  290. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/prompts/__init__.py +0 -0
  291. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/prompts/base.py +0 -0
  292. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/prompts/chat_prompts.py +0 -0
  293. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/prompts/error_correction_prompts.py +0 -0
  294. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/stdlib/prompts/tool_prompts.py +0 -0
  295. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/__init__.py +0 -0
  296. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/build_ui.py +0 -0
  297. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/__init__.py +0 -0
  298. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/main.py +0 -0
  299. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/__init__.py +0 -0
  300. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/export.py +0 -0
  301. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/files.py +0 -0
  302. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/server/routes/plugins.py +0 -0
  303. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/index.html +0 -0
  304. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/package-lock.json +0 -0
  305. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/package.json +0 -0
  306. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/postcss.config.js +0 -0
  307. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/public/hexdag.svg +0 -0
  308. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/App.tsx +0 -0
  309. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/Canvas.tsx +0 -0
  310. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/ContextMenu.tsx +0 -0
  311. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/FileBrowser.tsx +0 -0
  312. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/Header.tsx +0 -0
  313. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/HexdagNode.tsx +0 -0
  314. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/NodeInspector.tsx +0 -0
  315. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/NodePalette.tsx +0 -0
  316. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/NodePortsSection.tsx +0 -0
  317. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/PluginManager.tsx +0 -0
  318. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/PortsEditor.tsx +0 -0
  319. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/PythonEditor.tsx +0 -0
  320. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/ValidationPanel.tsx +0 -0
  321. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/YamlEditor.tsx +0 -0
  322. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/components/index.ts +0 -0
  323. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/index.css +0 -0
  324. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/lib/api.ts +0 -0
  325. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/lib/nodeTemplates.ts +0 -0
  326. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/lib/store.ts +0 -0
  327. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/main.tsx +0 -0
  328. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/types/index.ts +0 -0
  329. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/src/vite-env.d.ts +0 -0
  330. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/tailwind.config.js +0 -0
  331. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/tsconfig.json +0 -0
  332. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/tsconfig.node.json +0 -0
  333. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag/studio/ui/vite.config.ts +0 -0
  334. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/.gitignore +0 -0
  335. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/README.md +0 -0
  336. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/__init__.py +0 -0
  337. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/LICENSE +0 -0
  338. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/README.md +0 -0
  339. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/__init__.py +0 -0
  340. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/adapters/__init__.py +0 -0
  341. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/adapters/cosmos.py +0 -0
  342. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/adapters/keyvault.py +0 -0
  343. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/adapters/openai.py +0 -0
  344. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/pyproject.toml +0 -0
  345. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/tests/__init__.py +0 -0
  346. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/tests/test_azure_blob_adapter.py +0 -0
  347. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +0 -0
  348. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +0 -0
  349. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/azure/tests/test_azure_openai_adapter.py +0 -0
  350. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/README.md +0 -0
  351. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/__init__.py +0 -0
  352. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +0 -0
  353. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +0 -0
  354. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +0 -0
  355. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +0 -0
  356. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag.toml +0 -0
  357. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +0 -0
  358. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +0 -0
  359. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +0 -0
  360. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +0 -0
  361. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +0 -0
  362. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +0 -0
  363. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +0 -0
  364. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/pyproject.toml +0 -0
  365. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/test_transform.py +0 -0
  366. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +0 -0
  367. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/LICENSE +0 -0
  368. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/README.md +0 -0
  369. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/__init__.py +0 -0
  370. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/adapters/__init__.py +0 -0
  371. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/adapters/mysql.py +0 -0
  372. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/mysql_adapter.py +0 -0
  373. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/pyproject.toml +0 -0
  374. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +0 -0
  375. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/README.md +0 -0
  376. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/__init__.py +0 -0
  377. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/__init__.py +0 -0
  378. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/file/__init__.py +0 -0
  379. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/sql/__init__.py +0 -0
  380. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/sql/base.py +0 -0
  381. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/sql/collection_storage.py +0 -0
  382. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/sql/mysql.py +0 -0
  383. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/sql/postgresql.py +0 -0
  384. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/vector/__init__.py +0 -0
  385. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/vector/chromadb.py +0 -0
  386. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/vector/in_memory.py +0 -0
  387. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/adapters/vector/pgvector.py +0 -0
  388. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/ports/__init__.py +0 -0
  389. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/ports/vector_store.py +0 -0
  390. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/tests/__init__.py +0 -0
  391. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/tests/test_local_file_storage.py +0 -0
  392. {hexdag-0.7.0.dev13 → hexdag-0.8.0.dev1}/hexdag_plugins/storage/tests/test_sql_adapters.py +0 -0
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hexdag
3
- Version: 0.7.0.dev13
4
- Summary: Lightweight DAG orchestration framework with enterprise pipeline capabilities
3
+ Version: 0.8.0.dev1
4
+ Summary: Operating system for AI agents pipelines, ports, drivers, and stdlib so agents don't reinvent infrastructure
5
5
  Project-URL: Homepage, https://hexdag.ai
6
6
  Project-URL: Repository, https://github.com/omniviser/hexdag
7
7
  Project-URL: Documentation, https://hexdag.ai/docs
8
8
  Author-email: hexDAG Team <developers@omniviser.ai>
9
9
  License: Apache-2.0
10
10
  License-File: LICENSE
11
- Keywords: async,dag,hexagonal-architecture,orchestration,pipeline,workflow
11
+ Keywords: ai-agents,async,dag,llm,operating-system,orchestration,pipeline,workflow
12
12
  Classifier: Development Status :: 3 - Alpha
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: Apache Software License
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
18
  Requires-Python: >=3.12
19
+ Requires-Dist: aiofiles>=23.0.0
19
20
  Requires-Dist: jinja2>=3.1.0
20
21
  Requires-Dist: loguru>=0.7.0
21
22
  Requires-Dist: orjson>=3.9.0
@@ -25,8 +25,10 @@ from hexdag.kernel import (
25
25
  FewShotPromptTemplate,
26
26
  PipelineRunner,
27
27
  PromptTemplate,
28
+ System,
28
29
  ToolRouter,
29
30
  )
31
+ from hexdag.kernel.domain.pipeline_result import PipelineResult
30
32
  from hexdag.stdlib.nodes import (
31
33
  FunctionNode,
32
34
  LLMNode,
@@ -121,7 +123,9 @@ __all__ = [
121
123
  # Version
122
124
  "__version__",
123
125
  # Primary API
126
+ "PipelineResult",
124
127
  "PipelineRunner",
128
+ "System",
125
129
  # Node Factories
126
130
  "FunctionNode",
127
131
  "LLMNode",
@@ -26,7 +26,6 @@ if TYPE_CHECKING:
26
26
  from hexdag.kernel import PipelineSpawner
27
27
  from hexdag.stdlib.lib.entity_state import EntityState
28
28
  from hexdag.stdlib.lib.process_registry import ProcessRegistry
29
- from hexdag.stdlib.lib.scheduler import Scheduler
30
29
 
31
30
 
32
31
  # ---------------------------------------------------------------------------
@@ -119,94 +118,6 @@ async def spawn_pipeline(
119
118
  return {"run_id": run_id, "pipeline_name": pipeline_name, "status": "spawned"}
120
119
 
121
120
 
122
- # ---------------------------------------------------------------------------
123
- # Scheduler tools
124
- # ---------------------------------------------------------------------------
125
-
126
-
127
- async def schedule_pipeline(
128
- scheduler: Scheduler,
129
- pipeline_name: str,
130
- initial_input: dict[str, Any] | None = None,
131
- *,
132
- delay_seconds: float | None = None,
133
- interval_seconds: float | None = None,
134
- ref_id: str | None = None,
135
- ref_type: str | None = None,
136
- ) -> dict[str, Any]:
137
- """Schedule a pipeline for delayed or recurring execution.
138
-
139
- Provide ``delay_seconds`` for one-shot or ``interval_seconds`` for
140
- recurring. If both given, recurring takes precedence.
141
-
142
- Args
143
- ----
144
- scheduler: Scheduler instance.
145
- pipeline_name: Name of the pipeline to execute.
146
- initial_input: Input data for the pipeline.
147
- delay_seconds: Seconds to wait before one-shot execution.
148
- interval_seconds: Seconds between recurring executions.
149
- ref_id: Business reference ID.
150
- ref_type: Business reference type.
151
-
152
- Returns
153
- -------
154
- Dict with task_id and schedule details.
155
- """
156
- if interval_seconds is not None:
157
- return await scheduler.aschedule_recurring(
158
- pipeline_name,
159
- initial_input,
160
- interval_seconds=interval_seconds,
161
- ref_id=ref_id,
162
- ref_type=ref_type,
163
- )
164
- return await scheduler.aschedule_once(
165
- pipeline_name,
166
- initial_input,
167
- delay_seconds=delay_seconds or 0.0,
168
- ref_id=ref_id,
169
- ref_type=ref_type,
170
- )
171
-
172
-
173
- async def cancel_scheduled(
174
- scheduler: Scheduler,
175
- task_id: str,
176
- ) -> dict[str, Any]:
177
- """Cancel a scheduled task.
178
-
179
- Args
180
- ----
181
- scheduler: Scheduler instance.
182
- task_id: The task ID to cancel.
183
-
184
- Returns
185
- -------
186
- Dict with task_id and cancellation status.
187
- """
188
- return await scheduler.acancel(task_id)
189
-
190
-
191
- async def list_scheduled(
192
- scheduler: Scheduler,
193
- *,
194
- ref_id: str | None = None,
195
- ) -> list[dict[str, Any]]:
196
- """List scheduled tasks, optionally filtered by ref_id.
197
-
198
- Args
199
- ----
200
- scheduler: Scheduler instance.
201
- ref_id: Filter by business reference ID.
202
-
203
- Returns
204
- -------
205
- List of scheduled task dicts.
206
- """
207
- return await scheduler.alist_scheduled(ref_id=ref_id)
208
-
209
-
210
121
  # ---------------------------------------------------------------------------
211
122
  # EntityState tools
212
123
  # ---------------------------------------------------------------------------
@@ -6,7 +6,10 @@ Delegates to core YamlValidator for structural validation.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from typing import Any
9
+ from typing import TYPE_CHECKING, Any
10
+
11
+ if TYPE_CHECKING:
12
+ from pathlib import Path
10
13
 
11
14
  import yaml
12
15
 
@@ -14,7 +17,11 @@ from hexdag.compiler import YamlPipelineBuilder
14
17
  from hexdag.compiler.yaml_validator import YamlValidator
15
18
 
16
19
 
17
- def validate(yaml_content: str, lenient: bool = False) -> dict[str, Any]:
20
+ def validate(
21
+ yaml_content: str,
22
+ lenient: bool = False,
23
+ base_path: Path | None = None,
24
+ ) -> dict[str, Any]:
18
25
  """Validate a YAML pipeline configuration.
19
26
 
20
27
  Parameters
@@ -25,6 +32,10 @@ def validate(yaml_content: str, lenient: bool = False) -> dict[str, Any]:
25
32
  If True, validate structure only without requiring environment variables.
26
33
  Useful for CI/CD validation where secrets aren't available.
27
34
  Default: False
35
+ base_path : Path | None
36
+ Base directory for resolving ``!include`` directives.
37
+ Required for full validation of pipelines that use includes.
38
+ Default: None (uses current working directory)
28
39
 
29
40
  Returns
30
41
  -------
@@ -58,13 +69,16 @@ def validate(yaml_content: str, lenient: bool = False) -> dict[str, Any]:
58
69
  """
59
70
  if lenient:
60
71
  return _validate_lenient(yaml_content)
61
- return _validate_full(yaml_content)
72
+ return _validate_full(yaml_content, base_path=base_path)
62
73
 
63
74
 
64
- def _validate_full(yaml_content: str) -> dict[str, Any]:
75
+ def _validate_full(
76
+ yaml_content: str,
77
+ base_path: Path | None = None,
78
+ ) -> dict[str, Any]:
65
79
  """Full validation with YamlPipelineBuilder."""
66
80
  try:
67
- builder = YamlPipelineBuilder()
81
+ builder = YamlPipelineBuilder(base_path=base_path)
68
82
  graph, config = builder.build_from_yaml_string(yaml_content)
69
83
 
70
84
  return {
@@ -82,6 +96,46 @@ def _validate_full(yaml_content: str) -> dict[str, Any]:
82
96
  }
83
97
 
84
98
 
99
+ def _strip_includes(
100
+ obj: Any,
101
+ warnings: list[str],
102
+ *,
103
+ _counter: list[int] | None = None,
104
+ ) -> Any:
105
+ """Strip ``{"!include": "..."}`` entries from parsed YAML.
106
+
107
+ In node lists, replaces includes with placeholder data_node entries.
108
+ Elsewhere, replaces with None. Collects warnings for each stripped include.
109
+ """
110
+ if _counter is None:
111
+ _counter = [0]
112
+
113
+ if isinstance(obj, dict):
114
+ if "!include" in obj and len(obj) == 1:
115
+ path = obj["!include"]
116
+ warnings.append(f"!include '{path}' skipped during lenient validation")
117
+ return None
118
+ return {k: _strip_includes(v, warnings, _counter=_counter) for k, v in obj.items()}
119
+
120
+ if isinstance(obj, list):
121
+ result = []
122
+ for item in obj:
123
+ if isinstance(item, dict) and "!include" in item and len(item) == 1:
124
+ path = item["!include"]
125
+ warnings.append(f"!include '{path}' skipped during lenient validation")
126
+ _counter[0] += 1
127
+ result.append({
128
+ "kind": "data_node",
129
+ "metadata": {"name": f"__included_{_counter[0]}__"},
130
+ "spec": {"data": {}},
131
+ })
132
+ else:
133
+ result.append(_strip_includes(item, warnings, _counter=_counter))
134
+ return result
135
+
136
+ return obj
137
+
138
+
85
139
  def _validate_lenient(yaml_content: str) -> dict[str, Any]:
86
140
  """Structure-only validation using core YamlValidator.
87
141
 
@@ -90,6 +144,10 @@ def _validate_lenient(yaml_content: str) -> dict[str, Any]:
90
144
  - Manifest structure (kind, metadata, spec)
91
145
  - Node structure and dependencies
92
146
  - Cycle detection
147
+
148
+ ``!include`` directives (dict-key syntax) are stripped and replaced
149
+ with placeholder nodes so that structural validation can proceed
150
+ without requiring access to included files.
93
151
  """
94
152
  try:
95
153
  parsed = yaml.safe_load(yaml_content)
@@ -100,6 +158,10 @@ def _validate_lenient(yaml_content: str) -> dict[str, Any]:
100
158
  "error_type": "ParseError",
101
159
  }
102
160
 
161
+ # Strip !include directives before validation
162
+ include_warnings: list[str] = []
163
+ parsed = _strip_includes(parsed, include_warnings)
164
+
103
165
  # Use core validator for structural validation
104
166
  validator = YamlValidator()
105
167
  report = validator.validate(parsed)
@@ -122,7 +184,7 @@ def _validate_lenient(yaml_content: str) -> dict[str, Any]:
122
184
  "message": "Pipeline structure is valid",
123
185
  "node_count": len(nodes),
124
186
  "nodes": nodes,
125
- "warnings": report.warnings,
187
+ "warnings": include_warnings + report.warnings,
126
188
  }
127
189
 
128
190
  except yaml.YAMLError as e:
@@ -27,20 +27,17 @@ from hexdag.drivers.vfs.providers import (
27
27
  LibProvider,
28
28
  ProcEntitiesProvider,
29
29
  ProcRunsProvider,
30
- ProcScheduledProvider,
31
30
  )
32
31
 
33
32
  if TYPE_CHECKING:
34
33
  from hexdag.kernel import VFS
35
34
  from hexdag.stdlib.lib.entity_state import EntityState
36
35
  from hexdag.stdlib.lib.process_registry import ProcessRegistry
37
- from hexdag.stdlib.lib.scheduler import Scheduler
38
36
 
39
37
 
40
38
  def create_vfs(
41
39
  *,
42
40
  registry: ProcessRegistry | None = None,
43
- scheduler: Scheduler | None = None,
44
41
  entity_state: EntityState | None = None,
45
42
  ) -> VFS:
46
43
  """Create a VFS instance with all available providers mounted.
@@ -52,8 +49,6 @@ def create_vfs(
52
49
  ----------
53
50
  registry : ProcessRegistry | None
54
51
  Mount ``/proc/runs/`` if provided.
55
- scheduler : Scheduler | None
56
- Mount ``/proc/scheduled/`` if provided.
57
52
  entity_state : EntityState | None
58
53
  Mount ``/proc/entities/`` if provided.
59
54
 
@@ -68,8 +63,6 @@ def create_vfs(
68
63
 
69
64
  if registry is not None:
70
65
  vfs.mount("/proc/runs/", ProcRunsProvider(registry))
71
- if scheduler is not None:
72
- vfs.mount("/proc/scheduled/", ProcScheduledProvider(scheduler))
73
66
  if entity_state is not None:
74
67
  vfs.mount("/proc/entities/", ProcEntitiesProvider(entity_state))
75
68
 
@@ -19,7 +19,7 @@ import hexdag.cli.commands as _commands_pkg
19
19
 
20
20
  app = typer.Typer(
21
21
  name="hexdag",
22
- help="HexDAG - Lightweight DAG orchestration framework with hexagonal architecture.",
22
+ help="hexDAG Operating system for AI agents.",
23
23
  no_args_is_help=True,
24
24
  rich_markup_mode="rich",
25
25
  pretty_exceptions_enable=False,
@@ -56,7 +56,7 @@ def callback(
56
56
  help="Show version and exit",
57
57
  ),
58
58
  ) -> None:
59
- """HexDAG CLI - Modular DAG orchestration framework."""
59
+ """hexDAG CLI Operating system for AI agents."""
60
60
  if version:
61
61
  # Read version from package metadata
62
62
  try:
@@ -6,9 +6,7 @@ from declarative YAML configurations, plus the configuration loader.
6
6
  """
7
7
 
8
8
  # Import tags to register YAML custom tags
9
- from . import include_tag as _include_tag # noqa: F401
10
9
  from . import py_tag as _py_tag # noqa: F401
11
- from .include_tag import set_include_base_path
12
10
  from .tag_discovery import discover_tags, get_known_tag_names, get_tag_schema
13
11
  from .yaml_builder import YamlPipelineBuilder
14
12
 
@@ -34,5 +32,4 @@ __all__ = [
34
32
  "discover_tags",
35
33
  "get_known_tag_names",
36
34
  "get_tag_schema",
37
- "set_include_base_path",
38
35
  ]
@@ -37,6 +37,10 @@ class MacroEntityPlugin:
37
37
  self, node_config: dict[str, Any], builder: YamlPipelineBuilder, graph: DirectedGraph
38
38
  ) -> NodeSpec | None:
39
39
  """Expand macro into subgraph and merge into main graph."""
40
+ # Reset exit nodes upfront so a failed expansion doesn't leave
41
+ # stale state from the previous macro for the next node's implicit deps.
42
+ self.last_exit_nodes = []
43
+
40
44
  instance_name = node_config["metadata"]["name"]
41
45
  spec = node_config.get("spec", {})
42
46
  macro_ref = spec.get("macro")
@@ -84,7 +84,7 @@ class NodeEntityPlugin:
84
84
 
85
85
  # Backward compat: if no explicit settings section, auto-partition flat spec
86
86
  if not settings_values:
87
- settings_values, spec = self._partition_spec(factory_obj, spec)
87
+ settings_values, spec = self._partition_spec(factory, spec)
88
88
 
89
89
  # Merge for factory call (factory signature unchanged)
90
90
  factory_kwargs = {**settings_values, **spec}
@@ -0,0 +1,282 @@
1
+ """Reference resolver — extracts node references from mapping values, expressions, and templates.
2
+
3
+ Used by the YAML builder to infer dependencies from ``input_mapping``,
4
+ ``expressions``, and ``prompt_template`` / ``template`` fields so that
5
+ users no longer need to specify redundant ``dependencies``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import re
11
+ from typing import Any
12
+
13
+ from hexdag.kernel.context.execution_context import RESERVED_NAMES
14
+ from hexdag.kernel.expression_parser import ALLOWED_FUNCTIONS
15
+
16
+ # Pattern: identifier.identifier (but not $input.field)
17
+ _NODE_FIELD_RE = re.compile(r"(?<!\$)\b([A-Za-z_][A-Za-z0-9_]*)\.[A-Za-z_][A-Za-z0-9_.]*")
18
+
19
+ # Pattern: splits a source string into identifier tokens and non-identifier chars.
20
+ # Used to find bare node names in expressions like "analyzer + 1".
21
+ _IDENT_SPLIT_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*")
22
+
23
+ # Jinja2 variable pattern: {{node.field}} or {{ node.field }}
24
+ _JINJA_VAR_RE = re.compile(r"\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\.[A-Za-z_][A-Za-z0-9_.]*\s*\}\}")
25
+
26
+ # Names that are never node references — expression namespaces (from kernel)
27
+ # plus Python/YAML keyword-like literals and built-in functions.
28
+ _BUILTIN_NAMES = frozenset(ALLOWED_FUNCTIONS.keys()) | frozenset({
29
+ "self",
30
+ "type",
31
+ "true",
32
+ "false",
33
+ "none",
34
+ "True",
35
+ "False",
36
+ "None",
37
+ "null",
38
+ })
39
+
40
+
41
+ def extract_refs_from_mapping(
42
+ input_mapping: dict[str, Any],
43
+ known_nodes: frozenset[str],
44
+ macro_instances: frozenset[str] = frozenset(),
45
+ ) -> set[str]:
46
+ """Extract node names referenced in ``input_mapping`` values.
47
+
48
+ Recognises the ``node_name.field`` pattern used by
49
+ :pyclass:`ExecutionCoordinator._apply_input_mapping`.
50
+ Skips ``$input.*`` references (pipeline input, not a node).
51
+
52
+ Parameters
53
+ ----------
54
+ input_mapping : dict[str, Any]
55
+ Mapping of ``{target_field: "source_path"}``.
56
+ known_nodes : frozenset[str]
57
+ Set of all node names in the pipeline (used for validation).
58
+ macro_instances : frozenset[str]
59
+ Macro invocation names for prefix-based matching.
60
+
61
+ Returns
62
+ -------
63
+ set[str]
64
+ Node names referenced in the mapping.
65
+ """
66
+ refs: set[str] = set()
67
+ for source_path in input_mapping.values():
68
+ if isinstance(source_path, str):
69
+ refs.update(_extract_node_refs(source_path, known_nodes, macro_instances))
70
+ elif isinstance(source_path, list):
71
+ for item in source_path:
72
+ if isinstance(item, str):
73
+ refs.update(_extract_node_refs(item, known_nodes, macro_instances))
74
+ return refs
75
+
76
+
77
+ def extract_refs_from_expressions(
78
+ expressions: dict[str, Any],
79
+ known_nodes: frozenset[str],
80
+ macro_instances: frozenset[str] = frozenset(),
81
+ ) -> set[str]:
82
+ """Extract node names referenced in expression strings.
83
+
84
+ Scans for ``node_name.field`` tokens where ``node_name`` matches
85
+ a known node.
86
+
87
+ Parameters
88
+ ----------
89
+ expressions : dict[str, str]
90
+ Mapping of ``{variable_name: expression_string}``.
91
+ known_nodes : frozenset[str]
92
+ Set of all node names in the pipeline.
93
+ macro_instances : frozenset[str]
94
+ Macro invocation names for prefix-based matching.
95
+
96
+ Returns
97
+ -------
98
+ set[str]
99
+ Node names referenced in the expressions.
100
+ """
101
+ refs: set[str] = set()
102
+ for expr in expressions.values():
103
+ if not isinstance(expr, str):
104
+ continue
105
+ refs.update(_extract_node_refs(expr, known_nodes, macro_instances))
106
+ return refs
107
+
108
+
109
+ def extract_refs_from_template(
110
+ template: str,
111
+ known_nodes: frozenset[str],
112
+ macro_instances: frozenset[str] = frozenset(),
113
+ ) -> set[str]:
114
+ """Extract node names referenced in Jinja2-style templates.
115
+
116
+ Looks for ``{{node_name.field}}`` patterns where ``node_name``
117
+ matches a known node.
118
+
119
+ Parameters
120
+ ----------
121
+ template : str
122
+ Jinja2 template string.
123
+ known_nodes : frozenset[str]
124
+ Set of all node names in the pipeline.
125
+ macro_instances : frozenset[str]
126
+ Macro invocation names for prefix-based matching.
127
+
128
+ Returns
129
+ -------
130
+ set[str]
131
+ Node names referenced in the template.
132
+ """
133
+ refs: set[str] = set()
134
+ for match in _JINJA_VAR_RE.finditer(template):
135
+ candidate = match.group(1)
136
+ if candidate in _BUILTIN_NAMES:
137
+ continue
138
+ if candidate in known_nodes:
139
+ refs.add(candidate)
140
+ elif macro_instances:
141
+ for mi in macro_instances:
142
+ if candidate.startswith(f"{mi}_"):
143
+ refs.add(mi)
144
+ break
145
+ return refs
146
+
147
+
148
+ def extract_refs_from_string(
149
+ source: str,
150
+ known_nodes: frozenset[str],
151
+ macro_instances: frozenset[str] = frozenset(),
152
+ ) -> set[str]:
153
+ """Extract node references from a single string (condition, items, etc.).
154
+
155
+ Public wrapper around :func:`_extract_node_refs` for use by
156
+ ``_infer_deps`` when scanning composite node fields.
157
+
158
+ Parameters
159
+ ----------
160
+ source : str
161
+ A source path or expression string.
162
+ known_nodes : frozenset[str]
163
+ Set of all node names in the pipeline.
164
+ macro_instances : frozenset[str]
165
+ Macro invocation names for prefix-based matching.
166
+
167
+ Returns
168
+ -------
169
+ set[str]
170
+ Node names found.
171
+ """
172
+ return _extract_node_refs(source, known_nodes, macro_instances)
173
+
174
+
175
+ # Pattern: $input.field_name — captures the field name after $input.
176
+ _INPUT_FIELD_RE = re.compile(r"\$input\.([A-Za-z_][A-Za-z0-9_]*)")
177
+
178
+
179
+ def extract_input_refs_from_mapping(input_mapping: dict[str, Any]) -> set[str]:
180
+ """Extract ``$input.X`` field names from ``input_mapping`` values.
181
+
182
+ Unlike :func:`extract_refs_from_mapping` which *skips* ``$input`` references,
183
+ this function *collects* them — returning the field names (without the
184
+ ``$input.`` prefix) so the validator can cross-check them against the
185
+ pipeline's declared ``input_schema`` or sibling nodes.
186
+
187
+ Parameters
188
+ ----------
189
+ input_mapping : dict[str, Any]
190
+ Mapping of ``{target_field: "source_path"}``.
191
+
192
+ Returns
193
+ -------
194
+ set[str]
195
+ Field names referenced via ``$input.X``.
196
+ """
197
+ fields: set[str] = set()
198
+ for val in input_mapping.values():
199
+ if isinstance(val, str):
200
+ for match in _INPUT_FIELD_RE.finditer(val):
201
+ fields.add(match.group(1))
202
+ elif isinstance(val, list):
203
+ for item in val:
204
+ if isinstance(item, str):
205
+ for match in _INPUT_FIELD_RE.finditer(item):
206
+ fields.add(match.group(1))
207
+ return fields
208
+
209
+
210
+ def _extract_node_refs(
211
+ source: str,
212
+ known_nodes: frozenset[str],
213
+ macro_instances: frozenset[str] = frozenset(),
214
+ ) -> set[str]:
215
+ """Extract node references from a single source string.
216
+
217
+ Parameters
218
+ ----------
219
+ source : str
220
+ A source path or expression string.
221
+ known_nodes : frozenset[str]
222
+ Set of all node names in the pipeline.
223
+ macro_instances : frozenset[str]
224
+ Macro invocation names for prefix-based matching.
225
+
226
+ Returns
227
+ -------
228
+ set[str]
229
+ Node names found.
230
+ """
231
+ refs: set[str] = set()
232
+
233
+ # Skip pure $input references
234
+ stripped = source.strip()
235
+ if stripped == "$input" or stripped.startswith("$input."):
236
+ return refs
237
+
238
+ # Sort macro instances by length descending so longer prefixes match first.
239
+ # Without this, "extract" could greedily match "extract_rate_node" before
240
+ # the correct macro "extract_rate" gets a chance.
241
+ sorted_macros = sorted(macro_instances, key=len, reverse=True) if macro_instances else []
242
+
243
+ for match in _NODE_FIELD_RE.finditer(source):
244
+ candidate = match.group(1)
245
+ if candidate in RESERVED_NAMES or candidate in _BUILTIN_NAMES:
246
+ continue
247
+ if candidate in known_nodes:
248
+ refs.add(candidate)
249
+ elif sorted_macros:
250
+ for mi in sorted_macros:
251
+ if candidate.startswith(f"{mi}_"):
252
+ refs.add(mi)
253
+ break
254
+
255
+ # Bare identifiers — detect known nodes and macro-prefixed names that
256
+ # the dotted regex above cannot match. Handles both simple bare names
257
+ # ("analyzer") and bare names inside expressions ("analyzer + 1").
258
+ # Extract all identifier tokens, then look them up in known_nodes directly.
259
+ # Tokens that are part of a "node.field" chain are skipped because _NODE_FIELD_RE
260
+ # already handled those and they appear with a trailing or leading dot in the
261
+ # source — but we filter by checking the char before/after each token position.
262
+ for token_match in _IDENT_SPLIT_RE.finditer(stripped):
263
+ start = token_match.start()
264
+ end = token_match.end()
265
+ # Skip if preceded by '.' or '$' (part of node.field or $input)
266
+ if start > 0 and stripped[start - 1] in (".", "$"):
267
+ continue
268
+ # Skip if followed by '.' (this is the owner in a node.field pattern)
269
+ if end < len(stripped) and stripped[end] == ".":
270
+ continue
271
+ candidate = token_match.group(0)
272
+ if candidate in _BUILTIN_NAMES or candidate in RESERVED_NAMES:
273
+ continue
274
+ if candidate in known_nodes:
275
+ refs.add(candidate)
276
+ elif sorted_macros:
277
+ for mi in sorted_macros:
278
+ if candidate.startswith(f"{mi}_"):
279
+ refs.add(mi)
280
+ break
281
+
282
+ return refs