hexdag 0.5.0.dev1__tar.gz → 0.5.0.dev3__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 (264) hide show
  1. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/.gitignore +2 -2
  2. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/PKG-INFO +1 -1
  3. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/Canvas.tsx +1 -1
  4. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/NodeInspector.tsx +12 -12
  5. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/NodePalette.tsx +4 -3
  6. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/PluginManager.tsx +2 -2
  7. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/ValidationPanel.tsx +4 -3
  8. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/YamlEditor.tsx +2 -1
  9. hexdag-0.5.0.dev3/hexdag/studio/ui/src/lib/api.ts +227 -0
  10. hexdag-0.5.0.dev3/hexdag/studio/ui/src/lib/nodeTemplates.ts +207 -0
  11. hexdag-0.5.0.dev3/hexdag/studio/ui/src/lib/store.ts +247 -0
  12. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/pyproject.toml +13 -11
  13. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/LICENSE +0 -0
  14. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/README.md +0 -0
  15. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/__init__.py +0 -0
  16. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/__main__.py +0 -0
  17. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/adapters/executors/__init__.py +0 -0
  18. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/adapters/executors/local_executor.py +0 -0
  19. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/__init__.py +0 -0
  20. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/__init__.py +0 -0
  21. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/anthropic/__init__.py +0 -0
  22. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/anthropic/anthropic_adapter.py +0 -0
  23. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/__init__.py +0 -0
  24. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/csv/csv_adapter.py +0 -0
  25. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/pgvector/__init__.py +0 -0
  26. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/pgvector/pgvector_adapter.py +0 -0
  27. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/sqlalchemy/sqlalchemy_adapter.py +0 -0
  28. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/sqlite/__init__.py +0 -0
  29. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/database/sqlite/sqlite_adapter.py +0 -0
  30. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/local/README.md +0 -0
  31. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/local/__init__.py +0 -0
  32. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/local/local_observer_manager.py +0 -0
  33. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/__init__.py +0 -0
  34. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/file_memory_adapter.py +0 -0
  35. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/in_memory_memory.py +0 -0
  36. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/schemas.py +0 -0
  37. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/session_memory.py +0 -0
  38. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/sqlite_memory_adapter.py +0 -0
  39. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/memory/state_memory.py +0 -0
  40. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/README.md +0 -0
  41. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/__init__.py +0 -0
  42. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/hexdag.toml +0 -0
  43. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/mock_database.py +0 -0
  44. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/mock_embedding.py +0 -0
  45. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/mock_llm.py +0 -0
  46. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/mock_tool_adapter.py +0 -0
  47. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/mock/mock_tool_router.py +0 -0
  48. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/openai/__init__.py +0 -0
  49. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/openai/openai_adapter.py +0 -0
  50. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/secret/__init__.py +0 -0
  51. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/secret/local_secret_adapter.py +0 -0
  52. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/adapters/unified_tool_router.py +0 -0
  53. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/macros/__init__.py +0 -0
  54. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/macros/conversation_agent.py +0 -0
  55. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/macros/llm_macro.py +0 -0
  56. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/macros/reasoning_agent.py +0 -0
  57. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/macros/tool_macro.py +0 -0
  58. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/__init__.py +0 -0
  59. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/_discovery.py +0 -0
  60. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/agent_node.py +0 -0
  61. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/base_node_factory.py +0 -0
  62. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/composite_node.py +0 -0
  63. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/data_node.py +0 -0
  64. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/expression_node.py +0 -0
  65. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/function_node.py +0 -0
  66. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/llm_node.py +0 -0
  67. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/loop_node.py +0 -0
  68. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/mapped_input.py +0 -0
  69. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/port_call_node.py +0 -0
  70. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/tool_call_node.py +0 -0
  71. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/nodes/tool_utils.py +0 -0
  72. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/prompts/__init__.py +0 -0
  73. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/prompts/base.py +0 -0
  74. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/prompts/chat_prompts.py +0 -0
  75. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/prompts/error_correction_prompts.py +0 -0
  76. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/prompts/tool_prompts.py +0 -0
  77. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/tools/builtin_tools.py +0 -0
  78. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/builtin/tools/database_tools.py +0 -0
  79. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/__init__.py +0 -0
  80. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/__main__.py +0 -0
  81. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/__init__.py +0 -0
  82. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/build_cmd.py +0 -0
  83. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/create_cmd.py +0 -0
  84. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/docs_cmd.py +0 -0
  85. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/generate_types_cmd.py +0 -0
  86. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/init_cmd.py +0 -0
  87. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/pipeline_cmd.py +0 -0
  88. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/plugin_dev_cmd.py +0 -0
  89. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/plugins_cmd.py +0 -0
  90. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/studio_cmd.py +0 -0
  91. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/commands/validate_cmd.py +0 -0
  92. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/cli/main.py +0 -0
  93. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/__init__.py +0 -0
  94. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/config/__init__.py +0 -0
  95. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/config/loader.py +0 -0
  96. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/config/models.py +0 -0
  97. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/configurable.py +0 -0
  98. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/context/__init__.py +0 -0
  99. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/context/execution_context.py +0 -0
  100. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/docs/__init__.py +0 -0
  101. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/docs/extractors.py +0 -0
  102. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/docs/generators.py +0 -0
  103. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/docs/models.py +0 -0
  104. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/domain/__init__.py +0 -0
  105. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/domain/dag.py +0 -0
  106. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/exceptions.py +0 -0
  107. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/expression_parser.py +0 -0
  108. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/logging.py +0 -0
  109. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/models/__init__.py +0 -0
  110. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/models/base.py +0 -0
  111. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/__init__.py +0 -0
  112. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/body_executor.py +0 -0
  113. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/__init__.py +0 -0
  114. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/adapter_lifecycle_manager.py +0 -0
  115. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/checkpoint_manager.py +0 -0
  116. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/execution_coordinator.py +0 -0
  117. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/health_check_manager.py +0 -0
  118. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/input_mapper.py +0 -0
  119. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/lifecycle_manager.py +0 -0
  120. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/node_executor.py +0 -0
  121. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/secret_manager.py +0 -0
  122. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/components/wave_executor.py +0 -0
  123. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/constants.py +0 -0
  124. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/README.md +0 -0
  125. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/__init__.py +0 -0
  126. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/batching.py +0 -0
  127. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/decorators.py +0 -0
  128. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/events.py +0 -0
  129. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/observers/__init__.py +0 -0
  130. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/observers/core_observers.py +0 -0
  131. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/observers/models.py +0 -0
  132. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/events/taxonomy.py +0 -0
  133. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/hook_context.py +0 -0
  134. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/hooks.py +0 -0
  135. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/models.py +0 -0
  136. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/orchestrator.py +0 -0
  137. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/orchestrator_factory.py +0 -0
  138. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/port_wrappers.py +0 -0
  139. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/prompt/__init__.py +0 -0
  140. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/orchestration/prompt/template.py +0 -0
  141. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/__init__.py +0 -0
  142. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/component_instantiator.py +0 -0
  143. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/include_tag.py +0 -0
  144. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/pipeline_config.py +0 -0
  145. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/py_tag.py +0 -0
  146. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/tag_discovery.py +0 -0
  147. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/yaml_builder.py +0 -0
  148. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/pipeline_builder/yaml_validator.py +0 -0
  149. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/__init__.py +0 -0
  150. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/api_call.py +0 -0
  151. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/database.py +0 -0
  152. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/embedding.py +0 -0
  153. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/executor.py +0 -0
  154. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/file_storage.py +0 -0
  155. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/healthcheck.py +0 -0
  156. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/llm.py +0 -0
  157. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/memory.py +0 -0
  158. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/observer_manager.py +0 -0
  159. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/secret.py +0 -0
  160. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports/tool_router.py +0 -0
  161. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/ports_builder.py +0 -0
  162. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/protocols.py +0 -0
  163. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/resolver.py +0 -0
  164. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/schema/__init__.py +0 -0
  165. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/schema/generator.py +0 -0
  166. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/secrets.py +0 -0
  167. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/types.py +0 -0
  168. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/utils/async_warnings.py +0 -0
  169. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/utils/schema_conversion.py +0 -0
  170. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/utils/sql_validation.py +0 -0
  171. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/validation/secure_json.py +0 -0
  172. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/core/yaml_macro.py +0 -0
  173. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/mcp_server.py +0 -0
  174. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/__init__.py +0 -0
  175. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/build_ui.py +0 -0
  176. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/__init__.py +0 -0
  177. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/main.py +0 -0
  178. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/__init__.py +0 -0
  179. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/execute.py +0 -0
  180. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/export.py +0 -0
  181. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/files.py +0 -0
  182. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/plugins.py +0 -0
  183. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/server/routes/validate.py +0 -0
  184. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/index.html +0 -0
  185. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/package-lock.json +0 -0
  186. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/package.json +0 -0
  187. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/postcss.config.js +0 -0
  188. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/public/hexdag.svg +0 -0
  189. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/App.tsx +0 -0
  190. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/ContextMenu.tsx +0 -0
  191. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/FileBrowser.tsx +0 -0
  192. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/Header.tsx +0 -0
  193. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/HexdagNode.tsx +0 -0
  194. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/NodePortsSection.tsx +0 -0
  195. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/PortsEditor.tsx +0 -0
  196. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/PythonEditor.tsx +0 -0
  197. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/components/index.ts +0 -0
  198. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/index.css +0 -0
  199. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/main.tsx +0 -0
  200. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/types/index.ts +0 -0
  201. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/src/vite-env.d.ts +0 -0
  202. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/tailwind.config.js +0 -0
  203. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/tsconfig.json +0 -0
  204. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/tsconfig.node.json +0 -0
  205. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/studio/ui/vite.config.ts +0 -0
  206. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/visualization/__init__.py +0 -0
  207. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag/visualization/dag_visualizer.py +0 -0
  208. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/.gitignore +0 -0
  209. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/README.md +0 -0
  210. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/__init__.py +0 -0
  211. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/LICENSE +0 -0
  212. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/README.md +0 -0
  213. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/__init__.py +0 -0
  214. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/azure_blob_adapter.py +0 -0
  215. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/azure_cosmos_adapter.py +0 -0
  216. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/azure_keyvault_adapter.py +0 -0
  217. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/azure_openai_adapter.py +0 -0
  218. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/pyproject.toml +0 -0
  219. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/tests/__init__.py +0 -0
  220. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/tests/test_azure_blob_adapter.py +0 -0
  221. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +0 -0
  222. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +0 -0
  223. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/azure/tests/test_azure_openai_adapter.py +0 -0
  224. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/README.md +0 -0
  225. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/__init__.py +0 -0
  226. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +0 -0
  227. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +0 -0
  228. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +0 -0
  229. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +0 -0
  230. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag.toml +0 -0
  231. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +0 -0
  232. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +0 -0
  233. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +0 -0
  234. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +0 -0
  235. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +0 -0
  236. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/outlook.py +0 -0
  237. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +0 -0
  238. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +0 -0
  239. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/pyproject.toml +0 -0
  240. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/test_transform.py +0 -0
  241. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +0 -0
  242. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/LICENSE +0 -0
  243. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/README.md +0 -0
  244. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/__init__.py +0 -0
  245. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/mysql_adapter.py +0 -0
  246. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/pyproject.toml +0 -0
  247. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +0 -0
  248. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/README.md +0 -0
  249. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/__init__.py +0 -0
  250. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/file/__init__.py +0 -0
  251. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/file/local.py +0 -0
  252. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/ports/__init__.py +0 -0
  253. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/ports/vector_store.py +0 -0
  254. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/sql/__init__.py +0 -0
  255. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/sql/base.py +0 -0
  256. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/sql/mysql.py +0 -0
  257. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/sql/postgresql.py +0 -0
  258. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/tests/__init__.py +0 -0
  259. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/tests/test_local_file_storage.py +0 -0
  260. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/tests/test_sql_adapters.py +0 -0
  261. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/vector/__init__.py +0 -0
  262. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/vector/chromadb.py +0 -0
  263. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/vector/in_memory.py +0 -0
  264. {hexdag-0.5.0.dev1 → hexdag-0.5.0.dev3}/hexdag_plugins/storage/vector/pgvector.py +0 -0
