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
package/docs/config.toml
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Enact Documentation Site Configuration
|
|
2
|
+
# Built with Zola (https://www.getzola.org/) and Tanuki theme
|
|
3
|
+
|
|
4
|
+
base_url = "https://docs.enact.dev"
|
|
5
|
+
title = "Enact Documentation"
|
|
6
|
+
description = "Multi-channel gateway for AI agents - Telegram, Teams, WhatsApp and more"
|
|
7
|
+
theme = "tanuki"
|
|
8
|
+
|
|
9
|
+
# Build configuration
|
|
10
|
+
build_search_index = true
|
|
11
|
+
compile_sass = true
|
|
12
|
+
generate_feeds = false
|
|
13
|
+
|
|
14
|
+
# Syntax highlighting (Zola 0.22+ format)
|
|
15
|
+
[markdown]
|
|
16
|
+
insert_anchor_links = "left"
|
|
17
|
+
|
|
18
|
+
[markdown.highlighting]
|
|
19
|
+
light_theme = "github-light"
|
|
20
|
+
dark_theme = "github-dark"
|
|
21
|
+
style = "class"
|
|
22
|
+
|
|
23
|
+
# Theme-specific configuration
|
|
24
|
+
[extra]
|
|
25
|
+
mode = "docs" # Tanuki documentation mode (options: docs, book, blog)
|
|
26
|
+
|
|
27
|
+
# Repository link (shows "Edit on GitHub" button)
|
|
28
|
+
github = "https://github.com/your-org/enact-agent"
|
|
29
|
+
show_theme_toggle = true
|
|
30
|
+
|
|
31
|
+
# Navigation links in header
|
|
32
|
+
[[extra.nav]]
|
|
33
|
+
name = "Installation"
|
|
34
|
+
url = "/installation/"
|
|
35
|
+
|
|
36
|
+
[[extra.nav]]
|
|
37
|
+
name = "Quick Start"
|
|
38
|
+
url = "/getting-started/"
|
|
39
|
+
|
|
40
|
+
[[extra.nav]]
|
|
41
|
+
name = "CLI"
|
|
42
|
+
url = "/cli/"
|
|
43
|
+
|
|
44
|
+
[[extra.nav]]
|
|
45
|
+
name = "Configuration"
|
|
46
|
+
url = "/configuration/"
|
|
47
|
+
|
|
48
|
+
[[extra.nav]]
|
|
49
|
+
name = "Channels"
|
|
50
|
+
url = "/channels/"
|
|
51
|
+
|
|
52
|
+
[[extra.nav]]
|
|
53
|
+
name = "Concepts"
|
|
54
|
+
url = "/concepts/"
|
|
55
|
+
|
|
56
|
+
[[extra.nav]]
|
|
57
|
+
name = "API"
|
|
58
|
+
url = "/api/"
|
|
59
|
+
|
|
60
|
+
[[extra.nav]]
|
|
61
|
+
name = "Developers"
|
|
62
|
+
url = "/developers/"
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Enact"
|
|
3
|
+
sort_by = "weight"
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
# Enact
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
<strong>YAML-defined AI agent runtime with multi-channel support.</strong><br />
|
|
10
|
+
Define agents as DAGs, run them anywhere.
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
## What is Enact?
|
|
14
|
+
|
|
15
|
+
Enact is a **Rust-based AI agent runtime** that lets you define agents as YAML configurations and run them across multiple channels (Telegram, Teams, WhatsApp).
|
|
16
|
+
|
|
17
|
+
**Core Philosophy:**
|
|
18
|
+
- **Declarative agents**: Define agent workflows as YAML DAGs
|
|
19
|
+
- **Multi-channel**: One agent definition, multiple deployment targets
|
|
20
|
+
- **Rust-native**: Fast, memory-efficient, single binary
|
|
21
|
+
- **Self-hosted**: Your hardware, your data
|
|
22
|
+
|
|
23
|
+
## Current Status
|
|
24
|
+
|
|
25
|
+
| Component | Status |
|
|
26
|
+
|-----------|--------|
|
|
27
|
+
| CLI (`enact`) | ✅ Complete |
|
|
28
|
+
| Agent Runner | ✅ Complete |
|
|
29
|
+
| LLM Providers | ✅ Complete |
|
|
30
|
+
| HTTP Gateway | ✅ Complete |
|
|
31
|
+
| WhatsApp Channel | ✅ Complete |
|
|
32
|
+
| Telegram Channel | ✅ Complete |
|
|
33
|
+
| Teams Channel | ✅ Complete |
|
|
34
|
+
| CI/CD Pipeline | ✅ Complete |
|
|
35
|
+
| Skills System | ✅ Complete |
|
|
36
|
+
| MCP Client | ✅ Complete |
|
|
37
|
+
| Cron/Scheduling | ✅ Complete |
|
|
38
|
+
| Built-in Tools | ✅ Complete |
|
|
39
|
+
| Security/Audit | ✅ Complete |
|
|
40
|
+
| Memory (Embeddings) | ✅ Complete |
|
|
41
|
+
| Built-in Tools (7 tools) | ✅ Complete |
|
|
42
|
+
| A2A (Agent-to-Agent) | ✅ Complete |
|
|
43
|
+
| Generic Webhooks | ✅ Complete |
|
|
44
|
+
| OAuth/Token Lifecycle | ✅ Complete |
|
|
45
|
+
| Observability | ✅ Complete |
|
|
46
|
+
| gRPC API | ✅ Proto designed |
|
|
47
|
+
| CI/CD Pipeline | ✅ Complete |
|
|
48
|
+
|
|
49
|
+
## Quick Start
|
|
50
|
+
|
|
51
|
+
### 1. Build the CLI
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git clone https://github.com/your-org/enact-agent.git
|
|
55
|
+
cd enact-agent
|
|
56
|
+
cargo build --release
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. Check System Status
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
./target/release/enact doctor
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. Run an Agent
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
OPENAI_API_KEY="..." ./target/release/enact run --input "Hello!"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 4. Start the Gateway
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
WHATSAPP_ACCESS_TOKEN="..." \
|
|
75
|
+
WHATSAPP_ENDPOINT_ID="..." \
|
|
76
|
+
WHATSAPP_VERIFY_TOKEN="..." \
|
|
77
|
+
./target/release/enact serve --http-port 8080
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## CLI Commands
|
|
81
|
+
|
|
82
|
+
| Command | Description |
|
|
83
|
+
|---------|-------------|
|
|
84
|
+
| `enact --help` | Show all commands |
|
|
85
|
+
| `enact doctor` | System check with pretty table output |
|
|
86
|
+
| `enact version` | Show version (0.0.1) |
|
|
87
|
+
| `enact run --input "..."` | Run agent with input |
|
|
88
|
+
| `enact serve --http-port 8080` | Start gateway server |
|
|
89
|
+
|
|
90
|
+
## Production-Ready Gateway
|
|
91
|
+
|
|
92
|
+
The HTTP gateway includes enterprise features:
|
|
93
|
+
|
|
94
|
+
| Feature | Status |
|
|
95
|
+
|---------|--------|
|
|
96
|
+
| Health endpoint (`/health`) | ✅ |
|
|
97
|
+
| WhatsApp webhook (challenge + message) | ✅ |
|
|
98
|
+
| Rate limiting (sliding window) | ✅ |
|
|
99
|
+
| Idempotency (dedupe duplicates) | ✅ |
|
|
100
|
+
| Signature verification | ✅ |
|
|
101
|
+
| Request limits (64KB) + timeout (30s) | ✅ |
|
|
102
|
+
| All with tests passing | ✅ |
|
|
103
|
+
|
|
104
|
+
## Architecture
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
108
|
+
│ YAML Definition │
|
|
109
|
+
│ agents/*.yaml → GraphLoader → StateGraph → Compiled │
|
|
110
|
+
└───────────────────────────────┬─────────────────────────────────┘
|
|
111
|
+
│
|
|
112
|
+
┌───────────────────────────────▼─────────────────────────────────┐
|
|
113
|
+
│ enact-core │
|
|
114
|
+
│ Graph Engine │ Callable │ Execution │ Context │
|
|
115
|
+
└───────────────────────────────┬─────────────────────────────────┘
|
|
116
|
+
│
|
|
117
|
+
┌─────────┬─────────┬───────┼───────┬─────────┬─────────┐
|
|
118
|
+
▼ ▼ ▼ ▼ ▼ ▼ ▼
|
|
119
|
+
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
|
|
120
|
+
│skills │ │provid.│ │gateway│ │channel│ │ mcp │ │ tools │ │securit│
|
|
121
|
+
│TOML/MD│ │OpenAI │ │ HTTP │ │WA/Tele│ │ Stdio │ │shell/ │ │audit/ │
|
|
122
|
+
│ tools│ │Azure │ │ Axum │ │ Teams │ │JSON-RP│ │git/http│ │policy │
|
|
123
|
+
└───────┘ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘
|
|
124
|
+
│ │ │ │
|
|
125
|
+
└───────────────────┬───────────────────┘ │ │
|
|
126
|
+
▼ │ │
|
|
127
|
+
┌───────────┐ │ │
|
|
128
|
+
│ memory │◄───────────────────────┘ │
|
|
129
|
+
│ sqlite/md │ │
|
|
130
|
+
│ embeddings│◄─────────────────────────────────┘
|
|
131
|
+
│ vectors │
|
|
132
|
+
└───────────┘
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Gateway Flow
|
|
136
|
+
|
|
137
|
+
Messages are processed through the full agent runner:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
Message via webhook
|
|
141
|
+
│
|
|
142
|
+
▼
|
|
143
|
+
WhatsAppChannel (parse)
|
|
144
|
+
│
|
|
145
|
+
▼
|
|
146
|
+
RunnerResponder
|
|
147
|
+
│
|
|
148
|
+
▼
|
|
149
|
+
DefaultAgentRunner (retry/compaction/checkpoints)
|
|
150
|
+
│
|
|
151
|
+
▼
|
|
152
|
+
Response sent back
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Documentation
|
|
156
|
+
|
|
157
|
+
| Section | Description |
|
|
158
|
+
|---------|-------------|
|
|
159
|
+
| [Getting Started](/getting-started/) | Quick start guide |
|
|
160
|
+
| [CLI Reference](/cli/) | Command documentation |
|
|
161
|
+
| [YAML Schema](/yaml-schema/) | Agent definition format |
|
|
162
|
+
| [Gateway](/api/) | HTTP API documentation |
|
|
163
|
+
| [Channels](/channels/) | Telegram, Teams, WhatsApp setup |
|
|
164
|
+
| [Providers](/providers/) | LLM provider configuration |
|
|
165
|
+
| [Skills](/skills/) | Skills system (TOML/MD manifests) |
|
|
166
|
+
| [MCP Client](/mcp/) | Model Context Protocol integration |
|
|
167
|
+
| [Memory](/memory/) | Memory backends, embeddings, vectors |
|
|
168
|
+
| [Security](/security/) | Audit logging, policy, sandboxing |
|
|
169
|
+
| [Cron/Scheduler](/cron/) | Job scheduling system |
|
|
170
|
+
| [Tools](/tools/) | 7 built-in tools (file, shell, git, search, http, cost) |
|
|
171
|
+
| [A2A](/a2a/) | Multi-agent system, agent delegation |
|
|
172
|
+
| [OAuth](/oauth/) | Device-code authentication, token management |
|
|
173
|
+
| [Observability](/observability/) | Metrics, tracing, execution tracking |
|
|
174
|
+
| [Roadmap](/roadmap/) | Planned features |
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
+++
|
|
2
|
+
title = "Multi-Agent (A2A)"
|
|
3
|
+
weight = 15
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
# Multi-Agent System (A2A)
|
|
7
|
+
|
|
8
|
+
The `enact-a2a` crate provides multi-agent capabilities for Enact, enabling agents to delegate tasks, communicate with each other, and build complex agent workflows.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
A2A (Agent-to-Agent) allows you to:
|
|
13
|
+
|
|
14
|
+
- **Delegate tasks** from one agent to specialized sub-agents
|
|
15
|
+
- **Register multiple agents** with different configurations
|
|
16
|
+
- **Discover agents** by capability
|
|
17
|
+
- **Prevent infinite loops** with depth limiting
|
|
18
|
+
- **Build agent hierarchies** for complex workflows
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```rust
|
|
23
|
+
use enact_a2a::{MultiAgentSystem, DelegateAgentConfig};
|
|
24
|
+
|
|
25
|
+
// Create multi-agent system
|
|
26
|
+
let mut system = MultiAgentSystem::new();
|
|
27
|
+
|
|
28
|
+
// Register specialized agents
|
|
29
|
+
system.register_agent(
|
|
30
|
+
"coder",
|
|
31
|
+
DelegateAgentConfig {
|
|
32
|
+
provider: "openai".to_string(),
|
|
33
|
+
model: "gpt-4o-mini".to_string(),
|
|
34
|
+
system_prompt: Some("You are a coding assistant.".to_string()),
|
|
35
|
+
api_key: None, // Uses fallback credential
|
|
36
|
+
temperature: Some(0.3),
|
|
37
|
+
max_depth: 3, // Max recursion depth
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
system.register_agent(
|
|
42
|
+
"researcher",
|
|
43
|
+
DelegateAgentConfig {
|
|
44
|
+
provider: "anthropic".to_string(),
|
|
45
|
+
model: "claude-3-sonnet".to_string(),
|
|
46
|
+
system_prompt: Some("You are a research assistant.".to_string()),
|
|
47
|
+
api_key: Some("anthropic-api-key".to_string()),
|
|
48
|
+
temperature: Some(0.7),
|
|
49
|
+
max_depth: 2,
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// Set fallback credential for agents without specific API keys
|
|
54
|
+
system.set_fallback_credential(std::env::var("OPENAI_API_KEY").unwrap());
|
|
55
|
+
|
|
56
|
+
// Delegate a task
|
|
57
|
+
let result = system.delegate(
|
|
58
|
+
"coder", // agent name
|
|
59
|
+
"Write a function to parse JSON", // prompt
|
|
60
|
+
None, // context (optional)
|
|
61
|
+
0 // current depth
|
|
62
|
+
).await?;
|
|
63
|
+
|
|
64
|
+
if result.success {
|
|
65
|
+
println!("Agent output: {}", result.output);
|
|
66
|
+
} else {
|
|
67
|
+
eprintln!("Error: {}", result.error.unwrap_or_default());
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Components
|
|
72
|
+
|
|
73
|
+
### MultiAgentSystem
|
|
74
|
+
|
|
75
|
+
The main orchestrator for multi-agent workflows:
|
|
76
|
+
|
|
77
|
+
```rust
|
|
78
|
+
use enact_a2a::MultiAgentSystem;
|
|
79
|
+
|
|
80
|
+
let system = MultiAgentSystem::new();
|
|
81
|
+
|
|
82
|
+
// Register agents
|
|
83
|
+
system.register_agent("name", config);
|
|
84
|
+
|
|
85
|
+
// List registered agents
|
|
86
|
+
let names = system.get_agent_names();
|
|
87
|
+
println!("Available agents: {:?}", names);
|
|
88
|
+
|
|
89
|
+
// Set global credential fallback
|
|
90
|
+
system.set_fallback_credential(api_key);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### DelegateAgentConfig
|
|
94
|
+
|
|
95
|
+
Configuration for each sub-agent:
|
|
96
|
+
|
|
97
|
+
```rust
|
|
98
|
+
use enact_a2a::DelegateAgentConfig;
|
|
99
|
+
|
|
100
|
+
let config = DelegateAgentConfig {
|
|
101
|
+
provider: "openai".to_string(), // Provider name
|
|
102
|
+
model: "gpt-4o-mini".to_string(), // Model to use
|
|
103
|
+
system_prompt: Some("...".to_string()), // System prompt
|
|
104
|
+
api_key: None, // Specific API key (optional)
|
|
105
|
+
temperature: Some(0.7), // Temperature (0.0 - 1.0)
|
|
106
|
+
max_depth: 3, // Max delegation depth
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### DelegateResult
|
|
111
|
+
|
|
112
|
+
Result of a delegation operation:
|
|
113
|
+
|
|
114
|
+
```rust
|
|
115
|
+
use enact_a2a::DelegateResult;
|
|
116
|
+
|
|
117
|
+
let result: DelegateResult = system.delegate(...).await?;
|
|
118
|
+
|
|
119
|
+
println!("Success: {}", result.success);
|
|
120
|
+
println!("Output: {}", result.output);
|
|
121
|
+
println!("Agent: {}", result.agent);
|
|
122
|
+
println!("Provider: {}", result.provider);
|
|
123
|
+
println!("Model: {}", result.model);
|
|
124
|
+
|
|
125
|
+
if let Some(error) = result.error {
|
|
126
|
+
eprintln!("Error: {}", error);
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Agent Registry
|
|
131
|
+
|
|
132
|
+
Discover and manage agents by capability:
|
|
133
|
+
|
|
134
|
+
```rust
|
|
135
|
+
use enact_a2a::AgentRegistry;
|
|
136
|
+
|
|
137
|
+
let mut registry = AgentRegistry::new();
|
|
138
|
+
|
|
139
|
+
// Register agent with capabilities
|
|
140
|
+
registry.register(
|
|
141
|
+
"coder",
|
|
142
|
+
"Writes and reviews code",
|
|
143
|
+
vec!["coding".to_string(), "rust".to_string(), "review".to_string()],
|
|
144
|
+
None, // No endpoint (local agent)
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
registry.register(
|
|
148
|
+
"researcher",
|
|
149
|
+
"Researches topics",
|
|
150
|
+
vec!["research".to_string(), "summarization".to_string()],
|
|
151
|
+
None,
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
// Find agents by capability
|
|
155
|
+
let coders = registry.find_by_capability("coding");
|
|
156
|
+
println!("Available coders: {:?}", coders);
|
|
157
|
+
|
|
158
|
+
// Get agent info
|
|
159
|
+
if let Some(agent) = registry.get("coder") {
|
|
160
|
+
println!("Name: {}", agent.name);
|
|
161
|
+
println!("Description: {}", agent.description);
|
|
162
|
+
println!("Capabilities: {:?}", agent.capabilities);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// List all agents
|
|
166
|
+
let all_agents = registry.list();
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## A2A Messages
|
|
170
|
+
|
|
171
|
+
Direct agent-to-agent communication:
|
|
172
|
+
|
|
173
|
+
```rust
|
|
174
|
+
use enact_a2a::{A2aMessage, A2aMessageType};
|
|
175
|
+
|
|
176
|
+
// Create a message
|
|
177
|
+
let message = A2aMessage {
|
|
178
|
+
from_agent: "agent_a".to_string(),
|
|
179
|
+
to_agent: "agent_b".to_string(),
|
|
180
|
+
message_type: A2aMessageType::Request,
|
|
181
|
+
payload: "Please help with this task".to_string(),
|
|
182
|
+
timestamp: chrono::Utc::now(),
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// Message types:
|
|
186
|
+
// - Request: Ask another agent to do something
|
|
187
|
+
// - Response: Reply to a request
|
|
188
|
+
// - Event: Broadcast an event
|
|
189
|
+
// - Error: Report an error
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Safety Features
|
|
193
|
+
|
|
194
|
+
### Recursion Depth Limiting
|
|
195
|
+
|
|
196
|
+
Prevents infinite delegation loops:
|
|
197
|
+
|
|
198
|
+
```rust
|
|
199
|
+
// Configure max depth per agent
|
|
200
|
+
let config = DelegateAgentConfig {
|
|
201
|
+
max_depth: 3, // Maximum 3 levels of delegation
|
|
202
|
+
..Default::default()
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// Delegate with current depth tracking
|
|
206
|
+
let result = system.delegate("agent", "task", None, 0).await?;
|
|
207
|
+
|
|
208
|
+
// Depth increases automatically:
|
|
209
|
+
// Level 0: Main agent
|
|
210
|
+
// Level 1: First delegation
|
|
211
|
+
// Level 2: Second delegation
|
|
212
|
+
// Level 3: Third delegation (max)
|
|
213
|
+
// Level 4+: Blocked with error
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Error when depth exceeded:
|
|
217
|
+
```
|
|
218
|
+
Delegation depth limit reached (3/3). Cannot delegate further to prevent infinite loops.
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Timeout Protection
|
|
222
|
+
|
|
223
|
+
All delegations have timeouts:
|
|
224
|
+
|
|
225
|
+
```rust
|
|
226
|
+
// Default timeout: 120 seconds
|
|
227
|
+
// Configurable via environment or per-agent settings
|
|
228
|
+
|
|
229
|
+
// Agent will timeout if provider doesn't respond
|
|
230
|
+
let result = system.delegate(...).await?;
|
|
231
|
+
if !result.success {
|
|
232
|
+
// Check if it was a timeout
|
|
233
|
+
if result.error.as_ref().unwrap().contains("timed out") {
|
|
234
|
+
println!("Agent took too long to respond");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Use Cases
|
|
240
|
+
|
|
241
|
+
### Code Review Pipeline
|
|
242
|
+
|
|
243
|
+
```rust
|
|
244
|
+
// Main agent delegates to specialist agents
|
|
245
|
+
let code = "fn main() { ... }";
|
|
246
|
+
|
|
247
|
+
// 1. Code generation
|
|
248
|
+
let coder_result = system.delegate("coder",
|
|
249
|
+
&format!("Write a function: {}", requirement), None, 0).await?;
|
|
250
|
+
|
|
251
|
+
// 2. Code review
|
|
252
|
+
let reviewer_result = system.delegate("reviewer",
|
|
253
|
+
&format!("Review this code: {}", coder_result.output), None, 0).await?;
|
|
254
|
+
|
|
255
|
+
// 3. Testing
|
|
256
|
+
let tester_result = system.delegate("tester",
|
|
257
|
+
&format!("Write tests for: {}", coder_result.output), None, 0).await?;
|
|
258
|
+
|
|
259
|
+
// Combine results
|
|
260
|
+
let final_output = format!(
|
|
261
|
+
"Code:\n{}\n\nReview:\n{}\n\nTests:\n{}",
|
|
262
|
+
coder_result.output,
|
|
263
|
+
reviewer_result.output,
|
|
264
|
+
tester_result.output
|
|
265
|
+
);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Research & Summarization
|
|
269
|
+
|
|
270
|
+
```rust
|
|
271
|
+
// Research a topic
|
|
272
|
+
let research_result = system.delegate("researcher",
|
|
273
|
+
"Research Rust async patterns", None, 0).await?;
|
|
274
|
+
|
|
275
|
+
// Summarize findings
|
|
276
|
+
let summary_result = system.delegate("summarizer",
|
|
277
|
+
&format!("Summarize this: {}", research_result.output), None, 0).await?;
|
|
278
|
+
|
|
279
|
+
// Generate code examples
|
|
280
|
+
let examples_result = system.delegate("coder",
|
|
281
|
+
&format!("Create examples based on: {}", summary_result.output), None, 0).await?;
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Multi-Step Workflows
|
|
285
|
+
|
|
286
|
+
```rust
|
|
287
|
+
// Complex workflow with multiple agents
|
|
288
|
+
async fn process_document(document: &str) -> anyhow::Result<String> {
|
|
289
|
+
// Step 1: Extract information
|
|
290
|
+
let extraction = system.delegate("extractor",
|
|
291
|
+
&format!("Extract key info from: {}", document), None, 0).await?;
|
|
292
|
+
|
|
293
|
+
// Step 2: Analyze
|
|
294
|
+
let analysis = system.delegate("analyst",
|
|
295
|
+
&format!("Analyze: {}", extraction.output), None, 0).await?;
|
|
296
|
+
|
|
297
|
+
// Step 3: Generate report
|
|
298
|
+
let report = system.delegate("reporter",
|
|
299
|
+
&format!("Create report from: {}", analysis.output), None, 0).await?;
|
|
300
|
+
|
|
301
|
+
Ok(report.output)
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Configuration
|
|
306
|
+
|
|
307
|
+
### YAML Configuration
|
|
308
|
+
|
|
309
|
+
```yaml
|
|
310
|
+
# agents.yaml
|
|
311
|
+
agents:
|
|
312
|
+
coder:
|
|
313
|
+
provider: openai
|
|
314
|
+
model: gpt-4o-mini
|
|
315
|
+
system_prompt: |
|
|
316
|
+
You are an expert programmer.
|
|
317
|
+
Write clean, documented code.
|
|
318
|
+
temperature: 0.3
|
|
319
|
+
max_depth: 3
|
|
320
|
+
|
|
321
|
+
researcher:
|
|
322
|
+
provider: anthropic
|
|
323
|
+
model: claude-3-sonnet
|
|
324
|
+
system_prompt: |
|
|
325
|
+
You are a research assistant.
|
|
326
|
+
Find accurate, relevant information.
|
|
327
|
+
temperature: 0.7
|
|
328
|
+
max_depth: 2
|
|
329
|
+
api_key: ${ANTHROPIC_API_KEY}
|
|
330
|
+
|
|
331
|
+
# Fallback credential for agents without specific keys
|
|
332
|
+
fallback_credential: ${OPENAI_API_KEY}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Environment Variables
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
# Fallback API key for agents without specific keys
|
|
339
|
+
export OPENAI_API_KEY="sk-..."
|
|
340
|
+
|
|
341
|
+
# Specific agent API keys
|
|
342
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
343
|
+
export GEMINI_API_KEY="..."
|
|
344
|
+
|
|
345
|
+
# Timeout configuration
|
|
346
|
+
export A2A_DELEGATION_TIMEOUT_SECS=120
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Testing
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Run A2A tests
|
|
353
|
+
cargo test -p enact-a2a
|
|
354
|
+
|
|
355
|
+
# Run with output
|
|
356
|
+
cargo test -p enact-a2a -- --nocapture
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Example Test
|
|
360
|
+
|
|
361
|
+
```rust
|
|
362
|
+
#[tokio::test]
|
|
363
|
+
async fn test_multi_agent_delegation() {
|
|
364
|
+
let mut system = MultiAgentSystem::new();
|
|
365
|
+
|
|
366
|
+
system.register_agent("test-agent", DelegateAgentConfig {
|
|
367
|
+
provider: "openai".to_string(),
|
|
368
|
+
model: "gpt-4o-mini".to_string(),
|
|
369
|
+
max_depth: 2,
|
|
370
|
+
..Default::default()
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// This will fail at provider level since no API key,
|
|
374
|
+
// but proves the delegation mechanism works
|
|
375
|
+
let result = system.delegate("test-agent", "Hello", None, 0).await;
|
|
376
|
+
assert!(result.is_ok() || result.is_err());
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## Architecture
|
|
381
|
+
|
|
382
|
+
```
|
|
383
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
384
|
+
│ MultiAgentSystem │
|
|
385
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
386
|
+
│ │ Agent A │ │ Agent B │ │ Agent C │ │
|
|
387
|
+
│ │ (Coder) │ │(Researcher) │ │ (Tester) │ │
|
|
388
|
+
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
|
389
|
+
│ │ │ │ │
|
|
390
|
+
│ └────────────────┼────────────────┘ │
|
|
391
|
+
│ ▼ │
|
|
392
|
+
│ ┌──────────────────────┐ │
|
|
393
|
+
│ │ AgentRegistry │ │
|
|
394
|
+
│ │ (Discovery/Capabilities) │
|
|
395
|
+
│ └──────────────────────┘ │
|
|
396
|
+
└─────────────────────────────────────────────────────────────┘
|
|
397
|
+
│
|
|
398
|
+
▼
|
|
399
|
+
┌──────────────────────┐
|
|
400
|
+
│ DelegateResult │
|
|
401
|
+
│ (Output/Metrics) │
|
|
402
|
+
└──────────────────────┘
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
## Comparison with MCP
|
|
406
|
+
|
|
407
|
+
| Feature | A2A | MCP |
|
|
408
|
+
|---------|-----|-----|
|
|
409
|
+
| **Purpose** | Multi-agent orchestration | External tool integration |
|
|
410
|
+
| **Scope** | Internal agent communication | Third-party services |
|
|
411
|
+
| **Examples** | Code review pipeline, research workflow | GitHub API, Slack, Notion |
|
|
412
|
+
| **Network** | Optional (depends on provider) | Required |
|
|
413
|
+
| **Latency** | Low (direct delegation) | Higher (external calls) |
|
|
414
|
+
|
|
415
|
+
**Use A2A for:** Building agent teams and workflows
|
|
416
|
+
**Use MCP for:** Connecting to external APIs and services
|
|
417
|
+
|
|
418
|
+
## Future Enhancements
|
|
419
|
+
|
|
420
|
+
- [ ] Dynamic agent discovery via registry
|
|
421
|
+
- [ ] Agent-to-agent messaging protocol
|
|
422
|
+
- [ ] Workflow DAG definitions
|
|
423
|
+
- [ ] Parallel agent execution
|
|
424
|
+
- [ ] Agent performance analytics
|
|
425
|
+
- [ ] Automatic agent selection based on task
|
|
426
|
+
|
|
427
|
+
## Resources
|
|
428
|
+
|
|
429
|
+
- [enact-a2a crate](/docs/crates/enact-a2a/)
|
|
430
|
+
- [Example: Multi-agent code review](https://github.com/your-org/enact-agent/examples/a2a-code-review.rs)
|
|
431
|
+
- [API Reference](/docs/api/a2a/)
|