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,206 @@
1
+ +++
2
+ title = "Providers"
3
+ weight = 5
4
+ sort_by = "weight"
5
+ +++
6
+
7
+ # LLM Providers
8
+
9
+ Enact supports multiple LLM providers through the `enact-providers` crate.
10
+
11
+ ## Supported Providers
12
+
13
+ | Provider | Status | Models |
14
+ |----------|--------|--------|
15
+ | Azure OpenAI | ✅ Implemented | GPT-4, GPT-4 Turbo, GPT-3.5 |
16
+ | OpenAI | ✅ Implemented | GPT-4, GPT-4 Turbo, GPT-3.5 |
17
+ | Anthropic | ✅ Implemented | Claude 3 Opus, Sonnet, Haiku |
18
+ | Google Gemini | ✅ Implemented | Gemini Pro, Gemini Ultra |
19
+ | OpenRouter | ✅ Implemented | Multiple models via API |
20
+ | Ollama | ✅ Implemented | Llama, Mistral, etc. (local) |
21
+
22
+ ## Configuration
23
+
24
+ ### Environment Variables
25
+
26
+ Create a `.env` file:
27
+
28
+ ```bash
29
+ # Azure OpenAI
30
+ AZURE_OPENAI_API_KEY=your-key
31
+ AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
32
+ AZURE_OPENAI_DEPLOYMENT=gpt-4
33
+ AZURE_OPENAI_API_VERSION=2024-02-01
34
+
35
+ # OpenAI
36
+ OPENAI_API_KEY=sk-...
37
+ OPENAI_ORG_ID=org-... # Optional
38
+
39
+ # Anthropic
40
+ ANTHROPIC_API_KEY=sk-ant-...
41
+
42
+ # Google
43
+ GOOGLE_API_KEY=...
44
+
45
+ # OpenRouter
46
+ OPENROUTER_API_KEY=sk-or-...
47
+
48
+ # Ollama (local)
49
+ OLLAMA_ENDPOINT=http://localhost:11434
50
+ ```
51
+
52
+ ## Azure OpenAI
53
+
54
+ ```rust
55
+ use enact_providers::azure::AzureOpenAiProvider;
56
+ use enact_config::Config;
57
+
58
+ let config = Config::load()?;
59
+ let provider = AzureOpenAiProvider::from_config(&config)?;
60
+ ```
61
+
62
+ **Required environment variables:**
63
+ - `AZURE_OPENAI_API_KEY`
64
+ - `AZURE_OPENAI_ENDPOINT`
65
+ - `AZURE_OPENAI_DEPLOYMENT`
66
+
67
+ **Optional:**
68
+ - `AZURE_OPENAI_API_VERSION` (default: `2024-02-01`)
69
+
70
+ ## OpenAI
71
+
72
+ ```rust
73
+ use enact_providers::openai_compatible::OpenAiProvider;
74
+
75
+ let provider = OpenAiProvider::new(
76
+ "https://api.openai.com/v1",
77
+ std::env::var("OPENAI_API_KEY")?,
78
+ "gpt-4",
79
+ )?;
80
+ ```
81
+
82
+ ## Anthropic
83
+
84
+ ```rust
85
+ use enact_providers::anthropic::AnthropicProvider;
86
+
87
+ let provider = AnthropicProvider::new(
88
+ std::env::var("ANTHROPIC_API_KEY")?,
89
+ "claude-3-opus-20240229",
90
+ )?;
91
+ ```
92
+
93
+ ## Google Gemini
94
+
95
+ ```rust
96
+ use enact_providers::gemini::GeminiProvider;
97
+
98
+ let provider = GeminiProvider::new(
99
+ std::env::var("GOOGLE_API_KEY")?,
100
+ "gemini-pro",
101
+ )?;
102
+ ```
103
+
104
+ ## OpenRouter
105
+
106
+ Access multiple models through OpenRouter:
107
+
108
+ ```rust
109
+ use enact_providers::openrouter::OpenRouterProvider;
110
+
111
+ let provider = OpenRouterProvider::new(
112
+ std::env::var("OPENROUTER_API_KEY")?,
113
+ "anthropic/claude-3-opus", // Or any supported model
114
+ )?;
115
+ ```
116
+
117
+ ## Ollama (Local)
118
+
119
+ Run models locally with Ollama:
120
+
121
+ ```rust
122
+ use enact_providers::openai_compatible::OpenAiProvider;
123
+
124
+ // Ollama uses OpenAI-compatible API
125
+ let provider = OpenAiProvider::new(
126
+ "http://localhost:11434/v1",
127
+ "ollama", // No real key needed
128
+ "llama3",
129
+ )?;
130
+ ```
131
+
132
+ **Setup Ollama:**
133
+
134
+ ```bash
135
+ # Install Ollama
136
+ curl -fsSL https://ollama.ai/install.sh | sh
137
+
138
+ # Pull a model
139
+ ollama pull llama3
140
+
141
+ # Start server (usually automatic)
142
+ ollama serve
143
+ ```
144
+
145
+ ## Provider Trait
146
+
147
+ All providers implement the `ModelProvider` trait:
148
+
149
+ ```rust
150
+ #[async_trait]
151
+ pub trait ModelProvider: Send + Sync {
152
+ /// Generate a completion
153
+ async fn complete(&self, request: ChatRequest) -> Result<ChatResponse>;
154
+
155
+ /// Whether this provider requires network access
156
+ fn requires_network(&self) -> bool { true }
157
+ }
158
+ ```
159
+
160
+ ## In YAML Agents
161
+
162
+ Specify the model in LLM nodes:
163
+
164
+ ```yaml
165
+ nodes:
166
+ analyze:
167
+ type: llm
168
+ model: gpt-4 # Uses default provider for this model
169
+ system_prompt: "..."
170
+
171
+ summarize:
172
+ type: llm
173
+ model: claude-3-opus # Different model
174
+ system_prompt: "..."
175
+ ```
176
+
177
+ ## Air-Gapped Mode
178
+
179
+ For environments without internet access, use Ollama:
180
+
181
+ ```bash
182
+ # Configure for air-gapped
183
+ export OLLAMA_ENDPOINT=http://localhost:11434
184
+
185
+ # All LLM calls use local Ollama
186
+ enact serve --air-gapped # 🚧 Future
187
+ ```
188
+
189
+ ## Adding a New Provider (🚧 Future)
190
+
191
+ ```rust
192
+ use enact_providers::ModelProvider;
193
+
194
+ pub struct MyProvider { /* ... */ }
195
+
196
+ #[async_trait]
197
+ impl ModelProvider for MyProvider {
198
+ async fn complete(&self, request: ChatRequest) -> Result<ChatResponse> {
199
+ // Implementation
200
+ }
201
+
202
+ fn requires_network(&self) -> bool {
203
+ true
204
+ }
205
+ }
206
+ ```
@@ -0,0 +1,199 @@
1
+ +++
2
+ title = "Roadmap"
3
+ weight = 9
4
+ sort_by = "weight"
5
+ +++
6
+
7
+ # Roadmap
8
+
9
+ Current status and planned features for Enact.
10
+
11
+ ## Current Status
12
+
13
+ Enact is a **complete, working AI agent system** with 900+ tests passing. Skills and MCP are now implemented.
14
+
15
+ ## ✅ Completed Features
16
+
17
+ ### CLI Binary (enact)
18
+
19
+ | Feature | Status |
20
+ |---------|--------|
21
+ | `enact --help` | ✅ Complete |
22
+ | `enact doctor` | ✅ Complete (pretty table output) |
23
+ | `enact version` | ✅ Complete (0.0.1) |
24
+ | `enact run --input "..."` | ✅ Complete |
25
+ | `enact serve --http-port` | ✅ Complete |
26
+
27
+ ### Runner Integration
28
+
29
+ | Feature | Status |
30
+ |---------|--------|
31
+ | DefaultAgentRunner | ✅ Complete |
32
+ | RunnerResponder (gateway integration) | ✅ Complete |
33
+ | Retry logic | ✅ Complete |
34
+ | Compaction | ✅ Complete |
35
+ | Checkpoints | ✅ Complete |
36
+
37
+ ### Production-Ready Gateway
38
+
39
+ | Feature | Status |
40
+ |---------|--------|
41
+ | Health endpoint (`/health`) | ✅ Complete |
42
+ | WhatsApp webhook (challenge + message) | ✅ Complete |
43
+ | Rate limiting (sliding window) | ✅ Complete |
44
+ | Idempotency (dedupe duplicates) | ✅ Complete |
45
+ | Signature verification | ✅ Complete |
46
+ | Request limits (64KB) + timeout (30s) | ✅ Complete |
47
+ | All with tests passing | ✅ Complete |
48
+
49
+ ### LLM Providers
50
+
51
+ | Provider | Status |
52
+ |----------|--------|
53
+ | OpenAI (via OpenAICompatible) | ✅ Complete |
54
+ | Azure OpenAI | ✅ Complete |
55
+ | Anthropic | ✅ Complete |
56
+ | Google Gemini | ✅ Complete |
57
+ | OpenRouter | ✅ Complete |
58
+ | Ollama (local) | ✅ Complete |
59
+
60
+ ### Channels
61
+
62
+ | Channel | Status |
63
+ |---------|--------|
64
+ | WhatsApp (gateway integration) | ✅ Complete |
65
+ | Telegram | ✅ Complete |
66
+ | Teams | ✅ Complete |
67
+
68
+ ### Core Components
69
+
70
+ | Component | Status |
71
+ |-----------|--------|
72
+ | YAML Agent Schema | ✅ Complete |
73
+ | GraphLoader | ✅ Complete |
74
+ | StateGraph | ✅ Complete |
75
+ | LlmCallable | ✅ Complete |
76
+ | Configuration (.env) | ✅ Complete |
77
+
78
+ ### CI/CD Pipeline
79
+
80
+ | Feature | Status |
81
+ |---------|--------|
82
+ | Automated testing on push/PR | ✅ Complete |
83
+ | Format checking with `rustfmt` | ✅ Complete |
84
+ | Linting with `clippy` | ✅ Complete |
85
+ | Cross-platform builds (Linux, macOS, Windows) | ✅ Complete |
86
+ | Caching for faster builds | ✅ Complete |
87
+
88
+ ### Skills System (crates/enact-skills)
89
+
90
+ | Feature | Status |
91
+ |---------|--------|
92
+ | TOML skill manifests (`SKILL.toml`) | ✅ Complete |
93
+ | Markdown skill format (`SKILL.md`) | ✅ Complete |
94
+ | Tool definitions (shell, http, script) | ✅ Complete |
95
+ | Open-skills repo integration | ✅ Complete |
96
+ | 15+ comprehensive tests | ✅ Complete |
97
+ | Load skills from workspace directory | ✅ Complete |
98
+ | Convert skills to prompts | ✅ Complete |
99
+
100
+ ### MCP Client (crates/enact-mcp)
101
+
102
+ | Feature | Status |
103
+ |---------|--------|
104
+ | Stdio transport support | ✅ Complete |
105
+ | JSON-RPC protocol | ✅ Complete |
106
+ | Tool listing | ✅ Complete |
107
+ | Tool calling | ✅ Complete |
108
+ | Async/await support | ✅ Complete |
109
+
110
+ ### gRPC API (Proto Definitions)
111
+
112
+ Proto definitions are in `proto/`:
113
+
114
+ | Service | Methods | Status |
115
+ |---------|---------|--------|
116
+ | RuntimeService | RunAgent, RunAgentStream, Resume, Cancel, Pause | ✅ Proto designed |
117
+ | ConfigService | GetSecret, SetSecret, GetConfig, SyncConfig | ✅ Proto designed |
118
+
119
+ ---
120
+
121
+ ## 🚧 In Progress
122
+
123
+ Currently being implemented:
124
+
125
+ ### Agent-to-Agent (A2A)
126
+
127
+ - [ ] Agent-to-agent communication protocol
128
+ - [ ] Agent discovery
129
+ - [ ] Orchestration patterns
130
+ - [ ] Shared state management
131
+
132
+ ### Custom Webhooks
133
+
134
+ - [ ] Generic webhook endpoint
135
+ - [ ] Webhook authentication
136
+ - [ ] Payload transformation
137
+ - [ ] Event routing
138
+
139
+ ### OAuth & Token Lifecycle
140
+
141
+ - [ ] OAuth 2.0 token management
142
+ - [ ] Automatic token refresh
143
+ - [ ] Secure token storage (keychain integration)
144
+ - [ ] Per-channel authentication
145
+
146
+ ---
147
+
148
+ ## Future Considerations
149
+
150
+ ### Additional Channels
151
+
152
+ - [ ] Email integration
153
+
154
+ ### Developer Experience
155
+
156
+ - [ ] `enact init` - Project scaffolding
157
+ - [ ] `enact validate` - YAML validation
158
+ - [ ] `enact console` - Interactive TUI
159
+ - [ ] `enact logs` - Execution logs
160
+
161
+ ### Advanced Features
162
+
163
+ - [ ] Event sourcing
164
+ - [ ] Policy enforcement
165
+ - [ ] Multi-tenancy
166
+ - [ ] gRPC API (Rust implementation from proto)
167
+ - [ ] WebSocket streaming
168
+
169
+ ---
170
+
171
+ ## Ready to Use
172
+
173
+ You now have a complete, working AI agent system:
174
+
175
+ ```bash
176
+ # Test the CLI
177
+ ./target/release/enact doctor
178
+
179
+ # Run tests
180
+ cargo test --workspace
181
+
182
+ # Run an agent (with API key)
183
+ OPENAI_API_KEY="..." ./target/release/enact run --input "Hello!"
184
+
185
+ # Start gateway (with WhatsApp creds)
186
+ WHATSAPP_ACCESS_TOKEN="..." WHATSAPP_ENDPOINT_ID="..." WHATSAPP_VERIFY_TOKEN="..." \
187
+ ./target/release/enact serve --http-port 8080
188
+ ```
189
+
190
+ ## Contributing
191
+
192
+ We welcome contributions. Current priorities:
193
+
194
+ 1. **A2A (Agent-to-Agent)** - In progress
195
+ 2. **Custom Webhooks** - In progress
196
+ 3. **OAuth/Token lifecycle** - In progress
197
+ 4. **Documentation improvements**
198
+
199
+ See the [Developer Guide](/developers/) for how to contribute.
@@ -0,0 +1,219 @@
1
+ +++
2
+ title = "Security"
3
+ weight = 10
4
+ +++
5
+
6
+ # Security System
7
+
8
+ The `enact-security` crate provides security policy, audit logging, and action validation for agents.
9
+
10
+ ## Autonomy Levels
11
+
12
+ | Level | Description | Write Access |
13
+ |-------|-------------|--------------|
14
+ | `read_only` | No modifications allowed | No |
15
+ | `supervised` | Actions require approval | Conditional |
16
+ | `full` | All actions allowed within policy | Yes |
17
+
18
+ ## Security Policy
19
+
20
+ ```rust
21
+ use enact_security::{SecurityPolicy, PolicyConfig, AutonomyLevel};
22
+
23
+ let config = PolicyConfig {
24
+ autonomy: AutonomyLevel::Supervised,
25
+ max_actions_per_hour: 1000,
26
+ blocked_commands: vec!["rm -rf /".into(), "sudo".into()],
27
+ require_approval_for: vec!["rm".into(), "mv".into()],
28
+ ..PolicyConfig::default()
29
+ };
30
+
31
+ let policy = SecurityPolicy::new(config, workspace_dir);
32
+
33
+ // Check if action is allowed
34
+ if policy.can_act() {
35
+ // Validate a command
36
+ let result = policy.validate_command("rm file.txt", approved);
37
+ if result.allowed {
38
+ // Execute command
39
+ } else if result.requires_approval {
40
+ // Request user approval
41
+ } else {
42
+ // Blocked by policy
43
+ println!("Denied: {:?}", result.reason);
44
+ }
45
+ }
46
+ ```
47
+
48
+ ### Risk Levels
49
+
50
+ | Level | Examples |
51
+ |-------|----------|
52
+ | `Low` | `ls`, `cat`, `echo` |
53
+ | `Medium` | `rm`, `mv`, `cp`, `chmod` |
54
+ | `High` | `rm -r`, blocked patterns |
55
+ | `Critical` | `rm -rf /`, `sudo`, `mkfs` |
56
+
57
+ ### Rate Limiting
58
+
59
+ ```rust
60
+ // Check rate limit
61
+ if policy.is_rate_limited() {
62
+ return Err("Rate limit exceeded");
63
+ }
64
+
65
+ // Record action (returns false if limit hit)
66
+ if !policy.record_action() {
67
+ return Err("Action budget exhausted");
68
+ }
69
+
70
+ // Check remaining actions
71
+ let remaining = policy.remaining_actions();
72
+ ```
73
+
74
+ ### Path Validation
75
+
76
+ ```rust
77
+ // Validate file path access
78
+ let result = policy.validate_path("src/main.rs", write: true);
79
+ if !result.allowed {
80
+ println!("Path blocked: {:?}", result.reason);
81
+ }
82
+
83
+ // Check if path is in workspace
84
+ if policy.is_path_in_workspace(&resolved_path) {
85
+ // Safe to access
86
+ }
87
+ ```
88
+
89
+ ## Audit Logging
90
+
91
+ All security-relevant events are logged for compliance and debugging:
92
+
93
+ ```rust
94
+ use enact_security::{AuditLogger, AuditConfig, AuditEvent, AuditEventType};
95
+
96
+ let config = AuditConfig {
97
+ enabled: true,
98
+ log_path: "audit.log".into(),
99
+ max_size_mb: 100,
100
+ retain_days: 90,
101
+ };
102
+
103
+ let logger = AuditLogger::new(config, workspace_dir)?;
104
+
105
+ // Log a command execution
106
+ logger.log_command(
107
+ "telegram", // channel
108
+ "ls -la", // command
109
+ "low", // risk level
110
+ false, // approved
111
+ true, // allowed
112
+ true, // success
113
+ 15, // duration_ms
114
+ )?;
115
+
116
+ // Log a tool invocation
117
+ logger.log_tool(
118
+ "cli", // channel
119
+ "file_write", // tool name
120
+ true, // allowed
121
+ true, // success
122
+ 42, // duration_ms
123
+ None, // error
124
+ )?;
125
+
126
+ // Log a policy violation
127
+ logger.log_violation("telegram", "Attempted to access /etc/passwd")?;
128
+ ```
129
+
130
+ ### Event Types
131
+
132
+ | Type | Description |
133
+ |------|-------------|
134
+ | `CommandExecution` | Shell command executed |
135
+ | `FileAccess` | File read/write |
136
+ | `ConfigChange` | Configuration modified |
137
+ | `AuthSuccess` | Authentication succeeded |
138
+ | `AuthFailure` | Authentication failed |
139
+ | `PolicyViolation` | Security policy violated |
140
+ | `SecurityEvent` | General security event |
141
+ | `ToolInvocation` | Agent tool invoked |
142
+ | `AgentAction` | Agent performed action |
143
+
144
+ ### Log Rotation
145
+
146
+ Audit logs are automatically rotated when they exceed `max_size_mb`:
147
+
148
+ ```
149
+ audit.log <- current
150
+ audit.log.1.log <- previous
151
+ audit.log.2.log <- older
152
+ ...
153
+ audit.log.9.log <- oldest kept
154
+ ```
155
+
156
+ ### Log Format
157
+
158
+ Each log entry is a JSON line:
159
+
160
+ ```json
161
+ {
162
+ "timestamp": "2026-02-21T12:00:00Z",
163
+ "event_id": "550e8400-e29b-41d4-a716-446655440000",
164
+ "event_type": "command_execution",
165
+ "actor": {
166
+ "channel": "telegram",
167
+ "user_id": "123456",
168
+ "username": "@alice"
169
+ },
170
+ "action": {
171
+ "command": "ls -la",
172
+ "risk_level": "low",
173
+ "approved": false,
174
+ "allowed": true
175
+ },
176
+ "result": {
177
+ "success": true,
178
+ "exit_code": 0,
179
+ "duration_ms": 15
180
+ },
181
+ "security": {
182
+ "policy_violation": false,
183
+ "rate_limit_remaining": 999
184
+ }
185
+ }
186
+ ```
187
+
188
+ ## Configuration
189
+
190
+ ```yaml
191
+ # In agent config
192
+ security:
193
+ autonomy: supervised # read_only, supervised, full
194
+ max_actions_per_hour: 1000
195
+
196
+ blocked_commands:
197
+ - "rm -rf /"
198
+ - "sudo"
199
+ - "chmod 777"
200
+
201
+ require_approval_for:
202
+ - rm
203
+ - mv
204
+ - chmod
205
+
206
+ audit:
207
+ enabled: true
208
+ log_path: audit.log
209
+ max_size_mb: 100
210
+ retain_days: 90
211
+ ```
212
+
213
+ ## Best Practices
214
+
215
+ 1. **Start with `supervised` mode** - Review actions before enabling `full` autonomy
216
+ 2. **Configure blocked_commands** - Block dangerous patterns specific to your environment
217
+ 3. **Enable audit logging** - Keep logs for compliance and debugging
218
+ 4. **Set appropriate rate limits** - Prevent runaway agents
219
+ 5. **Use path sandboxing** - Restrict agents to workspace directories