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,407 @@
1
+ //! Tool Policy - Permissions and trust levels for tools
2
+
3
+ use super::{PolicyAction, PolicyContext, PolicyDecision, PolicyEvaluator};
4
+ use serde::{Deserialize, Serialize};
5
+ use std::collections::HashSet;
6
+
7
+ /// Tool trust level
8
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
9
+ pub enum ToolTrustLevel {
10
+ /// Untrusted - requires explicit approval for each invocation
11
+ Untrusted = 0,
12
+ /// Low - limited permissions, sandboxed
13
+ Low = 1,
14
+ /// Medium - standard permissions
15
+ Medium = 2,
16
+ /// High - elevated permissions
17
+ High = 3,
18
+ /// System - full system access (dangerous)
19
+ System = 4,
20
+ }
21
+
22
+ impl Default for ToolTrustLevel {
23
+ fn default() -> Self {
24
+ ToolTrustLevel::Medium
25
+ }
26
+ }
27
+
28
+ /// Tool permissions
29
+ #[derive(Debug, Clone, Serialize, Deserialize, Default)]
30
+ pub struct ToolPermissions {
31
+ /// Can access network
32
+ pub network_access: bool,
33
+ /// Can access filesystem
34
+ pub filesystem_access: bool,
35
+ /// Can access filesystem (write)
36
+ pub filesystem_write: bool,
37
+ /// Can access environment variables
38
+ pub env_access: bool,
39
+ /// Can execute subprocesses
40
+ pub subprocess_access: bool,
41
+ /// Can access PII data
42
+ pub pii_access: bool,
43
+ /// Allowed domains (if network_access is true)
44
+ pub allowed_domains: HashSet<String>,
45
+ /// Allowed paths (if filesystem_access is true)
46
+ pub allowed_paths: HashSet<String>,
47
+ }
48
+
49
+ impl ToolPermissions {
50
+ /// Create permissions for a sandboxed tool
51
+ pub fn sandboxed() -> Self {
52
+ Self {
53
+ network_access: false,
54
+ filesystem_access: false,
55
+ filesystem_write: false,
56
+ env_access: false,
57
+ subprocess_access: false,
58
+ pii_access: false,
59
+ allowed_domains: HashSet::new(),
60
+ allowed_paths: HashSet::new(),
61
+ }
62
+ }
63
+
64
+ /// Create permissions for a network tool
65
+ pub fn network_only() -> Self {
66
+ Self {
67
+ network_access: true,
68
+ filesystem_access: false,
69
+ filesystem_write: false,
70
+ env_access: false,
71
+ subprocess_access: false,
72
+ pii_access: false,
73
+ allowed_domains: HashSet::new(),
74
+ allowed_paths: HashSet::new(),
75
+ }
76
+ }
77
+
78
+ /// Create full permissions (dangerous)
79
+ pub fn full() -> Self {
80
+ Self {
81
+ network_access: true,
82
+ filesystem_access: true,
83
+ filesystem_write: true,
84
+ env_access: true,
85
+ subprocess_access: true,
86
+ pii_access: true,
87
+ allowed_domains: HashSet::new(),
88
+ allowed_paths: HashSet::new(),
89
+ }
90
+ }
91
+
92
+ /// Add an allowed domain
93
+ pub fn allow_domain(mut self, domain: impl Into<String>) -> Self {
94
+ self.allowed_domains.insert(domain.into());
95
+ self
96
+ }
97
+
98
+ /// Add an allowed path
99
+ pub fn allow_path(mut self, path: impl Into<String>) -> Self {
100
+ self.allowed_paths.insert(path.into());
101
+ self
102
+ }
103
+ }
104
+
105
+ /// Tool policy
106
+ #[derive(Debug, Clone)]
107
+ pub struct ToolPolicy {
108
+ /// Default permissions for all tools
109
+ pub default_permissions: ToolPermissions,
110
+ /// Tool-specific permissions (overrides default)
111
+ pub tool_permissions: std::collections::HashMap<String, ToolPermissions>,
112
+ /// Tool trust levels
113
+ pub tool_trust: std::collections::HashMap<String, ToolTrustLevel>,
114
+ /// Minimum trust level required
115
+ pub min_trust_level: ToolTrustLevel,
116
+ /// Blocked tools
117
+ pub blocked_tools: HashSet<String>,
118
+ }
119
+
120
+ impl Default for ToolPolicy {
121
+ fn default() -> Self {
122
+ Self {
123
+ default_permissions: ToolPermissions::sandboxed(),
124
+ tool_permissions: std::collections::HashMap::new(),
125
+ tool_trust: std::collections::HashMap::new(),
126
+ min_trust_level: ToolTrustLevel::Low,
127
+ blocked_tools: HashSet::new(),
128
+ }
129
+ }
130
+ }
131
+
132
+ impl ToolPolicy {
133
+ /// Create a new tool policy
134
+ pub fn new() -> Self {
135
+ Self::default()
136
+ }
137
+
138
+ /// Set default permissions
139
+ pub fn with_default_permissions(mut self, perms: ToolPermissions) -> Self {
140
+ self.default_permissions = perms;
141
+ self
142
+ }
143
+
144
+ /// Set permissions for a specific tool
145
+ pub fn set_tool_permissions(
146
+ mut self,
147
+ tool: impl Into<String>,
148
+ perms: ToolPermissions,
149
+ ) -> Self {
150
+ self.tool_permissions.insert(tool.into(), perms);
151
+ self
152
+ }
153
+
154
+ /// Set trust level for a specific tool
155
+ pub fn set_tool_trust(mut self, tool: impl Into<String>, level: ToolTrustLevel) -> Self {
156
+ self.tool_trust.insert(tool.into(), level);
157
+ self
158
+ }
159
+
160
+ /// Block a tool
161
+ pub fn block_tool(mut self, tool: impl Into<String>) -> Self {
162
+ self.blocked_tools.insert(tool.into());
163
+ self
164
+ }
165
+
166
+ /// Get permissions for a tool
167
+ pub fn get_permissions(&self, tool_name: &str) -> &ToolPermissions {
168
+ self.tool_permissions
169
+ .get(tool_name)
170
+ .unwrap_or(&self.default_permissions)
171
+ }
172
+
173
+ /// Get trust level for a tool
174
+ pub fn get_trust_level(&self, tool_name: &str) -> ToolTrustLevel {
175
+ self.tool_trust
176
+ .get(tool_name)
177
+ .copied()
178
+ .unwrap_or(ToolTrustLevel::Medium)
179
+ }
180
+ }
181
+
182
+ impl PolicyEvaluator for ToolPolicy {
183
+ fn evaluate(&self, context: &PolicyContext) -> PolicyDecision {
184
+ match &context.action {
185
+ PolicyAction::InvokeTool { tool_name } => {
186
+ // Check if tool is blocked
187
+ if self.blocked_tools.contains(tool_name) {
188
+ return PolicyDecision::Deny {
189
+ reason: format!("Tool '{}' is blocked by policy", tool_name),
190
+ };
191
+ }
192
+
193
+ // Check trust level
194
+ let trust = self.get_trust_level(tool_name);
195
+ if trust < self.min_trust_level {
196
+ return PolicyDecision::Deny {
197
+ reason: format!(
198
+ "Tool '{}' trust level {:?} is below minimum {:?}",
199
+ tool_name, trust, self.min_trust_level
200
+ ),
201
+ };
202
+ }
203
+
204
+ PolicyDecision::Allow
205
+ }
206
+ _ => PolicyDecision::Allow,
207
+ }
208
+ }
209
+ }
210
+
211
+ #[cfg(test)]
212
+ mod tests {
213
+ use super::*;
214
+ use std::collections::HashMap;
215
+
216
+ // ============ ToolTrustLevel Tests ============
217
+
218
+ #[test]
219
+ fn test_tool_trust_level_ordering() {
220
+ assert!(ToolTrustLevel::Untrusted < ToolTrustLevel::Low);
221
+ assert!(ToolTrustLevel::Low < ToolTrustLevel::Medium);
222
+ assert!(ToolTrustLevel::Medium < ToolTrustLevel::High);
223
+ assert!(ToolTrustLevel::High < ToolTrustLevel::System);
224
+ }
225
+
226
+ #[test]
227
+ fn test_tool_trust_level_default() {
228
+ assert_eq!(ToolTrustLevel::default(), ToolTrustLevel::Medium);
229
+ }
230
+
231
+ // ============ ToolPermissions Tests ============
232
+
233
+ #[test]
234
+ fn test_tool_permissions_default() {
235
+ let perms = ToolPermissions::default();
236
+ assert!(!perms.network_access);
237
+ assert!(!perms.filesystem_access);
238
+ assert!(!perms.filesystem_write);
239
+ assert!(!perms.env_access);
240
+ assert!(!perms.subprocess_access);
241
+ assert!(!perms.pii_access);
242
+ }
243
+
244
+ #[test]
245
+ fn test_tool_permissions_sandboxed() {
246
+ let perms = ToolPermissions::sandboxed();
247
+ assert!(!perms.network_access);
248
+ assert!(!perms.filesystem_access);
249
+ assert!(!perms.filesystem_write);
250
+ assert!(!perms.env_access);
251
+ assert!(!perms.subprocess_access);
252
+ assert!(!perms.pii_access);
253
+ assert!(perms.allowed_domains.is_empty());
254
+ assert!(perms.allowed_paths.is_empty());
255
+ }
256
+
257
+ #[test]
258
+ fn test_tool_permissions_network_only() {
259
+ let perms = ToolPermissions::network_only();
260
+ assert!(perms.network_access);
261
+ assert!(!perms.filesystem_access);
262
+ assert!(!perms.subprocess_access);
263
+ }
264
+
265
+ #[test]
266
+ fn test_tool_permissions_full() {
267
+ let perms = ToolPermissions::full();
268
+ assert!(perms.network_access);
269
+ assert!(perms.filesystem_access);
270
+ assert!(perms.filesystem_write);
271
+ assert!(perms.env_access);
272
+ assert!(perms.subprocess_access);
273
+ assert!(perms.pii_access);
274
+ }
275
+
276
+ #[test]
277
+ fn test_tool_permissions_allow_domain() {
278
+ let perms = ToolPermissions::network_only()
279
+ .allow_domain("api.example.com")
280
+ .allow_domain("cdn.example.com");
281
+
282
+ assert!(perms.allowed_domains.contains("api.example.com"));
283
+ assert!(perms.allowed_domains.contains("cdn.example.com"));
284
+ assert_eq!(perms.allowed_domains.len(), 2);
285
+ }
286
+
287
+ #[test]
288
+ fn test_tool_permissions_allow_path() {
289
+ let perms = ToolPermissions::sandboxed()
290
+ .allow_path("/tmp")
291
+ .allow_path("/var/data");
292
+
293
+ assert!(perms.allowed_paths.contains("/tmp"));
294
+ assert!(perms.allowed_paths.contains("/var/data"));
295
+ }
296
+
297
+ // ============ ToolPolicy Tests ============
298
+
299
+ #[test]
300
+ fn test_tool_policy_default() {
301
+ let policy = ToolPolicy::default();
302
+ assert_eq!(policy.min_trust_level, ToolTrustLevel::Low);
303
+ assert!(policy.blocked_tools.is_empty());
304
+ }
305
+
306
+ #[test]
307
+ fn test_tool_policy_with_default_permissions() {
308
+ let policy = ToolPolicy::new().with_default_permissions(ToolPermissions::network_only());
309
+ assert!(policy.default_permissions.network_access);
310
+ }
311
+
312
+ #[test]
313
+ fn test_tool_policy_set_tool_permissions() {
314
+ let policy = ToolPolicy::new()
315
+ .set_tool_permissions("web_search", ToolPermissions::network_only());
316
+
317
+ let perms = policy.get_permissions("web_search");
318
+ assert!(perms.network_access);
319
+
320
+ // Other tools get default
321
+ let default_perms = policy.get_permissions("other_tool");
322
+ assert!(!default_perms.network_access);
323
+ }
324
+
325
+ #[test]
326
+ fn test_tool_policy_set_tool_trust() {
327
+ let policy = ToolPolicy::new()
328
+ .set_tool_trust("trusted_tool", ToolTrustLevel::High)
329
+ .set_tool_trust("untrusted_tool", ToolTrustLevel::Untrusted);
330
+
331
+ assert_eq!(policy.get_trust_level("trusted_tool"), ToolTrustLevel::High);
332
+ assert_eq!(policy.get_trust_level("untrusted_tool"), ToolTrustLevel::Untrusted);
333
+ assert_eq!(policy.get_trust_level("unknown_tool"), ToolTrustLevel::Medium); // default
334
+ }
335
+
336
+ #[test]
337
+ fn test_tool_policy_block_tool() {
338
+ let policy = ToolPolicy::new()
339
+ .block_tool("dangerous_tool")
340
+ .block_tool("another_dangerous");
341
+
342
+ assert!(policy.blocked_tools.contains("dangerous_tool"));
343
+ assert!(policy.blocked_tools.contains("another_dangerous"));
344
+ }
345
+
346
+ // ============ PolicyEvaluator Tests ============
347
+
348
+ #[test]
349
+ fn test_tool_policy_evaluate_allowed() {
350
+ let policy = ToolPolicy::new();
351
+ let context = PolicyContext {
352
+ tenant_id: None,
353
+ user_id: None,
354
+ action: PolicyAction::InvokeTool { tool_name: "safe_tool".to_string() },
355
+ metadata: HashMap::new(),
356
+ };
357
+
358
+ let decision = policy.evaluate(&context);
359
+ assert!(decision.is_allowed());
360
+ }
361
+
362
+ #[test]
363
+ fn test_tool_policy_evaluate_blocked() {
364
+ let policy = ToolPolicy::new().block_tool("blocked_tool");
365
+ let context = PolicyContext {
366
+ tenant_id: None,
367
+ user_id: None,
368
+ action: PolicyAction::InvokeTool { tool_name: "blocked_tool".to_string() },
369
+ metadata: HashMap::new(),
370
+ };
371
+
372
+ let decision = policy.evaluate(&context);
373
+ assert!(decision.is_denied());
374
+ }
375
+
376
+ #[test]
377
+ fn test_tool_policy_evaluate_trust_level_denied() {
378
+ let mut policy = ToolPolicy::new();
379
+ policy.min_trust_level = ToolTrustLevel::High;
380
+ let policy = policy.set_tool_trust("low_trust", ToolTrustLevel::Low);
381
+
382
+ let context = PolicyContext {
383
+ tenant_id: None,
384
+ user_id: None,
385
+ action: PolicyAction::InvokeTool { tool_name: "low_trust".to_string() },
386
+ metadata: HashMap::new(),
387
+ };
388
+
389
+ let decision = policy.evaluate(&context);
390
+ assert!(decision.is_denied());
391
+ }
392
+
393
+ #[test]
394
+ fn test_tool_policy_evaluate_non_tool_action_allowed() {
395
+ let policy = ToolPolicy::new().block_tool("some_tool");
396
+ let context = PolicyContext {
397
+ tenant_id: None,
398
+ user_id: None,
399
+ action: PolicyAction::LlmCall { model: "gpt-4".to_string() },
400
+ metadata: HashMap::new(),
401
+ };
402
+
403
+ // Non-tool actions are allowed by ToolPolicy
404
+ let decision = policy.evaluate(&context);
405
+ assert!(decision.is_allowed());
406
+ }
407
+ }
@@ -0,0 +1,63 @@
1
+ //! Providers module - LLM adapters
2
+ //!
3
+ //! This module defines the `ModelProvider` trait and types. Provider implementations
4
+ //! are in the `enact-providers` crate to enable independent release cadence.
5
+ //!
6
+ //! Providers are thin HTTP adapters that translate between the `ModelProvider` trait
7
+ //! and external LLM APIs. They are replaceable and side-effect free outside HTTP calls.
8
+ //!
9
+ //! All retries, rate limiting, and quotas are enforced by the kernel, not by providers.
10
+ //!
11
+ //! ## CRITICAL: Provider Module Scope & Crate Boundaries
12
+ //!
13
+ //! **Crate Structure:**
14
+ //! - This module (`enact-core::providers`) contains only the trait and types
15
+ //! - Provider implementations are in `enact-providers` crate
16
+ //! - Dependency direction: `enact-providers` → `enact-core` (one-way, no circular deps)
17
+ //! - `enact-core` must NEVER depend on `enact-providers`
18
+ //!
19
+ //! **Import Boundaries:**
20
+ //! - `enact-providers` MUST NOT import from `enact_core::kernel`, `enact_core::flow`, or `enact_core::policy`
21
+ //! - Providers should only see:
22
+ //! - `ChatRequest` / `ChatResponse` (from `enact_core::providers`)
23
+ //! - `EmbeddingRequest` / `EmbeddingResponse` (from `enact_core::providers`)
24
+ //! - Tool schemas (read-only)
25
+ //! - HTTP helper utilities (in `enact-providers` itself)
26
+ //!
27
+ //! If providers import forbidden modules, they will slowly grow "smart" and
28
+ //! violate the "replaceable adapter" principle.
29
+ //!
30
+ //! **Enforcement**: If you find yourself needing kernel/flow/policy types in
31
+ //! provider code, you are violating this invariant. Move that logic to the kernel.
32
+ //!
33
+ //! ## Usage
34
+ //!
35
+ //! To use provider implementations, depend on `enact-providers`:
36
+ //!
37
+ //! ```toml
38
+ //! [dependencies]
39
+ //! enact-core = { workspace = true }
40
+ //! enact-providers = { workspace = true, features = ["provider-azure"] }
41
+ //! ```
42
+ //!
43
+ //! Then import:
44
+ //!
45
+ //! ```rust,ignore
46
+ //! use enact_core::providers::ModelProvider; // Trait from enact-core
47
+ //! use enact_providers::AzureOpenAI; // Implementation from enact-providers
48
+ //!
49
+ //! // Chat completion
50
+ //! let response = provider.chat(request).await?;
51
+ //!
52
+ //! // Embedding generation (if supported)
53
+ //! let embedding = provider.embed(embedding_request).await?;
54
+ //! ```
55
+
56
+ mod r#trait;
57
+
58
+ // Re-export trait and types
59
+ pub use r#trait::{
60
+ ChatChoice, ChatMessage, ChatRequest, ChatResponse, ChatUsage,
61
+ EmbeddingData, EmbeddingRequest, EmbeddingResponse, EmbeddingUsage,
62
+ ModelCapabilities, ModelProvider,
63
+ };