voodoo-framework 2.6.0__tar.gz → 2.6.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.
Files changed (253) hide show
  1. voodoo_framework-2.6.2/PKG-INFO +284 -0
  2. voodoo_framework-2.6.2/README.md +216 -0
  3. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/pyproject.toml +0 -1
  4. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/__init__.py +1 -1
  5. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/config.py +5 -0
  6. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/__init__.py +10 -0
  7. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/auth.py +7 -0
  8. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/errors.py +45 -0
  9. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/gateway.py +152 -13
  10. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/http.py +30 -5
  11. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/mqtt.py +89 -5
  12. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/simulator.py +65 -0
  13. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/store.py +212 -8
  14. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/engine.py +107 -173
  15. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/execution.py +11 -3
  16. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/workflow.py +121 -89
  17. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/workers/__init__.py +33 -41
  18. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/workers/queue.py +39 -26
  19. voodoo_framework-2.6.2/src/voodoo_framework.egg-info/PKG-INFO +284 -0
  20. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo_framework.egg-info/SOURCES.txt +5 -0
  21. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo_framework.egg-info/requires.txt +0 -1
  22. voodoo_framework-2.6.2/tests/test_edge_e2e.py +186 -0
  23. voodoo_framework-2.6.2/tests/test_edge_gateway.py +1002 -0
  24. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_edge_http.py +38 -0
  25. voodoo_framework-2.6.2/tests/test_edge_security.py +399 -0
  26. voodoo_framework-2.6.2/tests/test_hitl_persistence_correctness.py +140 -0
  27. voodoo_framework-2.6.2/tests/test_runtime_correctness.py +93 -0
  28. voodoo_framework-2.6.2/tests/test_worker_retry_semantics.py +77 -0
  29. voodoo_framework-2.6.0/PKG-INFO +0 -551
  30. voodoo_framework-2.6.0/README.md +0 -482
  31. voodoo_framework-2.6.0/src/voodoo_framework.egg-info/PKG-INFO +0 -551
  32. voodoo_framework-2.6.0/tests/test_edge_gateway.py +0 -417
  33. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/LICENSE +0 -0
  34. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/setup.cfg +0 -0
  35. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/adapters/__init__.py +0 -0
  36. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/adapters/capabilities.py +0 -0
  37. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/adapters/registry.py +0 -0
  38. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/adapters/tailwind.py +0 -0
  39. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/adapters/voodoo_css.py +0 -0
  40. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/agent.py +0 -0
  41. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/agents/__init__.py +0 -0
  42. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/agents/models.py +0 -0
  43. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/agents/registry.py +0 -0
  44. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/__init__.py +0 -0
  45. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/agent.py +0 -0
  46. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/__init__.py +0 -0
  47. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/anthropic.py +0 -0
  48. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/gemini.py +0 -0
  49. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/mock.py +0 -0
  50. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/ollama.py +0 -0
  51. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/providers/openai.py +0 -0
  52. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/tools/__init__.py +0 -0
  53. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ai/tools/registry.py +0 -0
  54. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/api.py +0 -0
  55. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/__init__.py +0 -0
  56. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/cookies.py +0 -0
  57. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/guards.py +0 -0
  58. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/jwt.py +0 -0
  59. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/middleware.py +0 -0
  60. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/passwords.py +0 -0
  61. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/auth/user.py +0 -0
  62. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/__init__.py +0 -0
  63. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/__main__.py +0 -0
  64. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/agents.py +0 -0
  65. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/ai.py +0 -0
  66. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/approvals.py +0 -0
  67. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/auth.py +0 -0
  68. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/create.py +0 -0
  69. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/dev.py +0 -0
  70. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/doctor.py +0 -0
  71. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/executions.py +0 -0
  72. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/generate.py +0 -0
  73. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/inspect.py +0 -0
  74. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/new.py +0 -0
  75. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/objects.py +0 -0
  76. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/protocol.py +0 -0
  77. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/recover.py +0 -0
  78. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/routes.py +0 -0
  79. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/scaffolding.py +0 -0
  80. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/schedules.py +0 -0
  81. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/status.py +0 -0
  82. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/tasks.py +0 -0
  83. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/terminal.py +0 -0
  84. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/theme.py +0 -0
  85. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/version.py +0 -0
  86. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/cli/workers_cmd.py +0 -0
  87. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/components.py +0 -0
  88. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/__init__.py +0 -0
  89. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/app.py +0 -0
  90. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/errors.py +0 -0
  91. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/events.py +0 -0
  92. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/render.py +0 -0
  93. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/routing.py +0 -0
  94. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/sitemap.py +0 -0
  95. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/core/state.py +0 -0
  96. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/data/__init__.py +0 -0
  97. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/data/base.py +0 -0
  98. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/data/model.py +0 -0
  99. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/models.py +0 -0
  100. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/edge/protocol.py +0 -0
  101. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/i18n.py +0 -0
  102. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/mcp/__init__.py +0 -0
  103. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/mcp/client.py +0 -0
  104. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/memory/__init__.py +0 -0
  105. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/memory/interfaces.py +0 -0
  106. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/memory/sqlite.py +0 -0
  107. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/mesh/__init__.py +0 -0
  108. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/mesh/client.py +0 -0
  109. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/mesh/event_bus.py +0 -0
  110. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/__init__.py +0 -0
  111. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/capability.py +0 -0
  112. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/compute.py +0 -0
  113. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/constraint.py +0 -0
  114. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/effect.py +0 -0
  115. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/intent.py +0 -0
  116. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/resource.py +0 -0
  117. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/state.py +0 -0
  118. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/primitives/time.py +0 -0
  119. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/protocol/__init__.py +0 -0
  120. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/protocol/export.py +0 -0
  121. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/protocol/schemas.py +0 -0
  122. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/py.typed +0 -0
  123. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/queue.py +0 -0
  124. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/routing/api.py +0 -0
  125. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/routing/pages.py +0 -0
  126. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/__init__.py +0 -0
  127. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/adaptive.py +0 -0
  128. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/capability.py +0 -0
  129. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/constraint.py +0 -0
  130. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/context.py +0 -0
  131. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/errors.py +0 -0
  132. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/graph.py +0 -0
  133. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/human.py +0 -0
  134. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/persistence.py +0 -0
  135. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/planner.py +0 -0
  136. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/scheduler.py +0 -0
  137. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/runtime/task.py +0 -0
  138. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/schedule.py +0 -0
  139. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/__init__.py +0 -0
  140. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/cors.py +0 -0
  141. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/csrf.py +0 -0
  142. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/headers.py +0 -0
  143. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/passwords.py +0 -0
  144. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/rate_limit.py +0 -0
  145. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/redaction.py +0 -0
  146. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/security/secrets.py +0 -0
  147. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/seo.py +0 -0
  148. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/static/client.js +0 -0
  149. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/status.py +0 -0
  150. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/__init__.py +0 -0
  151. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/cache/__init__.py +0 -0
  152. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/cache/interfaces.py +0 -0
  153. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/cache/memory.py +0 -0
  154. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/cache/redis.py +0 -0
  155. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/database/__init__.py +0 -0
  156. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/database/interfaces.py +0 -0
  157. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/database/postgres.py +0 -0
  158. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/database/sqlite.py +0 -0
  159. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/events/__init__.py +0 -0
  160. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/events/interfaces.py +0 -0
  161. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/events/local.py +0 -0
  162. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/events/postgres.py +0 -0
  163. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/events/sqlite.py +0 -0
  164. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/execution/__init__.py +0 -0
  165. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/execution/migrations.py +0 -0
  166. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/execution/postgres.py +0 -0
  167. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/execution/sqlite.py +0 -0
  168. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/manager.py +0 -0
  169. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/objects/__init__.py +0 -0
  170. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/objects/interfaces.py +0 -0
  171. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/objects/local.py +0 -0
  172. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/objects/s3.py +0 -0
  173. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/__init__.py +0 -0
  174. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/interfaces.py +0 -0
  175. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/memory.py +0 -0
  176. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/postgres.py +0 -0
  177. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/redis.py +0 -0
  178. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/queue/sqlite.py +0 -0
  179. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/scheduler/__init__.py +0 -0
  180. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/storage/scheduler/sqlite.py +0 -0
  181. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/telemetry/__init__.py +0 -0
  182. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/telemetry/api.py +0 -0
  183. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/telemetry/middleware.py +0 -0
  184. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/telemetry/otlp.py +0 -0
  185. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/telemetry/store.py +0 -0
  186. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/theme.py +0 -0
  187. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/tools/__init__.py +0 -0
  188. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/tools/registry.py +0 -0
  189. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/__init__.py +0 -0
  190. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/component.py +0 -0
  191. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/events.py +0 -0
  192. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/library.py +0 -0
  193. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/markdown.py +0 -0
  194. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/rendering.py +0 -0
  195. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/state.py +0 -0
  196. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/styles/__init__.py +0 -0
  197. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/styles/presets.py +0 -0
  198. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo/ui/styles/theme.py +0 -0
  199. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo_framework.egg-info/dependency_links.txt +0 -0
  200. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo_framework.egg-info/entry_points.txt +0 -0
  201. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/src/voodoo_framework.egg-info/top_level.txt +0 -0
  202. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_agent.py +0 -0
  203. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_agent_registry.py +0 -0
  204. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_agent_runtime.py +0 -0
  205. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_app.py +0 -0
  206. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_auth.py +0 -0
  207. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_capability_security.py +0 -0
  208. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_checkpoint_resume.py +0 -0
  209. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_chrome.py +0 -0
  210. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_cli.py +0 -0
  211. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_cli_inspect.py +0 -0
  212. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_components.py +0 -0
  213. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_config.py +0 -0
  214. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_contract_api.py +0 -0
  215. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_create.py +0 -0
  216. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_data.py +0 -0
  217. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_design_system.py +0 -0
  218. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_durable_hitl.py +0 -0
  219. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_edge_device.py +0 -0
  220. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_edge_protocol.py +0 -0
  221. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_events.py +0 -0
  222. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_execution_sqlite_store.py +0 -0
  223. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_http_runtime.py +0 -0
  224. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_human.py +0 -0
  225. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_i18n.py +0 -0
  226. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_integration.py +0 -0
  227. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_mcp.py +0 -0
  228. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_mcp_runtime.py +0 -0
  229. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_memory.py +0 -0
  230. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_mesh.py +0 -0
  231. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_mesh_event_bus.py +0 -0
  232. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_model.py +0 -0
  233. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_object_store.py +0 -0
  234. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_observability.py +0 -0
  235. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_persistence.py +0 -0
  236. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_planner_adaptive.py +0 -0
  237. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_primitives.py +0 -0
  238. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_protocol.py +0 -0
  239. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_provider_switching.py +0 -0
  240. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_providers.py +0 -0
  241. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_queue.py +0 -0
  242. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_reactive.py +0 -0
  243. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_runtime.py +0 -0
  244. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_scheduler.py +0 -0
  245. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_security.py +0 -0
  246. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_seo.py +0 -0
  247. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_state.py +0 -0
  248. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_theme.py +0 -0
  249. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_theme_presets.py +0 -0
  250. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_tools.py +0 -0
  251. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_ui.py +0 -0
  252. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_websocket.py +0 -0
  253. {voodoo_framework-2.6.0 → voodoo_framework-2.6.2}/tests/test_workers.py +0 -0
