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,193 @@
1
+ //! Policy - Execution constraints and guardrails
2
+ //!
3
+ //! Policies define what is ALLOWED during execution:
4
+ //! - Execution policies: limits, timeouts, retries
5
+ //! - Tool policies: permissions, network/fs access, PII handling
6
+ //! - Tenant policies: quotas, feature flags, isolation
7
+ //! - Input processors: pre-execution validation (PII, prompt injection)
8
+ //!
9
+ //! ## Architecture
10
+ //!
11
+ //! Policies are evaluated BEFORE execution, not during business logic.
12
+ //! This ensures:
13
+ //! - Clear separation of concerns
14
+ //! - Auditable policy decisions
15
+ //! - No policy logic scattered in execution code
16
+ //!
17
+ //! ```text
18
+ //! ┌─────────────────────────────────────────────┐
19
+ //! │ Policy Evaluator │
20
+ //! │ ┌─────────────────────────────────────┐ │
21
+ //! │ │ ExecutionPolicy │ ToolPolicy │ ... │ │
22
+ //! │ └─────────────────────────────────────┘ │
23
+ //! │ │ │
24
+ //! │ ▼ │
25
+ //! │ Allow / Deny / Warn │
26
+ //! └─────────────────────────────────────────────┘
27
+ //! │
28
+ //! ▼
29
+ //! ExecutionKernel
30
+ //! ```
31
+ //!
32
+ //! @see docs/TECHNICAL/17-GUARDRAILS-PROTECTION.md
33
+ //! @see docs/TECHNICAL/25-STREAM-PROCESSORS.md
34
+
35
+ mod execution_policy;
36
+ mod filters;
37
+ mod tenant_policy;
38
+ mod tool_policy;
39
+
40
+ // Input processors (feat-09: Guardrails)
41
+ mod input_processor;
42
+ mod long_running;
43
+ mod pii_input;
44
+
45
+ pub use execution_policy::{ExecutionLimits, ExecutionPolicy};
46
+ pub use filters::{ContentFilter, FilterAction, FilterResult};
47
+ pub use long_running::{
48
+ CheckpointPolicy, ContextStrategy, LongRunningExecutionPolicy, WorkingMemoryPolicy,
49
+ };
50
+ pub use tenant_policy::{FeatureFlags, TenantLimits, TenantPolicy};
51
+ pub use tool_policy::{ToolPermissions, ToolPolicy, ToolTrustLevel};
52
+
53
+ // Input processor exports
54
+ pub use input_processor::{InputProcessor, InputProcessorPipeline, InputProcessorResult};
55
+ pub use pii_input::{PiiInputMode, PiiInputProcessor};
56
+
57
+ /// Policy decision result
58
+ #[derive(Debug, Clone)]
59
+ pub enum PolicyDecision {
60
+ /// Action is allowed
61
+ Allow,
62
+ /// Action is denied with reason
63
+ Deny { reason: String },
64
+ /// Action is allowed but logged/warned
65
+ Warn { message: String },
66
+ }
67
+
68
+ impl PolicyDecision {
69
+ pub fn is_allowed(&self) -> bool {
70
+ matches!(self, PolicyDecision::Allow | PolicyDecision::Warn { .. })
71
+ }
72
+
73
+ pub fn is_denied(&self) -> bool {
74
+ matches!(self, PolicyDecision::Deny { .. })
75
+ }
76
+ }
77
+
78
+ /// Trait for policy evaluators
79
+ pub trait PolicyEvaluator: Send + Sync {
80
+ /// Evaluate a policy for the given context
81
+ fn evaluate(&self, context: &PolicyContext) -> PolicyDecision;
82
+ }
83
+
84
+ /// Context for policy evaluation
85
+ #[derive(Debug, Clone)]
86
+ pub struct PolicyContext {
87
+ /// Tenant ID (if multi-tenant)
88
+ pub tenant_id: Option<String>,
89
+ /// User ID
90
+ pub user_id: Option<String>,
91
+ /// Current action being evaluated
92
+ pub action: PolicyAction,
93
+ /// Additional metadata
94
+ pub metadata: std::collections::HashMap<String, String>,
95
+ }
96
+
97
+ /// Actions that can be evaluated by policies
98
+ #[derive(Debug, Clone)]
99
+ pub enum PolicyAction {
100
+ /// Starting an execution
101
+ StartExecution { graph_id: Option<String> },
102
+ /// Invoking a tool
103
+ InvokeTool { tool_name: String },
104
+ /// Making an LLM call
105
+ LlmCall { model: String },
106
+ /// Accessing external resource
107
+ ExternalAccess { resource: String },
108
+ /// Outputting content
109
+ OutputContent { content_type: String },
110
+ }
111
+
112
+ #[cfg(test)]
113
+ mod tests {
114
+ use super::*;
115
+
116
+ // ============ PolicyDecision Tests ============
117
+
118
+ #[test]
119
+ fn test_policy_decision_allow() {
120
+ let decision = PolicyDecision::Allow;
121
+ assert!(decision.is_allowed());
122
+ assert!(!decision.is_denied());
123
+ }
124
+
125
+ #[test]
126
+ fn test_policy_decision_deny() {
127
+ let decision = PolicyDecision::Deny {
128
+ reason: "Not authorized".to_string(),
129
+ };
130
+ assert!(!decision.is_allowed());
131
+ assert!(decision.is_denied());
132
+ }
133
+
134
+ #[test]
135
+ fn test_policy_decision_warn() {
136
+ let decision = PolicyDecision::Warn {
137
+ message: "Proceed with caution".to_string(),
138
+ };
139
+ // Warn is allowed but logged
140
+ assert!(decision.is_allowed());
141
+ assert!(!decision.is_denied());
142
+ }
143
+
144
+ // ============ PolicyContext Tests ============
145
+
146
+ #[test]
147
+ fn test_policy_context_creation() {
148
+ let mut metadata = std::collections::HashMap::new();
149
+ metadata.insert("key".to_string(), "value".to_string());
150
+
151
+ let context = PolicyContext {
152
+ tenant_id: Some("tenant-123".to_string()),
153
+ user_id: Some("user-456".to_string()),
154
+ action: PolicyAction::StartExecution {
155
+ graph_id: Some("graph-789".to_string()),
156
+ },
157
+ metadata,
158
+ };
159
+
160
+ assert_eq!(context.tenant_id.as_ref().unwrap(), "tenant-123");
161
+ assert_eq!(context.user_id.as_ref().unwrap(), "user-456");
162
+ assert!(matches!(
163
+ context.action,
164
+ PolicyAction::StartExecution { .. }
165
+ ));
166
+ }
167
+
168
+ #[test]
169
+ fn test_policy_action_variants() {
170
+ let start = PolicyAction::StartExecution { graph_id: None };
171
+ assert!(matches!(start, PolicyAction::StartExecution { .. }));
172
+
173
+ let invoke = PolicyAction::InvokeTool {
174
+ tool_name: "web_search".to_string(),
175
+ };
176
+ assert!(matches!(invoke, PolicyAction::InvokeTool { .. }));
177
+
178
+ let llm = PolicyAction::LlmCall {
179
+ model: "gpt-4".to_string(),
180
+ };
181
+ assert!(matches!(llm, PolicyAction::LlmCall { .. }));
182
+
183
+ let external = PolicyAction::ExternalAccess {
184
+ resource: "https://api.example.com".to_string(),
185
+ };
186
+ assert!(matches!(external, PolicyAction::ExternalAccess { .. }));
187
+
188
+ let output = PolicyAction::OutputContent {
189
+ content_type: "text/plain".to_string(),
190
+ };
191
+ assert!(matches!(output, PolicyAction::OutputContent { .. }));
192
+ }
193
+ }
@@ -0,0 +1,274 @@
1
+ //! PII Input Processor
2
+ //!
3
+ //! Detects PII in user input before execution.
4
+ //! Can block, warn, or allow based on configuration.
5
+
6
+ use super::input_processor::{InputProcessor, InputProcessorResult};
7
+ use super::PolicyContext;
8
+ use async_trait::async_trait;
9
+
10
+ #[cfg(feature = "guardrails")]
11
+ use enact_guardrails::{PiiClass, PiiDetector};
12
+
13
+ /// PII detection mode
14
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
15
+ pub enum PiiInputMode {
16
+ /// Allow all input (no PII checking)
17
+ Allow,
18
+ /// Warn if PII detected but allow
19
+ Warn,
20
+ /// Block if Direct PII detected (email, SSN, etc.)
21
+ BlockDirect,
22
+ /// Block if any PII detected
23
+ BlockAll,
24
+ }
25
+
26
+ impl Default for PiiInputMode {
27
+ fn default() -> Self {
28
+ Self::Warn
29
+ }
30
+ }
31
+
32
+ /// PII Input Processor
33
+ ///
34
+ /// Detects PII in user input before sending to LLM.
35
+ /// Behavior is configurable via `PiiInputMode`.
36
+ pub struct PiiInputProcessor {
37
+ mode: PiiInputMode,
38
+ #[cfg(feature = "guardrails")]
39
+ detector: PiiDetector,
40
+ }
41
+
42
+ impl PiiInputProcessor {
43
+ /// Create a new PII input processor with default mode (Warn)
44
+ #[cfg(feature = "guardrails")]
45
+ pub fn new() -> Self {
46
+ Self {
47
+ mode: PiiInputMode::default(),
48
+ detector: PiiDetector::new(),
49
+ }
50
+ }
51
+
52
+ /// Create a new PII input processor (no-op when guardrails disabled)
53
+ #[cfg(not(feature = "guardrails"))]
54
+ pub fn new() -> Self {
55
+ Self {
56
+ mode: PiiInputMode::Allow,
57
+ }
58
+ }
59
+
60
+ /// Set the detection mode
61
+ pub fn with_mode(mut self, mode: PiiInputMode) -> Self {
62
+ self.mode = mode;
63
+ self
64
+ }
65
+
66
+ /// Check input for PII
67
+ #[cfg(feature = "guardrails")]
68
+ fn check_pii(&self, input: &str) -> Option<(PiiClass, Vec<String>)> {
69
+ let matches = self.detector.detect(input);
70
+ if matches.is_empty() {
71
+ return None;
72
+ }
73
+
74
+ // Get highest classification from matches
75
+ let highest = matches
76
+ .iter()
77
+ .fold(PiiClass::None, |acc, m| acc.max(m.class));
78
+
79
+ // Collect pattern names for reporting
80
+ let patterns: Vec<String> = matches.iter().map(|m| m.pattern_name.clone()).collect();
81
+
82
+ Some((highest, patterns))
83
+ }
84
+
85
+ /// Check input for PII (no-op when guardrails disabled)
86
+ #[cfg(not(feature = "guardrails"))]
87
+ #[allow(dead_code)]
88
+ fn check_pii(&self, _input: &str) -> Option<((), Vec<String>)> {
89
+ None
90
+ }
91
+ }
92
+
93
+ impl Default for PiiInputProcessor {
94
+ fn default() -> Self {
95
+ Self::new()
96
+ }
97
+ }
98
+
99
+ #[async_trait]
100
+ impl InputProcessor for PiiInputProcessor {
101
+ fn name(&self) -> &str {
102
+ "pii-input"
103
+ }
104
+
105
+ fn priority(&self) -> u32 {
106
+ 50 // Run early in the pipeline
107
+ }
108
+
109
+ #[cfg(feature = "guardrails")]
110
+ async fn process(
111
+ &self,
112
+ input: &str,
113
+ _ctx: &PolicyContext,
114
+ ) -> anyhow::Result<InputProcessorResult> {
115
+ // Skip if mode is Allow
116
+ if self.mode == PiiInputMode::Allow {
117
+ return Ok(InputProcessorResult::Pass);
118
+ }
119
+
120
+ // Check for PII
121
+ if let Some((class, patterns)) = self.check_pii(input) {
122
+ let pattern_list = patterns.join(", ");
123
+
124
+ match self.mode {
125
+ PiiInputMode::Allow => {
126
+ // Already handled above
127
+ Ok(InputProcessorResult::Pass)
128
+ }
129
+ PiiInputMode::Warn => {
130
+ // Log warning but allow
131
+ tracing::warn!(
132
+ pii_class = ?class,
133
+ patterns = %pattern_list,
134
+ "PII detected in input"
135
+ );
136
+ Ok(InputProcessorResult::Pass)
137
+ }
138
+ PiiInputMode::BlockDirect => {
139
+ // Block only Direct PII
140
+ if class == PiiClass::Direct {
141
+ Ok(InputProcessorResult::Block {
142
+ reason: format!("Direct PII detected in input: {}", pattern_list),
143
+ processor: self.name().to_string(),
144
+ })
145
+ } else {
146
+ tracing::warn!(
147
+ pii_class = ?class,
148
+ patterns = %pattern_list,
149
+ "Indirect/Sensitive PII detected in input (allowed)"
150
+ );
151
+ Ok(InputProcessorResult::Pass)
152
+ }
153
+ }
154
+ PiiInputMode::BlockAll => {
155
+ // Block any PII
156
+ Ok(InputProcessorResult::Block {
157
+ reason: format!("PII detected in input ({:?}): {}", class, pattern_list),
158
+ processor: self.name().to_string(),
159
+ })
160
+ }
161
+ }
162
+ } else {
163
+ Ok(InputProcessorResult::Pass)
164
+ }
165
+ }
166
+
167
+ #[cfg(not(feature = "guardrails"))]
168
+ async fn process(
169
+ &self,
170
+ _input: &str,
171
+ _ctx: &PolicyContext,
172
+ ) -> anyhow::Result<InputProcessorResult> {
173
+ // No guardrails feature, always pass
174
+ Ok(InputProcessorResult::Pass)
175
+ }
176
+ }
177
+
178
+ #[cfg(test)]
179
+ mod tests {
180
+ use super::*;
181
+ use crate::policy::PolicyAction;
182
+ use std::collections::HashMap;
183
+
184
+ fn test_context() -> PolicyContext {
185
+ PolicyContext {
186
+ tenant_id: None,
187
+ user_id: None,
188
+ action: PolicyAction::StartExecution { graph_id: None },
189
+ metadata: HashMap::new(),
190
+ }
191
+ }
192
+
193
+ #[tokio::test]
194
+ async fn test_pii_input_processor_name() {
195
+ let processor = PiiInputProcessor::new();
196
+ assert_eq!(processor.name(), "pii-input");
197
+ }
198
+
199
+ #[tokio::test]
200
+ async fn test_pii_input_processor_priority() {
201
+ let processor = PiiInputProcessor::new();
202
+ assert_eq!(processor.priority(), 50);
203
+ }
204
+
205
+ #[cfg(feature = "guardrails")]
206
+ #[tokio::test]
207
+ async fn test_pii_input_allow_mode() {
208
+ let processor = PiiInputProcessor::new().with_mode(PiiInputMode::Allow);
209
+ let ctx = test_context();
210
+
211
+ // Even with PII, should pass
212
+ let result = processor
213
+ .process("Email: user@example.com", &ctx)
214
+ .await
215
+ .unwrap();
216
+ assert!(result.should_proceed());
217
+ }
218
+
219
+ #[cfg(feature = "guardrails")]
220
+ #[tokio::test]
221
+ async fn test_pii_input_warn_mode() {
222
+ let processor = PiiInputProcessor::new().with_mode(PiiInputMode::Warn);
223
+ let ctx = test_context();
224
+
225
+ // With PII, should warn but pass
226
+ let result = processor
227
+ .process("Email: user@example.com", &ctx)
228
+ .await
229
+ .unwrap();
230
+ assert!(result.should_proceed());
231
+ }
232
+
233
+ #[cfg(feature = "guardrails")]
234
+ #[tokio::test]
235
+ async fn test_pii_input_block_direct() {
236
+ let processor = PiiInputProcessor::new().with_mode(PiiInputMode::BlockDirect);
237
+ let ctx = test_context();
238
+
239
+ // Direct PII (email) should block
240
+ let result = processor
241
+ .process("Email: user@example.com", &ctx)
242
+ .await
243
+ .unwrap();
244
+ assert!(result.is_blocked());
245
+
246
+ // No PII should pass
247
+ let result = processor.process("Hello world", &ctx).await.unwrap();
248
+ assert!(result.should_proceed());
249
+ }
250
+
251
+ #[cfg(feature = "guardrails")]
252
+ #[tokio::test]
253
+ async fn test_pii_input_block_all() {
254
+ let processor = PiiInputProcessor::new().with_mode(PiiInputMode::BlockAll);
255
+ let ctx = test_context();
256
+
257
+ // Any PII should block
258
+ let result = processor.process("IP: 192.168.1.1", &ctx).await.unwrap();
259
+ assert!(result.is_blocked());
260
+ }
261
+
262
+ #[tokio::test]
263
+ async fn test_pii_input_no_pii() {
264
+ let processor = PiiInputProcessor::new();
265
+ let ctx = test_context();
266
+
267
+ // No PII should always pass
268
+ let result = processor
269
+ .process("Hello, how can I help?", &ctx)
270
+ .await
271
+ .unwrap();
272
+ assert!(result.should_proceed());
273
+ }
274
+ }