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