@@ -10,8 +10,8 @@ dist/
10
10
  downloads/
11
11
  eggs/
12
12
  .eggs/
13
- lib/
14
- lib64/
13
+ /lib/
14
+ /lib64/
15
15
  parts/
16
16
  sdist/
17
17
  var/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hexdag
3
- Version: 0.5.0.dev1
3
+ Version: 0.5.0.dev3
4
4
  Summary: Lightweight DAG orchestration framework with enterprise pipeline capabilities
5
5
  Project-URL: Homepage, https://hexdag.ai
6
6
  Project-URL: Repository, https://github.com/omniviser/hexdag
@@ -92,7 +92,7 @@ export default function Canvas({ onNodeSelect, selectedNodeId }: CanvasProps) {
92
92
  setTimeout(() => {
93
93
  const currentNodes = useStudioStore.getState().nodes
94
94
  const deletedIds = deletions.map((d) => d.id)
95
- const newNodes = currentNodes.filter((n) => !deletedIds.includes(n.id))
95
+ const newNodes = currentNodes.filter((n: HexdagNodeType) => !deletedIds.includes(n.id))
96
96
  setStoreNodes(newNodes)
97
97
  syncCanvasToYaml()
98
98
 
@@ -5,7 +5,7 @@ import { getNodeTemplate, nodeTemplates } from '../lib/nodeTemplates'
5
5
  import PythonEditor from './PythonEditor'
6
6
  import PortsEditor from './PortsEditor'
7
7
  import NodePortsSection from './NodePortsSection'
8
- import type { HexdagNode } from '../types'
8
+ import type { HexdagNode, HexdagEdge, NodeTemplate } from '../types'
9
9
 
10
10
  interface NodeInspectorProps {
11
11
  nodeId: string | null
@@ -16,7 +16,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
16
16
  const { nodes, setNodes, edges, setEdges, syncCanvasToYaml } = useStudioStore()
17
17
  const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set(['general', 'spec']))
18
18
 
19
- const node = nodes.find((n) => n.id === nodeId)
19
+ const node = nodes.find((n: HexdagNode) => n.id === nodeId)
20
20
  const template = node ? getNodeTemplate(node.data.kind) : null
21
21
 
22
22
  // Show PortsEditor when no node is selected
@@ -36,7 +36,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
36
36
 
37
37
  const updateNode = (updates: Partial<HexdagNode['data']>) => {
38
38
  setNodes(
39
- nodes.map((n) =>
39
+ nodes.map((n: HexdagNode) =>
40
40
  n.id === nodeId
41
41
  ? { ...n, data: { ...n.data, ...updates } }
42
42
  : n
@@ -60,14 +60,14 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
60
60
  if (!newName || newName === nodeId) return
61
61
 
62
62
  // Check for duplicates
63
- if (nodes.some((n) => n.id === newName)) {
63
+ if (nodes.some((n: HexdagNode) => n.id === newName)) {
64
64
  alert('A node with this name already exists')
65
65
  return
66
66
  }
67
67
 
68
68
  // Update node id
69
69
  setNodes(
70
- nodes.map((n) =>
70
+ nodes.map((n: HexdagNode) =>
71
71
  n.id === nodeId
72
72
  ? { ...n, id: newName, data: { ...n.data, label: newName } }
73
73
  : n
@@ -76,7 +76,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
76
76
 
77
77
  // Update edges
78
78
  setEdges(
79
- edges.map((e) => ({
79
+ edges.map((e: HexdagEdge) => ({
80
80
  ...e,
81
81
  id: e.id.replace(nodeId, newName),
82
82
  source: e.source === nodeId ? newName : e.source,
@@ -100,8 +100,8 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
100
100
  const deleteNode = () => {
101
101
  if (!confirm(`Delete node "${nodeId}"?`)) return
102
102
 
103
- setNodes(nodes.filter((n) => n.id !== nodeId))
104
- setEdges(edges.filter((e) => e.source !== nodeId && e.target !== nodeId))
103
+ setNodes(nodes.filter((n: HexdagNode) => n.id !== nodeId))
104
+ setEdges(edges.filter((e: HexdagEdge) => e.source !== nodeId && e.target !== nodeId))
105
105
  syncCanvasToYaml()
106
106
  onClose()
107
107
  }
@@ -109,7 +109,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
109
109
  const duplicateNode = () => {
110
110
  let newName = `${nodeId}_copy`
111
111
  let counter = 1
112
- while (nodes.some((n) => n.id === newName)) {
112
+ while (nodes.some((n: HexdagNode) => n.id === newName)) {
113
113
  newName = `${nodeId}_copy_${counter}`
114
114
  counter++
115
115
  }
@@ -132,7 +132,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
132
132
  }
133
133
 
134
134
  // Get dependencies (incoming edges)
135
- const dependencies = edges.filter((e) => e.target === nodeId).map((e) => e.source)
135
+ const dependencies = edges.filter((e: HexdagEdge) => e.target === nodeId).map((e: HexdagEdge) => e.source)
136
136
 
137
137
  return (
138
138
  <div className="h-full flex flex-col bg-hex-surface">
@@ -198,7 +198,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
198
198
  onChange={(e) => changeNodeKind(e.target.value)}
199
199
  className="w-full bg-hex-bg border border-hex-border rounded px-2 py-1.5 text-xs text-hex-text focus:border-hex-accent focus:outline-none"
200
200
  >
201
- {nodeTemplates.map((t) => (
201
+ {nodeTemplates.map((t: NodeTemplate) => (
202
202
  <option key={t.kind} value={t.kind}>
203
203
  {t.label}
204
204
  </option>
@@ -211,7 +211,7 @@ export default function NodeInspector({ nodeId, onClose }: NodeInspectorProps) {
211
211
  {dependencies.length === 0 ? (
212
212
  <div className="text-[10px] text-hex-text-muted italic">No dependencies</div>
213
213
  ) : (
214
- dependencies.map((dep) => (
214
+ dependencies.map((dep: string) => (
215
215
  <div
216
216
  key={dep}
217
217
  className="flex items-center gap-2 text-xs bg-hex-bg rounded px-2 py-1"
@@ -23,6 +23,7 @@ import {
23
23
  } from 'lucide-react'
24
24
  import { nodeTemplates } from '../lib/nodeTemplates'
25
25
  import { getAllPluginNodes, type PluginNode } from '../lib/api'
26
+ import type { NodeTemplate } from '../types'
26
27
 
27
28
  const iconMap: Record<string, typeof Code> = {
28
29
  Code,
@@ -60,7 +61,7 @@ export default function NodePalette() {
60
61
 
61
62
  // Group nodes by plugin
62
63
  const groupedNodes = nodes.reduce(
63
- (acc, node) => {
64
+ (acc: Record<string, PluginNode[]>, node: PluginNode) => {
64
65
  const plugin = node.plugin || 'unknown'
65
66
  if (!acc[plugin]) {
66
67
  acc[plugin] = []
@@ -72,7 +73,7 @@ export default function NodePalette() {
72
73
  )
73
74
 
74
75
  setPluginNodeSections(
75
- Object.entries(groupedNodes).map(([plugin, nodes]) => ({
76
+ Object.entries(groupedNodes).map(([plugin, nodes]: [string, PluginNode[]]) => ({
76
77
  plugin,
77
78
  nodes,
78
79
  expanded: true,
@@ -134,7 +135,7 @@ export default function NodePalette() {
134
135
  </button>
135
136
  {builtinExpanded && (
136
137
  <div className="px-2 pb-2 space-y-1">
137
- {nodeTemplates.map((template) => {
138
+ {nodeTemplates.map((template: NodeTemplate) => {
138
139
  const Icon = iconMap[template.icon] || Box
139
140
  return (
140
141
  <div
@@ -247,7 +247,7 @@ function PluginCard({
247
247
  Adapters ({plugin.adapters.length})
248
248
  </h4>
249
249
  <div className="grid grid-cols-2 gap-2">
250
- {plugin.adapters.map((adapter, idx) => {
250
+ {plugin.adapters.map((adapter: PluginAdapter, idx: number) => {
251
251
  const Icon = getAdapterIcon(adapter)
252
252
  const color = getPortTypeColor(adapter.port_type)
253
253
  return (
@@ -300,7 +300,7 @@ function PluginCard({
300
300
  Nodes ({plugin.nodes.length})
301
301
  </h4>
302
302
  <div className="grid grid-cols-2 gap-2">
303
- {plugin.nodes.map((node, idx) => (
303
+ {plugin.nodes.map((node: PluginNode, idx: number) => (
304
304
  <NodeCard key={idx} node={node} />
305
305
  ))}
306
306
  </div>
@@ -1,5 +1,6 @@
1
1
  import { CheckCircle, XCircle, AlertTriangle, Info } from 'lucide-react'
2
2
  import { useStudioStore } from '../lib/store'
3
+ import type { ValidationError } from '../types'
3
4
 
4
5
  export default function ValidationPanel() {
5
6
  const { validation } = useStudioStore()
@@ -15,8 +16,8 @@ export default function ValidationPanel() {
15
16
  )
16
17
  }
17
18
 
18
- const errorCount = validation.errors.filter((e) => e.severity === 'error').length
19
- const warningCount = validation.errors.filter((e) => e.severity === 'warning').length
19
+ const errorCount = validation.errors.filter((e: ValidationError) => e.severity === 'error').length
20
+ const warningCount = validation.errors.filter((e: ValidationError) => e.severity === 'warning').length
20
21
 
21
22
  return (
22
23
  <div className="h-full flex flex-col">
@@ -68,7 +69,7 @@ export default function ValidationPanel() {
68
69
  </div>
69
70
  )}
70
71
 
71
- {validation.errors.map((error, index) => (
72
+ {validation.errors.map((error: ValidationError, index: number) => (
72
73
  <div
73
74
  key={index}
74
75
  className={`
@@ -3,6 +3,7 @@ import Editor, { type OnMount, type OnChange } from '@monaco-editor/react'
3
3
  import type * as Monaco from 'monaco-editor'
4
4
  import { useStudioStore } from '../lib/store'
5
5
  import { validateYaml } from '../lib/api'
6
+ import type { ValidationError } from '../types'
6
7
 
7
8
  export default function YamlEditor() {
8
9
  const editorRef = useRef<Monaco.editor.IStandaloneCodeEditor | null>(null)
@@ -124,7 +125,7 @@ export default function YamlEditor() {
124
125
  if (monacoRef.current && editorRef.current) {
125
126
  const model = editorRef.current.getModel()
126
127
  if (model) {
127
- const markers: Monaco.editor.IMarkerData[] = result.errors.map((err) => ({
128
+ const markers: Monaco.editor.IMarkerData[] = result.errors.map((err: ValidationError) => ({
128
129
  severity: err.severity === 'error'
129
130
  ? monacoRef.current!.MarkerSeverity.Error
130
131
  : err.severity === 'warning'
@@ -0,0 +1,227 @@
1
+ import type { FileInfo, FileContent, ValidationResult } from '../types'
2
+
3
+ const API_BASE = '/api'
4
+
5
+ // Plugin types
6
+ export interface PluginNode {
7
+ kind: string
8
+ name: string
9
+ description?: string
10
+ plugin: string
11
+ color: string
12
+ defaultSpec?: Record<string, unknown>
13
+ }
14
+
15
+ export interface PluginAdapter {
16
+ name: string
17
+ port_type: string
18
+ plugin: string
19
+ description?: string
20
+ config_schema?: Record<string, unknown>
21
+ secrets: string[]
22
+ }
23
+
24
+ export interface PluginInfo {
25
+ name: string
26
+ version: string
27
+ description?: string
28
+ author?: string
29
+ adapters: PluginAdapter[]
30
+ nodes: PluginNode[]
31
+ enabled: boolean
32
+ }
33
+
34
+ // Execution types
35
+ export interface ExecutionResult {
36
+ success: boolean
37
+ outputs?: Record<string, unknown>
38
+ error?: string
39
+ execution_time?: number
40
+ duration_ms: number
41
+ node_results?: Record<string, unknown>
42
+ }
43
+
44
+ // Helper function for API requests
45
+ async function apiRequest<T>(
46
+ endpoint: string,
47
+ options: RequestInit = {}
48
+ ): Promise<T> {
49
+ const url = `${API_BASE}${endpoint}`
50
+ const response = await fetch(url, {
51
+ ...options,
52
+ headers: {
53
+ 'Content-Type': 'application/json',
54
+ ...options.headers,
55
+ },
56
+ })
57
+
58
+ if (!response.ok) {
59
+ const error = await response.text()
60
+ throw new Error(`API error: ${response.status} - ${error}`)
61
+ }
62
+
63
+ return response.json()
64
+ }
65
+
66
+ // File operations
67
+ export async function listFiles(path: string = '.'): Promise<FileInfo[]> {
68
+ return apiRequest<FileInfo[]>(`/files?path=${encodeURIComponent(path)}`)
69
+ }
70
+
71
+ export async function readFile(path: string): Promise<FileContent> {
72
+ return apiRequest<FileContent>(`/files/${encodeURIComponent(path)}`)
73
+ }
74
+
75
+ export async function saveFile(path: string, content: string): Promise<void> {
76
+ await apiRequest(`/files/${encodeURIComponent(path)}`, {
77
+ method: 'PUT',
78
+ body: JSON.stringify({ content }),
79
+ })
80
+ }
81
+
82
+ export async function deleteFile(path: string): Promise<void> {
83
+ await apiRequest(`/files/${encodeURIComponent(path)}`, {
84
+ method: 'DELETE',
85
+ })
86
+ }
87
+
88
+ // Validation
89
+ export async function validateYaml(
90
+ content: string,
91
+ filePath?: string
92
+ ): Promise<ValidationResult> {
93
+ return apiRequest<ValidationResult>('/validate', {
94
+ method: 'POST',
95
+ body: JSON.stringify({ content, file_path: filePath }),
96
+ })
97
+ }
98
+
99
+ // Execution
100
+ export async function executePipeline(
101
+ yaml: string,
102
+ inputs: Record<string, unknown> = {},
103
+ dryRun: boolean = false
104
+ ): Promise<ExecutionResult> {
105
+ return apiRequest<ExecutionResult>('/execute', {
106
+ method: 'POST',
107
+ body: JSON.stringify({
108
+ yaml,
109
+ inputs,
110
+ dry_run: dryRun,
111
+ }),
112
+ })
113
+ }
114
+
115
+ // Project operations
116
+ export async function downloadProject(
117
+ yamlContent?: string,
118
+ filename?: string,
119
+ includeAssets?: boolean
120
+ ): Promise<void> {
121
+ const response = await fetch(`${API_BASE}/project/download`, {
122
+ method: 'POST',
123
+ headers: { 'Content-Type': 'application/json' },
124
+ body: JSON.stringify({
125
+ yaml: yamlContent,
126
+ filename,
127
+ include_assets: includeAssets,
128
+ }),
129
+ })
130
+ if (!response.ok) {
131
+ throw new Error(`Failed to download project: ${response.status}`)
132
+ }
133
+
134
+ const blob = await response.blob()
135
+ const url = window.URL.createObjectURL(blob)
136
+ const a = document.createElement('a')
137
+ a.href = url
138
+ a.download = filename || 'hexdag-project.zip'
139
+ document.body.appendChild(a)
140
+ a.click()
141
+ document.body.removeChild(a)
142
+ window.URL.revokeObjectURL(url)
143
+ }
144
+
145
+ // Plugin discovery
146
+ export async function getAllPluginNodes(): Promise<PluginNode[]> {
147
+ try {
148
+ const plugins = await listPlugins()
149
+ const nodes: PluginNode[] = []
150
+
151
+ for (const plugin of plugins) {
152
+ const pluginNodes = Array.isArray(plugin.nodes) ? plugin.nodes : []
153
+ for (const node of pluginNodes) {
154
+ nodes.push({
155
+ ...node,
156
+ plugin: plugin.name,
157
+ })
158
+ }
159
+ }
160
+
161
+ return nodes
162
+ } catch (error) {
163
+ console.error('Failed to get plugin nodes:', error)
164
+ return []
165
+ }
166
+ }
167
+
168
+ export async function getAllPluginAdapters(): Promise<PluginAdapter[]> {
169
+ try {
170
+ const plugins = await listPlugins()
171
+ const adapters: PluginAdapter[] = []
172
+
173
+ for (const plugin of plugins) {
174
+ const pluginAdapters = Array.isArray(plugin.adapters) ? plugin.adapters : []
175
+ for (const adapter of pluginAdapters) {
176
+ adapters.push({
177
+ ...adapter,
178
+ plugin: plugin.name,
179
+ })
180
+ }
181
+ }
182
+
183
+ return adapters
184
+ } catch (error) {
185
+ console.error('Failed to get plugin adapters:', error)
186
+ return []
187
+ }
188
+ }
189
+
190
+ export async function listPlugins(): Promise<PluginInfo[]> {
191
+ try {
192
+ const response = await apiRequest<PluginInfo[] | { plugins: PluginInfo[] }>('/plugins')
193
+ // Handle both array response and object with plugins property
194
+ if (Array.isArray(response)) {
195
+ return response
196
+ }
197
+ if (response && typeof response === 'object' && 'plugins' in response && Array.isArray(response.plugins)) {
198
+ return response.plugins
199
+ }
200
+ console.warn('Unexpected plugins response format:', response)
201
+ return []
202
+ } catch (error) {
203
+ console.error('Failed to list plugins:', error)
204
+ return []
205
+ }
206
+ }
207
+
208
+ // Registry endpoints
209
+ export async function getRegisteredNodes(): Promise<
210
+ Array<{ kind: string; name: string; namespace: string }>
211
+ > {
212
+ try {
213
+ return await apiRequest('/registry/nodes')
214
+ } catch {
215
+ return []
216
+ }
217
+ }
218
+
219
+ export async function getRegisteredAdapters(): Promise<
220
+ Array<{ name: string; port_type: string; namespace: string }>
221
+ > {
222
+ try {
223
+ return await apiRequest('/registry/adapters')
224
+ } catch {
225
+ return []
226
+ }
227
+ }
@@ -0,0 +1,207 @@
1
+ import type { NodeTemplate } from '../types'
2
+
3
+ // Built-in hexDAG node templates
4
+ export const nodeTemplates: NodeTemplate[] = [
5
+ {
6
+ kind: 'function_node',
7
+ label: 'Function',
8
+ description: 'Execute Python functions',
9
+ icon: 'Code',
10
+ color: '#3b82f6', // blue-500
11
+ defaultSpec: {
12
+ fn: '',
13
+ },
14
+ },
15
+ {
16
+ kind: 'llm_node',
17
+ label: 'LLM',
18
+ description: 'Language model interactions',
19
+ icon: 'Brain',
20
+ color: '#8b5cf6', // violet-500
21
+ defaultSpec: {
22
+ prompt_template: '',
23
+ },
24
+ requiredPorts: ['llm'],
25
+ },
26
+ {
27
+ kind: 'agent_node',
28
+ label: 'Agent',
29
+ description: 'ReAct agent with tools',
30
+ icon: 'Bot',
31
+ color: '#ec4899', // pink-500
32
+ defaultSpec: {
33
+ initial_prompt_template: '',
34
+ max_steps: 5,
35
+ },
36
+ requiredPorts: ['llm', 'tool_router'],
37
+ },
38
+ {
39
+ kind: 'conditional_node',
40
+ label: 'Conditional',
41
+ description: 'Conditional branching',
42
+ icon: 'GitBranch',
43
+ color: '#f59e0b', // amber-500
44
+ defaultSpec: {
45
+ condition: '',
46
+ if_true: null,
47
+ if_false: null,
48
+ },
49
+ },
50
+ {
51
+ kind: 'loop_node',
52
+ label: 'Loop',
53
+ description: 'Iterative processing',
54
+ icon: 'Repeat',
55
+ color: '#10b981', // emerald-500
56
+ defaultSpec: {
57
+ iterations: 1,
58
+ body: null,
59
+ },
60
+ },
61
+ {
62
+ kind: 'input_node',
63
+ label: 'Input',
64
+ description: 'Pipeline input',
65
+ icon: 'FileText',
66
+ color: '#06b6d4', // cyan-500
67
+ defaultSpec: {
68
+ schema: {},
69
+ },
70
+ },
71
+ {
72
+ kind: 'output_node',
73
+ label: 'Output',
74
+ description: 'Pipeline output',
75
+ icon: 'FileText',
76
+ color: '#14b8a6', // teal-500
77
+ defaultSpec: {
78
+ schema: {},
79
+ },
80
+ },
81
+ {
82
+ kind: 'transform_node',
83
+ label: 'Transform',
84
+ description: 'Data transformation',
85
+ icon: 'Scissors',
86
+ color: '#f97316', // orange-500
87
+ defaultSpec: {
88
+ transform_fn: '',
89
+ },
90
+ },
91
+ {
92
+ kind: 'parallel_node',
93
+ label: 'Parallel',
94
+ description: 'Parallel execution',
95
+ icon: 'Cpu',
96
+ color: '#6366f1', // indigo-500
97
+ defaultSpec: {
98
+ branches: [],
99
+ },
100
+ },
101
+ ]
102
+
103
+ // Map of kind to template for quick lookup
104
+ const templateMap = new Map<string, NodeTemplate>(
105
+ nodeTemplates.map((t) => [t.kind, t])
106
+ )
107
+
108
+ // Default colors for unknown node kinds
109
+ const defaultColors: Record<string, string> = {
110
+ function: '#3b82f6',
111
+ llm: '#8b5cf6',
112
+ agent: '#ec4899',
113
+ conditional: '#f59e0b',
114
+ loop: '#10b981',
115
+ input: '#06b6d4',
116
+ output: '#14b8a6',
117
+ transform: '#f97316',
118
+ parallel: '#6366f1',
119
+ default: '#6b7280',
120
+ }
121
+
122
+ /**
123
+ * Get a node template by kind
124
+ */
125
+ export function getNodeTemplate(kind: string): NodeTemplate | undefined {
126
+ // Direct lookup
127
+ if (templateMap.has(kind)) {
128
+ return templateMap.get(kind)
129
+ }
130
+
131
+ // Try with _node suffix
132
+ if (templateMap.has(`${kind}_node`)) {
133
+ return templateMap.get(`${kind}_node`)
134
+ }
135
+
136
+ // Handle namespaced kinds (e.g., 'etl:file_reader_node')
137
+ if (kind.includes(':')) {
138
+ const baseName = kind.split(':').pop()
139
+ if (baseName && templateMap.has(baseName)) {
140
+ return templateMap.get(baseName)
141
+ }
142
+ }
143
+
144
+ return undefined
145
+ }
146
+
147
+ /**
148
+ * Get the color for a node kind
149
+ */
150
+ export function getNodeColor(kind: string): string {
151
+ // Try to get from template
152
+ const template = getNodeTemplate(kind)
153
+ if (template) {
154
+ return template.color
155
+ }
156
+
157
+ // Try to match based on kind name
158
+ const kindLower = kind.toLowerCase()
159
+ for (const [key, color] of Object.entries(defaultColors)) {
160
+ if (kindLower.includes(key)) {
161
+ return color
162
+ }
163
+ }
164
+
165
+ return defaultColors.default
166
+ }
167
+
168
+ /**
169
+ * Get the icon name for a node kind
170
+ */
171
+ export function getNodeIcon(kind: string): string {
172
+ const template = getNodeTemplate(kind)
173
+ if (template) {
174
+ return template.icon
175
+ }
176
+
177
+ // Default icons based on kind name
178
+ const kindLower = kind.toLowerCase()
179
+ if (kindLower.includes('function')) return 'Code'
180
+ if (kindLower.includes('llm')) return 'Brain'
181
+ if (kindLower.includes('agent')) return 'Bot'
182
+ if (kindLower.includes('conditional') || kindLower.includes('branch'))
183
+ return 'GitBranch'
184
+ if (kindLower.includes('loop') || kindLower.includes('repeat')) return 'Repeat'
185
+ if (kindLower.includes('input') || kindLower.includes('output'))
186
+ return 'FileText'
187
+ if (kindLower.includes('transform')) return 'Scissors'
188
+ if (kindLower.includes('parallel')) return 'Cpu'
189
+
190
+ return 'Box'
191
+ }
192
+
193
+ /**
194
+ * Get the default spec for a node kind
195
+ */
196
+ export function getDefaultSpec(kind: string): Record<string, unknown> {
197
+ const template = getNodeTemplate(kind)
198
+ return template?.defaultSpec || {}
199
+ }
200
+
201
+ /**
202
+ * Get required ports for a node kind
203
+ */
204
+ export function getRequiredPorts(kind: string): string[] {
205
+ const template = getNodeTemplate(kind)
206
+ return template?.requiredPorts || []
207
+ }