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,99 @@
1
+ //! Invocation Context - Context for agent/tool invocation
2
+ //!
3
+ //! Extends RuntimeContext with invocation-specific fields like input
4
+ //! and available services.
5
+
6
+ use super::execution_context::RuntimeContext;
7
+ use crate::kernel::{ExecutionId, StepId};
8
+ use serde::{Deserialize, Serialize};
9
+
10
+ /// Services available during invocation
11
+ #[derive(Debug, Clone, Default, Serialize, Deserialize)]
12
+ pub struct InvocationServices {
13
+ /// Memory service available
14
+ pub memory: bool,
15
+ /// Artifact storage available
16
+ pub artifacts: bool,
17
+ /// Tool registry available
18
+ pub tools: bool,
19
+ }
20
+
21
+ impl InvocationServices {
22
+ /// Create with all services enabled
23
+ pub fn all() -> Self {
24
+ Self {
25
+ memory: true,
26
+ artifacts: true,
27
+ tools: true,
28
+ }
29
+ }
30
+
31
+ /// Create with no services
32
+ pub fn none() -> Self {
33
+ Self::default()
34
+ }
35
+ }
36
+
37
+ /// InvocationContext - Context for invoking an agent or tool
38
+ ///
39
+ /// Extends RuntimeContext with invocation-specific fields like input
40
+ /// and available services.
41
+ #[derive(Debug, Clone, Serialize, Deserialize)]
42
+ pub struct InvocationContext {
43
+ /// Runtime context
44
+ pub runtime: RuntimeContext,
45
+
46
+ /// Invocation input
47
+ pub input: serde_json::Value,
48
+
49
+ /// Services available to the invocation
50
+ pub services: InvocationServices,
51
+ }
52
+
53
+ impl InvocationContext {
54
+ /// Create a new InvocationContext
55
+ pub fn new(runtime: RuntimeContext, input: serde_json::Value) -> Self {
56
+ Self {
57
+ runtime,
58
+ input,
59
+ services: InvocationServices::default(),
60
+ }
61
+ }
62
+
63
+ /// Enable all services
64
+ pub fn with_all_services(mut self) -> Self {
65
+ self.services = InvocationServices::all();
66
+ self
67
+ }
68
+
69
+ /// Enable specific services
70
+ pub fn with_services(mut self, services: InvocationServices) -> Self {
71
+ self.services = services;
72
+ self
73
+ }
74
+
75
+ /// Get the execution ID
76
+ pub fn execution_id(&self) -> &ExecutionId {
77
+ &self.runtime.execution_id
78
+ }
79
+
80
+ /// Get the step ID
81
+ pub fn step_id(&self) -> Option<&StepId> {
82
+ self.runtime.step_id.as_ref()
83
+ }
84
+
85
+ /// Get the runtime context
86
+ pub fn runtime(&self) -> &RuntimeContext {
87
+ &self.runtime
88
+ }
89
+
90
+ /// Get the input
91
+ pub fn input(&self) -> &serde_json::Value {
92
+ &self.input
93
+ }
94
+
95
+ /// Get input as string (convenience method)
96
+ pub fn input_str(&self) -> Option<&str> {
97
+ self.input.as_str()
98
+ }
99
+ }
@@ -0,0 +1,50 @@
1
+ //! Context module - Execution context types
2
+ //!
3
+ //! This module provides the context types passed through all execution:
4
+ //!
5
+ //! - **TenantContext**: Multi-tenant isolation boundary (REQUIRED)
6
+ //! - **RuntimeContext**: The execution spine
7
+ //! - **TraceContext**: W3C distributed tracing
8
+ //! - **InvocationContext**: Agent/tool invocation context
9
+ //!
10
+ //! ## Key Invariant: TenantContext is Required
11
+ //!
12
+ //! Every execution MUST have a TenantContext. This ensures:
13
+ //! - Multi-tenant isolation
14
+ //! - Resource limit enforcement
15
+ //! - Audit compliance
16
+ //! - Billing attribution
17
+ //!
18
+ //! ## Usage
19
+ //! ```ignore
20
+ //! use enact_core::context::{TenantContext, RuntimeContext};
21
+ //! use enact_core::kernel::{ExecutionId, ParentLink, TenantId, UserId};
22
+ //!
23
+ //! // Create tenant context (REQUIRED)
24
+ //! let tenant = TenantContext::new(TenantId::from("tenant_acme"))
25
+ //! .with_user(UserId::from("usr_alice"));
26
+ //!
27
+ //! // Create runtime context with tenant
28
+ //! let ctx = RuntimeContext::new(
29
+ //! ExecutionId::new(),
30
+ //! ParentLink::from_user_message("msg_123"),
31
+ //! tenant,
32
+ //! );
33
+ //! ```
34
+
35
+ mod execution_context;
36
+ mod invocation;
37
+ mod tenant;
38
+ mod trace;
39
+
40
+ // Tenant context (REQUIRED for every execution)
41
+ pub use tenant::{ResourceLimits, TenantContext};
42
+
43
+ // Runtime context (the spine)
44
+ pub use execution_context::{RuntimeContext, RuntimeContextBuilder, SessionContext};
45
+
46
+ // Trace context (OpenTelemetry)
47
+ pub use trace::TraceContext;
48
+
49
+ // Invocation context
50
+ pub use invocation::{InvocationContext, InvocationServices};
@@ -0,0 +1,175 @@
1
+ //! Tenant Context - Multi-tenant isolation boundary
2
+ //!
3
+ //! TenantContext is a **required** component for every execution.
4
+ //! Every invocation must run within a tenant boundary for:
5
+ //! - Resource isolation
6
+ //! - Billing attribution
7
+ //! - Audit compliance
8
+ //! - Data segregation
9
+ //!
10
+ //! ## Usage
11
+ //! ```ignore
12
+ //! let tenant = TenantContext::new(TenantId::from("tenant_acme"))
13
+ //! .with_user(UserId::from("usr_alice"))
14
+ //! .with_limits(ResourceLimits::default());
15
+ //! ```
16
+
17
+ use crate::kernel::{TenantId, UserId};
18
+ use serde::{Deserialize, Serialize};
19
+ use std::collections::HashMap;
20
+
21
+ /// Resource limits enforced by the runtime per tenant
22
+ #[derive(Debug, Clone, Serialize, Deserialize)]
23
+ pub struct ResourceLimits {
24
+ /// Maximum number of steps in an execution
25
+ pub max_steps: u32,
26
+ /// Maximum total tokens for LLM calls
27
+ pub max_tokens: u32,
28
+ /// Maximum wall time in milliseconds
29
+ pub max_wall_time_ms: u64,
30
+ /// Maximum memory in megabytes (optional)
31
+ pub max_memory_mb: Option<u32>,
32
+ /// Maximum concurrent executions
33
+ pub max_concurrent_executions: Option<u32>,
34
+ }
35
+
36
+ impl Default for ResourceLimits {
37
+ fn default() -> Self {
38
+ Self {
39
+ max_steps: 100,
40
+ max_tokens: 100_000,
41
+ max_wall_time_ms: 300_000, // 5 minutes
42
+ max_memory_mb: None,
43
+ max_concurrent_executions: None,
44
+ }
45
+ }
46
+ }
47
+
48
+ /// TenantContext - Required context for every execution
49
+ ///
50
+ /// This is the multi-tenant isolation boundary. Every execution MUST
51
+ /// have a TenantContext with a valid TenantId.
52
+ #[derive(Debug, Clone, Serialize, Deserialize)]
53
+ pub struct TenantContext {
54
+ /// Tenant ID (REQUIRED)
55
+ pub tenant_id: TenantId,
56
+
57
+ /// User ID (optional - system executions may not have a user)
58
+ pub user_id: Option<UserId>,
59
+
60
+ /// Resource limits for this tenant
61
+ pub limits: ResourceLimits,
62
+
63
+ /// Tenant-specific feature flags
64
+ pub features: HashMap<String, bool>,
65
+
66
+ /// Tenant metadata
67
+ pub metadata: HashMap<String, serde_json::Value>,
68
+ }
69
+
70
+ impl TenantContext {
71
+ /// Create a new TenantContext (TenantId is required)
72
+ pub fn new(tenant_id: TenantId) -> Self {
73
+ Self {
74
+ tenant_id,
75
+ user_id: None,
76
+ limits: ResourceLimits::default(),
77
+ features: HashMap::new(),
78
+ metadata: HashMap::new(),
79
+ }
80
+ }
81
+
82
+ /// Add user context
83
+ pub fn with_user(mut self, user_id: UserId) -> Self {
84
+ self.user_id = Some(user_id);
85
+ self
86
+ }
87
+
88
+ /// Set resource limits
89
+ pub fn with_limits(mut self, limits: ResourceLimits) -> Self {
90
+ self.limits = limits;
91
+ self
92
+ }
93
+
94
+ /// Enable a feature flag
95
+ pub fn with_feature(mut self, feature: impl Into<String>, enabled: bool) -> Self {
96
+ self.features.insert(feature.into(), enabled);
97
+ self
98
+ }
99
+
100
+ /// Add metadata
101
+ pub fn with_metadata(mut self, key: impl Into<String>, value: serde_json::Value) -> Self {
102
+ self.metadata.insert(key.into(), value);
103
+ self
104
+ }
105
+
106
+ /// Check if a feature is enabled
107
+ pub fn is_feature_enabled(&self, feature: &str) -> bool {
108
+ self.features.get(feature).copied().unwrap_or(false)
109
+ }
110
+
111
+ /// Get the tenant ID
112
+ pub fn tenant_id(&self) -> &TenantId {
113
+ &self.tenant_id
114
+ }
115
+
116
+ /// Get the user ID
117
+ pub fn user_id(&self) -> Option<&UserId> {
118
+ self.user_id.as_ref()
119
+ }
120
+
121
+ /// Create a child TenantContext for sub-agent execution
122
+ /// (inherits tenant, limits, features but can override user)
123
+ pub fn child_context(&self, user_id: Option<UserId>) -> Self {
124
+ Self {
125
+ tenant_id: self.tenant_id.clone(),
126
+ user_id: user_id.or_else(|| self.user_id.clone()),
127
+ limits: self.limits.clone(),
128
+ features: self.features.clone(),
129
+ metadata: HashMap::new(), // Child starts fresh
130
+ }
131
+ }
132
+ }
133
+
134
+ #[cfg(test)]
135
+ mod tests {
136
+ use super::*;
137
+
138
+ #[test]
139
+ fn test_tenant_context_required_id() {
140
+ let tenant = TenantContext::new(TenantId::from("tenant_123"));
141
+ assert_eq!(tenant.tenant_id().as_str(), "tenant_123");
142
+ }
143
+
144
+ #[test]
145
+ fn test_tenant_context_with_user() {
146
+ let tenant = TenantContext::new(TenantId::from("tenant_123"))
147
+ .with_user(UserId::from("usr_456"));
148
+
149
+ assert_eq!(tenant.user_id().unwrap().as_str(), "usr_456");
150
+ }
151
+
152
+ #[test]
153
+ fn test_feature_flags() {
154
+ let tenant = TenantContext::new(TenantId::from("tenant_123"))
155
+ .with_feature("beta_tools", true)
156
+ .with_feature("experimental", false);
157
+
158
+ assert!(tenant.is_feature_enabled("beta_tools"));
159
+ assert!(!tenant.is_feature_enabled("experimental"));
160
+ assert!(!tenant.is_feature_enabled("nonexistent"));
161
+ }
162
+
163
+ #[test]
164
+ fn test_child_context() {
165
+ let parent = TenantContext::new(TenantId::from("tenant_123"))
166
+ .with_user(UserId::from("usr_456"))
167
+ .with_feature("beta", true);
168
+
169
+ let child = parent.child_context(Some(UserId::from("usr_789")));
170
+
171
+ assert_eq!(child.tenant_id().as_str(), "tenant_123");
172
+ assert_eq!(child.user_id().unwrap().as_str(), "usr_789");
173
+ assert!(child.is_feature_enabled("beta"));
174
+ }
175
+ }
@@ -0,0 +1,127 @@
1
+ //! Trace Context - W3C Trace Context for distributed tracing
2
+ //!
3
+ //! Implements W3C Trace Context propagation for OpenTelemetry integration.
4
+ //!
5
+ //! @see https://www.w3.org/TR/trace-context/
6
+
7
+ use serde::{Deserialize, Serialize};
8
+
9
+ /// TraceContext - W3C Trace Context for distributed tracing
10
+ #[derive(Debug, Clone, Serialize, Deserialize)]
11
+ pub struct TraceContext {
12
+ /// Trace ID (32 hex chars)
13
+ pub trace_id: String,
14
+ /// Span ID (16 hex chars)
15
+ pub span_id: String,
16
+ /// Sampling flags
17
+ pub trace_flags: Option<u8>,
18
+ /// Vendor-specific state
19
+ pub trace_state: Option<String>,
20
+ }
21
+
22
+ impl TraceContext {
23
+ /// Create a new TraceContext with generated IDs
24
+ pub fn new() -> Self {
25
+ Self {
26
+ trace_id: Self::generate_trace_id(),
27
+ span_id: Self::generate_span_id(),
28
+ trace_flags: Some(1), // sampled
29
+ trace_state: None,
30
+ }
31
+ }
32
+
33
+ /// Create a child span context (same trace, new span)
34
+ pub fn child_span(&self) -> Self {
35
+ Self {
36
+ trace_id: self.trace_id.clone(),
37
+ span_id: Self::generate_span_id(),
38
+ trace_flags: self.trace_flags,
39
+ trace_state: self.trace_state.clone(),
40
+ }
41
+ }
42
+
43
+ /// Parse from W3C traceparent header
44
+ pub fn from_traceparent(header: &str) -> Option<Self> {
45
+ let parts: Vec<&str> = header.split('-').collect();
46
+ if parts.len() >= 3 {
47
+ Some(Self {
48
+ trace_id: parts[1].to_string(),
49
+ span_id: parts[2].to_string(),
50
+ trace_flags: parts.get(3).and_then(|f| u8::from_str_radix(f, 16).ok()),
51
+ trace_state: None,
52
+ })
53
+ } else {
54
+ None
55
+ }
56
+ }
57
+
58
+ /// Format as W3C traceparent header
59
+ pub fn to_traceparent(&self) -> String {
60
+ format!(
61
+ "00-{}-{}-{:02x}",
62
+ self.trace_id,
63
+ self.span_id,
64
+ self.trace_flags.unwrap_or(0)
65
+ )
66
+ }
67
+
68
+ fn generate_trace_id() -> String {
69
+ use std::time::{SystemTime, UNIX_EPOCH};
70
+ let now = SystemTime::now()
71
+ .duration_since(UNIX_EPOCH)
72
+ .unwrap()
73
+ .as_nanos();
74
+ format!("{:032x}", now)
75
+ }
76
+
77
+ fn generate_span_id() -> String {
78
+ use std::time::{SystemTime, UNIX_EPOCH};
79
+ use std::sync::atomic::{AtomicU64, Ordering};
80
+ static COUNTER: AtomicU64 = AtomicU64::new(0);
81
+
82
+ let now = SystemTime::now()
83
+ .duration_since(UNIX_EPOCH)
84
+ .unwrap()
85
+ .as_nanos() as u64;
86
+ let counter = COUNTER.fetch_add(1, Ordering::Relaxed);
87
+ // Mix timestamp with counter to ensure uniqueness
88
+ format!("{:016x}", now ^ (counter << 48))
89
+ }
90
+ }
91
+
92
+ impl Default for TraceContext {
93
+ fn default() -> Self {
94
+ Self::new()
95
+ }
96
+ }
97
+
98
+ #[cfg(test)]
99
+ mod tests {
100
+ use super::*;
101
+
102
+ #[test]
103
+ fn test_trace_context_new() {
104
+ let ctx = TraceContext::new();
105
+ assert_eq!(ctx.trace_id.len(), 32);
106
+ assert_eq!(ctx.span_id.len(), 16);
107
+ }
108
+
109
+ #[test]
110
+ fn test_child_span() {
111
+ let parent = TraceContext::new();
112
+ let child = parent.child_span();
113
+
114
+ assert_eq!(child.trace_id, parent.trace_id);
115
+ assert_ne!(child.span_id, parent.span_id);
116
+ }
117
+
118
+ #[test]
119
+ fn test_traceparent_roundtrip() {
120
+ let ctx = TraceContext::new();
121
+ let header = ctx.to_traceparent();
122
+ let parsed = TraceContext::from_traceparent(&header).unwrap();
123
+
124
+ assert_eq!(parsed.trace_id, ctx.trace_id);
125
+ assert_eq!(parsed.span_id, ctx.span_id);
126
+ }
127
+ }