@@ -0,0 +1,284 @@
1
+ Metadata-Version: 2.4
2
+ Name: voodoo-framework
3
+ Version: 2.6.2
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: aiosqlite
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
+ Provides-Extra: postgres
55
+ Requires-Dist: psycopg[binary]>=3.3.4; extra == "postgres"
56
+ Provides-Extra: s3
57
+ Requires-Dist: boto3>=1.34; extra == "s3"
58
+ Requires-Dist: botocore>=1.34; extra == "s3"
59
+ Provides-Extra: redis
60
+ Requires-Dist: redis>=5.0; extra == "redis"
61
+ Provides-Extra: edge
62
+ Requires-Dist: paho-mqtt>=2.0; extra == "edge"
63
+ Provides-Extra: otel
64
+ Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
65
+ Requires-Dist: opentelemetry-sdk>=1.20; extra == "otel"
66
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20; extra == "otel"
67
+ Dynamic: license-file
68
+
69
+ # Voodoo
70
+
71
+ **The programmable runtime for adaptive applications and operational systems.**
72
+
73
+ Voodoo lets Python applications grow from a page or API into durable workers, agents, human approvals, realtime communication and production infrastructure without replacing the execution model underneath them.
74
+
75
+ > Composition over configuration. Python over DSLs. Adapters over lock-in. Explicit capabilities over unrestricted autonomy.
76
+
77
+ ## Why Voodoo?
78
+
79
+ Modern applications often assemble separate frameworks for HTTP, UI, persistence, queues, scheduling, AI, realtime communication and observability. Voodoo provides these as composable capabilities of one runtime.
80
+
81
+ The central model is:
82
+
83
+ ```text
84
+ Entity → State → Intent → Capability → Execution → Effect → State
85
+ ```
86
+
87
+ An `Execution` is not every function call. It is meaningful work worth observing, authorizing, recovering, accounting for, waiting on, or reasoning about.
88
+
89
+ ## Quick start
90
+
91
+ ```bash
92
+ pip install voodoo-framework
93
+ voodoo create my_app
94
+ cd my_app
95
+ voodoo dev
96
+ ```
97
+
98
+ Open `http://localhost:8000`. The default path requires no external database, queue or object store.
99
+
100
+ `voodoo create` is the primary onboarding path and scaffolds the local runtime. If you deliberately want only the smallest UI/routing scaffold, use `voodoo new`.
101
+
102
+ AI provider SDKs are optional:
103
+
104
+ ```bash
105
+ pip install "voodoo-framework[ai]"
106
+ ```
107
+
108
+ The core package does not install OpenAI, Anthropic, Gemini or Ollama SDKs. Providers are resolved lazily when used.
109
+
110
+ ## Start simple, add runtime capabilities when they matter
111
+
112
+ | You need | Voodoo primitive |
113
+ |---|---|
114
+ | UI-local mutable value | `state()` |
115
+ | Persistent business data | `Model` |
116
+ | Browser interaction | `@event` |
117
+ | Decoupled application notification | Mesh / event bus |
118
+ | Retryable background work | `@task` |
119
+ | Meaningful durable/observable work | `Execution` |
120
+ | LLM reasoning and tool use | `Agent` + `@tool` |
121
+ | Authorization to produce an effect | `Capability` |
122
+ | Human decision inside work | HITL approval |
123
+ | Future/recurring work | Scheduler |
124
+
125
+ See `docs/choosing-primitives.md` for the semantic boundaries between State, Model, Memory, events, tools, tasks, capabilities and executions.
126
+
127
+ ## A small AI + data + event example
128
+
129
+ Install the `ai` extra for real providers, or use `mock:*` locally. This example intentionally claims only the chain it executes: **Agent → Tool → Model → Mesh**.
130
+
131
+ ```python
132
+ from voodoo import Agent, Model, tool
133
+ from voodoo.mesh import mesh
134
+
135
+
136
+ class Lead(Model):
137
+ name: str
138
+ email: str
139
+
140
+
141
+ @tool
142
+ async def create_lead(name: str, email: str) -> str:
143
+ lead = await Lead.create(name=name, email=email)
144
+ await mesh.emit("lead.created", {"id": lead.id, "name": name})
145
+ return f"Created lead #{lead.id}"
146
+
147
+
148
+ @mesh.on("lead.created")
149
+ async def notify(payload):
150
+ print("new lead", payload["name"])
151
+
152
+
153
+ agent = Agent(model="mock:test", tools=["create_lead"])
154
+ ```
155
+
156
+ For the broader UI → agent → tool → event → worker → database demonstration, run `examples/ai_saas/main.py`. Tools registered with `@tool` are also available to Voodoo's MCP integration; that exposure is a separate integration boundary rather than a fake step inserted into the local call chain.
157
+
158
+ ## What makes Voodoo different
159
+
160
+ - **One execution model.** APIs, agents, tools, workers and human workflows can participate in a traceable runtime rather than forming independent orchestration stacks.
161
+ - **AI is one form of Compute.** Agents are powerful participants, not the foundation every application must depend on.
162
+ - **Durable when it matters.** Executions, tasks, schedules and approvals can survive process restarts using local persistence by default.
163
+ - **Human-in-the-loop is native.** Waiting for approval is an execution lifecycle state, not an ad-hoc polling pattern.
164
+ - **Local-first, production-capable.** SQLite/local filesystem provide the default path; PostgreSQL, Redis and S3-compatible storage are adapters.
165
+ - **Adaptive execution is optional.** Planner/supervisor capabilities are available when capability resolution, fallback or budget steering is useful; simple paths remain simple.
166
+ - **Observability is part of the runtime.** Correlation and execution context connect meaningful work across boundaries.
167
+
168
+ ## Computational model
169
+
170
+ ```text
171
+ Intent desired outcome
172
+ Capability ability + authorization to produce an effect
173
+ Execution meaningful unit of runtime work
174
+ Effect change produced by an execution
175
+ State operational truth
176
+ ```
177
+
178
+ `Compute`, `Time`, `Resource`, and `Constraint` govern how an Execution happens. See `docs/primitives.md`, `docs/execution-model.md`, `ARCHITECTURE.md`, and `docs/runtime-consolidation.md`.
179
+
180
+ ## Major capabilities
181
+
182
+ **Application:** server-rendered/reactive Python UI, routing/APIs, design system/themes, SEO, async ORM, auth and security middleware.
183
+
184
+ **Runtime:** ExecutionEngine, durable execution/checkpoints/recovery, workers/tasks, scheduler, event infrastructure, human approvals, capability security, telemetry and optional adaptive planning/supervision.
185
+
186
+ **AI:** agents, native provider tool calling, `@tool`, MCP integration, memory, model/provider abstraction and config-driven OpenAI-compatible endpoints.
187
+
188
+ **Infrastructure adapters:** PostgreSQL, Redis, S3-compatible object storage and OpenTelemetry are optional extras behind runtime contracts.
189
+
190
+ ## Installation
191
+
192
+ ```bash
193
+ # Core runtime — no third-party AI provider SDKs
194
+ pip install voodoo-framework
195
+
196
+ # Model providers
197
+ pip install "voodoo-framework[ai]"
198
+
199
+ # Production adapters as needed
200
+ pip install "voodoo-framework[postgres,redis,s3,otel]"
201
+
202
+ # Development tools
203
+ pip install "voodoo-framework[dev]"
204
+ ```
205
+
206
+ Other supported installation paths include Homebrew (`brew tap helderperez-dev/voodoo && brew install voodoo`), `uv tool install voodoo-framework`, and `pipx install voodoo-framework`.
207
+
208
+ Verify with:
209
+
210
+ ```bash
211
+ voodoo version
212
+ ```
213
+
214
+ ## Configuration
215
+
216
+ Voodoo is zero-config locally. Add `voodoo.yaml` when you need explicit providers:
217
+
218
+ ```yaml
219
+ database:
220
+ provider: sqlite
221
+ queue:
222
+ provider: sqlite
223
+ events:
224
+ provider: sqlite
225
+ objects:
226
+ provider: local
227
+ cache:
228
+ provider: memory
229
+ runtime:
230
+ run_api_through_runtime: true
231
+ ```
232
+
233
+ AI configuration is opt-in and requires the corresponding optional SDK:
234
+
235
+ ```yaml
236
+ ai:
237
+ provider: openai
238
+ model: gpt-4o
239
+ api_key: "${OPENAI_API_KEY}"
240
+ ```
241
+
242
+ Environment variables use the `VOODOO_*` convention. See `.env.example` for the full reference.
243
+
244
+ ## Documentation
245
+
246
+ Start here:
247
+
248
+ - `docs/hello_world.md` — first application
249
+ - `docs/choosing-primitives.md` — which Voodoo abstraction to use
250
+ - `docs/primitives.md` — computational model
251
+ - `docs/execution-model.md` and `docs/runtime.md` — execution semantics
252
+ - `docs/data.md` — Models and persistence
253
+ - `docs/events.md` and `docs/mesh.md` — communication boundaries
254
+ - `docs/workers.md` — background tasks
255
+ - `docs/agents.md`, `docs/tools.md`, `docs/mcp.md` — AI/tool integration
256
+ - `docs/hitl.md` — human approvals
257
+ - `docs/telemetry.md` — observability
258
+ - `docs/deployment.md` — production deployment
259
+ - `ARCHITECTURE.md` — root architecture reference
260
+ - `docs/runtime-consolidation.md` — invariants that keep the runtime coherent
261
+
262
+ ## Examples
263
+
264
+ | Example | Purpose |
265
+ |---|---|
266
+ | `examples/hello_world/` | smallest page |
267
+ | `examples/dashboard/` | reactive UI/state |
268
+ | `examples/realtime/` | realtime communication |
269
+ | `examples/ai_agent/` | agent/tool application |
270
+ | `examples/ai_saas/` | UI + Agent + Tool + Mesh + Worker + Model |
271
+
272
+ The examples are intentionally progressive. Applications do not need to adopt the complete runtime surface at once.
273
+
274
+ ## Project status
275
+
276
+ Voodoo is beta software. The repository's `SPRINT_PLAN.md` is the source of truth for implementation progress; `ROADMAP.md` describes longer-term direction. Public API and behavior should be treated with beta-level compatibility expectations until a stable release policy is declared.
277
+
278
+ ## Contributing and security
279
+
280
+ See `CONTRIBUTING.md` for the development workflow, `SECURITY.md` for vulnerability reporting, and `CODE_OF_CONDUCT.md` for community expectations.
281
+
282
+ ## License
283
+
284
+ MIT. See `LICENSE`.
@@ -0,0 +1,216 @@
1
+ # Voodoo
2
+
3
+ **The programmable runtime for adaptive applications and operational systems.**
4
+
5
+ Voodoo lets Python applications grow from a page or API into durable workers, agents, human approvals, realtime communication and production infrastructure without replacing the execution model underneath them.
6
+
7
+ > Composition over configuration. Python over DSLs. Adapters over lock-in. Explicit capabilities over unrestricted autonomy.
8
+
9
+ ## Why Voodoo?
10
+
11
+ Modern applications often assemble separate frameworks for HTTP, UI, persistence, queues, scheduling, AI, realtime communication and observability. Voodoo provides these as composable capabilities of one runtime.
12
+
13
+ The central model is:
14
+
15
+ ```text
16
+ Entity → State → Intent → Capability → Execution → Effect → State
17
+ ```
18
+
19
+ An `Execution` is not every function call. It is meaningful work worth observing, authorizing, recovering, accounting for, waiting on, or reasoning about.
20
+
21
+ ## Quick start
22
+
23
+ ```bash
24
+ pip install voodoo-framework
25
+ voodoo create my_app
26
+ cd my_app
27
+ voodoo dev
28
+ ```
29
+
30
+ Open `http://localhost:8000`. The default path requires no external database, queue or object store.
31
+
32
+ `voodoo create` is the primary onboarding path and scaffolds the local runtime. If you deliberately want only the smallest UI/routing scaffold, use `voodoo new`.
33
+
34
+ AI provider SDKs are optional:
35
+
36
+ ```bash
37
+ pip install "voodoo-framework[ai]"
38
+ ```
39
+
40
+ The core package does not install OpenAI, Anthropic, Gemini or Ollama SDKs. Providers are resolved lazily when used.
41
+
42
+ ## Start simple, add runtime capabilities when they matter
43
+
44
+ | You need | Voodoo primitive |
45
+ |---|---|
46
+ | UI-local mutable value | `state()` |
47
+ | Persistent business data | `Model` |
48
+ | Browser interaction | `@event` |
49
+ | Decoupled application notification | Mesh / event bus |
50
+ | Retryable background work | `@task` |
51
+ | Meaningful durable/observable work | `Execution` |
52
+ | LLM reasoning and tool use | `Agent` + `@tool` |
53
+ | Authorization to produce an effect | `Capability` |
54
+ | Human decision inside work | HITL approval |
55
+ | Future/recurring work | Scheduler |
56
+
57
+ See `docs/choosing-primitives.md` for the semantic boundaries between State, Model, Memory, events, tools, tasks, capabilities and executions.
58
+
59
+ ## A small AI + data + event example
60
+
61
+ Install the `ai` extra for real providers, or use `mock:*` locally. This example intentionally claims only the chain it executes: **Agent → Tool → Model → Mesh**.
62
+
63
+ ```python
64
+ from voodoo import Agent, Model, tool
65
+ from voodoo.mesh import mesh
66
+
67
+
68
+ class Lead(Model):
69
+ name: str
70
+ email: str
71
+
72
+
73
+ @tool
74
+ async def create_lead(name: str, email: str) -> str:
75
+ lead = await Lead.create(name=name, email=email)
76
+ await mesh.emit("lead.created", {"id": lead.id, "name": name})
77
+ return f"Created lead #{lead.id}"
78
+
79
+
80
+ @mesh.on("lead.created")
81
+ async def notify(payload):
82
+ print("new lead", payload["name"])
83
+
84
+
85
+ agent = Agent(model="mock:test", tools=["create_lead"])
86
+ ```
87
+
88
+ For the broader UI → agent → tool → event → worker → database demonstration, run `examples/ai_saas/main.py`. Tools registered with `@tool` are also available to Voodoo's MCP integration; that exposure is a separate integration boundary rather than a fake step inserted into the local call chain.
89
+
90
+ ## What makes Voodoo different
91
+
92
+ - **One execution model.** APIs, agents, tools, workers and human workflows can participate in a traceable runtime rather than forming independent orchestration stacks.
93
+ - **AI is one form of Compute.** Agents are powerful participants, not the foundation every application must depend on.
94
+ - **Durable when it matters.** Executions, tasks, schedules and approvals can survive process restarts using local persistence by default.
95
+ - **Human-in-the-loop is native.** Waiting for approval is an execution lifecycle state, not an ad-hoc polling pattern.
96
+ - **Local-first, production-capable.** SQLite/local filesystem provide the default path; PostgreSQL, Redis and S3-compatible storage are adapters.
97
+ - **Adaptive execution is optional.** Planner/supervisor capabilities are available when capability resolution, fallback or budget steering is useful; simple paths remain simple.
98
+ - **Observability is part of the runtime.** Correlation and execution context connect meaningful work across boundaries.
99
+
100
+ ## Computational model
101
+
102
+ ```text
103
+ Intent desired outcome
104
+ Capability ability + authorization to produce an effect
105
+ Execution meaningful unit of runtime work
106
+ Effect change produced by an execution
107
+ State operational truth
108
+ ```
109
+
110
+ `Compute`, `Time`, `Resource`, and `Constraint` govern how an Execution happens. See `docs/primitives.md`, `docs/execution-model.md`, `ARCHITECTURE.md`, and `docs/runtime-consolidation.md`.
111
+
112
+ ## Major capabilities
113
+
114
+ **Application:** server-rendered/reactive Python UI, routing/APIs, design system/themes, SEO, async ORM, auth and security middleware.
115
+
116
+ **Runtime:** ExecutionEngine, durable execution/checkpoints/recovery, workers/tasks, scheduler, event infrastructure, human approvals, capability security, telemetry and optional adaptive planning/supervision.
117
+
118
+ **AI:** agents, native provider tool calling, `@tool`, MCP integration, memory, model/provider abstraction and config-driven OpenAI-compatible endpoints.
119
+
120
+ **Infrastructure adapters:** PostgreSQL, Redis, S3-compatible object storage and OpenTelemetry are optional extras behind runtime contracts.
121
+
122
+ ## Installation
123
+
124
+ ```bash
125
+ # Core runtime — no third-party AI provider SDKs
126
+ pip install voodoo-framework
127
+
128
+ # Model providers
129
+ pip install "voodoo-framework[ai]"
130
+
131
+ # Production adapters as needed
132
+ pip install "voodoo-framework[postgres,redis,s3,otel]"
133
+
134
+ # Development tools
135
+ pip install "voodoo-framework[dev]"
136
+ ```
137
+
138
+ Other supported installation paths include Homebrew (`brew tap helderperez-dev/voodoo && brew install voodoo`), `uv tool install voodoo-framework`, and `pipx install voodoo-framework`.
139
+
140
+ Verify with:
141
+
142
+ ```bash
143
+ voodoo version
144
+ ```
145
+
146
+ ## Configuration
147
+
148
+ Voodoo is zero-config locally. Add `voodoo.yaml` when you need explicit providers:
149
+
150
+ ```yaml
151
+ database:
152
+ provider: sqlite
153
+ queue:
154
+ provider: sqlite
155
+ events:
156
+ provider: sqlite
157
+ objects:
158
+ provider: local
159
+ cache:
160
+ provider: memory
161
+ runtime:
162
+ run_api_through_runtime: true
163
+ ```
164
+
165
+ AI configuration is opt-in and requires the corresponding optional SDK:
166
+
167
+ ```yaml
168
+ ai:
169
+ provider: openai
170
+ model: gpt-4o
171
+ api_key: "${OPENAI_API_KEY}"
172
+ ```
173
+
174
+ Environment variables use the `VOODOO_*` convention. See `.env.example` for the full reference.
175
+
176
+ ## Documentation
177
+
178
+ Start here:
179
+
180
+ - `docs/hello_world.md` — first application
181
+ - `docs/choosing-primitives.md` — which Voodoo abstraction to use
182
+ - `docs/primitives.md` — computational model
183
+ - `docs/execution-model.md` and `docs/runtime.md` — execution semantics
184
+ - `docs/data.md` — Models and persistence
185
+ - `docs/events.md` and `docs/mesh.md` — communication boundaries
186
+ - `docs/workers.md` — background tasks
187
+ - `docs/agents.md`, `docs/tools.md`, `docs/mcp.md` — AI/tool integration
188
+ - `docs/hitl.md` — human approvals
189
+ - `docs/telemetry.md` — observability
190
+ - `docs/deployment.md` — production deployment
191
+ - `ARCHITECTURE.md` — root architecture reference
192
+ - `docs/runtime-consolidation.md` — invariants that keep the runtime coherent
193
+
194
+ ## Examples
195
+
196
+ | Example | Purpose |
197
+ |---|---|
198
+ | `examples/hello_world/` | smallest page |
199
+ | `examples/dashboard/` | reactive UI/state |
200
+ | `examples/realtime/` | realtime communication |
201
+ | `examples/ai_agent/` | agent/tool application |
202
+ | `examples/ai_saas/` | UI + Agent + Tool + Mesh + Worker + Model |
203
+
204
+ The examples are intentionally progressive. Applications do not need to adopt the complete runtime surface at once.
205
+
206
+ ## Project status
207
+
208
+ Voodoo is beta software. The repository's `SPRINT_PLAN.md` is the source of truth for implementation progress; `ROADMAP.md` describes longer-term direction. Public API and behavior should be treated with beta-level compatibility expectations until a stable release policy is declared.
209
+
210
+ ## Contributing and security
211
+
212
+ See `CONTRIBUTING.md` for the development workflow, `SECURITY.md` for vulnerability reporting, and `CODE_OF_CONDUCT.md` for community expectations.
213
+
214
+ ## License
215
+
216
+ MIT. See `LICENSE`.
@@ -52,7 +52,6 @@ dependencies = [
52
52
  "pyyaml",
53
53
  "typer",
54
54
  "rich",
55
- "openai",
56
55
  "aiofiles"
57
56
  ]
