hexdag 0.7.0.dev10__tar.gz → 0.7.0.dev12__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.
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/PKG-INFO +4 -1
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/__init__.py +3 -0
- hexdag-0.7.0.dev12/hexdag/api/logs.py +221 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/config_loader.py +10 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/plugins/__init__.py +6 -0
- hexdag-0.7.0.dev12/hexdag/compiler/plugins/adapter_definition.py +140 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/plugins/macro_definition.py +27 -5
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/plugins/macro_entity.py +93 -28
- hexdag-0.7.0.dev12/hexdag/compiler/plugins/middleware_definition.py +122 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/yaml_builder.py +104 -11
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/yaml_validator.py +151 -3
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/executors/local_executor.py +11 -3
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/pipeline_spawner/local.py +28 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/local.py +37 -3
- hexdag-0.7.0.dev12/hexdag/drivers/vfs/providers/sys_caps_provider.py +166 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/config/models.py +27 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/configurable.py +52 -2
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/context/__init__.py +4 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/context/execution_context.py +37 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/__init__.py +4 -0
- hexdag-0.7.0.dev12/hexdag/kernel/domain/caps.py +248 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/dag.py +20 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/pipeline_config.py +4 -3
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/exceptions.py +32 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/expression_parser.py +142 -13
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/logging.py +3 -6
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/execution_coordinator.py +35 -4
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/lifecycle_manager.py +11 -7
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/__init__.py +4 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/events.py +35 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/orchestrator.py +7 -2
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/orchestrator_factory.py +134 -2
- hexdag-0.7.0.dev12/hexdag/kernel/orchestration/port_wrappers.py +96 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/pipeline_runner.py +27 -4
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/__init__.py +2 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/detection.py +9 -1
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/llm.py +90 -29
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/pipeline_spawner.py +4 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/tool_router.py +20 -7
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/yaml_macro.py +151 -18
- hexdag-0.7.0.dev12/hexdag/stdlib/adapters/anthropic/anthropic_adapter.py +383 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/mock_llm.py +31 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/openai/openai_adapter.py +129 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/adapters/redis/__init__.py +22 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/adapters/redis/redis_adapter.py +230 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/observers/__init__.py +9 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/lib/observers/port_call_observers.py +338 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/macros/llm_macro.py +1 -3
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/macros/reasoning_agent.py +2 -2
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/__init__.py +56 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/compose.py +27 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/distributed_cache.py +190 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/observable.py +135 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/observable_tool_router.py +70 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/rate_limiter.py +131 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/response_cache.py +157 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/retry.py +144 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/structured_output.py +167 -0
- hexdag-0.7.0.dev12/hexdag/stdlib/middleware/timeout.py +100 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/agent_node.py +6 -2
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/api_call_node.py +2 -1
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/composite_node.py +7 -2
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/expression_node.py +6 -1
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/function_node.py +6 -2
- hexdag-0.7.0.dev12/hexdag/stdlib/nodes/llm_node.py +516 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/mapped_input.py +31 -10
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/tool_call_node.py +2 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/pyproject.toml +16 -4
- hexdag-0.7.0.dev10/hexdag/kernel/orchestration/port_wrappers.py +0 -316
- hexdag-0.7.0.dev10/hexdag/stdlib/adapters/anthropic/anthropic_adapter.py +0 -196
- hexdag-0.7.0.dev10/hexdag/stdlib/nodes/llm_node.py +0 -506
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/.gitignore +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/LICENSE +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/__main__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/components.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/documentation.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/execution.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/export.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/pipeline.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/processes.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/validation.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/api/vfs.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/__main__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/build_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/create_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/docs_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/generate_types_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/init_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/lint_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/pipeline_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/plugin_dev_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/plugins_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/studio_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/commands/validate_cmd.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/cli/main.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/component_instantiator.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/include_tag.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/pipeline_config.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/plugins/config_definition.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/plugins/node_entity.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/preprocessing/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/preprocessing/_type_guards.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/preprocessing/env_vars.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/preprocessing/include.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/preprocessing/template.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/py_tag.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/reference_resolver.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/system_builder.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/compiler/tag_discovery.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/docs/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/docs/extractors.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/docs/generators.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/docs/models.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/executors/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/http_client/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/http_client/http_client.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/observer_manager/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/observer_manager/local.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/pipeline_spawner/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/providers/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/providers/lib_provider.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/providers/proc_entities_provider.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/providers/proc_runs_provider.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/drivers/vfs/providers/proc_scheduled_provider.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/_alias_registry.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/config/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/config/loader.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/discovery.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/agent_tools.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/entity_state.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/pipeline_run.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/scheduled_task.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/system_config.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/domain/vfs.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/lib_base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/linting/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/linting/models.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/linting/pipeline_rules.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/linting/rules.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/models/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/models/base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/body_executor.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/adapter_lifecycle_manager.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/checkpoint_manager.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/health_check_manager.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/input_mapper.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/node_executor.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/components/secret_manager.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/constants.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/batching.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/decorators.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/events/observers/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/hook_context.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/hooks.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/models.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/prompt/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/orchestration/prompt/template.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/pipeline_builder/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/api_call.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/data_store.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/database.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/executor.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/file_storage.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/healthcheck.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/observer_manager.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/secret.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/vector_search.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports/vfs.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/ports_builder.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/protocols.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/resolver.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/schema/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/schema/generator.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/secrets.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/service.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/system_runner.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/types.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/async_warnings.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/caching.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/input_normalization.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/node_timer.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/schema_conversion.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/serialization.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/utils/sql_validation.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/validation/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/validation/retry.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/validation/sanitized_types.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/kernel/validation/secure_json.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/mcp_server.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/py.typed +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/_discovery.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/anthropic/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/csv/csv_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/pgvector/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/pgvector/pgvector_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/sqlalchemy/sqlalchemy_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/sqlite/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/database/sqlite/sqlite_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/local/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/local/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/collection_memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/file_memory_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/in_memory_memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/schemas.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/session_memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/sqlite_memory_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/memory/state_memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/hexdag.yaml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/mock_database.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/mock_embedding.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/mock/mock_http.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/openai/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/secret/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/adapters/secret/local_secret_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/database_tools.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/entity_state.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/observers/core_observers.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/observers/cost_profiler.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/observers/models.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/process_registry.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/process_registry_observer.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/scheduler.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib/vfs_tools.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/lib_base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/macros/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/macros/_discovery.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/macros/conversation_agent.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/_discovery.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/base_node_factory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/checkpoint_node.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/data_node.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/service_call_node.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/nodes/tool_utils.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/prompts/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/prompts/base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/prompts/chat_prompts.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/prompts/error_correction_prompts.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/stdlib/prompts/tool_prompts.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/build_ui.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/main.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/execute.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/export.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/files.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/plugins.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/server/routes/validate.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/index.html +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/package-lock.json +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/package.json +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/postcss.config.js +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/public/hexdag.svg +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/App.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/Canvas.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/ContextMenu.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/FileBrowser.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/Header.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/HexdagNode.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/NodeInspector.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/NodePalette.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/NodePortsSection.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/PluginManager.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/PortsEditor.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/PythonEditor.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/ValidationPanel.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/YamlEditor.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/components/index.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/index.css +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/lib/api.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/lib/nodeTemplates.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/lib/store.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/main.tsx +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/types/index.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/src/vite-env.d.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/tailwind.config.js +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/tsconfig.json +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/tsconfig.node.json +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag/studio/ui/vite.config.ts +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/.gitignore +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/LICENSE +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/adapters/blob.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/adapters/cosmos.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/adapters/keyvault.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/adapters/openai.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/pyproject.toml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/tests/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/tests/test_azure_blob_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/azure/tests/test_azure_openai_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag.toml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/pyproject.toml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/test_transform.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/LICENSE +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/adapters/mysql.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/mysql_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/pyproject.toml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/pyproject.toml +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/README.md +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/file/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/file/local.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/sql/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/sql/base.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/sql/collection_storage.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/sql/mysql.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/sql/postgresql.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/vector/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/vector/chromadb.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/vector/in_memory.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/adapters/vector/pgvector.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/ports/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/ports/vector_store.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/tests/__init__.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/tests/test_local_file_storage.py +0 -0
- {hexdag-0.7.0.dev10 → hexdag-0.7.0.dev12}/hexdag_plugins/storage/tests/test_sql_adapters.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hexdag
|
|
3
|
-
Version: 0.7.0.
|
|
3
|
+
Version: 0.7.0.dev12
|
|
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
|
|
@@ -41,6 +41,7 @@ Requires-Dist: nbformat>=5.9.0; extra == 'all'
|
|
|
41
41
|
Requires-Dist: openai>=1.0.0; extra == 'all'
|
|
42
42
|
Requires-Dist: pandas>=2.1.0; extra == 'all'
|
|
43
43
|
Requires-Dist: pgvector>=0.3.0; extra == 'all'
|
|
44
|
+
Requires-Dist: redis>=5.0.0; extra == 'all'
|
|
44
45
|
Requires-Dist: sqlalchemy>=2.0.0; extra == 'all'
|
|
45
46
|
Provides-Extra: anthropic
|
|
46
47
|
Requires-Dist: anthropic>=0.25.0; extra == 'anthropic'
|
|
@@ -58,6 +59,8 @@ Requires-Dist: nbformat>=5.9.0; extra == 'notebooks'
|
|
|
58
59
|
Requires-Dist: pandas>=2.1.0; extra == 'notebooks'
|
|
59
60
|
Provides-Extra: openai
|
|
60
61
|
Requires-Dist: openai>=1.0.0; extra == 'openai'
|
|
62
|
+
Provides-Extra: redis
|
|
63
|
+
Requires-Dist: redis>=5.0.0; extra == 'redis'
|
|
61
64
|
Provides-Extra: storage-all
|
|
62
65
|
Requires-Dist: aiomysql>=0.2.0; extra == 'storage-all'
|
|
63
66
|
Requires-Dist: aiosqlite>=0.20.0; extra == 'storage-all'
|
|
@@ -32,6 +32,7 @@ Available submodules
|
|
|
32
32
|
- documentation: Guides and references
|
|
33
33
|
- export: Project export
|
|
34
34
|
- processes: Process management (pipeline runs, scheduling, entity state)
|
|
35
|
+
- logs: Log querying (query, summarize, tail JSON log files)
|
|
35
36
|
- vfs: Virtual filesystem (uniform path-based introspection)
|
|
36
37
|
"""
|
|
37
38
|
|
|
@@ -40,6 +41,7 @@ from hexdag.api import (
|
|
|
40
41
|
documentation,
|
|
41
42
|
execution,
|
|
42
43
|
export,
|
|
44
|
+
logs,
|
|
43
45
|
pipeline,
|
|
44
46
|
processes,
|
|
45
47
|
validation,
|
|
@@ -51,6 +53,7 @@ __all__ = [
|
|
|
51
53
|
"documentation",
|
|
52
54
|
"execution",
|
|
53
55
|
"export",
|
|
56
|
+
"logs",
|
|
54
57
|
"pipeline",
|
|
55
58
|
"processes",
|
|
56
59
|
"validation",
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"""Log query API — MCP/Studio tools for querying hexDAG JSON log files.
|
|
2
|
+
|
|
3
|
+
Provides unified functions that both the MCP server and hexdag-studio
|
|
4
|
+
REST API consume. Reads Loguru JSON log files (written by
|
|
5
|
+
``configure_logging(output_file=...)``) and filters on structured fields.
|
|
6
|
+
|
|
7
|
+
MCP server usage::
|
|
8
|
+
|
|
9
|
+
from hexdag.api import logs
|
|
10
|
+
|
|
11
|
+
@mcp.tool()
|
|
12
|
+
async def query_logs(
|
|
13
|
+
level: str | None = None,
|
|
14
|
+
pipeline_name: str | None = None,
|
|
15
|
+
contains: str | None = None,
|
|
16
|
+
):
|
|
17
|
+
return await logs.query_logs(
|
|
18
|
+
"hexdag.log", level=level, pipeline_name=pipeline_name, contains=contains,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
Studio REST API::
|
|
22
|
+
|
|
23
|
+
@router.get("/logs")
|
|
24
|
+
async def get_logs(level: str | None = None, pipeline_name: str | None = None):
|
|
25
|
+
return await logs.query_logs("hexdag.log", level=level, pipeline_name=pipeline_name)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import json
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
from typing import Any
|
|
33
|
+
|
|
34
|
+
import aiofiles
|
|
35
|
+
|
|
36
|
+
_LEVEL_ORDER = {
|
|
37
|
+
"TRACE": 0,
|
|
38
|
+
"DEBUG": 1,
|
|
39
|
+
"INFO": 2,
|
|
40
|
+
"WARNING": 3,
|
|
41
|
+
"ERROR": 4,
|
|
42
|
+
"CRITICAL": 5,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
async def query_logs(
|
|
47
|
+
log_file: str | Path,
|
|
48
|
+
*,
|
|
49
|
+
level: str | None = None,
|
|
50
|
+
pipeline_name: str | None = None,
|
|
51
|
+
node_id: str | None = None,
|
|
52
|
+
contains: str | None = None,
|
|
53
|
+
limit: int = 100,
|
|
54
|
+
) -> list[dict[str, Any]]:
|
|
55
|
+
"""Query log records from a JSON log file with filters.
|
|
56
|
+
|
|
57
|
+
Each line in the log file is a JSON record produced by Loguru's
|
|
58
|
+
``serialize=True`` mode. Structured fields (``pipeline_name``,
|
|
59
|
+
``node``, ``node_type``) are extracted from ``record.extra``.
|
|
60
|
+
|
|
61
|
+
Args
|
|
62
|
+
----
|
|
63
|
+
log_file: Path to the JSON log file.
|
|
64
|
+
level: Minimum log level (DEBUG, INFO, WARNING, ERROR, CRITICAL).
|
|
65
|
+
pipeline_name: Filter by pipeline name (exact match on extra.pipeline_name).
|
|
66
|
+
node_id: Filter by node name (exact match on extra.node).
|
|
67
|
+
contains: Substring match on the log message text.
|
|
68
|
+
limit: Maximum number of records to return (default 100).
|
|
69
|
+
|
|
70
|
+
Returns
|
|
71
|
+
-------
|
|
72
|
+
List of matching log records, newest first.
|
|
73
|
+
"""
|
|
74
|
+
path = Path(log_file)
|
|
75
|
+
if not path.exists():
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
min_level = _LEVEL_ORDER.get(level.upper(), 0) if level else 0
|
|
79
|
+
contains_lower = contains.lower() if contains else None
|
|
80
|
+
|
|
81
|
+
records = await _read_json_lines(path)
|
|
82
|
+
|
|
83
|
+
results: list[dict[str, Any]] = []
|
|
84
|
+
for rec in reversed(records):
|
|
85
|
+
if len(results) >= limit:
|
|
86
|
+
break
|
|
87
|
+
|
|
88
|
+
record = rec.get("record", {})
|
|
89
|
+
extra = record.get("extra", {})
|
|
90
|
+
rec_level = record.get("level", {}).get("name", "INFO")
|
|
91
|
+
|
|
92
|
+
# Level filter
|
|
93
|
+
if _LEVEL_ORDER.get(rec_level, 0) < min_level:
|
|
94
|
+
continue
|
|
95
|
+
|
|
96
|
+
# Pipeline filter
|
|
97
|
+
if pipeline_name and extra.get("pipeline_name") != pipeline_name:
|
|
98
|
+
continue
|
|
99
|
+
|
|
100
|
+
# Node filter
|
|
101
|
+
if node_id and extra.get("node") != node_id:
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
# Substring match
|
|
105
|
+
message = record.get("message", rec.get("text", ""))
|
|
106
|
+
if contains_lower and contains_lower not in message.lower():
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
results.append(_summarize_record(rec))
|
|
110
|
+
|
|
111
|
+
return results
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def get_log_summary(
|
|
115
|
+
log_file: str | Path,
|
|
116
|
+
*,
|
|
117
|
+
pipeline_name: str | None = None,
|
|
118
|
+
) -> dict[str, Any]:
|
|
119
|
+
"""Aggregate log counts by level from a JSON log file.
|
|
120
|
+
|
|
121
|
+
Args
|
|
122
|
+
----
|
|
123
|
+
log_file: Path to the JSON log file.
|
|
124
|
+
pipeline_name: Scope summary to a specific pipeline.
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
Dict with counts per level, total count, and time range.
|
|
129
|
+
"""
|
|
130
|
+
path = Path(log_file)
|
|
131
|
+
if not path.exists():
|
|
132
|
+
return {"total": 0, "counts": {}, "pipeline_name": pipeline_name}
|
|
133
|
+
|
|
134
|
+
records = await _read_json_lines(path)
|
|
135
|
+
|
|
136
|
+
counts: dict[str, int] = {}
|
|
137
|
+
total = 0
|
|
138
|
+
|
|
139
|
+
for rec in records:
|
|
140
|
+
record = rec.get("record", {})
|
|
141
|
+
extra = record.get("extra", {})
|
|
142
|
+
|
|
143
|
+
if pipeline_name and extra.get("pipeline_name") != pipeline_name:
|
|
144
|
+
continue
|
|
145
|
+
|
|
146
|
+
rec_level = record.get("level", {}).get("name", "UNKNOWN")
|
|
147
|
+
counts[rec_level] = counts.get(rec_level, 0) + 1
|
|
148
|
+
total += 1
|
|
149
|
+
|
|
150
|
+
return {
|
|
151
|
+
"total": total,
|
|
152
|
+
"counts": counts,
|
|
153
|
+
"pipeline_name": pipeline_name,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
async def tail_logs(
|
|
158
|
+
log_file: str | Path,
|
|
159
|
+
*,
|
|
160
|
+
n: int = 20,
|
|
161
|
+
level: str | None = None,
|
|
162
|
+
) -> list[dict[str, Any]]:
|
|
163
|
+
"""Get the N most recent log records from a JSON log file.
|
|
164
|
+
|
|
165
|
+
Args
|
|
166
|
+
----
|
|
167
|
+
log_file: Path to the JSON log file.
|
|
168
|
+
n: Number of records to return (default 20).
|
|
169
|
+
level: Minimum log level filter.
|
|
170
|
+
|
|
171
|
+
Returns
|
|
172
|
+
-------
|
|
173
|
+
List of most recent records, newest first.
|
|
174
|
+
"""
|
|
175
|
+
return await query_logs(log_file, level=level, limit=n)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# ---------------------------------------------------------------------------
|
|
179
|
+
# Internal helpers
|
|
180
|
+
# ---------------------------------------------------------------------------
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
async def _read_json_lines(path: Path) -> list[dict[str, Any]]:
|
|
184
|
+
"""Read a JSON-lines log file, skipping malformed lines."""
|
|
185
|
+
records: list[dict[str, Any]] = []
|
|
186
|
+
async with aiofiles.open(path, encoding="utf-8") as f:
|
|
187
|
+
async for line in f:
|
|
188
|
+
line = line.strip()
|
|
189
|
+
if not line:
|
|
190
|
+
continue
|
|
191
|
+
try:
|
|
192
|
+
records.append(json.loads(line))
|
|
193
|
+
except json.JSONDecodeError:
|
|
194
|
+
continue
|
|
195
|
+
return records
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _summarize_record(rec: dict[str, Any]) -> dict[str, Any]:
|
|
199
|
+
"""Extract key fields from a Loguru JSON record for API output."""
|
|
200
|
+
record = rec.get("record", {})
|
|
201
|
+
extra = record.get("extra", {})
|
|
202
|
+
level_info = record.get("level", {})
|
|
203
|
+
time_info = record.get("time", {})
|
|
204
|
+
|
|
205
|
+
result: dict[str, Any] = {
|
|
206
|
+
"timestamp": time_info.get("repr", ""),
|
|
207
|
+
"level": level_info.get("name", ""),
|
|
208
|
+
"message": record.get("message", rec.get("text", "")),
|
|
209
|
+
"module": extra.get("module", record.get("name", "")),
|
|
210
|
+
"function": record.get("function", ""),
|
|
211
|
+
"line": record.get("line", 0),
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if pipeline_name := extra.get("pipeline_name"):
|
|
215
|
+
result["pipeline_name"] = pipeline_name
|
|
216
|
+
if node := extra.get("node"):
|
|
217
|
+
result["node"] = node
|
|
218
|
+
if node_type := extra.get("node_type"):
|
|
219
|
+
result["node_type"] = node_type
|
|
220
|
+
|
|
221
|
+
return result
|
|
@@ -29,6 +29,7 @@ from hexdag.kernel.config.models import (
|
|
|
29
29
|
HexDAGConfig,
|
|
30
30
|
LoggingConfig,
|
|
31
31
|
ManifestEntry,
|
|
32
|
+
MCPPermissions,
|
|
32
33
|
)
|
|
33
34
|
from hexdag.kernel.logging import get_logger
|
|
34
35
|
from hexdag.kernel.orchestration.models import OrchestratorConfig
|
|
@@ -377,6 +378,15 @@ class ConfigLoader:
|
|
|
377
378
|
config.caps = DefaultCaps(
|
|
378
379
|
default_set=caps_data.get("default_set"),
|
|
379
380
|
deny=caps_data.get("deny"),
|
|
381
|
+
profiles=caps_data.get("profiles"),
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
# Parse MCP permissions
|
|
385
|
+
if "mcp_permissions" in data:
|
|
386
|
+
mcp_data = data["mcp_permissions"]
|
|
387
|
+
config.mcp_permissions = MCPPermissions(
|
|
388
|
+
default_profile=mcp_data.get("default_profile", "read-only"),
|
|
389
|
+
client_profiles=mcp_data.get("client_profiles", {}),
|
|
380
390
|
)
|
|
381
391
|
|
|
382
392
|
return config
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
"""Entity plugins for the YAML pipeline builder.
|
|
2
2
|
|
|
3
3
|
These plugins build specific entity types from YAML configuration:
|
|
4
|
+
- AdapterDefinitionPlugin: Process Adapter definitions (kind: Adapter)
|
|
4
5
|
- ConfigDefinitionPlugin: Process Config definitions (kind: Config)
|
|
5
6
|
- MacroDefinitionPlugin: Process Macro definitions (kind: Macro)
|
|
6
7
|
- MacroEntityPlugin: Expand macro invocations into subgraphs
|
|
8
|
+
- MiddlewareDefinitionPlugin: Process Middleware definitions (kind: Middleware)
|
|
7
9
|
- NodeEntityPlugin: Build regular nodes (llm_node, function_node, etc.)
|
|
8
10
|
"""
|
|
9
11
|
|
|
12
|
+
from hexdag.compiler.plugins.adapter_definition import AdapterDefinitionPlugin
|
|
10
13
|
from hexdag.compiler.plugins.config_definition import ConfigDefinitionPlugin
|
|
11
14
|
from hexdag.compiler.plugins.macro_definition import MacroDefinitionPlugin
|
|
12
15
|
from hexdag.compiler.plugins.macro_entity import MacroEntityPlugin
|
|
16
|
+
from hexdag.compiler.plugins.middleware_definition import MiddlewareDefinitionPlugin
|
|
13
17
|
from hexdag.compiler.plugins.node_entity import NodeEntityPlugin
|
|
14
18
|
|
|
15
19
|
__all__ = [
|
|
20
|
+
"AdapterDefinitionPlugin",
|
|
16
21
|
"ConfigDefinitionPlugin",
|
|
17
22
|
"MacroDefinitionPlugin",
|
|
18
23
|
"MacroEntityPlugin",
|
|
24
|
+
"MiddlewareDefinitionPlugin",
|
|
19
25
|
"NodeEntityPlugin",
|
|
20
26
|
]
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""Plugin for handling Adapter definitions (kind: Adapter).
|
|
2
|
+
|
|
3
|
+
Standalone ``kind: Adapter`` manifests define reusable adapter configurations
|
|
4
|
+
that can be referenced by name from ``spec.ports.<name>.ref``.
|
|
5
|
+
|
|
6
|
+
Example YAML::
|
|
7
|
+
|
|
8
|
+
apiVersion: hexdag/v1
|
|
9
|
+
kind: Adapter
|
|
10
|
+
metadata:
|
|
11
|
+
name: production-openai
|
|
12
|
+
description: Production OpenAI with low temperature
|
|
13
|
+
spec:
|
|
14
|
+
class: hexdag.stdlib.adapters.openai.OpenAIAdapter
|
|
15
|
+
config:
|
|
16
|
+
model: gpt-4o
|
|
17
|
+
temperature: 0.3
|
|
18
|
+
api_key: ${OPENAI_API_KEY}
|
|
19
|
+
|
|
20
|
+
Reference in a pipeline::
|
|
21
|
+
|
|
22
|
+
spec:
|
|
23
|
+
ports:
|
|
24
|
+
llm:
|
|
25
|
+
ref: production-openai
|
|
26
|
+
config: # optional overrides merged on top
|
|
27
|
+
temperature: 0.9
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from typing import TYPE_CHECKING, Any
|
|
33
|
+
|
|
34
|
+
from hexdag.kernel.exceptions import YamlPipelineBuilderError
|
|
35
|
+
from hexdag.kernel.logging import get_logger
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from hexdag.compiler.yaml_builder import YamlPipelineBuilder
|
|
39
|
+
from hexdag.kernel.domain.dag import DirectedGraph, NodeSpec
|
|
40
|
+
|
|
41
|
+
logger = get_logger(__name__)
|
|
42
|
+
|
|
43
|
+
# Module-level registry for named adapter definitions
|
|
44
|
+
_adapter_registry: dict[str, dict[str, Any]] = {}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_adapter_definition(name: str) -> dict[str, Any] | None:
|
|
48
|
+
"""Look up a registered adapter definition by name.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
name : str
|
|
53
|
+
Adapter name (from ``metadata.name``)
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
dict[str, Any] | None
|
|
58
|
+
Adapter definition dict with ``class`` and ``config`` keys,
|
|
59
|
+
or None if not registered
|
|
60
|
+
"""
|
|
61
|
+
return _adapter_registry.get(name)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def clear_adapter_registry() -> None:
|
|
65
|
+
"""Clear all registered adapter definitions (for testing)."""
|
|
66
|
+
_adapter_registry.clear()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class AdapterDefinitionPlugin:
|
|
70
|
+
"""Plugin for handling Adapter definitions (kind: Adapter).
|
|
71
|
+
|
|
72
|
+
Processes ``kind: Adapter`` YAML documents and registers the
|
|
73
|
+
adapter configuration for later reference by name. Does not add
|
|
74
|
+
nodes to the graph.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def can_handle(self, node_config: dict[str, Any]) -> bool:
|
|
78
|
+
"""Handle Adapter kind."""
|
|
79
|
+
return node_config.get("kind") == "Adapter"
|
|
80
|
+
|
|
81
|
+
def build(
|
|
82
|
+
self, node_config: dict[str, Any], builder: YamlPipelineBuilder, graph: DirectedGraph
|
|
83
|
+
) -> NodeSpec | None:
|
|
84
|
+
"""Register named adapter definition.
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
node_config : dict[str, Any]
|
|
89
|
+
Adapter definition configuration
|
|
90
|
+
builder : YamlPipelineBuilder
|
|
91
|
+
Builder instance (unused)
|
|
92
|
+
graph : DirectedGraph
|
|
93
|
+
Graph instance (unused — definitions don't add nodes)
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
None
|
|
98
|
+
Adapter definitions don't add nodes to the graph
|
|
99
|
+
"""
|
|
100
|
+
metadata = node_config.get("metadata", {})
|
|
101
|
+
name = metadata.get("name")
|
|
102
|
+
if not name:
|
|
103
|
+
raise YamlPipelineBuilderError("Adapter definition missing 'metadata.name'")
|
|
104
|
+
|
|
105
|
+
spec = node_config.get("spec", {})
|
|
106
|
+
adapter_class = spec.get("class")
|
|
107
|
+
|
|
108
|
+
if not adapter_class:
|
|
109
|
+
raise YamlPipelineBuilderError(
|
|
110
|
+
f"Adapter '{name}' missing 'spec.class'. "
|
|
111
|
+
f"Adapter definitions must specify the adapter class module path."
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if not isinstance(adapter_class, str):
|
|
115
|
+
raise YamlPipelineBuilderError(
|
|
116
|
+
f"Adapter '{name}' spec.class must be a module path string, "
|
|
117
|
+
f"got {type(adapter_class).__name__}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
config = spec.get("config", {})
|
|
121
|
+
if not isinstance(config, dict):
|
|
122
|
+
raise YamlPipelineBuilderError(
|
|
123
|
+
f"Adapter '{name}' spec.config must be a dict, got {type(config).__name__}"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
capabilities = spec.get("capabilities")
|
|
127
|
+
|
|
128
|
+
entry: dict[str, Any] = {"class": adapter_class, "config": config}
|
|
129
|
+
if capabilities is not None:
|
|
130
|
+
entry["capabilities"] = capabilities
|
|
131
|
+
|
|
132
|
+
_adapter_registry[name] = entry
|
|
133
|
+
|
|
134
|
+
logger.info(
|
|
135
|
+
"Registered adapter definition '{}' (class={})",
|
|
136
|
+
name,
|
|
137
|
+
adapter_class,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return None
|
|
@@ -67,6 +67,7 @@ class MacroDefinitionPlugin:
|
|
|
67
67
|
Macro definitions don't add nodes to the graph
|
|
68
68
|
"""
|
|
69
69
|
from hexdag.kernel.yaml_macro import ( # lazy: mutual cycle with yaml_builder
|
|
70
|
+
PortRequirement,
|
|
70
71
|
YamlMacro,
|
|
71
72
|
YamlMacroConfig,
|
|
72
73
|
YamlMacroParameterSpec,
|
|
@@ -85,22 +86,31 @@ class MacroDefinitionPlugin:
|
|
|
85
86
|
raw_parameters = node_config.get("parameters", [])
|
|
86
87
|
parameters = [YamlMacroParameterSpec(**p) for p in raw_parameters]
|
|
87
88
|
|
|
88
|
-
# Extract nodes
|
|
89
|
+
# Extract nodes — support both static list and raw YAML template string
|
|
89
90
|
nodes = node_config.get("nodes", [])
|
|
90
|
-
|
|
91
|
+
nodes_raw = node_config.get("nodes_raw")
|
|
92
|
+
|
|
93
|
+
if not nodes and not nodes_raw:
|
|
91
94
|
raise YamlPipelineBuilderError(
|
|
92
|
-
f"Macro '{macro_name}' has no nodes.
|
|
95
|
+
f"Macro '{macro_name}' has no nodes. "
|
|
96
|
+
f"Macros must define 'nodes' (list) or 'nodes_raw' (template string)."
|
|
93
97
|
)
|
|
94
98
|
|
|
95
99
|
# Extract outputs (optional)
|
|
96
100
|
outputs = node_config.get("outputs")
|
|
97
101
|
|
|
102
|
+
# Extract port requirements (optional)
|
|
103
|
+
raw_ports = node_config.get("requires_ports", [])
|
|
104
|
+
requires_ports = [PortRequirement(**p) for p in raw_ports]
|
|
105
|
+
|
|
98
106
|
# Create YamlMacroConfig
|
|
99
107
|
macro_config = YamlMacroConfig(
|
|
100
108
|
macro_name=macro_name,
|
|
101
109
|
macro_description=macro_description,
|
|
102
110
|
parameters=parameters,
|
|
103
111
|
nodes=nodes,
|
|
112
|
+
nodes_raw=nodes_raw,
|
|
113
|
+
requires_ports=requires_ports,
|
|
104
114
|
outputs=outputs,
|
|
105
115
|
)
|
|
106
116
|
|
|
@@ -108,12 +118,24 @@ class MacroDefinitionPlugin:
|
|
|
108
118
|
# Create a dynamic class that pre-fills the YamlMacro config
|
|
109
119
|
config_dict = macro_config.model_dump()
|
|
110
120
|
|
|
121
|
+
# Structural fields that must not be overridden at invocation time
|
|
122
|
+
_structural = frozenset({
|
|
123
|
+
"macro_name",
|
|
124
|
+
"macro_description",
|
|
125
|
+
"parameters",
|
|
126
|
+
"nodes",
|
|
127
|
+
"nodes_raw",
|
|
128
|
+
"requires_ports",
|
|
129
|
+
"outputs",
|
|
130
|
+
})
|
|
131
|
+
|
|
111
132
|
class DynamicYamlMacro(YamlMacro):
|
|
112
133
|
"""Dynamically generated YamlMacro with pre-filled configuration."""
|
|
113
134
|
|
|
114
135
|
def __init__(self, **kwargs: Any) -> None:
|
|
115
|
-
#
|
|
116
|
-
|
|
136
|
+
# Only allow non-structural overrides (parameter values)
|
|
137
|
+
safe_kwargs = {k: v for k, v in kwargs.items() if k not in _structural}
|
|
138
|
+
merged_config = {**config_dict, **safe_kwargs}
|
|
117
139
|
super().__init__(**merged_config)
|
|
118
140
|
|
|
119
141
|
# Set class name for better debugging
|