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,43 @@
1
+ //! Streaming Protection Layer
2
+ //!
3
+ //! Output processors that run AFTER kernel execution, BEFORE storage/streaming.
4
+ //!
5
+ //! ## Architecture
6
+ //!
7
+ //! This module implements the protection layer from [17-GUARDRAILS-PROTECTION.md].
8
+ //! All observability data passes through this layer before storage or transmission.
9
+ //!
10
+ //! ```text
11
+ //! ExecutionKernel
12
+ //! │
13
+ //! ▼ (StreamEvent)
14
+ //! ┌─────────────────────────────────────┐
15
+ //! │ Protection Pipeline │
16
+ //! │ ┌───────────┐ ┌────────────────┐ │
17
+ //! │ │ PII │→ │ Encryption │ │
18
+ //! │ │ Protection│ │ (storage) │ │
19
+ //! │ └───────────┘ └────────────────┘ │
20
+ //! └─────────────────────────────────────┘
21
+ //! │ │
22
+ //! ▼ (masked) ▼ (encrypted)
23
+ //! SSE/GUI EventStore
24
+ //! ```
25
+ //!
26
+ //! ## Key Invariants
27
+ //!
28
+ //! - **No raw PII to frontend**: Kernel never emits raw PII to frontend-visible channels
29
+ //! - **Protection before storage**: All events pass through protection before storage
30
+ //! - **Streaming is read-only**: Processors transform payloads, don't mutate state
31
+ //!
32
+ //! @see docs/TECHNICAL/17-GUARDRAILS-PROTECTION.md
33
+ //! @see docs/TECHNICAL/25-STREAM-PROCESSORS.md
34
+
35
+ mod context;
36
+ mod encryption;
37
+ mod pii_protection;
38
+ mod processor;
39
+
40
+ pub use context::{DataDestination, ProtectionContext};
41
+ pub use encryption::EncryptionProcessor;
42
+ pub use pii_protection::PiiProtectionProcessor;
43
+ pub use processor::{OutputProcessor, ProcessedEvent, ProcessorPipeline};
@@ -0,0 +1,243 @@
1
+ //! PII Protection Processor
2
+ //!
3
+ //! Masks PII in stream events before storage or streaming to frontend.
4
+ //! Uses `enact-guardrails` for detection and redaction.
5
+
6
+ use super::context::{DataDestination, ProtectionContext};
7
+ use super::processor::{OutputProcessor, ProcessedEvent};
8
+ use crate::streaming::StreamEvent;
9
+ use async_trait::async_trait;
10
+
11
+ #[cfg(feature = "guardrails")]
12
+ use enact_guardrails::{PiiDetector, PiiRedactor};
13
+
14
+ /// PII Protection Processor
15
+ ///
16
+ /// Detects and masks PII in event payloads based on destination:
17
+ /// - Stream (frontend): Always mask
18
+ /// - Storage: Mask + optionally encrypt (future)
19
+ /// - Log: Hash sensitive fields
20
+ /// - AuditExport: Mask for external, allow for internal
21
+ pub struct PiiProtectionProcessor {
22
+ #[cfg(feature = "guardrails")]
23
+ detector: PiiDetector,
24
+ }
25
+
26
+ impl PiiProtectionProcessor {
27
+ /// Create a new PII protection processor
28
+ #[cfg(feature = "guardrails")]
29
+ pub fn new() -> Self {
30
+ Self {
31
+ detector: PiiDetector::new(),
32
+ }
33
+ }
34
+
35
+ /// Create a new PII protection processor (no-op when guardrails feature disabled)
36
+ #[cfg(not(feature = "guardrails"))]
37
+ pub fn new() -> Self {
38
+ Self {}
39
+ }
40
+
41
+ /// Mask PII in a text field
42
+ #[cfg(feature = "guardrails")]
43
+ fn mask_text(&self, text: &str) -> (String, bool) {
44
+ let matches = self.detector.detect(text);
45
+ if matches.is_empty() {
46
+ (text.to_string(), false)
47
+ } else {
48
+ (PiiRedactor::redact_matches(text, &matches), true)
49
+ }
50
+ }
51
+
52
+ /// Mask PII in a text field (no-op when guardrails disabled)
53
+ #[cfg(not(feature = "guardrails"))]
54
+ fn mask_text(&self, text: &str) -> (String, bool) {
55
+ (text.to_string(), false)
56
+ }
57
+
58
+ /// Process a StreamEvent, masking any PII in text fields
59
+ fn mask_event(&self, event: StreamEvent, ctx: &ProtectionContext) -> ProcessedEvent {
60
+ // For internal audit exports, don't mask (they need full access)
61
+ if ctx.destination == DataDestination::AuditExport && ctx.is_internal_audit {
62
+ return ProcessedEvent::unchanged(event);
63
+ }
64
+
65
+ match event {
66
+ StreamEvent::TextDelta { id, delta } => {
67
+ let (masked_delta, was_modified) = self.mask_text(&delta);
68
+ if was_modified {
69
+ ProcessedEvent::modified(StreamEvent::TextDelta {
70
+ id,
71
+ delta: masked_delta,
72
+ })
73
+ } else {
74
+ ProcessedEvent::unchanged(StreamEvent::TextDelta { id, delta })
75
+ }
76
+ }
77
+ StreamEvent::StepEnd {
78
+ execution_id,
79
+ step_id,
80
+ output,
81
+ duration_ms,
82
+ timestamp,
83
+ } => {
84
+ let (masked_output, was_modified) = match output {
85
+ Some(ref text) => {
86
+ let (masked, modified) = self.mask_text(text);
87
+ (Some(masked), modified)
88
+ }
89
+ None => (None, false),
90
+ };
91
+ if was_modified {
92
+ ProcessedEvent::modified(StreamEvent::StepEnd {
93
+ execution_id,
94
+ step_id,
95
+ output: masked_output,
96
+ duration_ms,
97
+ timestamp,
98
+ })
99
+ } else {
100
+ ProcessedEvent::unchanged(StreamEvent::StepEnd {
101
+ execution_id,
102
+ step_id,
103
+ output,
104
+ duration_ms,
105
+ timestamp,
106
+ })
107
+ }
108
+ }
109
+ StreamEvent::ExecutionEnd {
110
+ execution_id,
111
+ final_output,
112
+ duration_ms,
113
+ timestamp,
114
+ } => {
115
+ let (masked_output, was_modified) = match final_output {
116
+ Some(ref text) => {
117
+ let (masked, modified) = self.mask_text(text);
118
+ (Some(masked), modified)
119
+ }
120
+ None => (None, false),
121
+ };
122
+ if was_modified {
123
+ ProcessedEvent::modified(StreamEvent::ExecutionEnd {
124
+ execution_id,
125
+ final_output: masked_output,
126
+ duration_ms,
127
+ timestamp,
128
+ })
129
+ } else {
130
+ ProcessedEvent::unchanged(StreamEvent::ExecutionEnd {
131
+ execution_id,
132
+ final_output,
133
+ duration_ms,
134
+ timestamp,
135
+ })
136
+ }
137
+ }
138
+ StreamEvent::Error { error } => {
139
+ // Mask error messages - they might contain PII
140
+ let (masked_message, was_modified) = self.mask_text(&error.message);
141
+ if was_modified {
142
+ let mut masked_error = error.clone();
143
+ masked_error.message = masked_message;
144
+ ProcessedEvent::modified(StreamEvent::Error {
145
+ error: masked_error,
146
+ })
147
+ } else {
148
+ ProcessedEvent::unchanged(StreamEvent::Error { error })
149
+ }
150
+ }
151
+ // Events without text content pass through unchanged
152
+ _ => ProcessedEvent::unchanged(event),
153
+ }
154
+ }
155
+ }
156
+
157
+ impl Default for PiiProtectionProcessor {
158
+ fn default() -> Self {
159
+ Self::new()
160
+ }
161
+ }
162
+
163
+ #[async_trait]
164
+ impl OutputProcessor for PiiProtectionProcessor {
165
+ fn name(&self) -> &str {
166
+ "pii-protection"
167
+ }
168
+
169
+ async fn process(
170
+ &self,
171
+ event: StreamEvent,
172
+ ctx: &ProtectionContext,
173
+ ) -> anyhow::Result<ProcessedEvent> {
174
+ Ok(self.mask_event(event, ctx))
175
+ }
176
+ }
177
+
178
+ #[cfg(test)]
179
+ mod tests {
180
+ use super::*;
181
+ use crate::kernel::ExecutionId;
182
+
183
+ #[tokio::test]
184
+ async fn test_pii_protection_processor_name() {
185
+ let processor = PiiProtectionProcessor::new();
186
+ assert_eq!(processor.name(), "pii-protection");
187
+ }
188
+
189
+ #[cfg(feature = "guardrails")]
190
+ #[tokio::test]
191
+ async fn test_pii_protection_masks_email_in_text_delta() {
192
+ let processor = PiiProtectionProcessor::new();
193
+ let ctx = ProtectionContext::for_stream();
194
+
195
+ let event = StreamEvent::TextDelta {
196
+ id: "test".to_string(),
197
+ delta: "Contact me at user@example.com".to_string(),
198
+ };
199
+
200
+ let result = processor.process(event, &ctx).await.unwrap();
201
+ assert!(result.was_modified);
202
+
203
+ if let StreamEvent::TextDelta { delta, .. } = result.event {
204
+ assert!(delta.contains("us***@example.com"));
205
+ assert!(!delta.contains("user@example.com"));
206
+ } else {
207
+ panic!("Expected TextDelta event");
208
+ }
209
+ }
210
+
211
+ #[cfg(feature = "guardrails")]
212
+ #[tokio::test]
213
+ async fn test_pii_protection_skips_internal_audit() {
214
+ let processor = PiiProtectionProcessor::new();
215
+ let ctx = ProtectionContext::for_audit(true); // internal audit
216
+
217
+ let event = StreamEvent::TextDelta {
218
+ id: "test".to_string(),
219
+ delta: "Contact me at user@example.com".to_string(),
220
+ };
221
+
222
+ let result = processor.process(event, &ctx).await.unwrap();
223
+ // Internal audit should NOT mask
224
+ assert!(!result.was_modified);
225
+
226
+ if let StreamEvent::TextDelta { delta, .. } = result.event {
227
+ assert!(delta.contains("user@example.com")); // unmasked
228
+ }
229
+ }
230
+
231
+ #[tokio::test]
232
+ async fn test_pii_protection_unchanged_event() {
233
+ let processor = PiiProtectionProcessor::new();
234
+ let ctx = ProtectionContext::for_stream();
235
+
236
+ // Events without text content pass through unchanged
237
+ let exec_id = ExecutionId::new();
238
+ let event = StreamEvent::execution_start(&exec_id);
239
+
240
+ let result = processor.process(event, &ctx).await.unwrap();
241
+ assert!(!result.was_modified);
242
+ }
243
+ }
@@ -0,0 +1,166 @@
1
+ //! Output Processor Trait
2
+ //!
3
+ //! Defines the trait for output processors that transform events before
4
+ //! storage or streaming.
5
+
6
+ use super::context::ProtectionContext;
7
+ use crate::streaming::StreamEvent;
8
+ use async_trait::async_trait;
9
+ use std::sync::Arc;
10
+
11
+ /// Result of processing an event
12
+ #[derive(Debug, Clone)]
13
+ pub struct ProcessedEvent {
14
+ /// The processed event (may be transformed)
15
+ pub event: StreamEvent,
16
+
17
+ /// Whether the event was modified
18
+ pub was_modified: bool,
19
+
20
+ /// Optional: encrypted payload for storage (if applicable)
21
+ pub encrypted_payload: Option<String>,
22
+ }
23
+
24
+ impl ProcessedEvent {
25
+ /// Create a processed event that was not modified
26
+ pub fn unchanged(event: StreamEvent) -> Self {
27
+ Self {
28
+ event,
29
+ was_modified: false,
30
+ encrypted_payload: None,
31
+ }
32
+ }
33
+
34
+ /// Create a processed event that was modified
35
+ pub fn modified(event: StreamEvent) -> Self {
36
+ Self {
37
+ event,
38
+ was_modified: true,
39
+ encrypted_payload: None,
40
+ }
41
+ }
42
+
43
+ /// Add an encrypted payload (for storage destination)
44
+ pub fn with_encrypted(mut self, encrypted: String) -> Self {
45
+ self.encrypted_payload = Some(encrypted);
46
+ self
47
+ }
48
+ }
49
+
50
+ /// Output Processor trait
51
+ ///
52
+ /// Processors run AFTER kernel execution, BEFORE storage/streaming.
53
+ /// They MUST NOT mutate execution state (streaming is read-only).
54
+ #[async_trait]
55
+ pub trait OutputProcessor: Send + Sync {
56
+ /// Processor name for logging/metrics
57
+ fn name(&self) -> &str;
58
+
59
+ /// Process an event before storage/streaming
60
+ ///
61
+ /// # Arguments
62
+ /// * `event` - The event to process
63
+ /// * `ctx` - Protection context (destination, tenant, etc.)
64
+ ///
65
+ /// # Returns
66
+ /// The processed event, potentially transformed
67
+ async fn process(
68
+ &self,
69
+ event: StreamEvent,
70
+ ctx: &ProtectionContext,
71
+ ) -> anyhow::Result<ProcessedEvent>;
72
+ }
73
+
74
+ /// Processor Pipeline - chains multiple processors
75
+ pub struct ProcessorPipeline {
76
+ processors: Vec<Arc<dyn OutputProcessor>>,
77
+ }
78
+
79
+ impl ProcessorPipeline {
80
+ /// Create a new empty pipeline
81
+ pub fn new() -> Self {
82
+ Self { processors: vec![] }
83
+ }
84
+
85
+ /// Add a processor to the pipeline
86
+ pub fn add(mut self, processor: Arc<dyn OutputProcessor>) -> Self {
87
+ self.processors.push(processor);
88
+ self
89
+ }
90
+
91
+ /// Run all processors in sequence
92
+ pub async fn process(
93
+ &self,
94
+ event: StreamEvent,
95
+ ctx: &ProtectionContext,
96
+ ) -> anyhow::Result<ProcessedEvent> {
97
+ let mut current_event = event;
98
+ let mut any_modified = false;
99
+ let mut encrypted_payload = None;
100
+
101
+ for processor in &self.processors {
102
+ let result = processor.process(current_event, ctx).await?;
103
+ any_modified = any_modified || result.was_modified;
104
+ encrypted_payload = result.encrypted_payload.or(encrypted_payload);
105
+ current_event = result.event;
106
+ }
107
+
108
+ Ok(ProcessedEvent {
109
+ event: current_event,
110
+ was_modified: any_modified,
111
+ encrypted_payload,
112
+ })
113
+ }
114
+
115
+ /// Check if the pipeline is empty
116
+ pub fn is_empty(&self) -> bool {
117
+ self.processors.is_empty()
118
+ }
119
+
120
+ /// Get the number of processors
121
+ pub fn len(&self) -> usize {
122
+ self.processors.len()
123
+ }
124
+ }
125
+
126
+ impl Default for ProcessorPipeline {
127
+ fn default() -> Self {
128
+ Self::new()
129
+ }
130
+ }
131
+
132
+ #[cfg(test)]
133
+ mod tests {
134
+ use super::*;
135
+
136
+ #[test]
137
+ fn test_processed_event_unchanged() {
138
+ let event = StreamEvent::text_start(None);
139
+ let processed = ProcessedEvent::unchanged(event);
140
+ assert!(!processed.was_modified);
141
+ assert!(processed.encrypted_payload.is_none());
142
+ }
143
+
144
+ #[test]
145
+ fn test_processed_event_modified() {
146
+ let event = StreamEvent::text_start(None);
147
+ let processed = ProcessedEvent::modified(event);
148
+ assert!(processed.was_modified);
149
+ }
150
+
151
+ #[test]
152
+ fn test_processed_event_with_encrypted() {
153
+ let event = StreamEvent::text_start(None);
154
+ let processed =
155
+ ProcessedEvent::modified(event).with_encrypted("encrypted_data".to_string());
156
+ assert!(processed.encrypted_payload.is_some());
157
+ assert_eq!(processed.encrypted_payload.unwrap(), "encrypted_data");
158
+ }
159
+
160
+ #[test]
161
+ fn test_pipeline_new() {
162
+ let pipeline = ProcessorPipeline::new();
163
+ assert!(pipeline.is_empty());
164
+ assert_eq!(pipeline.len(), 0);
165
+ }
166
+ }
File without changes
File without changes
File without changes
@@ -0,0 +1,49 @@
1
+ //! Telemetry module - OpenTelemetry integration
2
+ //!
3
+ //! This module bridges core execution IDs and events into OpenTelemetry spans/traces.
4
+ //!
5
+ //! ## Important: Source of Truth
6
+ //!
7
+ //! IDs and Events are DEFINED in `kernel/` (source of truth).
8
+ //! This module bridges them into OpenTelemetry spans/traces.
9
+ //! No new domain types defined here.
10
+ //!
11
+ //! ## What This Module Provides
12
+ //!
13
+ //! - **Span attribute types**: ExecutionSpanAttributes, StepSpanAttributes, etc.
14
+ //! - **Span name generators**: execution_span_name, step_span_name, etc.
15
+ //! - **Trace context extraction**: extract_trace_context
16
+ //!
17
+ //! ## Architecture
18
+ //!
19
+ //! ```text
20
+ //! kernel/ (source of truth)
21
+ //! │
22
+ //! │ IDs and Events
23
+ //! ▼
24
+ //! ┌─────────────────────────────────────────────────────────┐
25
+ //! │ telemetry/ │
26
+ //! │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
27
+ //! │ │ spans │ │ exporter │ │ init │ │
28
+ //! │ │(attributes)│ │ (OTel) │ │ (setup) │ │
29
+ //! │ └────────────┘ └────────────┘ └────────────┘ │
30
+ //! └────────────────────────────┬────────────────────────────┘
31
+ //! │
32
+ //! ▼
33
+ //! OpenTelemetry Collector
34
+ //! ```
35
+ //!
36
+ //! @see docs/TECHNICAL/01-EXECUTION-TELEMETRY.md
37
+
38
+ mod exporter;
39
+ mod init;
40
+ mod spans;
41
+
42
+ pub use spans::{
43
+ // Span attribute types
44
+ ExecutionSpanAttributes, LlmSpanAttributes, StepSpanAttributes, ToolSpanAttributes,
45
+ // Span name generators
46
+ execution_span_name, llm_span_name, step_span_name, tool_span_name,
47
+ // Trace utilities
48
+ extract_trace_context,
49
+ };