58
57
 
@@ -102,7 +102,7 @@ from .ui.styles import (
102
102
  from .ui.styles.theme import Theme, ThemeColors, create_theme
103
103
  from .workers import task
104
104
 
105
- __version__ = "2.6.0"
105
+ __version__ = "2.6.2"
106
106
 
107
107
  __all__ = [
108
108
  # Core runtime
@@ -284,6 +284,11 @@ class EdgeConfig(BaseModel):
284
284
  max_state_size: int = 65536 # 64 KiB
285
285
  max_pending_effects: int = 1000
286
286
  heartbeat_interval: int = 30
287
+ # Enrollment security (Sprint 23.1).
288
+ enrollment_auth_required: bool = True
289
+ enrollment_admin_token: str = ""
290
+ # Effect delivery (Sprint 23.1).
291
+ max_effect_retries: int = 3
287
292
 
288
293
 
289
294
  class VoodooConfig(BaseModel):
@@ -27,6 +27,8 @@ from voodoo.edge.auth import (
27
27
  from voodoo.edge.errors import (
28
28
  AuthenticationFailedError,
29
29
  AuthorizationFailedError,
30
+ DeliveryFailedError,
31
+ DeviceIdMismatchError,
30
32
  DeviceNotFoundError,
31
33
  DeviceRevokedError,
32
34
  DuplicateMessageError,
@@ -37,6 +39,9 @@ from voodoo.edge.errors import (
37
39
  InvalidMessageError,
38
40
  InvalidProtocolVersionError,
39
41
  InvalidStateVersionError,
42
+ PayloadTooLargeError,
43
+ SessionInvalidError,
44
+ SessionRequiredError,
40
45
  TransportError,
41
46
  error_response,
42
47
  )
@@ -109,7 +114,9 @@ __all__ = [
109
114
  "error_response",
110
115
  "AuthenticationFailedError",
111
116
  "AuthorizationFailedError",
117
+ "DeliveryFailedError",
112
118
  "DeviceNotFoundError",
119
+ "DeviceIdMismatchError",
113
120
  "DeviceRevokedError",
114
121
  "DuplicateMessageError",
115
122
  "EffectExpiredError",
@@ -118,5 +125,8 @@ __all__ = [
118
125
  "InvalidMessageError",
119
126
  "InvalidProtocolVersionError",
120
127
  "InvalidStateVersionError",
128
+ "PayloadTooLargeError",
129
+ "SessionInvalidError",
130
+ "SessionRequiredError",
121
131
  "TransportError",
122
132
  ]
@@ -223,6 +223,13 @@ async def authenticate_device(
223
223
 
224
224
  await store.mark_credential_used(record.credential_id)
225
225
 
226
+ # Reconnect: invalidate any existing sessions for this device before
227
+ # creating a new one. The device transitions RECONNECTING → CONNECTED
228
+ # so downstream observers see a clean lifecycle signal (EDGE §30).
229
+ old_session_count = await store.delete_device_sessions(device.device_id)
230
+ if old_session_count > 0:
231
+ await store.update_device_status(device.device_id, DeviceStatus.RECONNECTING)
232
+
226
233
  session = DeviceSession(
227
234
  device_id=device.device_id,
228
235
  transport=transport,
@@ -17,6 +17,7 @@ __all__ = [
17
17
  "AuthenticationFailedError",
18
18
  "AuthorizationFailedError",
19
19
  "DeviceNotFoundError",
20
+ "DeviceIdMismatchError",
20
21
  "DeviceRevokedError",
21
22
  "InvalidMessageError",
22
23
  "InvalidProtocolVersionError",
@@ -25,6 +26,9 @@ __all__ = [
25
26
  "DuplicateMessageError",
26
27
  "EffectNotFoundError",
27
28
  "EffectExpiredError",
29
+ "SessionRequiredError",
30
+ "SessionInvalidError",
31
+ "DeliveryFailedError",
28
32
  "TransportError",
29
33
  "HTTP_STATUS",
30
34
  "error_response",
@@ -50,6 +54,9 @@ class EdgeErrorCode:
50
54
  DUPLICATE_MESSAGE = "DUPLICATE_MESSAGE"
51
55
  EFFECT_NOT_FOUND = "EFFECT_NOT_FOUND"
52
56
  EFFECT_EXPIRED = "EFFECT_EXPIRED"
57
+ SESSION_REQUIRED = "SESSION_REQUIRED"
58
+ SESSION_INVALID = "SESSION_INVALID"
59
+ DELIVERY_FAILED = "DELIVERY_FAILED"
53
60
  TRANSPORT_ERROR = "TRANSPORT_ERROR"
54
61
 
55
62
 
@@ -66,6 +73,9 @@ HTTP_STATUS: dict[str, int] = {
66
73
  EdgeErrorCode.DUPLICATE_MESSAGE: 200, # idempotent success, not an error for the client
67
74
  EdgeErrorCode.EFFECT_NOT_FOUND: 404,
68
75
  EdgeErrorCode.EFFECT_EXPIRED: 410,
76
+ EdgeErrorCode.SESSION_REQUIRED: 401,
77
+ EdgeErrorCode.SESSION_INVALID: 401,
78
+ EdgeErrorCode.DELIVERY_FAILED: 502,
69
79
  EdgeErrorCode.TRANSPORT_ERROR: 502,
70
80
  }
71
81
 
@@ -163,6 +173,41 @@ class TransportError(EdgeError):
163
173
  status = 502
164
174
 
165
175
 
176
+ class SessionRequiredError(AuthenticationFailedError):
177
+ """Request requires an authenticated session."""
178
+
179
+ code = EdgeErrorCode.SESSION_REQUIRED
180
+ status = 401
181
+
182
+
183
+ class SessionInvalidError(AuthenticationFailedError):
184
+ """Session ID is invalid or expired."""
185
+
186
+ code = EdgeErrorCode.SESSION_INVALID
187
+ status = 401
188
+
189
+
190
+ class DeliveryFailedError(TransportError):
191
+ """Effect delivery failed after max retries."""
192
+
193
+ code = EdgeErrorCode.DELIVERY_FAILED
194
+ status = 502
195
+
196
+
197
+ class DeviceIdMismatchError(AuthorizationFailedError):
198
+ """Message device_id does not match the authenticated device."""
199
+
200
+ code = EdgeErrorCode.AUTHORIZATION_FAILED
201
+
202
+
203
+ class PayloadTooLargeError(InvalidMessageError):
204
+ """Message or state payload exceeds configured size limit."""
205
+
206
+ code = EdgeErrorCode.INVALID_MESSAGE
207
+ status = 413
208
+ status = 403
209
+
210
+
166
211
  # ---------------------------------------------------------------------------
167
212
  # Serialization
168
213
  # ---------------------------------------------------------------------------