voodoo-framework 2.5.1__tar.gz → 2.5.2__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.1 → voodoo_framework-2.5.2}/PKG-INFO +1 -1
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/__init__.py +1 -1
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/agent.py +220 -11
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/PKG-INFO +1 -1
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/LICENSE +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/README.md +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/pyproject.toml +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/setup.cfg +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/adapters/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/adapters/capabilities.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/adapters/registry.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/adapters/tailwind.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/adapters/voodoo_css.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/agent.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/agents/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/agents/models.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/agents/registry.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/anthropic.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/gemini.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/mock.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/ollama.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/providers/openai.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/tools/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ai/tools/registry.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/api.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/cookies.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/guards.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/jwt.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/middleware.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/passwords.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/auth/user.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/__main__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/agents.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/ai.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/approvals.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/auth.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/create.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/dev.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/doctor.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/executions.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/generate.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/inspect.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/new.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/objects.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/protocol.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/recover.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/routes.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/scaffolding.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/schedules.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/status.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/tasks.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/terminal.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/theme.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/version.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/cli/workers_cmd.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/components.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/config.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/app.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/errors.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/events.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/render.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/routing.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/sitemap.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/core/state.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/data/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/data/base.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/data/model.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/i18n.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/mcp/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/mcp/client.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/memory/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/memory/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/memory/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/mesh/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/mesh/client.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/mesh/event_bus.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/capability.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/compute.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/constraint.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/effect.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/intent.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/resource.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/state.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/primitives/time.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/protocol/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/protocol/export.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/protocol/schemas.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/py.typed +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/queue.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/routing/api.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/routing/pages.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/adaptive.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/capability.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/constraint.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/context.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/engine.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/errors.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/execution.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/graph.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/human.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/persistence.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/planner.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/scheduler.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/task.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/runtime/workflow.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/schedule.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/cors.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/csrf.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/headers.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/passwords.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/rate_limit.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/redaction.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/security/secrets.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/seo.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/static/client.js +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/status.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/cache/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/cache/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/cache/memory.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/cache/redis.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/database/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/database/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/database/postgres.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/database/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/events/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/events/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/events/local.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/events/postgres.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/events/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/execution/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/execution/migrations.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/execution/postgres.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/execution/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/manager.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/objects/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/objects/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/objects/local.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/objects/s3.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/interfaces.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/memory.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/postgres.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/redis.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/queue/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/scheduler/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/storage/scheduler/sqlite.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/telemetry/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/telemetry/api.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/telemetry/middleware.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/telemetry/otlp.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/telemetry/store.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/theme.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/tools/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/tools/registry.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/component.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/events.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/library.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/markdown.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/rendering.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/state.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/styles/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/styles/presets.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/ui/styles/theme.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/workers/__init__.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo/workers/queue.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/SOURCES.txt +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/dependency_links.txt +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/entry_points.txt +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/requires.txt +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/src/voodoo_framework.egg-info/top_level.txt +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_agent.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_agent_registry.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_agent_runtime.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_app.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_auth.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_capability_security.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_checkpoint_resume.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_chrome.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_cli.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_cli_inspect.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_components.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_config.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_contract_api.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_create.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_data.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_design_system.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_durable_hitl.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_events.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_execution_sqlite_store.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_http_runtime.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_human.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_i18n.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_integration.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_mcp.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_mcp_runtime.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_memory.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_mesh.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_mesh_event_bus.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_model.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_object_store.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_observability.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_persistence.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_planner_adaptive.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_primitives.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_protocol.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_provider_switching.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_providers.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_queue.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_reactive.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_runtime.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_scheduler.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_security.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_seo.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_state.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_theme.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_theme_presets.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_tools.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_ui.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/tests/test_websocket.py +0 -0
- {voodoo_framework-2.5.1 → voodoo_framework-2.5.2}/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.2
|
|
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>
|
|
@@ -4,14 +4,22 @@ The Agent turns a prompt into a final answer by iterating:
|
|
|
4
4
|
|
|
5
5
|
prompt → provider → tool calls (via registry) → final
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
``
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
The Agent is a *participant* in the runtime, not a parallel execution
|
|
8
|
+
framework. ``run()`` creates an :class:`~voodoo.runtime.execution.Execution`
|
|
9
|
+
via the :class:`~voodoo.runtime.engine.ExecutionEngine` so that agent
|
|
10
|
+
runs share the same lifecycle, persistence, recovery, authorization and
|
|
11
|
+
observability as every other execution path (HTTP, Worker, Task, MCP, …).
|
|
12
|
+
|
|
13
|
+
``run()`` returns a full :class:`AgentRun` record with token/cost
|
|
14
|
+
accounting; ``stream()`` yields normalized :class:`AgentEvent` objects
|
|
15
|
+
so the UI can react to agent activity in real time. Lifecycle states
|
|
16
|
+
(created → configured → running → tool_call ⇄ thinking → completed |
|
|
17
|
+
error → retry/failed) are captured for telemetry and surfaced through
|
|
18
|
+
mesh events (S7-2).
|
|
19
|
+
|
|
20
|
+
The ``context`` parameter is an explicit, opaque dict passed to every
|
|
21
|
+
tool call; it is neither memory nor a database — keep the concepts
|
|
22
|
+
separate.
|
|
15
23
|
"""
|
|
16
24
|
|
|
17
25
|
from __future__ import annotations
|
|
@@ -67,7 +75,15 @@ class AgentState(StrEnum):
|
|
|
67
75
|
|
|
68
76
|
@dataclass
|
|
69
77
|
class AgentRun:
|
|
70
|
-
"""Full run record with token/cost accounting.
|
|
78
|
+
"""Full run record with token/cost accounting.
|
|
79
|
+
|
|
80
|
+
This is a *projection* of the underlying
|
|
81
|
+
:class:`~voodoo.runtime.execution.Execution` — it exists for
|
|
82
|
+
backward-compatible telemetry and agent-specific accounting, not as
|
|
83
|
+
a second source of truth. The ``execution_id`` links this record
|
|
84
|
+
to the canonical Execution; ``trace_id`` is the correlation id
|
|
85
|
+
propagated through the entire stack.
|
|
86
|
+
"""
|
|
71
87
|
|
|
72
88
|
run_id: str
|
|
73
89
|
model: str
|
|
@@ -84,6 +100,7 @@ class AgentRun:
|
|
|
84
100
|
started_at: float = field(default_factory=time.time)
|
|
85
101
|
completed_at: float | None = None
|
|
86
102
|
trace_id: str | None = None
|
|
103
|
+
execution_id: str | None = None
|
|
87
104
|
|
|
88
105
|
|
|
89
106
|
@dataclass
|
|
@@ -151,6 +168,7 @@ class Agent:
|
|
|
151
168
|
agent_id: str | None = None,
|
|
152
169
|
name: str = "",
|
|
153
170
|
agent_registry: Any | None = None,
|
|
171
|
+
engine: Any | None = None,
|
|
154
172
|
**provider_kwargs: Any,
|
|
155
173
|
) -> None:
|
|
156
174
|
self.model = model or default_model()
|
|
@@ -171,6 +189,11 @@ class Agent:
|
|
|
171
189
|
self._agent_registry: Any | None = agent_registry
|
|
172
190
|
self._registered: bool = False
|
|
173
191
|
|
|
192
|
+
# Execution engine — when set, Agent.run() creates an Execution
|
|
193
|
+
# via the engine so the run shares lifecycle, persistence,
|
|
194
|
+
# recovery and observability with every other execution path.
|
|
195
|
+
self._engine: Any | None = engine
|
|
196
|
+
|
|
174
197
|
# Resolve tool specs/names into a list of names for tool calling.
|
|
175
198
|
self._tool_names: list[str] = []
|
|
176
199
|
if tools:
|
|
@@ -336,9 +359,22 @@ class Agent:
|
|
|
336
359
|
"""Invoke a registered tool through the runtime authorization path.
|
|
337
360
|
|
|
338
361
|
Flow: Agent → Intent → capability check → Tool → Effect → Mesh.
|
|
362
|
+
|
|
363
|
+
When running inside an
|
|
364
|
+
:class:`~voodoo.runtime.engine.ExecutionEngine` Execution, each
|
|
365
|
+
tool call creates a *child* Execution so the full agent activity
|
|
366
|
+
is visible in the execution graph:
|
|
367
|
+
|
|
368
|
+
::
|
|
369
|
+
|
|
370
|
+
Agent Execution
|
|
371
|
+
├── Tool Execution #1
|
|
372
|
+
├── Tool Execution #2
|
|
373
|
+
└── Tool Execution #3
|
|
374
|
+
|
|
339
375
|
Tools that declare ``permissions`` require a matching capability,
|
|
340
376
|
granted either to this agent or held by the active runtime
|
|
341
|
-
:class:`~voodoo.runtime.context.ExecutionContext`.
|
|
377
|
+
:class:`~voodoo.runtime.context.ExecutionContext`. Unauthorized
|
|
342
378
|
tool calls are denied before any side effect executes.
|
|
343
379
|
"""
|
|
344
380
|
from voodoo.primitives.effect import Effect
|
|
@@ -371,6 +407,15 @@ class Agent:
|
|
|
371
407
|
f"{', '.join(missing)}"
|
|
372
408
|
}
|
|
373
409
|
|
|
410
|
+
# When inside an engine Execution, create a child Execution for
|
|
411
|
+
# this tool call so it appears in the execution graph.
|
|
412
|
+
engine = ctx.engine if ctx else None
|
|
413
|
+
if engine is not None:
|
|
414
|
+
return await self._execute_tool_as_child_execution(
|
|
415
|
+
engine, name, arguments, spec, ctx
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
# Standalone path: record as an Effect on the current context.
|
|
374
419
|
effect = Effect(
|
|
375
420
|
name=f"tool.{name}", capability_name=required[0] if required else None
|
|
376
421
|
)
|
|
@@ -391,6 +436,56 @@ class Agent:
|
|
|
391
436
|
await self._broadcast("tool.completed", {"tool": name, "status": "succeeded"})
|
|
392
437
|
return result
|
|
393
438
|
|
|
439
|
+
async def _execute_tool_as_child_execution(
|
|
440
|
+
self,
|
|
441
|
+
engine: Any,
|
|
442
|
+
name: str,
|
|
443
|
+
arguments: dict[str, Any],
|
|
444
|
+
spec: Any,
|
|
445
|
+
parent_ctx: Any,
|
|
446
|
+
) -> Any:
|
|
447
|
+
"""Execute a tool call as a child Execution on the engine.
|
|
448
|
+
|
|
449
|
+
Creates a child Execution with its own lifecycle, capability
|
|
450
|
+
context and effect record. The parent agent Execution's
|
|
451
|
+
capabilities propagate to the child (Step 4: capability
|
|
452
|
+
propagation).
|
|
453
|
+
"""
|
|
454
|
+
from voodoo.primitives.intent import Intent
|
|
455
|
+
from voodoo.runtime.context import ExecutionContext
|
|
456
|
+
|
|
457
|
+
intent = Intent(
|
|
458
|
+
name=f"tool.{name}",
|
|
459
|
+
description=f"Tool call: {name}",
|
|
460
|
+
params={"tool": name, "arguments": arguments},
|
|
461
|
+
requires=list(spec.permissions if spec else []),
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
async def _tool_compute(ctx: ExecutionContext) -> Any:
|
|
465
|
+
await self._broadcast("tool.called", {"tool": name, "arguments": arguments})
|
|
466
|
+
try:
|
|
467
|
+
result = await self.registry.call(name, **arguments)
|
|
468
|
+
await self._broadcast(
|
|
469
|
+
"tool.completed",
|
|
470
|
+
{"tool": name, "status": "succeeded"},
|
|
471
|
+
)
|
|
472
|
+
return result
|
|
473
|
+
except Exception as e: # noqa: BLE001
|
|
474
|
+
await self._broadcast(
|
|
475
|
+
"tool.completed",
|
|
476
|
+
{"tool": name, "status": "failed", "error": str(e)},
|
|
477
|
+
)
|
|
478
|
+
return {"error": str(e)}
|
|
479
|
+
|
|
480
|
+
execution = await engine.execute(
|
|
481
|
+
intent,
|
|
482
|
+
_tool_compute,
|
|
483
|
+
actor=f"agent:{self.agent_id}",
|
|
484
|
+
capabilities=list(spec.permissions if spec else []),
|
|
485
|
+
parent=parent_ctx,
|
|
486
|
+
)
|
|
487
|
+
return execution.result
|
|
488
|
+
|
|
394
489
|
# -- run ---------------------------------------------------------------
|
|
395
490
|
|
|
396
491
|
async def run(
|
|
@@ -401,12 +496,126 @@ class Agent:
|
|
|
401
496
|
) -> AgentRun:
|
|
402
497
|
"""Execute prompt → provider → tool calls → final; return AgentRun.
|
|
403
498
|
|
|
499
|
+
When an :class:`~voodoo.runtime.engine.ExecutionEngine` is
|
|
500
|
+
available (either passed at construction or attached to the
|
|
501
|
+
active :class:`~voodoo.runtime.context.ExecutionContext`), the
|
|
502
|
+
run creates a first-class
|
|
503
|
+
:class:`~voodoo.runtime.execution.Execution` so it shares
|
|
504
|
+
lifecycle, persistence, recovery and observability with every
|
|
505
|
+
other execution path.
|
|
506
|
+
|
|
404
507
|
``history`` prepends prior conversation turns (a list of ``Message``
|
|
405
508
|
dicts) before the new user prompt, enabling multi-turn chat.
|
|
406
509
|
"""
|
|
407
|
-
|
|
510
|
+
from voodoo.runtime.context import current_context
|
|
511
|
+
|
|
512
|
+
# Resolve the engine: explicit on the agent, or from the active
|
|
513
|
+
# context (set by ExecutionEngine._run_compute), or None.
|
|
514
|
+
ctx = current_context()
|
|
515
|
+
engine = self._engine or (ctx.engine if ctx else None)
|
|
516
|
+
|
|
517
|
+
if engine is not None:
|
|
518
|
+
return await self._run_via_engine(
|
|
519
|
+
engine, prompt, context=context, history=history, parent_ctx=ctx
|
|
520
|
+
)
|
|
521
|
+
return await self._run_standalone(prompt, context=context, history=history)
|
|
522
|
+
|
|
523
|
+
# -- engine-backed run -------------------------------------------------
|
|
524
|
+
|
|
525
|
+
async def _run_via_engine(
|
|
526
|
+
self,
|
|
527
|
+
engine: Any,
|
|
528
|
+
prompt: str,
|
|
529
|
+
*,
|
|
530
|
+
context: dict | None = None,
|
|
531
|
+
history: list[Message] | None = None,
|
|
532
|
+
parent_ctx: Any | None = None,
|
|
533
|
+
) -> AgentRun:
|
|
534
|
+
"""Run the agent loop inside an ExecutionEngine Execution.
|
|
535
|
+
|
|
536
|
+
The engine owns lifecycle, persistence, recovery and
|
|
537
|
+
observability. The agent's provider loop is the *compute*
|
|
538
|
+
participant — it receives an
|
|
539
|
+
:class:`~voodoo.runtime.context.ExecutionContext` and returns a
|
|
540
|
+
:class:`~voodoo.runtime.engine.ComputeResult`.
|
|
541
|
+
"""
|
|
542
|
+
from voodoo.primitives.intent import Intent
|
|
543
|
+
from voodoo.runtime.context import ExecutionContext
|
|
544
|
+
|
|
545
|
+
# Build the intent that represents this agent run.
|
|
546
|
+
intent = Intent(
|
|
547
|
+
name=f"agent.{self.name or self.agent_id}",
|
|
548
|
+
description=prompt[:200],
|
|
549
|
+
params={"prompt": prompt, "model": self.model},
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
# The compute function encapsulates the entire provider loop.
|
|
553
|
+
async def _agent_compute(ctx: ExecutionContext) -> Any:
|
|
554
|
+
return await self._provider_loop(
|
|
555
|
+
prompt, context=context, history=history, run_id=ctx.execution_id
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
# Execute through the engine — this creates the Execution,
|
|
559
|
+
# manages lifecycle, persists, and records telemetry.
|
|
560
|
+
execution = await engine.execute(
|
|
561
|
+
intent,
|
|
562
|
+
_agent_compute,
|
|
563
|
+
actor=f"agent:{self.agent_id}",
|
|
564
|
+
capabilities=self.capabilities or None,
|
|
565
|
+
parent=parent_ctx,
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
# Build the AgentRun projection from the Execution.
|
|
569
|
+
compute_result = execution.result
|
|
570
|
+
if isinstance(compute_result, AgentRun):
|
|
571
|
+
compute_result.execution_id = execution.id
|
|
572
|
+
return compute_result
|
|
573
|
+
|
|
574
|
+
# Fallback: wrap unexpected result types.
|
|
575
|
+
return AgentRun(
|
|
576
|
+
run_id=execution.id,
|
|
577
|
+
model=self.model,
|
|
578
|
+
provider=self.provider.name,
|
|
579
|
+
prompt=prompt,
|
|
580
|
+
output=str(compute_result) if compute_result is not None else "",
|
|
581
|
+
status=execution.status.value,
|
|
582
|
+
error=execution.error,
|
|
583
|
+
started_at=execution._started_ts or time.time(),
|
|
584
|
+
completed_at=execution._completed_ts,
|
|
585
|
+
trace_id=execution.trace_id,
|
|
586
|
+
execution_id=execution.id,
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
async def _run_standalone(
|
|
590
|
+
self,
|
|
591
|
+
prompt: str,
|
|
592
|
+
*,
|
|
593
|
+
context: dict | None = None,
|
|
594
|
+
history: list[Message] | None = None,
|
|
595
|
+
) -> AgentRun:
|
|
596
|
+
"""Run the agent loop without an engine (backward-compatible).
|
|
597
|
+
|
|
598
|
+
Used when no ExecutionEngine is available. Still produces a
|
|
599
|
+
valid AgentRun with telemetry and memory writes.
|
|
600
|
+
"""
|
|
601
|
+
return await self._provider_loop(prompt, context=context, history=history)
|
|
602
|
+
|
|
603
|
+
async def _provider_loop(
|
|
604
|
+
self,
|
|
605
|
+
prompt: str,
|
|
606
|
+
*,
|
|
607
|
+
context: dict | None = None,
|
|
608
|
+
history: list[Message] | None = None,
|
|
609
|
+
run_id: str | None = None,
|
|
610
|
+
) -> AgentRun:
|
|
611
|
+
"""The core provider loop shared by engine-backed and standalone runs.
|
|
612
|
+
|
|
613
|
+
When ``run_id`` is ``None``, a new UUID is generated. When
|
|
614
|
+
called inside an engine Execution, ``run_id`` is the execution id.
|
|
615
|
+
"""
|
|
408
616
|
from voodoo.telemetry import telemetry_store
|
|
409
617
|
|
|
618
|
+
run_id = run_id or str(uuid.uuid4())
|
|
410
619
|
trace_id = (
|
|
411
620
|
telemetry_store.trace_id_var.get()
|
|
412
621
|
if hasattr(telemetry_store, "trace_id_var")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voodoo-framework
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.2
|
|
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
|