edda-framework 0.12.0__tar.gz → 0.13.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.
Files changed (208) hide show
  1. {edda_framework-0.12.0 → edda_framework-0.13.0}/PKG-INFO +1 -1
  2. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/replay.py +41 -23
  3. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/viewer_ui/app.py +11 -4
  4. {edda_framework-0.12.0 → edda_framework-0.13.0}/pyproject.toml +1 -1
  5. {edda_framework-0.12.0 → edda_framework-0.13.0}/schema/README.md +4 -0
  6. edda_framework-0.13.0/schema/docs/column-values.md +91 -0
  7. edda_framework-0.13.0/tests/test_cross_language_channel.py +870 -0
  8. {edda_framework-0.12.0 → edda_framework-0.13.0}/uv.lock +1 -1
  9. {edda_framework-0.12.0 → edda_framework-0.13.0}/.github/workflows/ci.yml +0 -0
  10. {edda_framework-0.12.0 → edda_framework-0.13.0}/.github/workflows/docs.yml +0 -0
  11. {edda_framework-0.12.0 → edda_framework-0.13.0}/.github/workflows/release.yml +0 -0
  12. {edda_framework-0.12.0 → edda_framework-0.13.0}/.gitignore +0 -0
  13. {edda_framework-0.12.0 → edda_framework-0.13.0}/.gitmodules +0 -0
  14. {edda_framework-0.12.0 → edda_framework-0.13.0}/.python-version +0 -0
  15. {edda_framework-0.12.0 → edda_framework-0.13.0}/Justfile +0 -0
  16. {edda_framework-0.12.0 → edda_framework-0.13.0}/LICENSE +0 -0
  17. {edda_framework-0.12.0 → edda_framework-0.13.0}/README.md +0 -0
  18. {edda_framework-0.12.0 → edda_framework-0.13.0}/demo_app.py +0 -0
  19. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/api/reference.md +0 -0
  20. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/durable-execution/replay.md +0 -0
  21. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/events/cloudevents-http-binding.md +0 -0
  22. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/events/postgres-notify.md +0 -0
  23. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/events/wait-event.md +0 -0
  24. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/hooks.md +0 -0
  25. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/messages.md +0 -0
  26. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/retry.md +0 -0
  27. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/saga-compensation.md +0 -0
  28. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/transactional-outbox.md +0 -0
  29. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/core-features/workflows-activities.md +0 -0
  30. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/examples/ecommerce.md +0 -0
  31. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/examples/events.md +0 -0
  32. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/examples/fastapi-integration.md +0 -0
  33. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/examples/saga.md +0 -0
  34. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/examples/simple.md +0 -0
  35. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/getting-started/concepts.md +0 -0
  36. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/getting-started/first-workflow.md +0 -0
  37. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/getting-started/installation.md +0 -0
  38. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/getting-started/quick-start.md +0 -0
  39. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/index.md +0 -0
  40. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/integrations/mcp.md +0 -0
  41. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/integrations/mirascope.md +0 -0
  42. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/integrations/opentelemetry.md +0 -0
  43. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/integrations/pydantic-rpc.md +0 -0
  44. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/cloudevents-cli-trigger.png +0 -0
  45. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/compensation-execution.png +0 -0
  46. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/detail-page-loan-approval.png +0 -0
  47. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/detail-page-match-case.png +0 -0
  48. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/nested-pydantic-form.png +0 -0
  49. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/start-workflow-form-pydantic.png +0 -0
  50. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/wait-event-visualization.png +0 -0
  51. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/workflow-list-view.png +0 -0
  52. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/images/workflow-selection-dropdown.png +0 -0
  53. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/setup.md +0 -0
  54. {edda_framework-0.12.0 → edda_framework-0.13.0}/docs/viewer-ui/visualization.md +0 -0
  55. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/__init__.py +0 -0
  56. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/activity.py +0 -0
  57. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/app.py +0 -0
  58. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/channels.py +0 -0
  59. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/compensation.py +0 -0
  60. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/context.py +0 -0
  61. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/exceptions.py +0 -0
  62. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/hooks.py +0 -0
  63. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/__init__.py +0 -0
  64. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mcp/__init__.py +0 -0
  65. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mcp/decorators.py +0 -0
  66. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mcp/server.py +0 -0
  67. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mirascope/__init__.py +0 -0
  68. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mirascope/agent.py +0 -0
  69. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mirascope/call.py +0 -0
  70. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mirascope/decorator.py +0 -0
  71. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/mirascope/types.py +0 -0
  72. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/opentelemetry/__init__.py +0 -0
  73. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/integrations/opentelemetry/hooks.py +0 -0
  74. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/locking.py +0 -0
  75. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/migrations/mysql/20251217000000_initial_schema.sql +0 -0
  76. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/migrations/postgresql/20251217000000_initial_schema.sql +0 -0
  77. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/migrations/sqlite/20251217000000_initial_schema.sql +0 -0
  78. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/outbox/__init__.py +0 -0
  79. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/outbox/relayer.py +0 -0
  80. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/outbox/transactional.py +0 -0
  81. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/pydantic_utils.py +0 -0
  82. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/retry.py +0 -0
  83. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/serialization/__init__.py +0 -0
  84. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/serialization/base.py +0 -0
  85. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/serialization/json.py +0 -0
  86. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/__init__.py +0 -0
  87. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/migrations.py +0 -0
  88. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/models.py +0 -0
  89. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/notify_base.py +0 -0
  90. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/pg_notify.py +0 -0
  91. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/protocol.py +0 -0
  92. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/storage/sqlalchemy_storage.py +0 -0
  93. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/viewer_ui/__init__.py +0 -0
  94. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/viewer_ui/components.py +0 -0
  95. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/viewer_ui/data_service.py +0 -0
  96. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/viewer_ui/theme.py +0 -0
  97. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/visualizer/__init__.py +0 -0
  98. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/visualizer/ast_analyzer.py +0 -0
  99. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/visualizer/mermaid_generator.py +0 -0
  100. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/workflow.py +0 -0
  101. {edda_framework-0.12.0 → edda_framework-0.13.0}/edda/wsgi.py +0 -0
  102. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/__init__.py +0 -0
  103. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/cancellable_workflow.py +0 -0
  104. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/compensation_workflow.py +0 -0
  105. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/event_waiting_app.py +0 -0
  106. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/event_waiting_workflow.py +0 -0
  107. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/event_waiting_workflow_complete.py +0 -0
  108. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/long_running_loop.py +0 -0
  109. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mcp/README.md +0 -0
  110. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mcp/order_processing_mcp.py +0 -0
  111. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mcp/prompts_example.py +0 -0
  112. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mcp/remote_server_example.py +0 -0
  113. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mcp/simple_mcp_server.py +0 -0
  114. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/message_passing.py +0 -0
  115. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mirascope/__init__.py +0 -0
  116. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mirascope/durable_agent.py +0 -0
  117. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mirascope/multi_turn.py +0 -0
  118. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mirascope/simple_call.py +0 -0
  119. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/mirascope/with_tools.py +0 -0
  120. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/observability_with_logfire.py +0 -0
  121. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/observability_with_opentelemetry.py +0 -0
  122. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/pydantic_rpc_integration.py +0 -0
  123. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/pydantic_saga.py +0 -0
  124. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/retry_example.py +0 -0
  125. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/retry_with_compensation.py +0 -0
  126. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/simple_workflow.py +0 -0
  127. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/typeddict_example.py +0 -0
  128. {edda_framework-0.12.0 → edda_framework-0.13.0}/examples/with_outbox.py +0 -0
  129. {edda_framework-0.12.0 → edda_framework-0.13.0}/schema/.dbmate.yml +0 -0
  130. {edda_framework-0.12.0 → edda_framework-0.13.0}/schema/.git +0 -0
  131. {edda_framework-0.12.0 → edda_framework-0.13.0}/schema/.gitignore +0 -0
  132. {edda_framework-0.12.0 → edda_framework-0.13.0}/schema/LICENSE +0 -0
  133. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/__init__.py +0 -0
  134. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/conftest.py +0 -0
  135. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/__init__.py +0 -0
  136. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/__init__.py +0 -0
  137. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/test_cancel.py +0 -0
  138. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/test_integration.py +0 -0
  139. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/test_jsonrpc.py +0 -0
  140. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/test_prompts.py +0 -0
  141. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mcp/test_server.py +0 -0
  142. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mirascope/__init__.py +0 -0
  143. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mirascope/test_agent.py +0 -0
  144. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mirascope/test_call.py +0 -0
  145. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mirascope/test_decorator.py +0 -0
  146. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/mirascope/test_types.py +0 -0
  147. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/opentelemetry/__init__.py +0 -0
  148. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/integrations/opentelemetry/test_hooks.py +0 -0
  149. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_activity.py +0 -0
  150. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_activity_retry.py +0 -0
  151. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_activity_sync.py +0 -0
  152. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_app.py +0 -0
  153. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_ast_analyzer.py +0 -0
  154. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_atomic_wait_event.py +0 -0
  155. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_auto_migration.py +0 -0
  156. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_binary_data.py +0 -0
  157. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_channel_competing.py +0 -0
  158. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_channel_direct.py +0 -0
  159. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_channel_transactional.py +0 -0
  160. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_cloudevents_http_binding.py +0 -0
  161. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_compensation.py +0 -0
  162. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_compensation_crash_recovery.py.wip +0 -0
  163. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_concurrent_outbox.py +0 -0
  164. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_context.py +0 -0
  165. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_ctx_session.py +0 -0
  166. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_distributed_event_delivery.py +0 -0
  167. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_events.py +0 -0
  168. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_instance_id_routing.py +0 -0
  169. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_lock_race_condition.py +0 -0
  170. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_lock_timeout_customization.py +0 -0
  171. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_locking.py +0 -0
  172. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_message_cleanup.py +0 -0
  173. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_message_delivery_lock.py +0 -0
  174. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_messages.py +0 -0
  175. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_migrations_integration.py +0 -0
  176. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_multidb_storage.py +0 -0
  177. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_outbox.py +0 -0
  178. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pg_notify.py +0 -0
  179. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_polling_optimization.py +0 -0
  180. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pydantic_activity.py +0 -0
  181. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pydantic_enum.py +0 -0
  182. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pydantic_events.py +0 -0
  183. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pydantic_saga.py +0 -0
  184. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_pydantic_utils.py +0 -0
  185. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_receive_timeout.py +0 -0
  186. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_received_event.py +0 -0
  187. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_recur.py +0 -0
  188. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_recur_cleanup.py +0 -0
  189. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_replay.py +0 -0
  190. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_retry_policy.py +0 -0
  191. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_saga_parameter_extraction.py +0 -0
  192. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_serialization.py +0 -0
  193. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_skip_locked.py +0 -0
  194. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_stale_workflow_recovery.py +0 -0
  195. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_storage.py +0 -0
  196. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_storage_mysql.py +0 -0
  197. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_storage_postgresql.py +0 -0
  198. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_transactions.py +0 -0
  199. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_viewer_pagination.py +0 -0
  200. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_viewer_pydantic_form.py +0 -0
  201. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_viewer_start_saga.py +0 -0
  202. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_wait_timer.py +0 -0
  203. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_workflow.py +0 -0
  204. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_workflow_auto_register.py +0 -0
  205. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_workflow_cancellation.py +0 -0
  206. {edda_framework-0.12.0 → edda_framework-0.13.0}/tests/test_workflow_resumption.py +0 -0
  207. {edda_framework-0.12.0 → edda_framework-0.13.0}/viewer_app.py +0 -0
  208. {edda_framework-0.12.0 → edda_framework-0.13.0}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edda-framework
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Lightweight Durable Execution Framework
5
5
  Project-URL: Homepage, https://github.com/i2y/edda
