hexdag 0.7.0.dev12__tar.gz → 0.7.0.dev13__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.dev12 → hexdag-0.7.0.dev13}/PKG-INFO +1 -1
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/system_builder.py +86 -3
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/yaml_validator.py +8 -3
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/context/__init__.py +2 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/context/execution_context.py +14 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/dag.py +5 -0
- hexdag-0.7.0.dev13/hexdag/kernel/domain/extraction_state.py +107 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/pipeline_config.py +11 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/system_config.py +42 -0
- hexdag-0.7.0.dev13/hexdag/kernel/lifecycle_runner.py +615 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/checkpoint_manager.py +36 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/execution_coordinator.py +61 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/lifecycle_manager.py +13 -4
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/node_executor.py +31 -8
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/__init__.py +18 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/events.py +168 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/models.py +1 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/orchestrator.py +32 -1
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/orchestrator_factory.py +137 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/pipeline_runner.py +154 -4
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/data_store.py +40 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/__init__.py +4 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/entity_state.py +182 -4
- hexdag-0.7.0.dev13/hexdag/stdlib/lib/extraction_job.py +284 -0
- hexdag-0.7.0.dev13/hexdag/stdlib/lib/pipeline_memory.py +101 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/__init__.py +2 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/agent_node.py +20 -5
- hexdag-0.7.0.dev13/hexdag/stdlib/nodes/transition_node.py +138 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/pyproject.toml +1 -1
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/.gitignore +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/LICENSE +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/__main__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/components.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/documentation.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/execution.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/export.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/logs.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/pipeline.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/processes.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/validation.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/api/vfs.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/__main__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/build_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/create_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/docs_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/generate_types_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/init_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/lint_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/pipeline_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/plugin_dev_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/plugins_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/studio_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/commands/validate_cmd.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/cli/main.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/component_instantiator.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/config_loader.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/include_tag.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/pipeline_config.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/adapter_definition.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/config_definition.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/macro_definition.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/macro_entity.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/middleware_definition.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/plugins/node_entity.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/preprocessing/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/preprocessing/_type_guards.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/preprocessing/env_vars.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/preprocessing/include.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/preprocessing/template.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/py_tag.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/reference_resolver.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/tag_discovery.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/compiler/yaml_builder.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/docs/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/docs/extractors.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/docs/generators.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/docs/models.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/executors/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/executors/local_executor.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/http_client/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/http_client/http_client.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/observer_manager/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/observer_manager/local.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/pipeline_spawner/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/pipeline_spawner/local.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/local.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/lib_provider.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/proc_entities_provider.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/proc_runs_provider.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/proc_scheduled_provider.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/drivers/vfs/providers/sys_caps_provider.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/_alias_registry.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/config/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/config/loader.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/config/models.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/configurable.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/discovery.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/agent_tools.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/caps.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/entity_state.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/pipeline_run.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/scheduled_task.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/domain/vfs.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/exceptions.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/expression_parser.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/lib_base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/linting/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/linting/models.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/linting/pipeline_rules.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/linting/rules.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/logging.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/models/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/models/base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/body_executor.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/adapter_lifecycle_manager.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/health_check_manager.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/input_mapper.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/components/secret_manager.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/constants.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/batching.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/decorators.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/events/observers/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/hook_context.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/hooks.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/port_wrappers.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/prompt/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/orchestration/prompt/template.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/pipeline_builder/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/api_call.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/database.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/detection.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/executor.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/file_storage.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/healthcheck.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/llm.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/observer_manager.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/pipeline_spawner.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/secret.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/tool_router.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/vector_search.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports/vfs.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/ports_builder.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/protocols.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/resolver.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/schema/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/schema/generator.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/secrets.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/service.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/system_runner.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/types.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/async_warnings.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/caching.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/input_normalization.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/node_timer.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/schema_conversion.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/serialization.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/utils/sql_validation.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/validation/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/validation/retry.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/validation/sanitized_types.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/validation/secure_json.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/kernel/yaml_macro.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/mcp_server.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/py.typed +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/_discovery.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/anthropic/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/anthropic/anthropic_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/csv/csv_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/pgvector/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/pgvector/pgvector_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/sqlalchemy/sqlalchemy_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/sqlite/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/database/sqlite/sqlite_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/local/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/local/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/collection_memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/file_memory_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/in_memory_memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/schemas.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/session_memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/sqlite_memory_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/memory/state_memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/hexdag.yaml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/mock_database.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/mock_embedding.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/mock_http.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/mock/mock_llm.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/openai/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/openai/openai_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/redis/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/redis/redis_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/secret/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/adapters/secret/local_secret_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/database_tools.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/observers/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/observers/core_observers.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/observers/cost_profiler.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/observers/models.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/observers/port_call_observers.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/process_registry.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/process_registry_observer.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/scheduler.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib/vfs_tools.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/lib_base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/macros/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/macros/_discovery.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/macros/conversation_agent.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/macros/llm_macro.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/macros/reasoning_agent.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/compose.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/distributed_cache.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/observable.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/observable_tool_router.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/rate_limiter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/response_cache.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/retry.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/structured_output.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/middleware/timeout.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/_discovery.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/api_call_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/base_node_factory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/checkpoint_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/composite_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/data_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/expression_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/function_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/llm_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/mapped_input.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/service_call_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/tool_call_node.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/nodes/tool_utils.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/prompts/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/prompts/base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/prompts/chat_prompts.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/prompts/error_correction_prompts.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/stdlib/prompts/tool_prompts.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/build_ui.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/main.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/execute.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/export.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/files.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/plugins.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/server/routes/validate.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/index.html +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/package-lock.json +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/package.json +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/postcss.config.js +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/public/hexdag.svg +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/App.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/Canvas.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/ContextMenu.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/FileBrowser.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/Header.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/HexdagNode.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/NodeInspector.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/NodePalette.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/NodePortsSection.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/PluginManager.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/PortsEditor.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/PythonEditor.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/ValidationPanel.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/YamlEditor.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/components/index.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/index.css +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/lib/api.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/lib/nodeTemplates.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/lib/store.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/main.tsx +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/types/index.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/src/vite-env.d.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/tailwind.config.js +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/tsconfig.json +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/tsconfig.node.json +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag/studio/ui/vite.config.ts +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/.gitignore +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/LICENSE +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/adapters/blob.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/adapters/cosmos.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/adapters/keyvault.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/adapters/openai.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/pyproject.toml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/tests/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/tests/test_azure_blob_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/tests/test_azure_cosmos_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/tests/test_azure_keyvault_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/azure/tests/test_azure_openai_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/examples/01_simple_pandas_transform.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/examples/02_simple_pandas_only.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/examples/03_file_io_pipeline.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/examples/test_pandas_transform.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag.toml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/api_extract.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/base_node_factory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/file_io.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/pandas_transform.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/hexdag_etl/nodes/sql_extract_load.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/pyproject.toml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/test_transform.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/hexdag_etl/tests/test_plugin_integration.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/LICENSE +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/adapters/mysql.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/mysql_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/pyproject.toml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/mysql_adapter/tests/test_mysql_adapter.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/pyproject.toml +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/README.md +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/file/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/file/local.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/sql/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/sql/base.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/sql/collection_storage.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/sql/mysql.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/sql/postgresql.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/vector/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/vector/chromadb.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/vector/in_memory.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/adapters/vector/pgvector.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/ports/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/ports/vector_store.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/tests/__init__.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/hexdag_plugins/storage/tests/test_local_file_storage.py +0 -0
- {hexdag-0.7.0.dev12 → hexdag-0.7.0.dev13}/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.dev13
|
|
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
|
|
@@ -125,6 +125,12 @@ class SystemBuilder:
|
|
|
125
125
|
"ports": spec.get("ports", {}),
|
|
126
126
|
"policies": spec.get("policies", {}),
|
|
127
127
|
"services": spec.get("services", {}),
|
|
128
|
+
"state_machines": spec.get("state_machines", {}),
|
|
129
|
+
"states": spec.get("states", {}),
|
|
130
|
+
"on_transition": spec.get("on_transition", {}),
|
|
131
|
+
"observers": spec.get("observers", []),
|
|
132
|
+
"memory": spec.get("memory", {}),
|
|
133
|
+
"gc": spec.get("gc", {}),
|
|
128
134
|
})
|
|
129
135
|
except Exception as e:
|
|
130
136
|
raise SystemBuildError(f"System validation error: {e}") from e
|
|
@@ -132,15 +138,23 @@ class SystemBuilder:
|
|
|
132
138
|
# 5. Validate pipeline paths exist
|
|
133
139
|
self._validate_pipeline_paths(system_config, resolved_base)
|
|
134
140
|
|
|
135
|
-
# 6. Validate pipe DAG is acyclic
|
|
136
|
-
|
|
141
|
+
# 6. Validate pipe DAG is acyclic (only for non-lifecycle systems)
|
|
142
|
+
if not system_config.is_lifecycle:
|
|
143
|
+
self._validate_no_cycles(system_config)
|
|
144
|
+
|
|
145
|
+
# 7. Validate lifecycle constraints (if state machines declared)
|
|
146
|
+
if system_config.is_lifecycle:
|
|
147
|
+
self._validate_lifecycle(system_config)
|
|
137
148
|
|
|
138
149
|
system_name = metadata.get("name", "unnamed")
|
|
150
|
+
mode = "lifecycle" if system_config.is_lifecycle else "dag"
|
|
139
151
|
logger.info(
|
|
140
|
-
"Built system '{}': {} processes, {} pipes",
|
|
152
|
+
"Built system '{}' ({}): {} processes, {} pipes, {} state machines",
|
|
141
153
|
system_name,
|
|
154
|
+
mode,
|
|
142
155
|
len(system_config.processes),
|
|
143
156
|
len(system_config.pipes),
|
|
157
|
+
len(system_config.state_machines),
|
|
144
158
|
)
|
|
145
159
|
|
|
146
160
|
return system_config
|
|
@@ -201,6 +215,75 @@ class SystemBuilder:
|
|
|
201
215
|
"Cycle detected in pipe DAG. Processes must form a directed acyclic graph."
|
|
202
216
|
)
|
|
203
217
|
|
|
218
|
+
@staticmethod
|
|
219
|
+
def _validate_lifecycle(config: SystemConfig) -> None:
|
|
220
|
+
"""Validate lifecycle-mode constraints.
|
|
221
|
+
|
|
222
|
+
Ensures that ``states`` and ``on_transition`` reference valid
|
|
223
|
+
process names and valid state machine states.
|
|
224
|
+
|
|
225
|
+
Raises
|
|
226
|
+
------
|
|
227
|
+
SystemBuildError
|
|
228
|
+
If lifecycle configuration is invalid.
|
|
229
|
+
"""
|
|
230
|
+
process_names = set(config.process_names)
|
|
231
|
+
|
|
232
|
+
# Collect all valid states from state machines
|
|
233
|
+
all_states: set[str] = set()
|
|
234
|
+
for sm_spec in config.state_machines.values():
|
|
235
|
+
transitions = sm_spec.get("transitions", {})
|
|
236
|
+
for from_state, targets in transitions.items():
|
|
237
|
+
all_states.add(from_state)
|
|
238
|
+
if isinstance(targets, list):
|
|
239
|
+
for t in targets:
|
|
240
|
+
if isinstance(t, str):
|
|
241
|
+
all_states.add(t)
|
|
242
|
+
elif isinstance(t, dict) and "to" in t:
|
|
243
|
+
all_states.add(t["to"])
|
|
244
|
+
initial = sm_spec.get("initial")
|
|
245
|
+
if initial:
|
|
246
|
+
all_states.add(initial)
|
|
247
|
+
|
|
248
|
+
# Validate spec.states references
|
|
249
|
+
for state_name, state_spec in config.states.items():
|
|
250
|
+
if state_name not in all_states:
|
|
251
|
+
raise SystemBuildError(
|
|
252
|
+
f"spec.states references unknown state '{state_name}'. "
|
|
253
|
+
f"Valid states: {sorted(all_states)}"
|
|
254
|
+
)
|
|
255
|
+
on_enter = state_spec.get("on_enter")
|
|
256
|
+
if on_enter and on_enter not in process_names:
|
|
257
|
+
raise SystemBuildError(
|
|
258
|
+
f"State '{state_name}' references unknown process "
|
|
259
|
+
f"'{on_enter}'. Declared processes: {sorted(process_names)}"
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
# Validate spec.on_transition references
|
|
263
|
+
for transition_key, transition_spec in config.on_transition.items():
|
|
264
|
+
parts = [p.strip() for p in transition_key.split("->")]
|
|
265
|
+
if len(parts) != 2: # noqa: PLR2004
|
|
266
|
+
raise SystemBuildError(
|
|
267
|
+
f"Invalid on_transition key '{transition_key}'. "
|
|
268
|
+
"Expected format: 'FROM_STATE -> TO_STATE'"
|
|
269
|
+
)
|
|
270
|
+
from_state, to_state = parts
|
|
271
|
+
if from_state not in all_states:
|
|
272
|
+
raise SystemBuildError(
|
|
273
|
+
f"on_transition '{transition_key}' references unknown state '{from_state}'"
|
|
274
|
+
)
|
|
275
|
+
if to_state not in all_states:
|
|
276
|
+
raise SystemBuildError(
|
|
277
|
+
f"on_transition '{transition_key}' references unknown state '{to_state}'"
|
|
278
|
+
)
|
|
279
|
+
process_name = transition_spec.get("process")
|
|
280
|
+
if process_name and process_name not in process_names:
|
|
281
|
+
raise SystemBuildError(
|
|
282
|
+
f"on_transition '{transition_key}' references unknown "
|
|
283
|
+
f"process '{process_name}'. "
|
|
284
|
+
f"Declared processes: {sorted(process_names)}"
|
|
285
|
+
)
|
|
286
|
+
|
|
204
287
|
@staticmethod
|
|
205
288
|
def topological_order(config: SystemConfig) -> list[str]:
|
|
206
289
|
"""Compute topological execution order from the pipe DAG.
|
|
@@ -323,7 +323,7 @@ class YamlValidator:
|
|
|
323
323
|
self._validate_dependencies_with_cache(nodes, result, node_ids, macro_instances)
|
|
324
324
|
|
|
325
325
|
# Validate expression/mapping naming to prevent ambiguous resolution
|
|
326
|
-
self._validate_naming_collisions(nodes, result, node_ids)
|
|
326
|
+
self._validate_naming_collisions(nodes, result, node_ids, macro_instances)
|
|
327
327
|
|
|
328
328
|
return result
|
|
329
329
|
|
|
@@ -659,6 +659,7 @@ class YamlValidator:
|
|
|
659
659
|
nodes: list[dict[str, Any]],
|
|
660
660
|
result: ValidationReport,
|
|
661
661
|
node_ids: set[str],
|
|
662
|
+
macro_instances: set[str],
|
|
662
663
|
) -> None:
|
|
663
664
|
"""Validate that expression variables and input_mapping aliases don't collide.
|
|
664
665
|
|
|
@@ -725,7 +726,7 @@ class YamlValidator:
|
|
|
725
726
|
if not isinstance(expr, str):
|
|
726
727
|
continue
|
|
727
728
|
self._check_first_segments(
|
|
728
|
-
expr, var_name, node_id, valid_first_segments, node_ids, result
|
|
729
|
+
expr, var_name, node_id, valid_first_segments, node_ids, macro_instances, result
|
|
729
730
|
)
|
|
730
731
|
|
|
731
732
|
for alias, source in input_mapping.items():
|
|
@@ -735,7 +736,7 @@ class YamlValidator:
|
|
|
735
736
|
if source.startswith("$input") or source == "$input":
|
|
736
737
|
continue
|
|
737
738
|
self._check_first_segments(
|
|
738
|
-
source, alias, node_id, valid_first_segments, node_ids, result
|
|
739
|
+
source, alias, node_id, valid_first_segments, node_ids, macro_instances, result
|
|
739
740
|
)
|
|
740
741
|
|
|
741
742
|
@staticmethod
|
|
@@ -745,6 +746,7 @@ class YamlValidator:
|
|
|
745
746
|
node_id: str,
|
|
746
747
|
valid_first_segments: set[str],
|
|
747
748
|
node_ids: set[str],
|
|
749
|
+
macro_instances: set[str],
|
|
748
750
|
result: "ValidationReport",
|
|
749
751
|
) -> None:
|
|
750
752
|
"""Check that first path segments in text are known references."""
|
|
@@ -754,6 +756,9 @@ class YamlValidator:
|
|
|
754
756
|
continue
|
|
755
757
|
if candidate in valid_first_segments:
|
|
756
758
|
continue
|
|
759
|
+
# Check if candidate is a macro-expanded node name
|
|
760
|
+
if any(candidate.startswith(f"{mi}_") for mi in macro_instances):
|
|
761
|
+
continue
|
|
757
762
|
# Unknown first segment — likely a typo
|
|
758
763
|
close_matches = difflib.get_close_matches(candidate, sorted(node_ids), n=3, cutoff=0.6)
|
|
759
764
|
suggestion = ""
|
|
@@ -7,6 +7,7 @@ from hexdag.kernel.context.execution_context import (
|
|
|
7
7
|
get_current_node_name,
|
|
8
8
|
get_node_results,
|
|
9
9
|
get_observer_manager,
|
|
10
|
+
get_pipeline_memory,
|
|
10
11
|
get_pipeline_name,
|
|
11
12
|
get_port,
|
|
12
13
|
get_ports,
|
|
@@ -32,6 +33,7 @@ __all__ = [
|
|
|
32
33
|
"get_current_node_name",
|
|
33
34
|
"get_node_results",
|
|
34
35
|
"get_observer_manager",
|
|
36
|
+
"get_pipeline_memory",
|
|
35
37
|
"get_pipeline_name",
|
|
36
38
|
"get_port",
|
|
37
39
|
"get_ports",
|
|
@@ -279,6 +279,20 @@ def get_services() -> dict[str, Any] | None:
|
|
|
279
279
|
return _services_context.get()
|
|
280
280
|
|
|
281
281
|
|
|
282
|
+
def get_pipeline_memory() -> Any | None:
|
|
283
|
+
"""Convenience getter for the auto-registered PipelineMemory service.
|
|
284
|
+
|
|
285
|
+
Returns
|
|
286
|
+
-------
|
|
287
|
+
PipelineMemory | None
|
|
288
|
+
The pipeline memory instance, or None if not available.
|
|
289
|
+
"""
|
|
290
|
+
services = _services_context.get()
|
|
291
|
+
if services:
|
|
292
|
+
return services.get("pipeline_memory")
|
|
293
|
+
return None
|
|
294
|
+
|
|
295
|
+
|
|
282
296
|
# ============================================================================
|
|
283
297
|
# Pipeline Name Context
|
|
284
298
|
# ============================================================================
|
|
@@ -116,6 +116,8 @@ class NodeSpec:
|
|
|
116
116
|
retry_max_delay: float | None = None # Maximum delay cap in seconds (default: 60.0)
|
|
117
117
|
when: str | None = None # Optional expression to evaluate before execution
|
|
118
118
|
on_error: str | None = None # Name of DAG node to run if this node fails (after retries)
|
|
119
|
+
critical: bool = False # If True and node is skipped, pipeline fails
|
|
120
|
+
required_inputs: tuple[str, ...] | list[str] = () # Input fields that must be non-None
|
|
119
121
|
# Factory metadata for distributed execution (set by YAML pipeline builder)
|
|
120
122
|
factory_class: str | None = None # Module path, e.g. "hexdag.stdlib.nodes.LLMNode"
|
|
121
123
|
factory_params: dict[str, Any] | None = None # Original factory **kwargs
|
|
@@ -141,6 +143,9 @@ class NodeSpec:
|
|
|
141
143
|
object.__setattr__(self, "deps", frozenset(sys.intern(d) for d in self.deps))
|
|
142
144
|
object.__setattr__(self, "params", MappingProxyType(self.params))
|
|
143
145
|
object.__setattr__(self, "literals", MappingProxyType(self.literals))
|
|
146
|
+
# Normalize required_inputs to tuple for immutability
|
|
147
|
+
if isinstance(self.required_inputs, list):
|
|
148
|
+
object.__setattr__(self, "required_inputs", tuple(self.required_inputs))
|
|
144
149
|
# Freeze factory_params if present
|
|
145
150
|
if self.factory_params is not None:
|
|
146
151
|
object.__setattr__(self, "factory_params", MappingProxyType(self.factory_params))
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Domain models for multi-round extraction state tracking.
|
|
2
|
+
|
|
3
|
+
Used by :class:`ExtractionJob <hexdag.stdlib.lib.extraction_job.ExtractionJob>`
|
|
4
|
+
to track extraction progress across multiple pipeline invocations.
|
|
5
|
+
|
|
6
|
+
Each extraction round is a separate pipeline run. The ``ExtractionState``
|
|
7
|
+
persists between runs via ``SupportsKeyValue`` storage, tracking which
|
|
8
|
+
fields have been extracted and which are still needed.
|
|
9
|
+
|
|
10
|
+
OS metaphor: like a process image saved to disk (SIGSTOP + core dump)
|
|
11
|
+
and resumed later (SIGCONT + restore).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, Field, computed_field
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class RoundRecord(BaseModel):
|
|
23
|
+
"""Snapshot of a single extraction round.
|
|
24
|
+
|
|
25
|
+
Attributes
|
|
26
|
+
----------
|
|
27
|
+
round_number : int
|
|
28
|
+
1-based round index.
|
|
29
|
+
extracted_fields : dict[str, Any]
|
|
30
|
+
Fields successfully extracted in this round.
|
|
31
|
+
source : str
|
|
32
|
+
Description of the data source (e.g., "carrier_email", "api_response").
|
|
33
|
+
timestamp : datetime
|
|
34
|
+
When this round was executed.
|
|
35
|
+
raw_data : dict[str, Any]
|
|
36
|
+
Raw data received (for audit/debugging).
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
round_number: int
|
|
40
|
+
extracted_fields: dict[str, Any] = Field(default_factory=dict)
|
|
41
|
+
source: str = ""
|
|
42
|
+
timestamp: datetime = Field(default_factory=datetime.now)
|
|
43
|
+
raw_data: dict[str, Any] = Field(default_factory=dict)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ExtractionState(BaseModel):
|
|
47
|
+
"""Tracks multi-round extraction progress for a single entity.
|
|
48
|
+
|
|
49
|
+
Accumulates extracted data across rounds and computes which required
|
|
50
|
+
fields are still missing.
|
|
51
|
+
|
|
52
|
+
Attributes
|
|
53
|
+
----------
|
|
54
|
+
job_id : str
|
|
55
|
+
Unique extraction job identifier.
|
|
56
|
+
entity_type : str
|
|
57
|
+
Type of entity being extracted (e.g., "claim", "order").
|
|
58
|
+
entity_id : str
|
|
59
|
+
Unique entity identifier.
|
|
60
|
+
status : str
|
|
61
|
+
Current status: "pending", "extracting", "complete", "failed".
|
|
62
|
+
current_round : int
|
|
63
|
+
Number of rounds completed so far.
|
|
64
|
+
max_rounds : int
|
|
65
|
+
Maximum allowed extraction rounds before auto-failure.
|
|
66
|
+
required_fields : list[str]
|
|
67
|
+
Fields that must be extracted for completion.
|
|
68
|
+
extracted_data : dict[str, Any]
|
|
69
|
+
Accumulated extracted data across all rounds.
|
|
70
|
+
round_history : list[RoundRecord]
|
|
71
|
+
Ordered list of round snapshots.
|
|
72
|
+
failure_reason : str | None
|
|
73
|
+
Reason for failure (if status is "failed").
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
job_id: str
|
|
77
|
+
entity_type: str = ""
|
|
78
|
+
entity_id: str = ""
|
|
79
|
+
status: str = "pending"
|
|
80
|
+
current_round: int = 0
|
|
81
|
+
max_rounds: int = 5
|
|
82
|
+
required_fields: list[str] = Field(default_factory=list)
|
|
83
|
+
extracted_data: dict[str, Any] = Field(default_factory=dict)
|
|
84
|
+
round_history: list[RoundRecord] = Field(default_factory=list)
|
|
85
|
+
failure_reason: str | None = None
|
|
86
|
+
|
|
87
|
+
@computed_field # type: ignore[prop-decorator]
|
|
88
|
+
@property
|
|
89
|
+
def missing_fields(self) -> list[str]:
|
|
90
|
+
"""Fields still needed for completion."""
|
|
91
|
+
return [
|
|
92
|
+
f
|
|
93
|
+
for f in self.required_fields
|
|
94
|
+
if f not in self.extracted_data or self.extracted_data[f] is None
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
@computed_field # type: ignore[prop-decorator]
|
|
98
|
+
@property
|
|
99
|
+
def is_complete(self) -> bool:
|
|
100
|
+
"""Whether all required fields have been extracted."""
|
|
101
|
+
return len(self.missing_fields) == 0
|
|
102
|
+
|
|
103
|
+
@computed_field # type: ignore[prop-decorator]
|
|
104
|
+
@property
|
|
105
|
+
def is_max_rounds_reached(self) -> bool:
|
|
106
|
+
"""Whether the maximum number of rounds has been reached."""
|
|
107
|
+
return self.current_round >= self.max_rounds
|
|
@@ -249,6 +249,17 @@ class PipelineConfig(BaseModel):
|
|
|
249
249
|
default_factory=dict,
|
|
250
250
|
description="Service configurations. Format: {service_name: {class: str, config: dict}}",
|
|
251
251
|
)
|
|
252
|
+
state_machines: dict[str, dict[str, Any]] = Field(
|
|
253
|
+
default_factory=dict,
|
|
254
|
+
description=(
|
|
255
|
+
"Entity state machine definitions. "
|
|
256
|
+
"Format: {entity_type: {initial: str, transitions: dict}}"
|
|
257
|
+
),
|
|
258
|
+
)
|
|
259
|
+
observers: list[dict[str, Any]] = Field(
|
|
260
|
+
default_factory=list,
|
|
261
|
+
description=("Observer configurations. Format: [{class: str, config: dict}]"),
|
|
262
|
+
)
|
|
252
263
|
|
|
253
264
|
# Schema declarations
|
|
254
265
|
input_schema: dict[str, Any] | None = Field(
|
|
@@ -160,10 +160,52 @@ class SystemConfig(BaseModel):
|
|
|
160
160
|
default_factory=dict, description="Global service configurations"
|
|
161
161
|
)
|
|
162
162
|
|
|
163
|
+
# Lifecycle extensions (opt-in: presence of state_machines activates lifecycle mode)
|
|
164
|
+
state_machines: dict[str, dict[str, Any]] = Field(
|
|
165
|
+
default_factory=dict,
|
|
166
|
+
description=(
|
|
167
|
+
"Entity state machine definitions. "
|
|
168
|
+
"Format: {entity_type: {initial: str, transitions: dict, handlers: dict}}"
|
|
169
|
+
),
|
|
170
|
+
)
|
|
171
|
+
states: dict[str, dict[str, Any]] = Field(
|
|
172
|
+
default_factory=dict,
|
|
173
|
+
description=(
|
|
174
|
+
"State-to-process mapping. "
|
|
175
|
+
"Format: {STATE_NAME: {on_enter: process_name, terminal: bool}}"
|
|
176
|
+
),
|
|
177
|
+
)
|
|
178
|
+
on_transition: dict[str, dict[str, Any]] = Field(
|
|
179
|
+
default_factory=dict,
|
|
180
|
+
description=(
|
|
181
|
+
"Transition-specific process overrides. Format: {'FROM -> TO': {process: process_name}}"
|
|
182
|
+
),
|
|
183
|
+
)
|
|
184
|
+
observers: list[dict[str, Any]] = Field(
|
|
185
|
+
default_factory=list,
|
|
186
|
+
description="Observer configurations. Format: [{class: str, config: dict}]",
|
|
187
|
+
)
|
|
188
|
+
memory: dict[str, Any] = Field(
|
|
189
|
+
default_factory=dict,
|
|
190
|
+
description="Memory configuration (preload hooks).",
|
|
191
|
+
)
|
|
192
|
+
gc: dict[str, Any] = Field(
|
|
193
|
+
default_factory=dict,
|
|
194
|
+
description=(
|
|
195
|
+
"Garbage collection config for terminal entities. "
|
|
196
|
+
"Format: {check_interval: int, obligation_timeout: int, on_failure: str}"
|
|
197
|
+
),
|
|
198
|
+
)
|
|
199
|
+
|
|
163
200
|
# ------------------------------------------------------------------
|
|
164
201
|
# Derived helpers
|
|
165
202
|
# ------------------------------------------------------------------
|
|
166
203
|
|
|
204
|
+
@property
|
|
205
|
+
def is_lifecycle(self) -> bool:
|
|
206
|
+
"""Whether this system operates in lifecycle mode."""
|
|
207
|
+
return bool(self.state_machines)
|
|
208
|
+
|
|
167
209
|
@property
|
|
168
210
|
def process_names(self) -> list[str]:
|
|
169
211
|
"""Return ordered list of process names."""
|