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.
Files changed (389) hide show
  1. package/.env.example +20 -0
  2. package/.github/workflows/ci.yml +70 -0
  3. package/.github/workflows/publish.yml +250 -0
  4. package/.gitmodules +3 -0
  5. package/Cargo.lock +3584 -0
  6. package/Cargo.toml +97 -0
  7. package/crates/enact/Cargo.toml +27 -0
  8. package/crates/enact/src/lib.rs +60 -0
  9. package/crates/enact-a2a/Cargo.toml +25 -0
  10. package/crates/enact-a2a/src/lib.rs +411 -0
  11. package/crates/enact-channels/Cargo.toml +64 -0
  12. package/crates/enact-channels/examples/README.md +80 -0
  13. package/crates/enact-channels/examples/channel_bot.rs +169 -0
  14. package/crates/enact-channels/examples/telegram-echo.rs +34 -0
  15. package/crates/enact-channels/examples/whatsapp-echo.rs +142 -0
  16. package/crates/enact-channels/src/config.rs +213 -0
  17. package/crates/enact-channels/src/lib.rs +25 -0
  18. package/crates/enact-channels/src/runtime.rs +237 -0
  19. package/crates/enact-channels/src/security/mod.rs +5 -0
  20. package/crates/enact-channels/src/security/pairing.rs +205 -0
  21. package/crates/enact-channels/src/teams.rs +601 -0
  22. package/crates/enact-channels/src/telegram.rs +2833 -0
  23. package/crates/enact-channels/src/traits.rs +200 -0
  24. package/crates/enact-channels/src/webhook.rs +262 -0
  25. package/crates/enact-channels/src/whatsapp.rs +310 -0
  26. package/crates/enact-cli/Cargo.toml +40 -0
  27. package/crates/enact-cli/src/commands/doctor.rs +62 -0
  28. package/crates/enact-cli/src/commands/mod.rs +3 -0
  29. package/crates/enact-cli/src/commands/run.rs +69 -0
  30. package/crates/enact-cli/src/commands/serve.rs +81 -0
  31. package/crates/enact-cli/src/config.rs +2 -0
  32. package/crates/enact-cli/src/main.rs +79 -0
  33. package/crates/enact-config/Cargo.toml +36 -0
  34. package/crates/enact-config/ENV_VAR_MAPPING.md +135 -0
  35. package/crates/enact-config/QUICK_REFERENCE.md +92 -0
  36. package/crates/enact-config/README.md +107 -0
  37. package/crates/enact-config/TESTING.md +161 -0
  38. package/crates/enact-config/examples/test-env-vars.rs +100 -0
  39. package/crates/enact-config/src/config.rs +399 -0
  40. package/crates/enact-config/src/encrypted_store.rs +211 -0
  41. package/crates/enact-config/src/lib.rs +298 -0
  42. package/crates/enact-config/src/secrets.rs +149 -0
  43. package/crates/enact-config/src/sync.rs +260 -0
  44. package/crates/enact-config/test-env-vars.sh +34 -0
  45. package/crates/enact-config/tests/README.md +99 -0
  46. package/crates/enact-config/tests/config_integration_test.rs +202 -0
  47. package/crates/enact-config/tests/security_test.rs +140 -0
  48. package/crates/enact-context/Cargo.toml +41 -0
  49. package/crates/enact-context/src/budget.rs +314 -0
  50. package/crates/enact-context/src/calibrator.rs +535 -0
  51. package/crates/enact-context/src/compactor.rs +392 -0
  52. package/crates/enact-context/src/condenser.rs +826 -0
  53. package/crates/enact-context/src/lib.rs +94 -0
  54. package/crates/enact-context/src/segment.rs +238 -0
  55. package/crates/enact-context/src/step_context.rs +645 -0
  56. package/crates/enact-context/src/token_counter.rs +148 -0
  57. package/crates/enact-context/src/window.rs +372 -0
  58. package/crates/enact-core/Cargo.toml +42 -0
  59. package/crates/enact-core/README.md +98 -0
  60. package/crates/enact-core/src/background/executor.rs +524 -0
  61. package/crates/enact-core/src/background/mod.rs +48 -0
  62. package/crates/enact-core/src/background/target_binding.rs +390 -0
  63. package/crates/enact-core/src/background/trigger.rs +511 -0
  64. package/crates/enact-core/src/callable/callable.rs +152 -0
  65. package/crates/enact-core/src/callable/composite.rs +817 -0
  66. package/crates/enact-core/src/callable/graph.rs +104 -0
  67. package/crates/enact-core/src/callable/llm.rs +211 -0
  68. package/crates/enact-core/src/callable/mod.rs +64 -0
  69. package/crates/enact-core/src/callable/registry.rs +206 -0
  70. package/crates/enact-core/src/context/execution_context.rs +757 -0
  71. package/crates/enact-core/src/context/invocation.rs +99 -0
  72. package/crates/enact-core/src/context/mod.rs +50 -0
  73. package/crates/enact-core/src/context/tenant.rs +175 -0
  74. package/crates/enact-core/src/context/trace.rs +127 -0
  75. package/crates/enact-core/src/flow/conditional.rs +293 -0
  76. package/crates/enact-core/src/flow/mod.rs +43 -0
  77. package/crates/enact-core/src/flow/parallel.rs +437 -0
  78. package/crates/enact-core/src/flow/repeat.rs +534 -0
  79. package/crates/enact-core/src/flow/sequential.rs +248 -0
  80. package/crates/enact-core/src/graph/checkpoint.rs +79 -0
  81. package/crates/enact-core/src/graph/checkpoint_store.rs +76 -0
  82. package/crates/enact-core/src/graph/compiled.rs +189 -0
  83. package/crates/enact-core/src/graph/edge.rs +59 -0
  84. package/crates/enact-core/src/graph/graph_schema.rs +218 -0
  85. package/crates/enact-core/src/graph/loader.rs +155 -0
  86. package/crates/enact-core/src/graph/mod.rs +18 -0
  87. package/crates/enact-core/src/graph/node/function.rs +49 -0
  88. package/crates/enact-core/src/graph/node/mod.rs +48 -0
  89. package/crates/enact-core/src/graph/schema.rs +62 -0
  90. package/crates/enact-core/src/inbox/message.rs +405 -0
  91. package/crates/enact-core/src/inbox/mod.rs +31 -0
  92. package/crates/enact-core/src/inbox/store.rs +355 -0
  93. package/crates/enact-core/src/kernel/artifact/filesystem.rs +546 -0
  94. package/crates/enact-core/src/kernel/artifact/metadata.rs +283 -0
  95. package/crates/enact-core/src/kernel/artifact/mod.rs +27 -0
  96. package/crates/enact-core/src/kernel/artifact/store.rs +427 -0
  97. package/crates/enact-core/src/kernel/enforcement.rs +1315 -0
  98. package/crates/enact-core/src/kernel/error.rs +1200 -0
  99. package/crates/enact-core/src/kernel/event.rs +1394 -0
  100. package/crates/enact-core/src/kernel/execution_model.rs +831 -0
  101. package/crates/enact-core/src/kernel/execution_state.rs +189 -0
  102. package/crates/enact-core/src/kernel/execution_strategy.rs +117 -0
  103. package/crates/enact-core/src/kernel/ids.rs +2086 -0
  104. package/crates/enact-core/src/kernel/interrupt.rs +125 -0
  105. package/crates/enact-core/src/kernel/kernel.rs +1283 -0
  106. package/crates/enact-core/src/kernel/mod.rs +205 -0
  107. package/crates/enact-core/src/kernel/persistence/event_store.rs +270 -0
  108. package/crates/enact-core/src/kernel/persistence/message_store.rs +908 -0
  109. package/crates/enact-core/src/kernel/persistence/mod.rs +102 -0
  110. package/crates/enact-core/src/kernel/persistence/state_store.rs +228 -0
  111. package/crates/enact-core/src/kernel/persistence/vector_store.rs +299 -0
  112. package/crates/enact-core/src/kernel/reducer.rs +808 -0
  113. package/crates/enact-core/src/kernel/replay.rs +153 -0
  114. package/crates/enact-core/src/lib.rs +413 -0
  115. package/crates/enact-core/src/memory/episodic.rs +0 -0
  116. package/crates/enact-core/src/memory/mod.rs +6 -0
  117. package/crates/enact-core/src/memory/semantic.rs +0 -0
  118. package/crates/enact-core/src/memory/trait.rs +0 -0
  119. package/crates/enact-core/src/memory/vector_db.rs +0 -0
  120. package/crates/enact-core/src/memory/working.rs +0 -0
  121. package/crates/enact-core/src/policy/execution_policy.rs +292 -0
  122. package/crates/enact-core/src/policy/filters.rs +458 -0
  123. package/crates/enact-core/src/policy/input_processor.rs +407 -0
  124. package/crates/enact-core/src/policy/long_running.rs +134 -0
  125. package/crates/enact-core/src/policy/mod.rs +193 -0
  126. package/crates/enact-core/src/policy/pii_input.rs +274 -0
  127. package/crates/enact-core/src/policy/tenant_policy.rs +453 -0
  128. package/crates/enact-core/src/policy/tool_policy.rs +407 -0
  129. package/crates/enact-core/src/providers/mod.rs +63 -0
  130. package/crates/enact-core/src/providers/trait.rs +292 -0
  131. package/crates/enact-core/src/runner/callbacks.rs +6 -0
  132. package/crates/enact-core/src/runner/execution_runner.rs +476 -0
  133. package/crates/enact-core/src/runner/loop.rs +117 -0
  134. package/crates/enact-core/src/runner/mod.rs +58 -0
  135. package/crates/enact-core/src/runner/protected_runner.rs +280 -0
  136. package/crates/enact-core/src/signal/inmemory.rs +231 -0
  137. package/crates/enact-core/src/signal/mod.rs +108 -0
  138. package/crates/enact-core/src/streaming/event_logger.rs +195 -0
  139. package/crates/enact-core/src/streaming/event_stream.rs +1423 -0
  140. package/crates/enact-core/src/streaming/mod.rs +108 -0
  141. package/crates/enact-core/src/streaming/pause_cancel.rs +0 -0
  142. package/crates/enact-core/src/streaming/protected_emitter.rs +173 -0
  143. package/crates/enact-core/src/streaming/protection/context.rs +136 -0
  144. package/crates/enact-core/src/streaming/protection/encryption.rs +289 -0
  145. package/crates/enact-core/src/streaming/protection/mod.rs +43 -0
  146. package/crates/enact-core/src/streaming/protection/pii_protection.rs +243 -0
  147. package/crates/enact-core/src/streaming/protection/processor.rs +166 -0
  148. package/crates/enact-core/src/streaming/sse.rs +0 -0
  149. package/crates/enact-core/src/telemetry/exporter.rs +0 -0
  150. package/crates/enact-core/src/telemetry/init.rs +0 -0
  151. package/crates/enact-core/src/telemetry/mod.rs +49 -0
  152. package/crates/enact-core/src/telemetry/spans.rs +245 -0
  153. package/crates/enact-core/src/tool/agent_tool.rs +177 -0
  154. package/crates/enact-core/src/tool/browser/mod.rs +0 -0
  155. package/crates/enact-core/src/tool/browser/webdriver.rs +0 -0
  156. package/crates/enact-core/src/tool/cost.rs +247 -0
  157. package/crates/enact-core/src/tool/discovery.rs +0 -0
  158. package/crates/enact-core/src/tool/dispatcher.rs +347 -0
  159. package/crates/enact-core/src/tool/filesystem.rs +231 -0
  160. package/crates/enact-core/src/tool/function.rs +99 -0
  161. package/crates/enact-core/src/tool/git.rs +162 -0
  162. package/crates/enact-core/src/tool/http.rs +214 -0
  163. package/crates/enact-core/src/tool/mcp/client.rs +0 -0
  164. package/crates/enact-core/src/tool/mcp/mod.rs +0 -0
  165. package/crates/enact-core/src/tool/mod.rs +51 -0
  166. package/crates/enact-core/src/tool/reasoning/debugging.rs +0 -0
  167. package/crates/enact-core/src/tool/reasoning/mcts.rs +0 -0
  168. package/crates/enact-core/src/tool/reasoning/mod.rs +0 -0
  169. package/crates/enact-core/src/tool/reasoning/sequential.rs +0 -0
  170. package/crates/enact-core/src/tool/sandbox/dagger.rs +0 -0
  171. package/crates/enact-core/src/tool/sandbox/mod.rs +0 -0
  172. package/crates/enact-core/src/tool/shell.rs +147 -0
  173. package/crates/enact-core/src/tool/trait.rs +33 -0
  174. package/crates/enact-core/src/tool/web_search.rs +277 -0
  175. package/crates/enact-core/src/util/config.rs +0 -0
  176. package/crates/enact-core/src/util/errors.rs +0 -0
  177. package/crates/enact-core/src/util/mod.rs +6 -0
  178. package/crates/enact-core/tests/airgapped_e2e_test.rs +291 -0
  179. package/crates/enact-core/tests/e2e_agentic_loop.rs +119 -0
  180. package/crates/enact-core/tests/e2e_test.rs +259 -0
  181. package/crates/enact-core/tests/graph_test.rs +130 -0
  182. package/crates/enact-core/tests/stream_event_id_validation.rs +435 -0
  183. package/crates/enact-cron/Cargo.toml +28 -0
  184. package/crates/enact-cron/src/lib.rs +44 -0
  185. package/crates/enact-cron/src/schedule.rs +156 -0
  186. package/crates/enact-cron/src/store.rs +589 -0
  187. package/crates/enact-cron/src/types.rs +148 -0
  188. package/crates/enact-gateway/Cargo.toml +31 -0
  189. package/crates/enact-gateway/README.md +30 -0
  190. package/crates/enact-gateway/examples/whatsapp-gateway-runner-mock.rs +59 -0
  191. package/crates/enact-gateway/examples/whatsapp-gateway.rs +42 -0
  192. package/crates/enact-gateway/src/lib.rs +582 -0
  193. package/crates/enact-mcp/Cargo.toml +24 -0
  194. package/crates/enact-mcp/src/lib.rs +178 -0
  195. package/crates/enact-memory/Cargo.toml +25 -0
  196. package/crates/enact-memory/src/backend.rs +20 -0
  197. package/crates/enact-memory/src/chunker.rs +230 -0
  198. package/crates/enact-memory/src/embeddings.rs +221 -0
  199. package/crates/enact-memory/src/lib.rs +67 -0
  200. package/crates/enact-memory/src/markdown.rs +127 -0
  201. package/crates/enact-memory/src/none.rs +61 -0
  202. package/crates/enact-memory/src/sqlite.rs +276 -0
  203. package/crates/enact-memory/src/traits.rs +65 -0
  204. package/crates/enact-memory/src/vector.rs +198 -0
  205. package/crates/enact-oauth/Cargo.toml +27 -0
  206. package/crates/enact-oauth/src/lib.rs +584 -0
  207. package/crates/enact-observability/Cargo.toml +22 -0
  208. package/crates/enact-observability/src/lib.rs +197 -0
  209. package/crates/enact-providers/Cargo.toml +33 -0
  210. package/crates/enact-providers/examples/hello-agent.rs +33 -0
  211. package/crates/enact-providers/src/anthropic.rs +182 -0
  212. package/crates/enact-providers/src/azure.rs +96 -0
  213. package/crates/enact-providers/src/bridge.rs +221 -0
  214. package/crates/enact-providers/src/gemini.rs +227 -0
  215. package/crates/enact-providers/src/http.rs +78 -0
  216. package/crates/enact-providers/src/lib.rs +53 -0
  217. package/crates/enact-providers/src/openai_compatible.rs +167 -0
  218. package/crates/enact-providers/src/openrouter.rs +33 -0
  219. package/crates/enact-runner/Cargo.toml +24 -0
  220. package/crates/enact-runner/README.md +76 -0
  221. package/crates/enact-runner/src/compaction.rs +225 -0
  222. package/crates/enact-runner/src/config.rs +118 -0
  223. package/crates/enact-runner/src/lib.rs +63 -0
  224. package/crates/enact-runner/src/loop_driver.rs +414 -0
  225. package/crates/enact-runner/src/parser.rs +421 -0
  226. package/crates/enact-runner/src/retry.rs +262 -0
  227. package/crates/enact-runner/tests/integration.rs +278 -0
  228. package/crates/enact-security/Cargo.toml +22 -0
  229. package/crates/enact-security/src/audit.rs +375 -0
  230. package/crates/enact-security/src/lib.rs +37 -0
  231. package/crates/enact-security/src/policy.rs +406 -0
  232. package/crates/enact-skills/Cargo.toml +25 -0
  233. package/crates/enact-skills/src/lib.rs +506 -0
  234. package/crates/enact-tools/Cargo.toml +22 -0
  235. package/crates/enact-tools/src/file_read.rs +166 -0
  236. package/crates/enact-tools/src/file_write.rs +216 -0
  237. package/crates/enact-tools/src/git_operations.rs +513 -0
  238. package/crates/enact-tools/src/http_request.rs +417 -0
  239. package/crates/enact-tools/src/lib.rs +104 -0
  240. package/crates/enact-tools/src/security.rs +227 -0
  241. package/crates/enact-tools/src/shell.rs +191 -0
  242. package/crates/enact-tools/src/traits.rs +159 -0
  243. package/docs/Makefile +74 -0
  244. package/docs/config.toml +62 -0
  245. package/docs/content/_index.md +174 -0
  246. package/docs/content/a2a/_index.md +431 -0
  247. package/docs/content/api/_index.md +323 -0
  248. package/docs/content/channels/_index.md +160 -0
  249. package/docs/content/channels/teams.md +205 -0
  250. package/docs/content/channels/telegram.md +182 -0
  251. package/docs/content/channels/webhook.md +423 -0
  252. package/docs/content/channels/whatsapp.md +240 -0
  253. package/docs/content/cli/_index.md +261 -0
  254. package/docs/content/concepts/_index.md +273 -0
  255. package/docs/content/configuration/_index.md +241 -0
  256. package/docs/content/cron/_index.md +248 -0
  257. package/docs/content/developers/_index.md +278 -0
  258. package/docs/content/getting-started/_index.md +180 -0
  259. package/docs/content/installation/_index.md +186 -0
  260. package/docs/content/installation/uninstall.md +101 -0
  261. package/docs/content/installation/updating.md +120 -0
  262. package/docs/content/mcp/_index.md +215 -0
  263. package/docs/content/memory/_index.md +163 -0
  264. package/docs/content/oauth/_index.md +515 -0
  265. package/docs/content/providers/_index.md +206 -0
  266. package/docs/content/roadmap/_index.md +199 -0
  267. package/docs/content/security/_index.md +219 -0
  268. package/docs/content/skills/_index.md +228 -0
  269. package/docs/content/tools/_index.md +485 -0
  270. package/docs/content/troubleshooting/_index.md +259 -0
  271. package/docs/content/yaml-schema/_index.md +294 -0
  272. package/docs/static/giallo-dark.css +91 -0
  273. package/docs/static/giallo-light.css +91 -0
  274. package/docs/themes/tanuki/.github/workflows/deploy.yml +44 -0
  275. package/docs/themes/tanuki/LICENSE +21 -0
  276. package/docs/themes/tanuki/README.md +166 -0
  277. package/docs/themes/tanuki/examples/blog/config.toml +58 -0
  278. package/docs/themes/tanuki/examples/blog/content/_index.md +4 -0
  279. package/docs/themes/tanuki/examples/blog/content/about.md +33 -0
  280. package/docs/themes/tanuki/examples/blog/content/blog/_index.md +7 -0
  281. package/docs/themes/tanuki/examples/blog/content/blog/api-design-best-practices.md +245 -0
  282. package/docs/themes/tanuki/examples/blog/content/blog/building-accessible-websites.md +147 -0
  283. package/docs/themes/tanuki/examples/blog/content/blog/css-grid-vs-flexbox.md +165 -0
  284. package/docs/themes/tanuki/examples/blog/content/blog/customizing-catppuccin-colors.md +137 -0
  285. package/docs/themes/tanuki/examples/blog/content/blog/dark-mode-best-practices.md +82 -0
  286. package/docs/themes/tanuki/examples/blog/content/blog/docker-essentials.md +301 -0
  287. package/docs/themes/tanuki/examples/blog/content/blog/getting-started-with-zola.md +129 -0
  288. package/docs/themes/tanuki/examples/blog/content/blog/git-workflow-for-content.md +112 -0
  289. package/docs/themes/tanuki/examples/blog/content/blog/introduction-to-webassembly.md +183 -0
  290. package/docs/themes/tanuki/examples/blog/content/blog/modern-javascript-features.md +234 -0
  291. package/docs/themes/tanuki/examples/blog/content/blog/testing-strategies.md +311 -0
  292. package/docs/themes/tanuki/examples/blog/content/blog/typography-for-developers.md +104 -0
  293. package/docs/themes/tanuki/examples/blog/content/blog/welcome-to-tanuki.md +67 -0
  294. package/docs/themes/tanuki/examples/blog/content/blog/why-static-sites.md +85 -0
  295. package/docs/themes/tanuki/examples/blog/content/projects.md +64 -0
  296. package/docs/themes/tanuki/examples/book/config.toml +17 -0
  297. package/docs/themes/tanuki/examples/book/content/_index.md +12 -0
  298. package/docs/themes/tanuki/examples/book/content/chapter-1.md +90 -0
  299. package/docs/themes/tanuki/examples/book/content/chapter-2.md +143 -0
  300. package/docs/themes/tanuki/examples/book/content/chapter-3.md +217 -0
  301. package/docs/themes/tanuki/examples/book/content/chapter-4.md +224 -0
  302. package/docs/themes/tanuki/examples/book/content/chapter-5.md +297 -0
  303. package/docs/themes/tanuki/examples/book/content/print.md +6 -0
  304. package/docs/themes/tanuki/examples/docs/config.toml +28 -0
  305. package/docs/themes/tanuki/examples/docs/content/_index.md +20 -0
  306. package/docs/themes/tanuki/examples/docs/content/components.md +156 -0
  307. package/docs/themes/tanuki/examples/docs/content/configuration.md +94 -0
  308. package/docs/themes/tanuki/examples/docs/content/customization.md +202 -0
  309. package/docs/themes/tanuki/examples/docs/content/deployment.md +204 -0
  310. package/docs/themes/tanuki/examples/docs/content/installation.md +59 -0
  311. package/docs/themes/tanuki/examples/docs/content/print.md +6 -0
  312. package/docs/themes/tanuki/examples/docs/static/img/tanuki-icon.avif +0 -0
  313. package/docs/themes/tanuki/examples/index.html +2104 -0
  314. package/docs/themes/tanuki/mise.toml +108 -0
  315. package/docs/themes/tanuki/sass/base/_catppuccin.scss +164 -0
  316. package/docs/themes/tanuki/sass/base/_fonts.scss +64 -0
  317. package/docs/themes/tanuki/sass/base/_reset.scss +152 -0
  318. package/docs/themes/tanuki/sass/base/_typography.scss +523 -0
  319. package/docs/themes/tanuki/sass/components/_buttons.scss +209 -0
  320. package/docs/themes/tanuki/sass/components/_code.scss +457 -0
  321. package/docs/themes/tanuki/sass/components/_landing.scss +633 -0
  322. package/docs/themes/tanuki/sass/components/_layout.scss +294 -0
  323. package/docs/themes/tanuki/sass/components/_navigation.scss +1200 -0
  324. package/docs/themes/tanuki/sass/components/_print.scss +237 -0
  325. package/docs/themes/tanuki/sass/components/_search.scss +224 -0
  326. package/docs/themes/tanuki/sass/components/_sidebar.scss +473 -0
  327. package/docs/themes/tanuki/sass/components/_theme-toggle.scss +186 -0
  328. package/docs/themes/tanuki/sass/modes/_blog.scss +366 -0
  329. package/docs/themes/tanuki/sass/modes/_product.scss +875 -0
  330. package/docs/themes/tanuki/sass/modes/_raskell.scss +1696 -0
  331. package/docs/themes/tanuki/sass/patterns/_buttons.scss +183 -0
  332. package/docs/themes/tanuki/sass/patterns/_cards.scss +144 -0
  333. package/docs/themes/tanuki/sass/patterns/_index.scss +9 -0
  334. package/docs/themes/tanuki/sass/patterns/_lists.scss +259 -0
  335. package/docs/themes/tanuki/sass/patterns/_sections.scss +243 -0
  336. package/docs/themes/tanuki/sass/style.scss +47 -0
  337. package/docs/themes/tanuki/sass/tokens/_colors.scss +139 -0
  338. package/docs/themes/tanuki/sass/tokens/_spacing.scss +100 -0
  339. package/docs/themes/tanuki/sass/tokens/_typography.scss +186 -0
  340. package/docs/themes/tanuki/screenshot.png +0 -0
  341. package/docs/themes/tanuki/sentinel.kdl +59 -0
  342. package/docs/themes/tanuki/static/elasticlunr.min.js +10 -0
  343. package/docs/themes/tanuki/static/fonts/GEIST-LICENSE.txt +92 -0
  344. package/docs/themes/tanuki/static/fonts/Geist-Variable.woff2 +0 -0
  345. package/docs/themes/tanuki/static/fonts/GeistMono-Variable.woff2 +0 -0
  346. package/docs/themes/tanuki/static/img/tanuki-icon.avif +0 -0
  347. package/docs/themes/tanuki/static/img/tanuki-icon.png +0 -0
  348. package/docs/themes/tanuki/static/js/anchors.js +18 -0
  349. package/docs/themes/tanuki/static/js/app.js +274 -0
  350. package/docs/themes/tanuki/static/js/code.js +394 -0
  351. package/docs/themes/tanuki/static/js/navigation.js +778 -0
  352. package/docs/themes/tanuki/static/js/scroll-to-top.js +33 -0
  353. package/docs/themes/tanuki/static/js/search-raskell.js +240 -0
  354. package/docs/themes/tanuki/static/js/search.js +215 -0
  355. package/docs/themes/tanuki/static/js/theme.js +169 -0
  356. package/docs/themes/tanuki/static/syntax-dark.css +151 -0
  357. package/docs/themes/tanuki/static/syntax-light.css +151 -0
  358. package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm.js +486 -0
  359. package/docs/themes/tanuki/static/wasm/sentinel_playground_wasm_bg.wasm +0 -0
  360. package/docs/themes/tanuki/templates/404.html +52 -0
  361. package/docs/themes/tanuki/templates/base.html +428 -0
  362. package/docs/themes/tanuki/templates/blog.html +66 -0
  363. package/docs/themes/tanuki/templates/home.html +108 -0
  364. package/docs/themes/tanuki/templates/index.html +178 -0
  365. package/docs/themes/tanuki/templates/landing.html +168 -0
  366. package/docs/themes/tanuki/templates/macros/nav.html +128 -0
  367. package/docs/themes/tanuki/templates/macros/posts.html +101 -0
  368. package/docs/themes/tanuki/templates/macros/ui.html +159 -0
  369. package/docs/themes/tanuki/templates/page.html +135 -0
  370. package/docs/themes/tanuki/templates/partials/footer.html +38 -0
  371. package/docs/themes/tanuki/templates/partials/header.html +366 -0
  372. package/docs/themes/tanuki/templates/partials/nav-buttons.html +55 -0
  373. package/docs/themes/tanuki/templates/partials/nav-overlay.html +81 -0
  374. package/docs/themes/tanuki/templates/partials/page-toc-panel.html +43 -0
  375. package/docs/themes/tanuki/templates/partials/search.html +52 -0
  376. package/docs/themes/tanuki/templates/partials/sidebar.html +107 -0
  377. package/docs/themes/tanuki/templates/partials/theme-toggle.html +35 -0
  378. package/docs/themes/tanuki/templates/partials/toc-overlay.html +146 -0
  379. package/docs/themes/tanuki/templates/partials/version-picker.html +38 -0
  380. package/docs/themes/tanuki/templates/print.html +244 -0
  381. package/docs/themes/tanuki/templates/section.html +186 -0
  382. package/docs/themes/tanuki/templates/taxonomy_list.html +18 -0
  383. package/docs/themes/tanuki/templates/taxonomy_single.html +31 -0
  384. package/docs/themes/tanuki/theme.toml +58 -0
  385. package/examples/hello-agent.rs +55 -0
  386. package/package.json +36 -0
  387. package/proto/config.proto +60 -0
  388. package/proto/events.proto +0 -0
  389. package/proto/runtime.proto +215 -0
@@ -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/)