6
6
  Project-URL: Documentation, https://github.com/i2y/edda#readme
@@ -368,16 +368,22 @@ class ReplayEngine:
368
368
  traceback.format_exception(type(error), error, error.__traceback__)
369
369
  )
370
370
 
371
- # Mark as failed with detailed error information
372
- await ctx._update_status(
373
- "failed",
374
- {
375
- "error_message": str(error),
376
- "error_type": type(error).__name__,
377
- "stack_trace": stack_trace,
378
- },
371
+ error_data = {
372
+ "error_message": str(error),
373
+ "error_type": type(error).__name__,
374
+ "stack_trace": stack_trace,
375
+ }
376
+
377
+ await self.storage.append_history(
378
+ instance_id=instance_id,
379
+ activity_id="workflow_failed",
380
+ event_type="WorkflowFailed",
381
+ event_data=error_data,
379
382
  )
380
383
 
384
+ # Mark as failed with detailed error information
385
+ await ctx._update_status("failed", error_data)
386
+
381
387
  # Call hook: workflow failed
382
388
  if self.hooks and hasattr(self.hooks, "on_workflow_failed"):
383
389
  await self.hooks.on_workflow_failed(instance_id, workflow_name, error)
@@ -576,15 +582,21 @@ class ReplayEngine:
576
582
  traceback.format_exception(type(error), error, error.__traceback__)
577
583
  )
