voodoo-framework 2.6.2__tar.gz → 2.7.0__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.7.0/PKG-INFO +432 -0
- voodoo_framework-2.7.0/README.md +361 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/pyproject.toml +6 -2
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/__init__.py +7 -4
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/adapters/registry.py +22 -59
- voodoo_framework-2.7.0/src/voodoo/ai/agent.py +14 -0
- voodoo_framework-2.7.0/src/voodoo/ai/agent_runtime_truth.py +190 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/middleware.py +5 -8
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/user.py +114 -37
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/__init__.py +2 -0
- voodoo_framework-2.7.0/src/voodoo/cli/create.py +325 -0
- voodoo_framework-2.7.0/src/voodoo/cli/fabric.py +143 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/components.py +5 -5
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/config.py +96 -118
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/app.py +76 -101
- voodoo_framework-2.7.0/src/voodoo/data/__init__.py +51 -0
- voodoo_framework-2.7.0/src/voodoo/data/store_backend.py +178 -0
- voodoo_framework-2.7.0/src/voodoo/data/store_facade.py +140 -0
- voodoo_framework-2.7.0/src/voodoo/data/store_model.py +108 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/__init__.py +5 -12
- voodoo_framework-2.7.0/src/voodoo/edge/store_voodoo.py +273 -0
- voodoo_framework-2.7.0/src/voodoo/edge/world.py +217 -0
- voodoo_framework-2.7.0/src/voodoo/mesh/__init__.py +448 -0
- voodoo_framework-2.7.0/src/voodoo/mesh/auth.py +163 -0
- voodoo_framework-2.7.0/src/voodoo/mesh/client.py +145 -0
- voodoo_framework-2.7.0/src/voodoo/mesh/remote.py +284 -0
- voodoo_framework-2.7.0/src/voodoo/mesh/replay.py +166 -0
- voodoo_framework-2.7.0/src/voodoo/protocol/__init__.py +116 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/protocol/export.py +14 -31
- voodoo_framework-2.7.0/src/voodoo/protocol/fabric.py +86 -0
- voodoo_framework-2.7.0/src/voodoo/protocol/operational.py +190 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/routing/pages.py +24 -3
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/__init__.py +134 -29
- voodoo_framework-2.7.0/src/voodoo/runtime/adaptive.py +492 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/capability.py +208 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/context.py +82 -49
- voodoo_framework-2.7.0/src/voodoo/runtime/dashboard.py +146 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/engine.py +17 -4
- voodoo_framework-2.7.0/src/voodoo/runtime/fabric.py +341 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/goal.py +437 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/goal_store.py +176 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/human.py +4 -8
- voodoo_framework-2.7.0/src/voodoo/runtime/identity.py +156 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/identity_store.py +107 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/membership.py +227 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/operations.py +84 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/planner.py +285 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/policy.py +192 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/scheduler.py +22 -10
- voodoo_framework-2.7.0/src/voodoo/runtime/store.py +451 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/task.py +5 -11
- voodoo_framework-2.7.0/src/voodoo/runtime/transaction.py +252 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/workflow.py +165 -48
- voodoo_framework-2.7.0/src/voodoo/runtime/workflow_store.py +100 -0
- voodoo_framework-2.7.0/src/voodoo/runtime/world_execution.py +57 -0
- voodoo_framework-2.7.0/src/voodoo/static/client.js +322 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/database/sqlite.py +30 -5
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/events/__init__.py +3 -1
- voodoo_framework-2.7.0/src/voodoo/storage/events/store.py +141 -0
- voodoo_framework-2.7.0/src/voodoo/storage/execution/__init__.py +15 -0
- voodoo_framework-2.7.0/src/voodoo/storage/execution/store.py +234 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/manager.py +39 -28
- voodoo_framework-2.7.0/src/voodoo/storage/objects/store.py +124 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/__init__.py +5 -4
- voodoo_framework-2.7.0/src/voodoo/storage/queue/store.py +340 -0
- voodoo_framework-2.7.0/src/voodoo/storage/scheduler/__init__.py +31 -0
- voodoo_framework-2.7.0/src/voodoo/storage/scheduler/store.py +283 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/__init__.py +78 -17
- voodoo_framework-2.7.0/src/voodoo/ui/events.py +224 -0
- voodoo_framework-2.7.0/src/voodoo/ui/interactive.py +215 -0
- voodoo_framework-2.7.0/src/voodoo/ui/layout.py +31 -0
- voodoo_framework-2.7.0/src/voodoo/ui/primitives.py +230 -0
- voodoo_framework-2.7.0/src/voodoo/ui/product.py +434 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/rendering.py +21 -30
- voodoo_framework-2.7.0/src/voodoo/ui/state.py +223 -0
- voodoo_framework-2.7.0/src/voodoo/ui/styles/product.py +268 -0
- voodoo_framework-2.7.0/src/voodoo/ui/styles/system.py +273 -0
- voodoo_framework-2.7.0/src/voodoo/ui/styles/voodoo_system.py +169 -0
- voodoo_framework-2.7.0/src/voodoo/ui/voodoo_system.py +409 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/workers/queue.py +18 -15
- voodoo_framework-2.7.0/src/voodoo/world/__init__.py +17 -0
- voodoo_framework-2.7.0/src/voodoo/world/model.py +200 -0
- voodoo_framework-2.7.0/src/voodoo/world/models.py +137 -0
- voodoo_framework-2.7.0/src/voodoo/world/sqlite.py +289 -0
- voodoo_framework-2.7.0/src/voodoo/world/store.py +117 -0
- voodoo_framework-2.7.0/src/voodoo_framework.egg-info/PKG-INFO +432 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo_framework.egg-info/SOURCES.txt +90 -1
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo_framework.egg-info/requires.txt +5 -1
- voodoo_framework-2.7.0/tests/test_adaptive_agency_correctness.py +233 -0
- voodoo_framework-2.7.0/tests/test_agency_runtime_truth.py +172 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_agent.py +20 -108
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_auth.py +54 -60
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_chrome.py +4 -15
- voodoo_framework-2.7.0/tests/test_cli_fabric.py +28 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_components.py +12 -24
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_config.py +5 -11
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_create.py +61 -54
- voodoo_framework-2.7.0/tests/test_create_store_smoke.py +58 -0
- voodoo_framework-2.7.0/tests/test_design_system2.py +135 -0
- voodoo_framework-2.7.0/tests/test_durable_goal_runtime.py +161 -0
- voodoo_framework-2.7.0/tests/test_durable_workflow_runtime.py +157 -0
- voodoo_framework-2.7.0/tests/test_edge_voodoo_store.py +102 -0
- voodoo_framework-2.7.0/tests/test_edge_world.py +156 -0
- voodoo_framework-2.7.0/tests/test_goal_runtime.py +169 -0
- voodoo_framework-2.7.0/tests/test_identity_execution.py +149 -0
- voodoo_framework-2.7.0/tests/test_identity_foundation.py +156 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_memory.py +7 -10
- voodoo_framework-2.7.0/tests/test_mesh_remote_auth.py +216 -0
- voodoo_framework-2.7.0/tests/test_mesh_remote_authority.py +164 -0
- voodoo_framework-2.7.0/tests/test_mesh_remote_execution.py +326 -0
- voodoo_framework-2.7.0/tests/test_mesh_remote_outcomes.py +205 -0
- voodoo_framework-2.7.0/tests/test_mesh_remote_replay.py +178 -0
- voodoo_framework-2.7.0/tests/test_mesh_two_node_acceptance.py +254 -0
- voodoo_framework-2.7.0/tests/test_node_membership.py +134 -0
- voodoo_framework-2.7.0/tests/test_operational_policy.py +160 -0
- voodoo_framework-2.7.0/tests/test_operational_runtime_ui.py +70 -0
- voodoo_framework-2.7.0/tests/test_product_components.py +176 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_protocol.py +16 -46
- voodoo_framework-2.7.0/tests/test_protocol_fabric.py +55 -0
- voodoo_framework-2.7.0/tests/test_protocol_operational.py +96 -0
- voodoo_framework-2.7.0/tests/test_public_api_3.py +43 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_reactive.py +86 -5
- voodoo_framework-2.7.0/tests/test_runtime_fabric.py +226 -0
- voodoo_framework-2.7.0/tests/test_runtime_store_app_lifecycle.py +53 -0
- voodoo_framework-2.7.0/tests/test_runtime_store_lifecycle.py +211 -0
- voodoo_framework-2.7.0/tests/test_runtime_store_provider.py +200 -0
- voodoo_framework-2.7.0/tests/test_runtime_transaction.py +156 -0
- voodoo_framework-2.7.0/tests/test_sprint27_convergence.py +129 -0
- voodoo_framework-2.7.0/tests/test_sprint28_acceptance.py +154 -0
- voodoo_framework-2.7.0/tests/test_store_first_user_journey.py +116 -0
- voodoo_framework-2.7.0/tests/test_store_model_backend.py +209 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_ui.py +20 -82
- voodoo_framework-2.7.0/tests/test_ui_magic.py +101 -0
- voodoo_framework-2.7.0/tests/test_ui_magic_acceptance.py +99 -0
- voodoo_framework-2.7.0/tests/test_voodoo_store_events.py +64 -0
- voodoo_framework-2.7.0/tests/test_voodoo_store_execution.py +104 -0
- voodoo_framework-2.7.0/tests/test_voodoo_store_hitl_restart.py +138 -0
- voodoo_framework-2.7.0/tests/test_voodoo_store_queue.py +290 -0
- voodoo_framework-2.7.0/tests/test_voodoo_store_scheduler.py +253 -0
- voodoo_framework-2.7.0/tests/test_voodoo_system_components.py +197 -0
- voodoo_framework-2.7.0/tests/test_world_aware_execution.py +103 -0
- voodoo_framework-2.7.0/tests/test_world_model.py +134 -0
- voodoo_framework-2.7.0/tests/test_world_sqlite.py +121 -0
- voodoo_framework-2.6.2/PKG-INFO +0 -284
- voodoo_framework-2.6.2/README.md +0 -216
- voodoo_framework-2.6.2/src/voodoo/cli/create.py +0 -361
- voodoo_framework-2.6.2/src/voodoo/data/__init__.py +0 -72
- voodoo_framework-2.6.2/src/voodoo/mesh/__init__.py +0 -273
- voodoo_framework-2.6.2/src/voodoo/mesh/client.py +0 -59
- voodoo_framework-2.6.2/src/voodoo/protocol/__init__.py +0 -97
- voodoo_framework-2.6.2/src/voodoo/runtime/adaptive.py +0 -255
- voodoo_framework-2.6.2/src/voodoo/runtime/capability.py +0 -167
- voodoo_framework-2.6.2/src/voodoo/runtime/planner.py +0 -167
- voodoo_framework-2.6.2/src/voodoo/static/client.js +0 -152
- voodoo_framework-2.6.2/src/voodoo/storage/execution/__init__.py +0 -13
- voodoo_framework-2.6.2/src/voodoo/storage/scheduler/__init__.py +0 -9
- voodoo_framework-2.6.2/src/voodoo/ui/events.py +0 -90
- voodoo_framework-2.6.2/src/voodoo/ui/state.py +0 -191
- voodoo_framework-2.6.2/src/voodoo_framework.egg-info/PKG-INFO +0 -284
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/LICENSE +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/setup.cfg +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/adapters/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/adapters/capabilities.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/adapters/tailwind.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/adapters/voodoo_css.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/agent.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/agents/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/agents/models.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/agents/registry.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/__init__.py +0 -0
- /voodoo_framework-2.6.2/src/voodoo/ai/agent.py → /voodoo_framework-2.7.0/src/voodoo/ai/agent_legacy.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/anthropic.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/gemini.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/mock.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/ollama.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/providers/openai.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/tools/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ai/tools/registry.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/api.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/cookies.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/guards.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/jwt.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/auth/passwords.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/__main__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/agents.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/ai.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/approvals.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/auth.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/dev.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/doctor.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/executions.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/generate.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/inspect.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/new.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/objects.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/protocol.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/recover.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/routes.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/scaffolding.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/schedules.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/status.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/tasks.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/terminal.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/theme.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/version.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/cli/workers_cmd.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/errors.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/events.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/render.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/routing.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/sitemap.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/core/state.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/data/base.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/data/model.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/auth.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/errors.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/gateway.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/http.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/models.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/mqtt.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/protocol.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/simulator.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/edge/store.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/i18n.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/mcp/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/mcp/client.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/memory/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/memory/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/memory/sqlite.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/mesh/event_bus.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/capability.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/compute.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/constraint.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/effect.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/intent.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/resource.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/state.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/primitives/time.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/protocol/schemas.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/py.typed +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/queue.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/routing/api.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/constraint.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/errors.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/execution.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/graph.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/runtime/persistence.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/schedule.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/cors.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/csrf.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/headers.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/passwords.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/rate_limit.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/redaction.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/security/secrets.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/seo.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/status.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/cache/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/cache/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/cache/memory.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/cache/redis.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/database/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/database/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/database/postgres.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/events/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/events/local.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/events/postgres.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/events/sqlite.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/execution/migrations.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/execution/postgres.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/execution/sqlite.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/objects/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/objects/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/objects/local.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/objects/s3.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/interfaces.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/memory.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/postgres.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/redis.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/queue/sqlite.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/storage/scheduler/sqlite.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/telemetry/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/telemetry/api.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/telemetry/middleware.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/telemetry/otlp.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/telemetry/store.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/theme.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/tools/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/tools/registry.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/component.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/library.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/markdown.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/styles/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/styles/presets.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/ui/styles/theme.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo/workers/__init__.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo_framework.egg-info/dependency_links.txt +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo_framework.egg-info/entry_points.txt +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/src/voodoo_framework.egg-info/top_level.txt +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_agent_registry.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_agent_runtime.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_app.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_capability_security.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_checkpoint_resume.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_cli.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_cli_inspect.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_contract_api.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_data.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_design_system.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_durable_hitl.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_device.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_e2e.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_gateway.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_http.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_protocol.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_edge_security.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_events.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_execution_sqlite_store.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_hitl_persistence_correctness.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_http_runtime.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_human.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_i18n.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_integration.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_mcp.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_mcp_runtime.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_mesh.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_mesh_event_bus.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_model.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_object_store.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_observability.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_persistence.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_planner_adaptive.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_primitives.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_provider_switching.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_providers.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_queue.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_runtime.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_runtime_correctness.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_scheduler.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_security.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_seo.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_state.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_theme.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_theme_presets.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_tools.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_websocket.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_worker_retry_semantics.py +0 -0
- {voodoo_framework-2.6.2 → voodoo_framework-2.7.0}/tests/test_workers.py +0 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: voodoo-framework
|
|
3
|
+
Version: 2.7.0
|
|
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
|
+
Author-email: Helder Perez <contact@helderperez.com>
|
|
6
|
+
Maintainer-email: Helder Perez <contact@helderperez.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/helderperez-dev/voodoo
|
|
9
|
+
Project-URL: Documentation, https://github.com/helderperez-dev/voodoo#documentation
|
|
10
|
+
Project-URL: Repository, https://github.com/helderperez-dev/voodoo
|
|
11
|
+
Project-URL: Changelog, https://github.com/helderperez-dev/voodoo/blob/main/CHANGELOG.md
|
|
12
|
+
Project-URL: Roadmap, https://github.com/helderperez-dev/voodoo/blob/main/ROADMAP.md
|
|
13
|
+
Project-URL: Issues, https://github.com/helderperez-dev/voodoo/issues
|
|
14
|
+
Project-URL: Discussions, https://github.com/helderperez-dev/voodoo/discussions
|
|
15
|
+
Keywords: ai,agent,application-framework,async,durable-execution,mcp,realtime,reactive,web-framework
|
|
16
|
+
Classifier: Development Status :: 4 - Beta
|
|
17
|
+
Classifier: Framework :: AsyncIO
|
|
18
|
+
Classifier: Intended Audience :: Developers
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
24
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
25
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
|
26
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.12
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Requires-Dist: starlette
|
|
32
|
+
Requires-Dist: uvicorn
|
|
33
|
+
Requires-Dist: pydantic
|
|
34
|
+
Requires-Dist: voodoo-store<0.3,>=0.2.2
|
|
35
|
+
Requires-Dist: websockets
|
|
36
|
+
Requires-Dist: httpx
|
|
37
|
+
Requires-Dist: python-dotenv
|
|
38
|
+
Requires-Dist: pyyaml
|
|
39
|
+
Requires-Dist: typer
|
|
40
|
+
Requires-Dist: rich
|
|
41
|
+
Requires-Dist: aiofiles
|
|
42
|
+
Provides-Extra: ai
|
|
43
|
+
Requires-Dist: openai; extra == "ai"
|
|
44
|
+
Requires-Dist: anthropic; extra == "ai"
|
|
45
|
+
Requires-Dist: google-generativeai; extra == "ai"
|
|
46
|
+
Requires-Dist: ollama; extra == "ai"
|
|
47
|
+
Provides-Extra: mcp
|
|
48
|
+
Provides-Extra: dev
|
|
49
|
+
Requires-Dist: pytest; extra == "dev"
|
|
50
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
51
|
+
Requires-Dist: ruff; extra == "dev"
|
|
52
|
+
Requires-Dist: mypy; extra == "dev"
|
|
53
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
54
|
+
Requires-Dist: aiosqlite; extra == "dev"
|
|
55
|
+
Provides-Extra: sqlite
|
|
56
|
+
Requires-Dist: aiosqlite; extra == "sqlite"
|
|
57
|
+
Provides-Extra: postgres
|
|
58
|
+
Requires-Dist: psycopg[binary]>=3.3.4; extra == "postgres"
|
|
59
|
+
Provides-Extra: s3
|
|
60
|
+
Requires-Dist: boto3>=1.34; extra == "s3"
|
|
61
|
+
Requires-Dist: botocore>=1.34; extra == "s3"
|
|
62
|
+
Provides-Extra: redis
|
|
63
|
+
Requires-Dist: redis>=5.0; extra == "redis"
|
|
64
|
+
Provides-Extra: edge
|
|
65
|
+
Requires-Dist: paho-mqtt>=2.0; extra == "edge"
|
|
66
|
+
Provides-Extra: otel
|
|
67
|
+
Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
|
|
68
|
+
Requires-Dist: opentelemetry-sdk>=1.20; extra == "otel"
|
|
69
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20; extra == "otel"
|
|
70
|
+
Dynamic: license-file
|
|
71
|
+
|
|
72
|
+
# Voodoo
|
|
73
|
+
|
|
74
|
+
**The programmable runtime for adaptive applications and operational systems.**
|
|
75
|
+
|
|
76
|
+
Voodoo lets a Python application start as a page or API and grow into durable
|
|
77
|
+
workers, agents, human approvals, distributed participants and physical-device
|
|
78
|
+
workflows without replacing the execution model underneath it.
|
|
79
|
+
|
|
80
|
+
> Composition over configuration. Python over DSLs. Adapters over lock-in. Explicit capabilities over unrestricted autonomy.
|
|
81
|
+
|
|
82
|
+
## Why Voodoo?
|
|
83
|
+
|
|
84
|
+
Modern systems often assemble separate frameworks for HTTP, UI, persistence,
|
|
85
|
+
queues, scheduling, AI, realtime communication, workflow execution,
|
|
86
|
+
observability and devices. Voodoo provides a common runtime model so those
|
|
87
|
+
pieces can converge when the application actually needs them.
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
Entity → State → Intent → Capability → Execution → Effect → State
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`Compute`, `Time`, `Resource` and `Constraint` govern Execution. AI is one form
|
|
94
|
+
of Compute, not a second runtime.
|
|
95
|
+
|
|
96
|
+
An `Execution` is not every function call. It is meaningful work worth
|
|
97
|
+
observing, authorizing, recovering, accounting for, waiting on or reasoning
|
|
98
|
+
about.
|
|
99
|
+
|
|
100
|
+
For operational systems Voodoo also keeps attempted action and observed reality
|
|
101
|
+
separate:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
Effect != Observation
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
An Effect records what the runtime tried to do. An Observation records evidence
|
|
108
|
+
about what actually happened in the World.
|
|
109
|
+
|
|
110
|
+
## Quick start
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pip install voodoo-framework
|
|
114
|
+
voodoo create my_app
|
|
115
|
+
cd my_app
|
|
116
|
+
voodoo dev
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Open `http://localhost:8000`. On first run Voodoo creates:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
.voodoo/application.vstore
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
That Store is the default durable application substrate for local data, durable
|
|
126
|
+
work, scheduling, event state, objects, execution state, workflows, approvals,
|
|
127
|
+
identity state, and Edge/device state. A local application does not require an
|
|
128
|
+
external database, Redis, queue server, or object server.
|
|
129
|
+
|
|
130
|
+
AI provider SDKs are optional:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
pip install "voodoo-framework[ai]"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The core package does not install OpenAI, Anthropic, Gemini or Ollama SDKs.
|
|
137
|
+
Providers are resolved lazily when used.
|
|
138
|
+
|
|
139
|
+
## Voodoo Store by default
|
|
140
|
+
|
|
141
|
+
Voodoo Store is embedded application infrastructure. The framework owns one
|
|
142
|
+
Runtime Store handle per process/application lifecycle and shares it across
|
|
143
|
+
Store-backed Runtime domains.
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
Application
|
|
147
|
+
|
|
|
148
|
+
v
|
|
149
|
+
Voodoo Runtime
|
|
150
|
+
|
|
|
151
|
+
+-- Model / Data
|
|
152
|
+
+-- Jobs / Queue
|
|
153
|
+
+-- Scheduler
|
|
154
|
+
+-- Events
|
|
155
|
+
+-- Objects
|
|
156
|
+
+-- Execution / Workflow / HITL
|
|
157
|
+
+-- Identity
|
|
158
|
+
+-- Edge
|
|
159
|
+
|
|
|
160
|
+
v
|
|
161
|
+
.voodoo/application.vstore
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The Store is local-first and single-writer. PostgreSQL, SQLite, Redis, S3 and
|
|
165
|
+
other infrastructure remain explicit adapters for workloads that need them;
|
|
166
|
+
they are not silent defaults.
|
|
167
|
+
|
|
168
|
+
## Start simple
|
|
169
|
+
|
|
170
|
+
| You need | Voodoo primitive |
|
|
171
|
+
|---|---|
|
|
172
|
+
| UI-local mutable value | `state()` |
|
|
173
|
+
| Persistent business data | `Model` |
|
|
174
|
+
| Browser interaction | Python-callable UI event/action |
|
|
175
|
+
| Decoupled application notification | Mesh / event bus |
|
|
176
|
+
| Retryable background work | `@task` / durable queue |
|
|
177
|
+
| Meaningful durable/observable work | `Execution` |
|
|
178
|
+
| LLM reasoning and tool use | `Agent` + `@tool` |
|
|
179
|
+
| Authorization to produce an effect | `Capability` |
|
|
180
|
+
| Human decision inside work | HITL approval |
|
|
181
|
+
| Operational identity/evidence | `Entity` + `Observation` + `WorldModel` |
|
|
182
|
+
| Durable desired outcome | `Goal` + `GoalRuntime` |
|
|
183
|
+
| External physical participant | Edge / `DeviceGateway` |
|
|
184
|
+
| Future/recurring work | Scheduler |
|
|
185
|
+
|
|
186
|
+
See `docs/choosing-primitives.md` for semantic boundaries between State, Model,
|
|
187
|
+
Memory, events, tools, tasks, capabilities and executions.
|
|
188
|
+
|
|
189
|
+
## Small AI + data + event example
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
from voodoo import Agent, Model, tool
|
|
193
|
+
from voodoo.mesh import mesh
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class Lead(Model):
|
|
197
|
+
name: str
|
|
198
|
+
email: str
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@tool
|
|
202
|
+
async def create_lead(name: str, email: str) -> str:
|
|
203
|
+
lead = await Lead.create(name=name, email=email)
|
|
204
|
+
await mesh.emit("lead.created", {"id": lead.id, "name": name})
|
|
205
|
+
return f"Created lead #{lead.id}"
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@mesh.on("lead.created")
|
|
209
|
+
async def notify(payload):
|
|
210
|
+
print("new lead", payload["name"])
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
agent = Agent(model="mock:test", tools=["create_lead"])
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
With the default configuration, `Lead` is persisted through Voodoo Store. Tools
|
|
217
|
+
may also be exposed through MCP, but MCP is a separate interoperability
|
|
218
|
+
boundary, not a fake step inserted into every tool call.
|
|
219
|
+
|
|
220
|
+
## Operational closed loop
|
|
221
|
+
|
|
222
|
+
The operational runtime keeps attempted effects separate from observed reality:
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
simulated device
|
|
226
|
+
→ Edge
|
|
227
|
+
→ Observation
|
|
228
|
+
→ World
|
|
229
|
+
→ Goal / Intent
|
|
230
|
+
→ context-aware Planner
|
|
231
|
+
→ Capability + Policy
|
|
232
|
+
→ Execution
|
|
233
|
+
→ Effect
|
|
234
|
+
→ device
|
|
235
|
+
→ ACK / observed evidence
|
|
236
|
+
→ Observation
|
|
237
|
+
→ World
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Run the canary with:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
python examples/operational_closed_loop/main.py
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The World does not change merely because an Effect was sent. It changes only
|
|
247
|
+
when the simulated device reports observed evidence back through the Edge
|
|
248
|
+
boundary.
|
|
249
|
+
|
|
250
|
+
## What makes Voodoo different
|
|
251
|
+
|
|
252
|
+
- **One execution model.** APIs, agents, tools, workers, humans, remote nodes and
|
|
253
|
+
devices can converge on one traceable runtime instead of independent
|
|
254
|
+
orchestration stacks.
|
|
255
|
+
- **World-aware operational state.** `Entity`, `Relationship`, `Observation` and
|
|
256
|
+
`WorldModel` represent changing operational reality with provenance.
|
|
257
|
+
- **Governed agency.** Goal/Intent planning can use current World context, but
|
|
258
|
+
authority still flows through Capability and Policy.
|
|
259
|
+
- **AI is Compute.** Agents are powerful participants, not ambient authority.
|
|
260
|
+
- **Durable when it matters.** Executions, tasks, schedules, Goals and approvals
|
|
261
|
+
have persistence/recovery seams.
|
|
262
|
+
- **Human-in-the-loop is native.** Waiting is an execution lifecycle state.
|
|
263
|
+
- **Distributed without a second runtime.** Remote work re-enters the same
|
|
264
|
+
ExecutionEngine, capability and policy boundary.
|
|
265
|
+
- **Physical participants use the same semantics.** Edge devices report
|
|
266
|
+
evidence and receive Effects without owning a DeviceExecutionEngine.
|
|
267
|
+
- **Store-first and local-first.** Voodoo Store provides the default embedded
|
|
268
|
+
durable infrastructure; PostgreSQL, SQLite, Redis and S3-compatible storage
|
|
269
|
+
are explicit adapters.
|
|
270
|
+
- **Observability is structural.** Trace/execution lineage connects meaningful
|
|
271
|
+
work, Effects and resulting Observations.
|
|
272
|
+
|
|
273
|
+
## Canonical import model
|
|
274
|
+
|
|
275
|
+
The 2.x package root remains a compatibility facade. New code should use the
|
|
276
|
+
namespace that owns the concept:
|
|
277
|
+
|
|
278
|
+
```python
|
|
279
|
+
from voodoo import App, Agent, Model, page, state, task, tool
|
|
280
|
+
from voodoo.ui import Button, Card, DataTable
|
|
281
|
+
from voodoo.runtime import ExecutionEngine, Goal, GoalRuntime, Planner
|
|
282
|
+
from voodoo.world import Entity, Observation, WorldModel
|
|
283
|
+
from voodoo.edge import DeviceGateway, WorldAwareDeviceGateway
|
|
284
|
+
from voodoo.protocol import WorldSnapshot, RemoteExecutionRequest
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
See `docs/public-api-3.md` for the 3.0 import law and 2.x compatibility policy.
|
|
288
|
+
|
|
289
|
+
## Major capabilities
|
|
290
|
+
|
|
291
|
+
**Application:** server-rendered/reactive Python UI, routing/APIs, design
|
|
292
|
+
system/themes, SEO, async Model persistence, auth and security middleware.
|
|
293
|
+
|
|
294
|
+
**Runtime:** ExecutionEngine, durable checkpoints/recovery, workers/tasks,
|
|
295
|
+
scheduler, event infrastructure, human approvals, capability security,
|
|
296
|
+
contextual Policy, Goal Runtime and bounded adaptive planning/supervision.
|
|
297
|
+
|
|
298
|
+
**World:** stable entities, relationships, append-only observations, durable
|
|
299
|
+
World storage and reasoning/policy snapshots.
|
|
300
|
+
|
|
301
|
+
**AI:** agents, native provider tool calling, `@tool`, MCP integration, Memory,
|
|
302
|
+
model/provider abstraction and config-driven OpenAI-compatible endpoints.
|
|
303
|
+
|
|
304
|
+
**Distributed/Edge:** governed remote execution, replay/idempotency, distributed
|
|
305
|
+
WAITING/HITL, node membership/routing, device identity/auth, HTTP/MQTT Edge
|
|
306
|
+
semantics, effect delivery, ACKs and Edge → World evidence convergence.
|
|
307
|
+
|
|
308
|
+
**Infrastructure adapters:** PostgreSQL, SQLite, Redis, S3-compatible object
|
|
309
|
+
storage and OpenTelemetry are optional or explicit integrations behind Runtime
|
|
310
|
+
contracts.
|
|
311
|
+
|
|
312
|
+
## Installation
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# Core runtime (includes the Voodoo Store dependency)
|
|
316
|
+
pip install voodoo-framework
|
|
317
|
+
|
|
318
|
+
# Model providers
|
|
319
|
+
pip install "voodoo-framework[ai]"
|
|
320
|
+
|
|
321
|
+
# Explicit external adapters as needed
|
|
322
|
+
pip install "voodoo-framework[postgres,redis,s3,otel]"
|
|
323
|
+
|
|
324
|
+
# Explicit SQLite adapter when needed
|
|
325
|
+
pip install "voodoo-framework[sqlite]"
|
|
326
|
+
|
|
327
|
+
# Edge MQTT transport when needed
|
|
328
|
+
pip install "voodoo-framework[edge]"
|
|
329
|
+
|
|
330
|
+
# Development tools
|
|
331
|
+
pip install "voodoo-framework[dev]"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Other supported installation paths include `uv tool install voodoo-framework`
|
|
335
|
+
and `pipx install voodoo-framework`.
|
|
336
|
+
|
|
337
|
+
## Configuration
|
|
338
|
+
|
|
339
|
+
Voodoo is zero-config locally. The effective defaults are equivalent to:
|
|
340
|
+
|
|
341
|
+
```toml
|
|
342
|
+
[store]
|
|
343
|
+
provider = "voodoo"
|
|
344
|
+
path = ".voodoo/application.vstore"
|
|
345
|
+
|
|
346
|
+
[database]
|
|
347
|
+
provider = "voodoo"
|
|
348
|
+
|
|
349
|
+
[queue]
|
|
350
|
+
provider = "voodoo"
|
|
351
|
+
|
|
352
|
+
[events]
|
|
353
|
+
provider = "voodoo"
|
|
354
|
+
|
|
355
|
+
[objects]
|
|
356
|
+
provider = "voodoo"
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
You normally do not need to write those blocks. Override only the domain that
|
|
360
|
+
needs external infrastructure. For example:
|
|
361
|
+
|
|
362
|
+
```toml
|
|
363
|
+
[database]
|
|
364
|
+
provider = "postgres"
|
|
365
|
+
url = "postgresql://..."
|
|
366
|
+
|
|
367
|
+
[queue]
|
|
368
|
+
provider = "redis"
|
|
369
|
+
url = "redis://..."
|
|
370
|
+
|
|
371
|
+
[objects]
|
|
372
|
+
provider = "s3"
|
|
373
|
+
bucket = "my-bucket"
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
Voodoo does not silently migrate or copy legacy SQLite/PostgreSQL/Redis/S3 data
|
|
377
|
+
into the Store at startup. Migration is an explicit operation.
|
|
378
|
+
|
|
379
|
+
## Current Store boundaries
|
|
380
|
+
|
|
381
|
+
The Store-first path is usable, but current 0.2.x boundaries are explicit:
|
|
382
|
+
|
|
383
|
+
- schedule enable/disable is supported, but arbitrary schedule-cursor
|
|
384
|
+
repositioning is not exposed by Store 0.2.2;
|
|
385
|
+
- Events and Objects preserve their Framework contracts through Store-backed
|
|
386
|
+
compatibility layers while richer native Python bindings evolve;
|
|
387
|
+
- node-local Stores are not replicated automatically;
|
|
388
|
+
- Voodoo does not claim distributed consensus, global serializable
|
|
389
|
+
transactions, or global exactly-once execution.
|
|
390
|
+
|
|
391
|
+
## Documentation
|
|
392
|
+
|
|
393
|
+
Start here:
|
|
394
|
+
|
|
395
|
+
- `docs/hello_world.md` — first application
|
|
396
|
+
- `docs/choosing-primitives.md` — which abstraction to use
|
|
397
|
+
- `docs/primitives.md` — computational model
|
|
398
|
+
- `docs/execution-model.md` and `docs/runtime.md` — execution semantics
|
|
399
|
+
- `docs/agents.md`, `docs/tools.md`, `docs/mcp.md` — AI/tool integration
|
|
400
|
+
- `docs/hitl.md` — human approvals
|
|
401
|
+
- `docs/protocol.md` — language-neutral semantic boundary
|
|
402
|
+
- `docs/public-api-3.md` — canonical 3.0 import model
|
|
403
|
+
- `ARCHITECTURE.md` — root architecture reference
|
|
404
|
+
- `ROADMAP.md` — long-range architectural direction
|
|
405
|
+
- `SPRINT_PLAN.md` — implementation source of truth
|
|
406
|
+
|
|
407
|
+
## Examples
|
|
408
|
+
|
|
409
|
+
| Example | Purpose |
|
|
410
|
+
|---|---|
|
|
411
|
+
| `examples/hello_world/` | smallest page |
|
|
412
|
+
| `examples/dashboard/` | reactive UI/state |
|
|
413
|
+
| `examples/realtime/` | realtime communication |
|
|
414
|
+
| `examples/ai_agent/` | agent/tool application |
|
|
415
|
+
| `examples/ai_saas/` | UI + Agent + Tool + Mesh + Worker + Model |
|
|
416
|
+
| `examples/ui_magic/` | current callable UI / Design System acceptance app |
|
|
417
|
+
| `examples/operational_closed_loop/` | Edge → World → Goal → Execution → Effect → evidence canary |
|
|
418
|
+
|
|
419
|
+
## Project status
|
|
420
|
+
|
|
421
|
+
Voodoo is beta software. Sprint completion and a published package release are
|
|
422
|
+
intentionally separate operations. The repository branch may contain completed
|
|
423
|
+
work that has not yet been released to PyPI.
|
|
424
|
+
|
|
425
|
+
## Contributing and security
|
|
426
|
+
|
|
427
|
+
See `CONTRIBUTING.md` for development workflow, `SECURITY.md` for vulnerability
|
|
428
|
+
reporting and `CODE_OF_CONDUCT.md` for community expectations.
|
|
429
|
+
|
|
430
|
+
## License
|
|
431
|
+
|
|
432
|
+
MIT. See `LICENSE`.
|