voodoo-framework 2.5.0__tar.gz → 2.5.1__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.
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/PKG-INFO +1 -1
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/__init__.py +1 -1
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/protocol/schemas.py +81 -15
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/execution.py +53 -1
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/execution/sqlite.py +5 -1
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/PKG-INFO +1 -1
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/LICENSE +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/README.md +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/pyproject.toml +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/setup.cfg +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/adapters/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/adapters/capabilities.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/adapters/registry.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/adapters/tailwind.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/adapters/voodoo_css.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/agent.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/agents/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/agents/models.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/agents/registry.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/agent.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/anthropic.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/gemini.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/mock.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/ollama.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/providers/openai.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/tools/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ai/tools/registry.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/api.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/cookies.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/guards.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/jwt.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/middleware.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/passwords.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/auth/user.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/__main__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/agents.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/ai.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/approvals.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/auth.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/create.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/dev.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/doctor.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/executions.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/generate.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/inspect.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/new.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/objects.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/protocol.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/recover.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/routes.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/scaffolding.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/schedules.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/status.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/tasks.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/terminal.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/theme.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/version.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/cli/workers_cmd.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/components.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/config.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/app.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/errors.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/events.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/render.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/routing.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/sitemap.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/core/state.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/data/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/data/base.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/data/model.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/i18n.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/mcp/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/mcp/client.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/memory/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/memory/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/memory/sqlite.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/mesh/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/mesh/client.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/mesh/event_bus.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/capability.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/compute.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/constraint.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/effect.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/intent.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/resource.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/state.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/primitives/time.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/protocol/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/protocol/export.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/py.typed +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/queue.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/routing/api.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/routing/pages.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/adaptive.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/capability.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/constraint.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/context.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/engine.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/errors.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/graph.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/human.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/persistence.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/planner.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/scheduler.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/task.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/runtime/workflow.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/schedule.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/cors.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/csrf.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/headers.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/passwords.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/rate_limit.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/redaction.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/security/secrets.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/seo.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/static/client.js +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/status.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/cache/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/cache/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/cache/memory.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/cache/redis.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/database/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/database/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/database/postgres.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/database/sqlite.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/events/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/events/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/events/local.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/events/postgres.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/events/sqlite.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/execution/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/execution/migrations.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/execution/postgres.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/manager.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/objects/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/objects/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/objects/local.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/objects/s3.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/interfaces.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/memory.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/postgres.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/redis.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/queue/sqlite.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/scheduler/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/storage/scheduler/sqlite.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/telemetry/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/telemetry/api.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/telemetry/middleware.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/telemetry/otlp.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/telemetry/store.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/theme.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/tools/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/tools/registry.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/component.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/events.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/library.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/markdown.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/rendering.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/state.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/styles/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/styles/presets.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/ui/styles/theme.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/workers/__init__.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo/workers/queue.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/SOURCES.txt +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/dependency_links.txt +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/entry_points.txt +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/requires.txt +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/src/voodoo_framework.egg-info/top_level.txt +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_agent.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_agent_registry.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_agent_runtime.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_app.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_auth.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_capability_security.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_checkpoint_resume.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_chrome.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_cli.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_cli_inspect.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_components.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_config.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_contract_api.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_create.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_data.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_design_system.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_durable_hitl.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_events.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_execution_sqlite_store.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_http_runtime.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_human.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_i18n.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_integration.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_mcp.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_mcp_runtime.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_memory.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_mesh.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_mesh_event_bus.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_model.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_object_store.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_observability.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_persistence.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_planner_adaptive.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_primitives.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_protocol.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_provider_switching.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_providers.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_queue.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_reactive.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_runtime.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_scheduler.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_security.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_seo.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_state.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_theme.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_theme_presets.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_tools.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_ui.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_websocket.py +0 -0
- {voodoo_framework-2.5.0 → voodoo_framework-2.5.1}/tests/test_workers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voodoo-framework
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.1
|
|
4
4
|
Summary: The programmable runtime for adaptive applications and operational systems — web, APIs, agents, workers, human workflows, distributed systems, and physical systems in one runtime.
|
|
5
5
|
Author-email: Helder Perez <contact@helderperez.com>
|
|
6
6
|
Maintainer-email: Helder Perez <contact@helderperez.com>
|
|
@@ -17,7 +17,7 @@ Compatibility policy (see ``docs/protocol.md``):
|
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
-
from datetime import datetime
|
|
20
|
+
from datetime import UTC, datetime
|
|
21
21
|
from enum import StrEnum
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
@@ -150,8 +150,8 @@ class Identity(BaseModel):
|
|
|
150
150
|
id: str = Field(description="Globally unique entity ID (UUID4).")
|
|
151
151
|
kind: str = Field(description="Entity kind (e.g. 'agent', 'execution', 'task').")
|
|
152
152
|
owner: str | None = None
|
|
153
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
154
|
-
updated_at: datetime = Field(default_factory=datetime.
|
|
153
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
154
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
155
155
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
156
156
|
|
|
157
157
|
|
|
@@ -165,7 +165,7 @@ class Capability(BaseModel):
|
|
|
165
165
|
delegate_to: str | None = None
|
|
166
166
|
expires_at: datetime | None = None
|
|
167
167
|
revoked: bool = False
|
|
168
|
-
issued_at: datetime = Field(default_factory=datetime.
|
|
168
|
+
issued_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
169
169
|
issued_by: str | None = None
|
|
170
170
|
|
|
171
171
|
|
|
@@ -228,8 +228,8 @@ class Intent(BaseModel):
|
|
|
228
228
|
requires: list[str] = Field(default_factory=list)
|
|
229
229
|
constraints: list[Constraint] = Field(default_factory=list)
|
|
230
230
|
effect_ids: list[str] = Field(default_factory=list)
|
|
231
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
232
|
-
updated_at: datetime = Field(default_factory=datetime.
|
|
231
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
232
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
233
233
|
result: Any = None
|
|
234
234
|
error: str | None = None
|
|
235
235
|
|
|
@@ -248,7 +248,7 @@ class Effect(BaseModel):
|
|
|
248
248
|
status: EffectStatus = EffectStatus.PENDING
|
|
249
249
|
result: Any = None
|
|
250
250
|
error: str | None = None
|
|
251
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
251
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
252
252
|
executed_at: datetime | None = None
|
|
253
253
|
actor: str | None = None
|
|
254
254
|
principal: str | None = None
|
|
@@ -275,10 +275,76 @@ class Execution(BaseModel):
|
|
|
275
275
|
error: str | None = None
|
|
276
276
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
277
277
|
checkpoint: dict[str, Any] | None = None
|
|
278
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
278
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
279
279
|
started_at: datetime | None = None
|
|
280
280
|
completed_at: datetime | None = None
|
|
281
281
|
|
|
282
|
+
# -- runtime conversion ------------------------------------------------
|
|
283
|
+
|
|
284
|
+
@classmethod
|
|
285
|
+
def from_runtime_execution(
|
|
286
|
+
cls,
|
|
287
|
+
exec: Any, # noqa: ANN401 — runtime.Execution
|
|
288
|
+
) -> Execution:
|
|
289
|
+
"""Convert a runtime ``Execution`` to a protocol ``Execution``.
|
|
290
|
+
|
|
291
|
+
Runtime ``State`` objects in ``state_changes`` are converted to dicts
|
|
292
|
+
via ``model_dump()`` so the protocol representation is JSON-safe.
|
|
293
|
+
"""
|
|
294
|
+
return cls(
|
|
295
|
+
id=exec.id,
|
|
296
|
+
trace_id=exec.trace_id,
|
|
297
|
+
parent_execution_id=exec.parent_execution_id,
|
|
298
|
+
status=ExecutionStatus(exec.status.value),
|
|
299
|
+
intent=exec.intent,
|
|
300
|
+
actor=exec.actor,
|
|
301
|
+
compute=exec.compute,
|
|
302
|
+
capabilities=list(exec.capabilities),
|
|
303
|
+
resources=exec.resources,
|
|
304
|
+
effects=list(exec.effects),
|
|
305
|
+
state_changes=[
|
|
306
|
+
s.model_dump() if hasattr(s, "model_dump") else s
|
|
307
|
+
for s in exec.state_changes
|
|
308
|
+
],
|
|
309
|
+
result=exec.result,
|
|
310
|
+
error=exec.error,
|
|
311
|
+
metadata=dict(exec.metadata),
|
|
312
|
+
checkpoint=exec.checkpoint,
|
|
313
|
+
created_at=exec.created_at,
|
|
314
|
+
started_at=exec.started_at,
|
|
315
|
+
completed_at=exec.completed_at,
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
def to_runtime_execution(self) -> Any: # noqa: ANN401
|
|
319
|
+
"""Convert this protocol ``Execution`` back to a runtime ``Execution``.
|
|
320
|
+
|
|
321
|
+
Requires ``voodoo.runtime.execution.Execution`` to be importable.
|
|
322
|
+
Uses a lazy import to avoid circular dependencies.
|
|
323
|
+
"""
|
|
324
|
+
from voodoo.runtime.execution import Execution as RuntimeExecution
|
|
325
|
+
from voodoo.runtime.execution import ExecutionStatus as RuntimeStatus
|
|
326
|
+
|
|
327
|
+
return RuntimeExecution(
|
|
328
|
+
id=self.id,
|
|
329
|
+
trace_id=self.trace_id,
|
|
330
|
+
parent_execution_id=self.parent_execution_id,
|
|
331
|
+
status=RuntimeStatus(self.status.value),
|
|
332
|
+
intent=self.intent,
|
|
333
|
+
actor=self.actor,
|
|
334
|
+
compute=self.compute,
|
|
335
|
+
capabilities=list(self.capabilities),
|
|
336
|
+
resources=self.resources,
|
|
337
|
+
effects=list(self.effects),
|
|
338
|
+
state_changes=self.state_changes,
|
|
339
|
+
result=self.result,
|
|
340
|
+
error=self.error,
|
|
341
|
+
metadata=dict(self.metadata),
|
|
342
|
+
checkpoint=self.checkpoint,
|
|
343
|
+
created_at=self.created_at,
|
|
344
|
+
started_at=self.started_at,
|
|
345
|
+
completed_at=self.completed_at,
|
|
346
|
+
)
|
|
347
|
+
|
|
282
348
|
|
|
283
349
|
class Task(BaseModel):
|
|
284
350
|
"""A queued work item (worker task)."""
|
|
@@ -326,7 +392,7 @@ class ObjectRef(BaseModel):
|
|
|
326
392
|
content_type: str | None = None
|
|
327
393
|
checksum: str | None = None
|
|
328
394
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
329
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
395
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
330
396
|
|
|
331
397
|
|
|
332
398
|
class Error(BaseModel):
|
|
@@ -339,7 +405,7 @@ class Error(BaseModel):
|
|
|
339
405
|
trace_id: str | None = None
|
|
340
406
|
details: dict[str, Any] = Field(default_factory=dict)
|
|
341
407
|
cause: str | None = None
|
|
342
|
-
timestamp: datetime = Field(default_factory=datetime.
|
|
408
|
+
timestamp: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
343
409
|
|
|
344
410
|
|
|
345
411
|
class TelemetrySpan(BaseModel):
|
|
@@ -370,7 +436,7 @@ class Approval(BaseModel):
|
|
|
370
436
|
decided_by: str | None = None
|
|
371
437
|
decided_at: datetime | None = None
|
|
372
438
|
reason: str | None = None
|
|
373
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
439
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
374
440
|
participant: str | None = None
|
|
375
441
|
|
|
376
442
|
|
|
@@ -389,8 +455,8 @@ class AgentEntity(BaseModel):
|
|
|
389
455
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
390
456
|
state: str = "active"
|
|
391
457
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
392
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
393
|
-
updated_at: datetime = Field(default_factory=datetime.
|
|
458
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
459
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
394
460
|
|
|
395
461
|
|
|
396
462
|
class AgentRun(BaseModel):
|
|
@@ -424,8 +490,8 @@ class MemoryEntry(BaseModel):
|
|
|
424
490
|
tags: list[str] = Field(default_factory=list)
|
|
425
491
|
source_execution_id: str | None = None
|
|
426
492
|
importance: float = 0.5
|
|
427
|
-
created_at: datetime = Field(default_factory=datetime.
|
|
428
|
-
updated_at: datetime = Field(default_factory=datetime.
|
|
493
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
494
|
+
updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
429
495
|
expires_at: datetime | None = None
|
|
430
496
|
|
|
431
497
|
|
|
@@ -33,7 +33,7 @@ from voodoo.primitives.intent import Intent
|
|
|
33
33
|
from voodoo.primitives.resource import Resource
|
|
34
34
|
from voodoo.primitives.state import State
|
|
35
35
|
|
|
36
|
-
__all__ = ["ExecutionStatus", "Execution"]
|
|
36
|
+
__all__ = ["ExecutionStatus", "LEGAL_TRANSITIONS", "Execution"]
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
class ExecutionStatus(StrEnum):
|
|
@@ -67,6 +67,52 @@ class ExecutionStatus(StrEnum):
|
|
|
67
67
|
)
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
# ---------------------------------------------------------------------------
|
|
71
|
+
# Legal state transitions — enforced by Execution._transition()
|
|
72
|
+
# ---------------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
LEGAL_TRANSITIONS: dict[ExecutionStatus, set[ExecutionStatus]] = {
|
|
75
|
+
ExecutionStatus.CREATED: {
|
|
76
|
+
ExecutionStatus.PLANNED,
|
|
77
|
+
ExecutionStatus.AUTHORIZED,
|
|
78
|
+
ExecutionStatus.RUNNING,
|
|
79
|
+
ExecutionStatus.WAITING,
|
|
80
|
+
ExecutionStatus.COMPLETED,
|
|
81
|
+
ExecutionStatus.FAILED,
|
|
82
|
+
ExecutionStatus.CANCELLED,
|
|
83
|
+
},
|
|
84
|
+
ExecutionStatus.PLANNED: {
|
|
85
|
+
ExecutionStatus.AUTHORIZED,
|
|
86
|
+
ExecutionStatus.RUNNING,
|
|
87
|
+
ExecutionStatus.FAILED,
|
|
88
|
+
ExecutionStatus.CANCELLED,
|
|
89
|
+
},
|
|
90
|
+
ExecutionStatus.AUTHORIZED: {
|
|
91
|
+
ExecutionStatus.RUNNING,
|
|
92
|
+
ExecutionStatus.FAILED,
|
|
93
|
+
ExecutionStatus.CANCELLED,
|
|
94
|
+
},
|
|
95
|
+
ExecutionStatus.RUNNING: {
|
|
96
|
+
ExecutionStatus.WAITING,
|
|
97
|
+
ExecutionStatus.COMPLETED,
|
|
98
|
+
ExecutionStatus.FAILED,
|
|
99
|
+
ExecutionStatus.CANCELLED,
|
|
100
|
+
ExecutionStatus.TIMED_OUT,
|
|
101
|
+
},
|
|
102
|
+
ExecutionStatus.WAITING: {
|
|
103
|
+
ExecutionStatus.RUNNING,
|
|
104
|
+
ExecutionStatus.COMPLETED,
|
|
105
|
+
ExecutionStatus.FAILED,
|
|
106
|
+
ExecutionStatus.CANCELLED,
|
|
107
|
+
},
|
|
108
|
+
# Terminal states — no transitions out.
|
|
109
|
+
ExecutionStatus.COMPLETED: set(),
|
|
110
|
+
ExecutionStatus.FAILED: set(),
|
|
111
|
+
ExecutionStatus.CANCELLED: set(),
|
|
112
|
+
ExecutionStatus.TIMED_OUT: set(),
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
70
116
|
class Execution(BaseModel):
|
|
71
117
|
"""A single runtime execution.
|
|
72
118
|
|
|
@@ -150,6 +196,12 @@ class Execution(BaseModel):
|
|
|
150
196
|
self._transition(ExecutionStatus.TIMED_OUT)
|
|
151
197
|
|
|
152
198
|
def _transition(self, new_status: ExecutionStatus) -> None:
|
|
199
|
+
allowed = LEGAL_TRANSITIONS.get(self.status, set())
|
|
200
|
+
if new_status not in allowed:
|
|
201
|
+
raise ValueError(
|
|
202
|
+
f"Illegal transition: {self.status.value} → {new_status.value}. "
|
|
203
|
+
f"Allowed: {sorted(s.value for s in allowed) or '(terminal state)'}"
|
|
204
|
+
)
|
|
153
205
|
self.status = new_status
|
|
154
206
|
|
|
155
207
|
# -- recording ---------------------------------------------------------
|
|
@@ -186,13 +186,17 @@ class SQLiteExecutionStore:
|
|
|
186
186
|
``running``, ``execution.completed`` for ``completed``, etc. A
|
|
187
187
|
``state.changed`` event is appended after the status event when the
|
|
188
188
|
execution already existed (subsequent write).
|
|
189
|
+
|
|
190
|
+
Materialized row is upserted FIRST to satisfy FK constraints
|
|
191
|
+
(``execution_events.execution_id → executions.id``), matching
|
|
192
|
+
the PostgreSQL store ordering.
|
|
189
193
|
"""
|
|
194
|
+
self._upsert_materialized(execution)
|
|
190
195
|
self.append_event(
|
|
191
196
|
execution.id,
|
|
192
197
|
_status_event_type(execution.status),
|
|
193
198
|
_execution_payload(execution),
|
|
194
199
|
)
|
|
195
|
-
self._upsert_materialized(execution)
|
|
196
200
|
|
|
197
201
|
def load_all(self) -> list[Execution]:
|
|
198
202
|
"""Return every execution (materialized projection, last write wins)."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voodoo-framework
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.1
|
|
4
4
|
Summary: The programmable runtime for adaptive applications and operational systems — web, APIs, agents, workers, human workflows, distributed systems, and physical systems in one runtime.
|
|
5
5
|
Author-email: Helder Perez <contact@helderperez.com>
|
|
6
6
|
Maintainer-email: Helder Perez <contact@helderperez.com>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|