578
584
 
579
- # Mark as failed with detailed error information
580
- await ctx._update_status(
581
- "failed",
582
- {
583
- "error_message": str(error),
584
- "error_type": type(error).__name__,
585
- "stack_trace": stack_trace,
586
- },
585
+ error_data = {
586
+ "error_message": str(error),
587
+ "error_type": type(error).__name__,
588
+ "stack_trace": stack_trace,
589
+ }
590
+
591
+ await self.storage.append_history(
592
+ instance_id=instance_id,
593
+ activity_id="workflow_failed",
594
+ event_type="WorkflowFailed",
595
+ event_data=error_data,
587
596
  )
597
+
598
+ # Mark as failed with detailed error information
599
+ await ctx._update_status("failed", error_data)
588
600
  raise
589
601
 
590
602
  async def resume_by_name(
@@ -775,15 +787,21 @@ class ReplayEngine:
775
787
  traceback.format_exception(type(error), error, error.__traceback__)
776
788
  )
777
789
 
778
- await ctx._update_status(
779
- "failed",
780
- {
781
- "error_message": str(error),
782
- "error_type": type(error).__name__,
783
- "stack_trace": stack_trace,
784
- },
790
+ error_data = {
791
+ "error_message": str(error),
792
+ "error_type": type(error).__name__,
793
+ "stack_trace": stack_trace,
794
+ }
795
+
796
+ await self.storage.append_history(
797
+ instance_id=new_instance_id,
798
+ activity_id="workflow_failed",
799
+ event_type="WorkflowFailed",
800
+ event_data=error_data,
785
801
  )
786
802
 
803
+ await ctx._update_status("failed", error_data)
804
+
787
805
  if self.hooks and hasattr(self.hooks, "on_workflow_failed"):
788
806
  await self.hooks.on_workflow_failed(new_instance_id, workflow_name, error)
789
807
 
@@ -309,6 +309,10 @@ def start_viewer(edda_app: EddaApp, port: int = 8080, reload: bool = False) -> N
309
309
  all_workflows = service.get_all_workflows()
310
310
  workflow_names = list(all_workflows.keys())
311
311
 
312
+ workflow_select: Any = None
313
+ params_container: Any = None
314
+ param_fields: dict[str, Any] = {}
315
+
312
316
  if not workflow_names:
313
317
  ui.label("No workflows registered").classes("text-red-500")
314
318
  ui.button("Close", on_click=start_dialog.close)
@@ -323,9 +327,6 @@ def start_viewer(edda_app: EddaApp, port: int = 8080, reload: bool = False) -> N
323
327
  # Container for dynamic parameter fields
324
328
  params_container = ui.column().classes("w-full mb-4")
325
329
 
326
- # Store input field references
327
- param_fields: dict[str, Any] = {}
328
-
329
330
  # Factory functions for creating field managers with proper closures
330
331
  # These must be defined outside the loop to avoid closure issues
331
332
 
@@ -778,6 +779,8 @@ def start_viewer(edda_app: EddaApp, port: int = 8080, reload: bool = False) -> N
778
779
 
779
780
  def update_parameter_fields() -> None:
780
781
  """Update parameter input fields based on selected workflow."""
782
+ if workflow_select is None or params_container is None:
783
+ return
781
784
  selected_workflow = workflow_select.value
782
785
  if not selected_workflow:
783
786
  return
@@ -1106,13 +1109,17 @@ def start_viewer(edda_app: EddaApp, port: int = 8080, reload: bool = False) -> N
1106
1109
  update_parameter_fields()
1107
1110
 
1108
1111
  # Update fields when workflow selection changes
1109
- workflow_select.on_value_change(lambda _: update_parameter_fields())
1112
+ if workflow_select is not None:
1113
+ workflow_select.on_value_change(lambda _: update_parameter_fields())
1110
1114
 
1111
1115
  # Action buttons
1112
1116
  with ui.row().classes("w-full gap-2"):
1113
1117
 
1114
1118
  async def handle_start() -> None:
1115
1119
  """Handle workflow start."""
1120
+ if workflow_select is None:
1121
+ ui.notify("No workflows available", type="negative")
1122
+ return
1116
1123
  try:
1117
1124
  selected_workflow = workflow_select.value
1118
1125
  if not selected_workflow:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "edda-framework"
3
- version = "0.12.0"
3
+ version = "0.13.0"
4
4
  description = "Lightweight Durable Execution Framework"
5
5
  authors = [
6
6
  { name = "Yasushi Itoh", email = "6240399+i2y@users.noreply.github.com" }
@@ -48,6 +48,10 @@ dbmate status # Check migration status
48
48
  dbmate down # Rollback latest migration
49
49
  ```
50
50
 
51
+ ## Documentation
52
+
53
+ - [Column Values Reference](docs/column-values.md) - Standard values for database columns across all implementations
54
+
51
55
  ## License
52
56
 
53
57
  MIT
@@ -0,0 +1,91 @@
1
+ # Database Column Values Reference
2
+
3
+ This document defines the standard values for database columns that must be consistent across all Durax framework implementations (Edda/Python, Romancy/Go, etc.).
4
+
5
+ ## workflow_instances.status
6
+
7
+ | Value | Description |
8
+ |-------|-------------|
9
+ | `running` | Workflow is actively executing |
10
+ | `completed` | Workflow finished successfully |
11
+ | `failed` | Workflow failed with an error |
12
+ | `cancelled` | Workflow was cancelled by user |
13
+ | `waiting_for_event` | Workflow is waiting for an external event (via `wait_event`) |
14
+ | `waiting_for_timer` | Workflow is waiting for a timer to expire (via `sleep`/`sleep_until`) |
15
+ | `waiting_for_message` | Workflow is waiting for a channel message (via `receive`) |
16
+ | `recurred` | Workflow completed one iteration and is ready to restart (Erlang-style tail recursion) |
17
+ | `compensating` | Workflow is executing compensation handlers |
18
+
19
+ ## workflow_history.event_type
20
+
21
+ All event types use **PascalCase** for cross-language consistency.
22
+
23
+ | Value | Description |
24
+ |-------|-------------|
25
+ | `ActivityCompleted` | An activity finished successfully |
26
+ | `ActivityFailed` | An activity failed with an error |
27
+ | `EventReceived` | An external event was received (via `wait_event`) |
28
+ | `TimerExpired` | A timer expired (via `sleep`/`sleep_until`) |
29
+ | `ChannelMessageReceived` | A channel message was received (via `receive`) |
30
+ | `MessageTimeout` | A channel message receive timed out |
31
+ | `CompensationExecuted` | A compensation handler executed successfully |
32
+ | `CompensationFailed` | A compensation handler failed |
33
+ | `WorkflowFailed` | The workflow failed (recorded before status update) |
34
+ | `WorkflowCancelled` | The workflow was cancelled |
35
+
36
+ ## workflow_history.data_type
37
+
38
+ | Value | Description |
39
+ |-------|-------------|
40
+ | `json` | Event data is stored as JSON text in `event_data` column |
41
+ | `binary` | Event data is stored as raw bytes in `event_data_binary` column |
42
+
43
+ ## channel_subscriptions.mode
44
+
45
+ | Value | Description |
46
+ |-------|-------------|
47
+ | `broadcast` | All subscribers receive a copy of each message |
48
+ | `competing` | Only one subscriber receives each message (work queue pattern) |
49
+
50
+ ## channel_messages.data_type
51
+
52
+ | Value | Description |
53
+ |-------|-------------|
54
+ | `json` | Message data is stored as JSON text in `data` column |
55
+ | `binary` | Message data is stored as raw bytes in `data_binary` column |
56
+
57
+ ## outbox_events.status
58
+
59
+ | Value | Description |
60
+ |-------|-------------|
61
+ | `pending` | Event is waiting to be published |
62
+ | `processing` | Event is currently being processed by the relayer |
63
+ | `published` | Event was successfully published |
64
+ | `failed` | Event publishing failed after all retries |
65
+ | `invalid` | Event is malformed and cannot be published |
66
+ | `expired` | Event expired before it could be published |
67
+
68
+ ## workflow_instances.framework
69
+
70
+ | Value | Description |
71
+ |-------|-------------|
72
+ | `python` | Workflow is managed by Edda (Python) |
73
+ | `go` | Workflow is managed by Romancy (Go) |
74
+
75
+ This column enables cross-language interoperability: any framework can deliver messages to workflows managed by other frameworks, while each framework only processes (replays/resumes) its own workflows.
76
+
77
+ ---
78
+
79
+ ## Cross-Language Compatibility Notes
80
+
81
+ 1. **Event type naming**: Always use PascalCase (e.g., `ActivityCompleted`, not `activity_completed`)
82
+
83
+ 2. **Message delivery**: Any framework can deliver channel messages to any workflow, regardless of the target workflow's framework. The delivering framework:
84
+ - Acquires a lock on the target workflow
85
+ - Records the message in `workflow_history` with the correct `event_type`
86
+ - Updates the workflow status to `running`
87
+ - Releases the lock
88
+
89
+ 3. **Workflow processing**: Each framework only processes workflows where `framework` matches its own identifier. This ensures correct replay behavior.
90
+
91
+ 4. **Activity IDs**: Both frameworks use the format `{activity_name}:{counter}` for deterministic replay (e.g., `fetch_data:1`, `receive_orders:2`).