enya-agent 0.1.0
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.
- package/.env.example +20 -0
- package/.github/workflows/ci.yml +70 -0
- package/.github/workflows/publish.yml +250 -0
- package/.gitmodules +3 -0
- package/Cargo.lock +3584 -0
- package/Cargo.toml +97 -0
- package/crates/enact/Cargo.toml +27 -0
- package/crates/enact/src/lib.rs +60 -0
- package/crates/enact-a2a/Cargo.toml +25 -0
- package/crates/enact-a2a/src/lib.rs +411 -0
- package/crates/enact-channels/Cargo.toml +64 -0
- package/crates/enact-channels/examples/README.md +80 -0
- package/crates/enact-channels/examples/channel_bot.rs +169 -0
- package/crates/enact-channels/examples/telegram-echo.rs +34 -0
- package/crates/enact-channels/examples/whatsapp-echo.rs +142 -0
- package/crates/enact-channels/src/config.rs +213 -0
- package/crates/enact-channels/src/lib.rs +25 -0
- package/crates/enact-channels/src/runtime.rs +237 -0
- package/crates/enact-channels/src/security/mod.rs +5 -0
- package/crates/enact-channels/src/security/pairing.rs +205 -0
- package/crates/enact-channels/src/teams.rs +601 -0
- package/crates/enact-channels/src/telegram.rs +2833 -0
- package/crates/enact-channels/src/traits.rs +200 -0
- package/crates/enact-channels/src/webhook.rs +262 -0
- package/crates/enact-channels/src/whatsapp.rs +310 -0
- package/crates/enact-cli/Cargo.toml +40 -0
- package/crates/enact-cli/src/commands/doctor.rs +62 -0
- package/crates/enact-cli/src/commands/mod.rs +3 -0
- package/crates/enact-cli/src/commands/run.rs +69 -0
- package/crates/enact-cli/src/commands/serve.rs +81 -0
- package/crates/enact-cli/src/config.rs +2 -0
- package/crates/enact-cli/src/main.rs +79 -0
- package/crates/enact-config/Cargo.toml +36 -0
- package/crates/enact-config/ENV_VAR_MAPPING.md +135 -0
- package/crates/enact-config/QUICK_REFERENCE.md +92 -0
- package/crates/enact-config/README.md +107 -0
- package/crates/enact-config/TESTING.md +161 -0
- package/crates/enact-config/examples/test-env-vars.rs +100 -0
- package/crates/enact-config/src/config.rs +399 -0
- package/crates/enact-config/src/encrypted_store.rs +211 -0
- package/crates/enact-config/src/lib.rs +298 -0
- package/crates/enact-config/src/secrets.rs +149 -0
- package/crates/enact-config/src/sync.rs +260 -0
- package/crates/enact-config/test-env-vars.sh +34 -0
- package/crates/enact-config/tests/README.md +99 -0
- package/crates/enact-config/tests/config_integration_test.rs +202 -0
- package/crates/enact-config/tests/security_test.rs +140 -0
- package/crates/enact-context/Cargo.toml +41 -0
- package/crates/enact-context/src/budget.rs +314 -0
- package/crates/enact-context/src/calibrator.rs +535 -0
- package/crates/enact-context/src/compactor.rs +392 -0
- package/crates/enact-context/src/condenser.rs +826 -0
- package/crates/enact-context/src/lib.rs +94 -0
- package/crates/enact-context/src/segment.rs +238 -0
- package/crates/enact-context/src/step_context.rs +645 -0
- package/crates/enact-context/src/token_counter.rs +148 -0
- package/crates/enact-context/src/window.rs +372 -0
- package/crates/enact-core/Cargo.toml +42 -0
- package/crates/enact-core/README.md +98 -0
- package/crates/enact-core/src/background/executor.rs +524 -0
- package/crates/enact-core/src/background/mod.rs +48 -0
- package/crates/enact-core/src/background/target_binding.rs +390 -0
- package/crates/enact-core/src/background/trigger.rs +511 -0
- package/crates/enact-core/src/callable/callable.rs +152 -0
- package/crates/enact-core/src/callable/composite.rs +817 -0
- package/crates/enact-core/src/callable/graph.rs +104 -0
- package/crates/enact-core/src/callable/llm.rs +211 -0
- package/crates/enact-core/src/callable/mod.rs +64 -0
- package/crates/enact-core/src/callable/registry.rs +206 -0
- package/crates/enact-core/src/context/execution_context.rs +757 -0
- package/crates/enact-core/src/context/invocation.rs +99 -0
- package/crates/enact-core/src/context/mod.rs +50 -0
- package/crates/enact-core/src/context/tenant.rs +175 -0
- package/crates/enact-core/src/context/trace.rs +127 -0
- package/crates/enact-core/src/flow/conditional.rs +293 -0
- package/crates/enact-core/src/flow/mod.rs +43 -0
- package/crates/enact-core/src/flow/parallel.rs +437 -0
- package/crates/enact-core/src/flow/repeat.rs +534 -0
- package/crates/enact-core/src/flow/sequential.rs +248 -0
- package/crates/enact-core/src/graph/checkpoint.rs +79 -0
- package/crates/enact-core/src/graph/checkpoint_store.rs +76 -0
- package/crates/enact-core/src/graph/compiled.rs +189 -0
- package/crates/enact-core/src/graph/edge.rs +59 -0
- package/crates/enact-core/src/graph/graph_schema.rs +218 -0
- package/crates/enact-core/src/graph/loader.rs +155 -0
- package/crates/enact-core/src/graph/mod.rs +18 -0
- package/crates/enact-core/src/graph/node/function.rs +49 -0
- package/crates/enact-core/src/graph/node/mod.rs +48 -0
- package/crates/enact-core/src/graph/schema.rs +62 -0
- package/crates/enact-core/src/inbox/message.rs +405 -0
- package/crates/enact-core/src/inbox/mod.rs +31 -0
- package/crates/enact-core/src/inbox/store.rs +355 -0
- package/crates/enact-core/src/kernel/artifact/filesystem.rs +546 -0
- package/crates/enact-core/src/kernel/artifact/metadata.rs +283 -0
- package/crates/enact-core/src/kernel/artifact/mod.rs +27 -0
- package/crates/enact-core/src/kernel/artifact/store.rs +427 -0
- package/crates/enact-core/src/kernel/enforcement.rs +1315 -0
- package/crates/enact-core/src/kernel/error.rs +1200 -0
- package/crates/enact-core/src/kernel/event.rs +1394 -0
- package/crates/enact-core/src/kernel/execution_model.rs +831 -0
- package/crates/enact-core/src/kernel/execution_state.rs +189 -0
- package/crates/enact-core/src/kernel/execution_strategy.rs +117 -0
- package/crates/enact-core/src/kernel/ids.rs +2086 -0
- package/crates/enact-core/src/kernel/interrupt.rs +125 -0
- package/crates/enact-core/src/kernel/kernel.rs +1283 -0
- package/crates/enact-core/src/kernel/mod.rs +205 -0
- package/crates/enact-core/src/kernel/persistence/event_store.rs +270 -0
- package/crates/enact-core/src/kernel/persistence/message_store.rs +908 -0
- package/crates/enact-core/src/kernel/persistence/mod.rs +102 -0
- package/crates/enact-core/src/kernel/persistence/state_store.rs +228 -0
- package/crates/enact-core/src/kernel/persistence/vector_store.rs +299 -0
- package/crates/enact-core/src/kernel/reducer.rs +808 -0
- package/crates/enact-core/src/kernel/replay.rs +153 -0
- package/crates/enact-core/src/lib.rs +413 -0
- package/crates/enact-core/src/memory/episodic.rs +0 -0
- package/crates/enact-core/src/memory/mod.rs +6 -0
- package/crates/enact-core/src/memory/semantic.rs +0 -0
- package/crates/enact-core/src/memory/trait.rs +0 -0
- package/crates/enact-core/src/memory/vector_db.rs +0 -0
- package/crates/enact-core/src/memory/working.rs +0 -0
- package/crates/enact-core/src/policy/execution_policy.rs +292 -0
- package/crates/enact-core/src/policy/filters.rs +458 -0
- package/crates/enact-core/src/policy/input_processor.rs +407 -0
- package/crates/enact-core/src/policy/long_running.rs +134 -0
- package/crates/enact-core/src/policy/mod.rs +193 -0
- package/crates/enact-core/src/policy/pii_input.rs +274 -0
- package/crates/enact-core/src/policy/tenant_policy.rs +453 -0
- package/crates/enact-core/src/policy/tool_policy.rs +407 -0
- package/crates/enact-core/src/providers/mod.rs +63 -0
- package/crates/enact-core/src/providers/trait.rs +292 -0
- package/crates/enact-core/src/runner/callbacks.rs +6 -0
- package/crates/enact-core/src/runner/execution_runner.rs +476 -0
- package/crates/enact-core/src/runner/loop.rs +117 -0
- package/crates/enact-core/src/runner/mod.rs +58 -0
- package/crates/enact-core/src/runner/protected_runner.rs +280 -0
- package/crates/enact-core/src/signal/inmemory.rs +231 -0
- package/crates/enact-core/src/signal/mod.rs +108 -0
- package/crates/enact-core/src/streaming/event_logger.rs +195 -0
- package/crates/enact-core/src/streaming/event_stream.rs +1423 -0
- package/crates/enact-core/src/streaming/mod.rs +108 -0
- package/crates/enact-core/src/streaming/pause_cancel.rs +0 -0
- package/crates/enact-core/src/streaming/protected_emitter.rs +173 -0
- package/crates/enact-core/src/streaming/protection/context.rs +136 -0
- package/crates/enact-core/src/streaming/protection/encryption.rs +289 -0
- package/crates/enact-core/src/streaming/protection/mod.rs +43 -0
- package/crates/enact-core/src/streaming/protection/pii_protection.rs +243 -0
- package/crates/enact-core/src/streaming/protection/processor.rs +166 -0
- package/crates/enact-core/src/streaming/sse.rs +0 -0
- package/crates/enact-core/src/telemetry/exporter.rs +0 -0
- package/crates/enact-core/src/telemetry/init.rs +0 -0
- package/crates/enact-core/src/telemetry/mod.rs +49 -0
- package/crates/enact-core/src/telemetry/spans.rs +245 -0
- package/crates/enact-core/src/tool/agent_tool.rs +177 -0
- package/crates/enact-core/src/tool/browser/mod.rs +0 -0
- package/crates/enact-core/src/tool/browser/webdriver.rs +0 -0
- package/crates/enact-core/src/tool/cost.rs +247 -0
- package/crates/enact-core/src/tool/discovery.rs +0 -0
- package/crates/enact-core/src/tool/dispatcher.rs +347 -0
- package/crates/enact-core/src/tool/filesystem.rs +231 -0
- package/crates/enact-core/src/tool/function.rs +99 -0
- package/crates/enact-core/src/tool/git.rs +162 -0
- package/crates/enact-core/src/tool/http.rs +214 -0
- package/crates/enact-core/src/tool/mcp/client.rs +0 -0
- package/crates/enact-core/src/tool/mcp/mod.rs +0 -0
- package/crates/enact-core/src/tool/mod.rs +51 -0
- package/crates/enact-core/src/tool/reasoning/debugging.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/mcts.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/mod.rs +0 -0
- package/crates/enact-core/src/tool/reasoning/sequential.rs +0 -0
- package/crates/enact-core/src/tool/sandbox/dagger.rs +0 -0
- package/crates/enact-core/src/tool/sandbox/mod.rs +0 -0
- package/crates/enact-core/src/tool/shell.rs +147 -0
- package/crates/enact-core/src/tool/trait.rs +33 -0
- package/crates/enact-core/src/tool/web_search.rs +277 -0
- package/crates/enact-core/src/util/config.rs +0 -0
- package/crates/enact-core/src/util/errors.rs +0 -0
- package/crates/enact-core/src/util/mod.rs +6 -0
- package/crates/enact-core/tests/airgapped_e2e_test.rs +291 -0
- package/crates/enact-core/tests/e2e_agentic_loop.rs +119 -0
- package/crates/enact-core/tests/e2e_test.rs +259 -0
- package/crates/enact-core/tests/graph_test.rs +130 -0
- package/crates/enact-core/tests/stream_event_id_validation.rs +435 -0
- package/crates/enact-cron/Cargo.toml +28 -0
- package/crates/enact-cron/src/lib.rs +44 -0
- package/crates/enact-cron/src/schedule.rs +156 -0
- package/crates/enact-cron/src/store.rs +589 -0
- package/crates/enact-cron/src/types.rs +148 -0
- package/crates/enact-gateway/Cargo.toml +31 -0
- package/crates/enact-gateway/README.md +30 -0
- package/crates/enact-gateway/examples/whatsapp-gateway-runner-mock.rs +59 -0
- package/crates/enact-gateway/examples/whatsapp-gateway.rs +42 -0
- package/crates/enact-gateway/src/lib.rs +582 -0
- package/crates/enact-mcp/Cargo.toml +24 -0
- package/crates/enact-mcp/src/lib.rs +178 -0
- package/crates/enact-memory/Cargo.toml +25 -0
- package/crates/enact-memory/src/backend.rs +20 -0
- package/crates/enact-memory/src/chunker.rs +230 -0
- package/crates/enact-memory/src/embeddings.rs +221 -0
- package/crates/enact-memory/src/lib.rs +67 -0
- package/crates/enact-memory/src/markdown.rs +127 -0
- package/crates/enact-memory/src/none.rs +61 -0
- package/crates/enact-memory/src/sqlite.rs +276 -0
- package/crates/enact-memory/src/traits.rs +65 -0
- package/crates/enact-memory/src/vector.rs +198 -0
- package/crates/enact-oauth/Cargo.toml +27 -0
- package/crates/enact-oauth/src/lib.rs +584 -0
- package/crates/enact-observability/Cargo.toml +22 -0
- package/crates/enact-observability/src/lib.rs +197 -0
- package/crates/enact-providers/Cargo.toml +33 -0
- package/crates/enact-providers/examples/hello-agent.rs +33 -0
- package/crates/enact-providers/src/anthropic.rs +182 -0
- package/crates/enact-providers/src/azure.rs +96 -0
- package/crates/enact-providers/src/bridge.rs +221 -0
- package/crates/enact-providers/src/gemini.rs +227 -0
- package/crates/enact-providers/src/http.rs +78 -0
- package/crates/enact-providers/src/lib.rs +53 -0
- package/crates/enact-providers/src/openai_compatible.rs +167 -0
- package/crates/enact-providers/src/openrouter.rs +33 -0
- package/crates/enact-runner/Cargo.toml +24 -0
- package/crates/enact-runner/README.md +76 -0
- package/crates/enact-runner/src/compaction.rs +225 -0
- package/crates/enact-runner/src/config.rs +118 -0
- package/crates/enact-runner/src/lib.rs +63 -0
- package/crates/enact-runner/src/loop_driver.rs +414 -0
- package/crates/enact-runner/src/parser.rs +421 -0
- package/crates/enact-runner/src/retry.rs +262 -0
- package/crates/enact-runner/tests/integration.rs +278 -0
- package/crates/enact-security/Cargo.toml +22 -0
- package/crates/enact-security/src/audit.rs +375 -0
- package/crates/enact-security/src/lib.rs +37 -0
- package/crates/enact-security/src/policy.rs +406 -0
- package/crates/enact-skills/Cargo.toml +25 -0
- package/crates/enact-skills/src/lib.rs +506 -0
- package/crates/enact-tools/Cargo.toml +22 -0
- package/crates/enact-tools/src/file_read.rs +166 -0
- package/crates/enact-tools/src/file_write.rs +216 -0
- package/crates/enact-tools/src/git_operations.rs +513 -0
- package/crates/enact-tools/src/http_request.rs +417 -0
- package/crates/enact-tools/src/lib.rs +104 -0
- package/crates/enact-tools/src/security.rs +227 -0
- package/crates/enact-tools/src/shell.rs +191 -0
- package/crates/enact-tools/src/traits.rs +159 -0
- package/docs/Makefile +74 -0
- package/docs/config.toml +62 -0
- package/docs/content/_index.md +174 -0
- package/docs/content/a2a/_index.md +431 -0
- package/docs/content/api/_index.md +323 -0
- package/docs/content/channels/_index.md +160 -0
- package/docs/content/channels/teams.md +205 -0
- package/docs/content/channels/telegram.md +182 -0
- package/docs/content/channels/webhook.md +423 -0
- package/docs/content/channels/whatsapp.md +240 -0
- package/docs/content/cli/_index.md +261 -0
- package/docs/content/concepts/_index.md +273 -0
- package/docs/content/configuration/_index.md +241 -0
- package/docs/content/cron/_index.md +248 -0
- package/docs/content/developers/_index.md +278 -0
- package/docs/content/getting-started/_index.md +180 -0
- package/docs/content/installation/_index.md +186 -0
- package/docs/content/installation/uninstall.md +101 -0
- package/docs/content/installation/updating.md +120 -0
- package/docs/content/mcp/_index.md +215 -0
- package/docs/content/memory/_index.md +163 -0
- package/docs/content/oauth/_index.md +515 -0
- package/docs/content/providers/_index.md +206 -0
- package/docs/content/roadmap/_index.md +199 -0
- package/docs/content/security/_index.md +219 -0
- package/docs/content/skills/_index.md +228 -0
- package/docs/content/tools/_index.md +485 -0
- package/docs/content/troubleshooting/_index.md +259 -0
- package/docs/content/yaml-schema/_index.md +294 -0
- package/docs/static/giallo-dark.css +91 -0
- package/docs/static/giallo-light.css +91 -0
- package/docs/themes/tanuki/.github/workflows/deploy.yml +44 -0
- package/docs/themes/tanuki/LICENSE +21 -0
- package/docs/themes/tanuki/README.md +166 -0
- package/docs/themes/tanuki/examples/blog/config.toml +58 -0
- package/docs/themes/tanuki/examples/blog/content/_index.md +4 -0
- package/docs/themes/tanuki/examples/blog/content/about.md +33 -0
- package/docs/themes/tanuki/examples/blog/content/blog/_index.md +7 -0
- package/docs/themes/tanuki/examples/blog/content/blog/api-design-best-practices.md +245 -0
- package/docs/themes/tanuki/examples/blog/content/blog/building-accessible-websites.md +147 -0
- package/docs/themes/tanuki/examples/blog/content/blog/css-grid-vs-flexbox.md +165 -0
- package/docs/themes/tanuki/examples/blog/content/blog/customizing-catppuccin-colors.md +137 -0
- package/docs/themes/tanuki/examples/blog/content/blog/dark-mode-best-practices.md +82 -0
- package/docs/themes/tanuki/examples/blog/content/blog/docker-essentials.md +301 -0
- package/docs/themes/tanuki/examples/blog/content/blog/getting-started-with-zola.md +129 -0
- package/docs/themes/tanuki/examples/blog/content/blog/git-workflow-for-content.md +112 -0
- package/docs/themes/tanuki/examples/blog/content/blog/introduction-to-webassembly.md +183 -0
- package/docs/themes/tanuki/examples/blog/content/blog/modern-javascript-features.md +234 -0
- package/docs/themes/tanuki/examples/blog/content/blog/testing-strategies.md +311 -0
- package/docs/themes/tanuki/examples/blog/content/blog/typography-for-developers.md +104 -0
- package/docs/themes/tanuki/examples/blog/content/blog/welcome-to-tanuki.md +67 -0
- package/docs/themes/tanuki/examples/blog/content/blog/why-static-sites.md +85 -0
- package/docs/themes/tanuki/examples/blog/content/projects.md +64 -0
- package/docs/themes/tanuki/examples/book/config.toml +17 -0
- package/docs/themes/tanuki/examples/book/content/_index.md +12 -0
- package/docs/themes/tanuki/examples/book/content/chapter-1.md +90 -0
- package/docs/themes/tanuki/examples/book/content/chapter-2.md +143 -0
- package/docs/themes/tanuki/examples/book/content/chapter-3.md +217 -0
- package/docs/themes/tanuki/examples/book/content/chapter-4.md +224 -0
- package/docs/themes/tanuki/examples/book/content/chapter-5.md +297 -0
- package/docs/themes/tanuki/examples/book/content/print.md +6 -0
- package/docs/themes/tanuki/examples/docs/config.toml +28 -0
- package/docs/themes/tanuki/examples/docs/content/_index.md +20 -0
- package/docs/themes/tanuki/examples/docs/content/components.md +156 -0
- package/docs/themes/tanuki/examples/docs/content/configuration.md +94 -0
- package/docs/themes/tanuki/examples/docs/content/customization.md +202 -0
- package/docs/themes/tanuki/examples/docs/content/deployment.md +204 -0
- package/docs/themes/tanuki/examples/docs/content/installation.md +59 -0
- package/docs/themes/tanuki/examples/docs/content/print.md +6 -0
- package/docs/themes/tanuki/examples/docs/static/img/tanuki-icon.avif +0 -0
- package/docs/themes/tanuki/examples/index.html +2104 -0
- package/docs/themes/tanuki/mise.toml +108 -0
- package/docs/themes/tanuki/sass/base/_catppuccin.scss +164 -0
- package/docs/themes/tanuki/sass/base/_fonts.scss +64 -0
- package/docs/themes/tanuki/sass/base/_reset.scss +152 -0
- package/docs/themes/tanuki/sass/base/_typography.scss +523 -0
- package/docs/themes/tanuki/sass/components/_buttons.scss +209 -0
- package/docs/themes/tanuki/sass/components/_code.scss +457 -0
- package/docs/themes/tanuki/sass/components/_landing.scss +633 -0
- package/docs/themes/tanuki/sass/components/_layout.scss +294 -0
- package/docs/themes/tanuki/sass/components/_navigation.scss +1200 -0
- package/docs/themes/tanuki/sass/components/_print.scss +237 -0
- package/docs/themes/tanuki/sass/components/_search.scss +224 -0
- package/docs/themes/tanuki/sass/components/_sidebar.scss +473 -0
- package/docs/themes/tanuki/sass/components/_theme-toggle.scss +186 -0
- package/docs/themes/tanuki/sass/modes/_blog.scss +366 -0
- package/docs/themes/tanuki/sass/modes/_product.scss +875 -0
- package/docs/themes/tanuki/sass/modes/_raskell.scss +1696 -0
- package/docs/themes/tanuki/sass/patterns/_buttons.scss +183 -0
- package/docs/themes/tanuki/sass/patterns/_cards.scss +144 -0
- package/docs/themes/tanuki/sass/patterns/_index.scss +9 -0
- package/docs/themes/tanuki/sass/patterns/_lists.scss +259 -0
- package/docs/themes/tanuki/sass/patterns/_sections.scss +243 -0
- package/docs/themes/tanuki/sass/style.scss +47 -0
- package/docs/themes/tanuki/sass/tokens/_colors.scss +139 -0
- package/docs/themes/tanuki/sass/tokens/_spacing.scss +100 -0
- package/docs/themes/tanuki/sass/tokens/_typography.scss +186 -0
- package/docs/themes/tanuki/screenshot.png +0 -0
- package/docs/themes/tanuki/sentinel.kdl +59 -0
- package/docs/themes/tanuki/static/elasticlunr.min.js +10 -0
- package/docs/themes/tanuki/static/fonts/GEIST-LICENSE.txt +92 -0
- package/docs/themes/tanuki/static/fonts/Geist-Variable.woff2 +0 -0
- package/docs/themes/tanuki/static/fonts/GeistMono-Variable.woff2 +0 -0
- package/docs/themes/tanuki/static/img/tanuki-icon.avif +0 -0
- package/docs/themes/tanuki/static/img/tanuki-icon.png +0 -0
- package/docs/themes/tanuki/static/js/anchors.js +18 -0
- package/docs/themes/tanuki/static/js/app.js +274 -0
- package/docs/themes/tanuki/static/js/code.js +394 -0
- package/docs/themes/tanuki/static/js/navigation.js +778 -0
- package/docs/themes/tanuki/static/js/scroll-to-top.js +33 -0
- package/docs/themes/tanuki/static/js/search-raskell.js +240 -0
- package/docs/themes/tanuki/static/js/search.js +215 -0
- package/docs/themes/tanuki/static/js/theme.js +169 -0
- package/docs/themes/tanuki/static/syntax-dark.css +151 -0
- package/docs/themes/tanuki/static/syntax-light.css +151 -0
- package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm.js +486 -0
- package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm_bg.wasm +0 -0
- package/docs/themes/tanuki/templates/404.html +52 -0
- package/docs/themes/tanuki/templates/base.html +428 -0
- package/docs/themes/tanuki/templates/blog.html +66 -0
- package/docs/themes/tanuki/templates/home.html +108 -0
- package/docs/themes/tanuki/templates/index.html +178 -0
- package/docs/themes/tanuki/templates/landing.html +168 -0
- package/docs/themes/tanuki/templates/macros/nav.html +128 -0
- package/docs/themes/tanuki/templates/macros/posts.html +101 -0
- package/docs/themes/tanuki/templates/macros/ui.html +159 -0
- package/docs/themes/tanuki/templates/page.html +135 -0
- package/docs/themes/tanuki/templates/partials/footer.html +38 -0
- package/docs/themes/tanuki/templates/partials/header.html +366 -0
- package/docs/themes/tanuki/templates/partials/nav-buttons.html +55 -0
- package/docs/themes/tanuki/templates/partials/nav-overlay.html +81 -0
- package/docs/themes/tanuki/templates/partials/page-toc-panel.html +43 -0
- package/docs/themes/tanuki/templates/partials/search.html +52 -0
- package/docs/themes/tanuki/templates/partials/sidebar.html +107 -0
- package/docs/themes/tanuki/templates/partials/theme-toggle.html +35 -0
- package/docs/themes/tanuki/templates/partials/toc-overlay.html +146 -0
- package/docs/themes/tanuki/templates/partials/version-picker.html +38 -0
- package/docs/themes/tanuki/templates/print.html +244 -0
- package/docs/themes/tanuki/templates/section.html +186 -0
- package/docs/themes/tanuki/templates/taxonomy_list.html +18 -0
- package/docs/themes/tanuki/templates/taxonomy_single.html +31 -0
- package/docs/themes/tanuki/theme.toml +58 -0
- package/examples/hello-agent.rs +55 -0
- package/package.json +36 -0
- package/proto/config.proto +60 -0
- package/proto/events.proto +0 -0
- package/proto/runtime.proto +215 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
//! Kernel - The Execution Engine
|
|
2
|
+
//!
|
|
3
|
+
//! The kernel is the heart of enact-core. It:
|
|
4
|
+
//! - Defines the execution state machine
|
|
5
|
+
//! - Applies all state transitions through a reducer
|
|
6
|
+
//! - Provides the ExecutionKernel for running graphs
|
|
7
|
+
//! - Enables replay from event logs
|
|
8
|
+
//!
|
|
9
|
+
//! ## Architecture
|
|
10
|
+
//!
|
|
11
|
+
//! ```text
|
|
12
|
+
//! ┌─────────────────────────────────────────────┐
|
|
13
|
+
//! │ ExecutionKernel │
|
|
14
|
+
//! │ ┌───────────────────────────────────────┐ │
|
|
15
|
+
//! │ │ Execution State │ │
|
|
16
|
+
//! │ │ (ExecutionState, Steps, Artifacts) │ │
|
|
17
|
+
//! │ └───────────────────────────────────────┘ │
|
|
18
|
+
//! │ │ │
|
|
19
|
+
//! │ ▼ │
|
|
20
|
+
//! │ ┌───────────────────────────────────────┐ │
|
|
21
|
+
//! │ │ Reducer │ │
|
|
22
|
+
//! │ │ (Action, State) → State │ │
|
|
23
|
+
//! │ └───────────────────────────────────────┘ │
|
|
24
|
+
//! │ │ │
|
|
25
|
+
//! │ ▼ │
|
|
26
|
+
//! │ ┌───────────────────────────────────────┐ │
|
|
27
|
+
//! │ │ Event Emitter │ │
|
|
28
|
+
//! │ │ (StreamEvent for UI/persistence) │ │
|
|
29
|
+
//! │ └───────────────────────────────────────┘ │
|
|
30
|
+
//! └─────────────────────────────────────────────┘
|
|
31
|
+
//! ```
|
|
32
|
+
//!
|
|
33
|
+
//! ## Key Invariants
|
|
34
|
+
//!
|
|
35
|
+
//! 1. **Single Source of Truth**: ExecutionKernel owns the Execution state
|
|
36
|
+
//! 2. **Reducer-Only Transitions**: All state changes go through the reducer
|
|
37
|
+
//! 3. **Deterministic**: Same actions → same state (enables replay)
|
|
38
|
+
//! 4. **Observable**: All transitions emit events
|
|
39
|
+
//!
|
|
40
|
+
//! @see docs/TECHNICAL/01-EXECUTION-TELEMETRY.md
|
|
41
|
+
|
|
42
|
+
pub mod artifact;
|
|
43
|
+
mod enforcement;
|
|
44
|
+
mod error;
|
|
45
|
+
mod event;
|
|
46
|
+
mod execution_model;
|
|
47
|
+
mod execution_state;
|
|
48
|
+
mod execution_strategy;
|
|
49
|
+
pub mod ids;
|
|
50
|
+
mod interrupt;
|
|
51
|
+
mod kernel;
|
|
52
|
+
pub mod persistence;
|
|
53
|
+
mod reducer;
|
|
54
|
+
mod replay;
|
|
55
|
+
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// IDs - Source of Truth for all execution identifiers
|
|
58
|
+
// =============================================================================
|
|
59
|
+
pub use ids::{
|
|
60
|
+
// ID prefix constants
|
|
61
|
+
prefixes,
|
|
62
|
+
// Primary IDs
|
|
63
|
+
ArtifactId,
|
|
64
|
+
ExecutionId,
|
|
65
|
+
GraphId,
|
|
66
|
+
// Message/Thread IDs (MessageStore)
|
|
67
|
+
MessageId,
|
|
68
|
+
ThreadId,
|
|
69
|
+
// Backward compatibility aliases
|
|
70
|
+
NodeId,
|
|
71
|
+
// Parent linkage (causal tracing)
|
|
72
|
+
ParentLink,
|
|
73
|
+
ParentType,
|
|
74
|
+
RunId,
|
|
75
|
+
StepId,
|
|
76
|
+
// Step source (discovery tracking for agentic loops)
|
|
77
|
+
StepSource,
|
|
78
|
+
StepSourceType,
|
|
79
|
+
// SpawnMode (execution isolation control)
|
|
80
|
+
SpawnMode,
|
|
81
|
+
CancellationPolicy,
|
|
82
|
+
// Step/Node types
|
|
83
|
+
StepType,
|
|
84
|
+
// Callable types (for billing/traceability)
|
|
85
|
+
CallableType,
|
|
86
|
+
TenantId,
|
|
87
|
+
UserId,
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Events - Source of Truth for all execution events
|
|
92
|
+
// =============================================================================
|
|
93
|
+
pub use event::{
|
|
94
|
+
// Control events
|
|
95
|
+
ControlAction,
|
|
96
|
+
ControlActor,
|
|
97
|
+
ControlEvent,
|
|
98
|
+
ControlOutcome,
|
|
99
|
+
// Decision audit
|
|
100
|
+
DecisionAlternative,
|
|
101
|
+
DecisionInput,
|
|
102
|
+
DecisionRecord,
|
|
103
|
+
DecisionType,
|
|
104
|
+
// Legacy
|
|
105
|
+
Event,
|
|
106
|
+
// Execution events
|
|
107
|
+
ExecutionContext,
|
|
108
|
+
ExecutionEvent,
|
|
109
|
+
ExecutionEventType,
|
|
110
|
+
ModelContext,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// Core execution types
|
|
115
|
+
// =============================================================================
|
|
116
|
+
pub use execution_model::{Execution, Step};
|
|
117
|
+
|
|
118
|
+
// State machine
|
|
119
|
+
pub use execution_state::{ExecutionState, StepState, WaitReason};
|
|
120
|
+
|
|
121
|
+
// Reducer
|
|
122
|
+
pub use reducer::{reduce, ExecutionAction, ReducerError};
|
|
123
|
+
|
|
124
|
+
// Replay
|
|
125
|
+
pub use replay::{replay, EventLog, ReplayError};
|
|
126
|
+
|
|
127
|
+
// The kernel itself
|
|
128
|
+
pub use kernel::ExecutionKernel;
|
|
129
|
+
|
|
130
|
+
// =============================================================================
|
|
131
|
+
// Error Taxonomy (feat-02)
|
|
132
|
+
// =============================================================================
|
|
133
|
+
pub use error::{
|
|
134
|
+
// Error categories
|
|
135
|
+
ExecutionError,
|
|
136
|
+
ExecutionErrorCategory,
|
|
137
|
+
// Retry policies
|
|
138
|
+
BackoffStrategy,
|
|
139
|
+
RetryPolicy,
|
|
140
|
+
// Specific error codes
|
|
141
|
+
LlmErrorCode,
|
|
142
|
+
ToolErrorCode,
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// =============================================================================
|
|
146
|
+
// Enforcement & Limits (feat-03)
|
|
147
|
+
// =============================================================================
|
|
148
|
+
pub use enforcement::{
|
|
149
|
+
// Usage tracking
|
|
150
|
+
ExecutionUsage,
|
|
151
|
+
UsageSnapshot,
|
|
152
|
+
// Enforcement results
|
|
153
|
+
EnforcementResult,
|
|
154
|
+
EnforcementViolation,
|
|
155
|
+
EnforcementWarning,
|
|
156
|
+
ViolationType,
|
|
157
|
+
// Middleware
|
|
158
|
+
EnforcementMiddleware,
|
|
159
|
+
EnforcementPolicy,
|
|
160
|
+
// Long-running execution policy (agentic DAG controls)
|
|
161
|
+
LongRunningExecutionPolicy,
|
|
162
|
+
// Timeout guard
|
|
163
|
+
StepTimeoutGuard,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
// =============================================================================
|
|
167
|
+
// Execution strategy (parallel, interrupt handling)
|
|
168
|
+
// =============================================================================
|
|
169
|
+
pub use execution_strategy::{run_parallel, ParallelResult};
|
|
170
|
+
pub use interrupt::{InterruptDecision, InterruptReason, InterruptableRunner};
|
|
171
|
+
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// Persistence Layer (feat-05)
|
|
174
|
+
// =============================================================================
|
|
175
|
+
pub use persistence::{
|
|
176
|
+
// Base trait
|
|
177
|
+
StorageBackend,
|
|
178
|
+
// EventStore
|
|
179
|
+
EventStore,
|
|
180
|
+
ExecutionEventData,
|
|
181
|
+
StoredEvent,
|
|
182
|
+
// MessageStore
|
|
183
|
+
CostInfo,
|
|
184
|
+
ExecutionStats,
|
|
185
|
+
FinishReason,
|
|
186
|
+
InMemoryMessageStore,
|
|
187
|
+
Message,
|
|
188
|
+
MessageMetadata,
|
|
189
|
+
MessagePart,
|
|
190
|
+
MessageRole,
|
|
191
|
+
MessageStore,
|
|
192
|
+
Thread,
|
|
193
|
+
TokenUsage,
|
|
194
|
+
// StateStore
|
|
195
|
+
ExecutionSnapshot,
|
|
196
|
+
StateStore,
|
|
197
|
+
StateStoreJsonExt,
|
|
198
|
+
// VectorStore
|
|
199
|
+
CollectionInfo,
|
|
200
|
+
DistanceMetric,
|
|
201
|
+
VectorDocument,
|
|
202
|
+
VectorFilter,
|
|
203
|
+
VectorSearchResult,
|
|
204
|
+
VectorStore,
|
|
205
|
+
};
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
//! EventStore - Append-only event log
|
|
2
|
+
//!
|
|
3
|
+
//! The EventStore is the **authoritative source of truth** for execution history.
|
|
4
|
+
//! It provides:
|
|
5
|
+
//! - Append-only semantics (events are never modified)
|
|
6
|
+
//! - Ordered events per execution
|
|
7
|
+
//! - Durability guarantees (event is persisted before append returns)
|
|
8
|
+
//!
|
|
9
|
+
//! ## Guarantees
|
|
10
|
+
//!
|
|
11
|
+
//! - **Durability**: Event is durable before `append()` returns
|
|
12
|
+
//! - **Ordering**: Events are strictly ordered by sequence number within an execution
|
|
13
|
+
//! - **Immutability**: Events are append-only, never modified or deleted
|
|
14
|
+
//! - **Authority**: EventStore is the single source of truth for execution history
|
|
15
|
+
//!
|
|
16
|
+
//! @see docs/TECHNICAL/14-PERSISTENCE-LAYER.md
|
|
17
|
+
|
|
18
|
+
use async_trait::async_trait;
|
|
19
|
+
use chrono::{DateTime, Utc};
|
|
20
|
+
use serde::{Deserialize, Serialize};
|
|
21
|
+
|
|
22
|
+
use crate::kernel::{
|
|
23
|
+
ExecutionError, ExecutionId, ParentLink, StepId, StepSourceType, StepType, TenantId,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
use super::StorageBackend;
|
|
27
|
+
|
|
28
|
+
/// A stored event with metadata
|
|
29
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
30
|
+
pub struct StoredEvent {
|
|
31
|
+
/// Unique sequence number within the execution
|
|
32
|
+
pub sequence: u64,
|
|
33
|
+
/// The execution this event belongs to
|
|
34
|
+
pub execution_id: ExecutionId,
|
|
35
|
+
/// Tenant for multi-tenancy
|
|
36
|
+
pub tenant_id: TenantId,
|
|
37
|
+
/// The event payload
|
|
38
|
+
pub event: ExecutionEventData,
|
|
39
|
+
/// When this event occurred
|
|
40
|
+
pub timestamp: DateTime<Utc>,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Event data that can be stored
|
|
44
|
+
///
|
|
45
|
+
/// These events represent all state transitions in an execution.
|
|
46
|
+
/// They can be replayed to reconstruct execution state.
|
|
47
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
48
|
+
#[serde(tag = "type", rename_all = "snake_case")]
|
|
49
|
+
pub enum ExecutionEventData {
|
|
50
|
+
/// Execution started
|
|
51
|
+
ExecutionStarted {
|
|
52
|
+
parent: Option<ParentLink>,
|
|
53
|
+
metadata: Option<serde_json::Value>,
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/// A step started
|
|
57
|
+
StepStarted {
|
|
58
|
+
step_id: StepId,
|
|
59
|
+
parent_step_id: Option<StepId>,
|
|
60
|
+
step_type: StepType,
|
|
61
|
+
name: String,
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
/// A step completed successfully
|
|
65
|
+
StepCompleted {
|
|
66
|
+
step_id: StepId,
|
|
67
|
+
output: Option<String>,
|
|
68
|
+
duration_ms: u64,
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
/// A step failed
|
|
72
|
+
StepFailed {
|
|
73
|
+
step_id: StepId,
|
|
74
|
+
error: ExecutionError,
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
/// Execution paused
|
|
78
|
+
ExecutionPaused { reason: String },
|
|
79
|
+
|
|
80
|
+
/// Execution resumed
|
|
81
|
+
ExecutionResumed,
|
|
82
|
+
|
|
83
|
+
/// Execution completed successfully
|
|
84
|
+
ExecutionCompleted {
|
|
85
|
+
output: Option<String>,
|
|
86
|
+
duration_ms: u64,
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
/// Execution failed
|
|
90
|
+
ExecutionFailed { error: ExecutionError },
|
|
91
|
+
|
|
92
|
+
/// Execution cancelled
|
|
93
|
+
ExecutionCancelled { reason: String },
|
|
94
|
+
|
|
95
|
+
/// Artifact stored
|
|
96
|
+
ArtifactStored {
|
|
97
|
+
artifact_id: String,
|
|
98
|
+
step_id: StepId,
|
|
99
|
+
content_hash: String,
|
|
100
|
+
size_bytes: u64,
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/// A step was dynamically discovered during execution
|
|
104
|
+
///
|
|
105
|
+
/// Emitted when the agentic loop or LLM output identifies new work.
|
|
106
|
+
/// Enables audit trails for discovered steps and replay of discovery sequences.
|
|
107
|
+
StepDiscovered {
|
|
108
|
+
/// The discovered step's ID
|
|
109
|
+
step_id: StepId,
|
|
110
|
+
/// Which step discovered this new work (if any)
|
|
111
|
+
discovered_by: Option<StepId>,
|
|
112
|
+
/// What triggered the discovery
|
|
113
|
+
source_type: StepSourceType,
|
|
114
|
+
/// Human-readable reason for discovery
|
|
115
|
+
reason: String,
|
|
116
|
+
/// Discovery depth (how deep in the discovery chain)
|
|
117
|
+
depth: u32,
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
/// A tool call started (input available)
|
|
121
|
+
ToolCallStarted {
|
|
122
|
+
step_id: Option<StepId>,
|
|
123
|
+
tool_call_id: String,
|
|
124
|
+
tool_name: String,
|
|
125
|
+
input: serde_json::Value,
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/// A tool call completed (output available)
|
|
129
|
+
ToolCallCompleted {
|
|
130
|
+
step_id: Option<StepId>,
|
|
131
|
+
tool_call_id: String,
|
|
132
|
+
output: serde_json::Value,
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
/// A checkpoint was saved
|
|
136
|
+
CheckpointSaved {
|
|
137
|
+
step_id: Option<StepId>,
|
|
138
|
+
checkpoint_id: String,
|
|
139
|
+
state_hash: String,
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/// A goal was evaluated
|
|
143
|
+
GoalEvaluated {
|
|
144
|
+
step_id: Option<StepId>,
|
|
145
|
+
goal_id: String,
|
|
146
|
+
status: String, // "met", "not_met", "progressing"
|
|
147
|
+
score: Option<f64>,
|
|
148
|
+
reason: Option<String>,
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
/// Custom event (for extensibility)
|
|
152
|
+
Custom {
|
|
153
|
+
event_type: String,
|
|
154
|
+
data: serde_json::Value,
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/// EventStore trait - append-only event log
|
|
159
|
+
///
|
|
160
|
+
/// This is the core persistence trait for execution events. All execution
|
|
161
|
+
/// state can be reconstructed by replaying events from this store.
|
|
162
|
+
#[async_trait]
|
|
163
|
+
pub trait EventStore: StorageBackend {
|
|
164
|
+
/// Append an event to the store
|
|
165
|
+
///
|
|
166
|
+
/// # Arguments
|
|
167
|
+
/// * `execution_id` - The execution this event belongs to
|
|
168
|
+
/// * `tenant_id` - Tenant for multi-tenancy isolation
|
|
169
|
+
/// * `event` - The event data to store
|
|
170
|
+
///
|
|
171
|
+
/// # Returns
|
|
172
|
+
/// * `Ok(sequence)` - The sequence number assigned to this event
|
|
173
|
+
/// * `Err` - If the event could not be persisted
|
|
174
|
+
///
|
|
175
|
+
/// # Guarantees
|
|
176
|
+
/// - Event is durable when this returns Ok
|
|
177
|
+
/// - Sequence numbers are monotonically increasing per execution
|
|
178
|
+
async fn append(
|
|
179
|
+
&self,
|
|
180
|
+
execution_id: &ExecutionId,
|
|
181
|
+
tenant_id: &TenantId,
|
|
182
|
+
event: ExecutionEventData,
|
|
183
|
+
) -> anyhow::Result<u64>;
|
|
184
|
+
|
|
185
|
+
/// Append multiple events atomically
|
|
186
|
+
///
|
|
187
|
+
/// All events are stored with consecutive sequence numbers, or none are stored.
|
|
188
|
+
///
|
|
189
|
+
/// # Returns
|
|
190
|
+
/// * `Ok(first_sequence)` - The sequence number of the first event in the batch
|
|
191
|
+
async fn append_batch(
|
|
192
|
+
&self,
|
|
193
|
+
execution_id: &ExecutionId,
|
|
194
|
+
tenant_id: &TenantId,
|
|
195
|
+
events: Vec<ExecutionEventData>,
|
|
196
|
+
) -> anyhow::Result<u64>;
|
|
197
|
+
|
|
198
|
+
/// Load all events for an execution
|
|
199
|
+
///
|
|
200
|
+
/// Returns events ordered by sequence number.
|
|
201
|
+
async fn load_events(&self, execution_id: &ExecutionId) -> anyhow::Result<Vec<StoredEvent>>;
|
|
202
|
+
|
|
203
|
+
/// Load events after a specific sequence number
|
|
204
|
+
///
|
|
205
|
+
/// Useful for incremental replay or catching up after a checkpoint.
|
|
206
|
+
///
|
|
207
|
+
/// # Arguments
|
|
208
|
+
/// * `execution_id` - The execution to load events for
|
|
209
|
+
/// * `after_seq` - Return events with sequence > after_seq
|
|
210
|
+
async fn load_events_after(
|
|
211
|
+
&self,
|
|
212
|
+
execution_id: &ExecutionId,
|
|
213
|
+
after_seq: u64,
|
|
214
|
+
) -> anyhow::Result<Vec<StoredEvent>>;
|
|
215
|
+
|
|
216
|
+
/// Get the latest sequence number for an execution
|
|
217
|
+
///
|
|
218
|
+
/// Returns `None` if no events exist for this execution.
|
|
219
|
+
async fn get_latest_sequence(&self, execution_id: &ExecutionId) -> anyhow::Result<Option<u64>>;
|
|
220
|
+
|
|
221
|
+
/// Check if an execution exists
|
|
222
|
+
async fn execution_exists(&self, execution_id: &ExecutionId) -> anyhow::Result<bool> {
|
|
223
|
+
Ok(self.get_latest_sequence(execution_id).await?.is_some())
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/// List executions for a tenant
|
|
227
|
+
///
|
|
228
|
+
/// Returns execution IDs ordered by creation time (newest first).
|
|
229
|
+
///
|
|
230
|
+
/// # Arguments
|
|
231
|
+
/// * `tenant_id` - The tenant to list executions for
|
|
232
|
+
/// * `limit` - Maximum number of executions to return
|
|
233
|
+
/// * `offset` - Number of executions to skip (for pagination)
|
|
234
|
+
async fn list_executions(
|
|
235
|
+
&self,
|
|
236
|
+
tenant_id: &TenantId,
|
|
237
|
+
limit: usize,
|
|
238
|
+
offset: usize,
|
|
239
|
+
) -> anyhow::Result<Vec<ExecutionId>>;
|
|
240
|
+
|
|
241
|
+
/// Count events for an execution
|
|
242
|
+
async fn count_events(&self, execution_id: &ExecutionId) -> anyhow::Result<u64> {
|
|
243
|
+
Ok(self.get_latest_sequence(execution_id).await?.unwrap_or(0))
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#[cfg(test)]
|
|
248
|
+
mod tests {
|
|
249
|
+
use super::*;
|
|
250
|
+
|
|
251
|
+
#[test]
|
|
252
|
+
fn test_event_serialization() {
|
|
253
|
+
let event = ExecutionEventData::StepStarted {
|
|
254
|
+
step_id: StepId::new(),
|
|
255
|
+
parent_step_id: None,
|
|
256
|
+
step_type: StepType::FunctionNode,
|
|
257
|
+
name: "test_step".to_string(),
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
let json = serde_json::to_string(&event).unwrap();
|
|
261
|
+
let parsed: ExecutionEventData = serde_json::from_str(&json).unwrap();
|
|
262
|
+
|
|
263
|
+
match parsed {
|
|
264
|
+
ExecutionEventData::StepStarted { name, .. } => {
|
|
265
|
+
assert_eq!(name, "test_step");
|
|
266
|
+
}
|
|
267
|
+
_ => panic!("Wrong event type"),
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|