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,427 @@
1
+ //! ArtifactStore - Trait for artifact storage backends
2
+ //!
3
+ //! The ArtifactStore trait defines the interface for storing and retrieving
4
+ //! artifacts. Implementations must handle compression, content addressing,
5
+ //! and lifecycle events.
6
+
7
+ use super::metadata::{ArtifactMetadata, ArtifactType};
8
+ use crate::kernel::ids::{ArtifactId, ExecutionId, StepId};
9
+ use async_trait::async_trait;
10
+ use serde::{Deserialize, Serialize};
11
+ use std::io;
12
+ use thiserror::Error;
13
+
14
+ // =============================================================================
15
+ // Error Types
16
+ // =============================================================================
17
+
18
+ /// Errors that can occur during artifact operations
19
+ #[derive(Debug, Error)]
20
+ pub enum ArtifactStoreError {
21
+ /// Artifact not found
22
+ #[error("Artifact not found: {0}")]
23
+ NotFound(ArtifactId),
24
+
25
+ /// IO error during storage operation
26
+ #[error("IO error: {0}")]
27
+ Io(#[from] io::Error),
28
+
29
+ /// Serialization/deserialization error
30
+ #[error("Serialization error: {0}")]
31
+ Serialization(#[from] serde_json::Error),
32
+
33
+ /// Compression/decompression error
34
+ #[error("Compression error: {0}")]
35
+ Compression(String),
36
+
37
+ /// Invalid artifact data
38
+ #[error("Invalid artifact: {0}")]
39
+ Invalid(String),
40
+
41
+ /// Storage backend error
42
+ #[error("Storage error: {0}")]
43
+ Storage(String),
44
+
45
+ /// Artifact already exists (for put operations)
46
+ #[error("Artifact already exists: {0}")]
47
+ AlreadyExists(ArtifactId),
48
+ }
49
+
50
+ // =============================================================================
51
+ // Artifact Data
52
+ // =============================================================================
53
+
54
+ /// Request to store an artifact
55
+ #[derive(Debug, Clone)]
56
+ pub struct PutArtifactRequest {
57
+ /// Execution that produced this artifact
58
+ pub execution_id: ExecutionId,
59
+ /// Step that produced this artifact
60
+ pub step_id: StepId,
61
+ /// Name of the artifact
62
+ pub name: String,
63
+ /// Type of artifact
64
+ pub artifact_type: ArtifactType,
65
+ /// Content type (MIME type)
66
+ pub content_type: Option<String>,
67
+ /// Raw content bytes
68
+ pub content: Vec<u8>,
69
+ /// Additional metadata
70
+ pub metadata: Option<serde_json::Value>,
71
+ }
72
+
73
+ impl PutArtifactRequest {
74
+ /// Create a new put request
75
+ pub fn new(
76
+ execution_id: ExecutionId,
77
+ step_id: StepId,
78
+ name: impl Into<String>,
79
+ artifact_type: ArtifactType,
80
+ content: Vec<u8>,
81
+ ) -> Self {
82
+ Self {
83
+ execution_id,
84
+ step_id,
85
+ name: name.into(),
86
+ artifact_type,
87
+ content_type: None,
88
+ content,
89
+ metadata: None,
90
+ }
91
+ }
92
+
93
+ /// Set content type
94
+ pub fn with_content_type(mut self, content_type: impl Into<String>) -> Self {
95
+ self.content_type = Some(content_type.into());
96
+ self
97
+ }
98
+
99
+ /// Set metadata
100
+ pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
101
+ self.metadata = Some(metadata);
102
+ self
103
+ }
104
+ }
105
+
106
+ /// Response from storing an artifact
107
+ #[derive(Debug, Clone, Serialize, Deserialize)]
108
+ pub struct PutArtifactResponse {
109
+ /// Generated artifact ID
110
+ pub artifact_id: ArtifactId,
111
+ /// Full metadata of the stored artifact
112
+ pub metadata: ArtifactMetadata,
113
+ /// Size of the compressed content (bytes)
114
+ pub compressed_size: u64,
115
+ /// Size of the original content (bytes)
116
+ pub original_size: u64,
117
+ }
118
+
119
+ /// Request to retrieve an artifact
120
+ #[allow(dead_code)]
121
+ #[derive(Debug, Clone)]
122
+ pub struct GetArtifactRequest {
123
+ /// Artifact ID to retrieve
124
+ pub artifact_id: ArtifactId,
125
+ }
126
+
127
+ /// Response from retrieving an artifact
128
+ #[derive(Debug, Clone)]
129
+ pub struct GetArtifactResponse {
130
+ /// Artifact metadata
131
+ pub metadata: ArtifactMetadata,
132
+ /// Decompressed content bytes
133
+ pub content: Vec<u8>,
134
+ }
135
+
136
+ /// Query for listing artifacts
137
+ #[derive(Debug, Clone, Default)]
138
+ pub struct ListArtifactsQuery {
139
+ /// Filter by execution ID
140
+ pub execution_id: Option<ExecutionId>,
141
+ /// Filter by step ID
142
+ pub step_id: Option<StepId>,
143
+ /// Filter by artifact type
144
+ pub artifact_type: Option<ArtifactType>,
145
+ /// Maximum number of results
146
+ pub limit: Option<usize>,
147
+ /// Offset for pagination
148
+ pub offset: Option<usize>,
149
+ }
150
+
151
+ impl ListArtifactsQuery {
152
+ /// Create a query for a specific execution
153
+ pub fn for_execution(execution_id: ExecutionId) -> Self {
154
+ Self {
155
+ execution_id: Some(execution_id),
156
+ ..Default::default()
157
+ }
158
+ }
159
+
160
+ /// Create a query for a specific step
161
+ pub fn for_step(step_id: StepId) -> Self {
162
+ Self {
163
+ step_id: Some(step_id),
164
+ ..Default::default()
165
+ }
166
+ }
167
+ }
168
+
169
+ // =============================================================================
170
+ // ArtifactStore Trait
171
+ // =============================================================================
172
+
173
+ /// Trait for artifact storage backends
174
+ ///
175
+ /// Implementations must:
176
+ /// - Generate deterministic artifact IDs
177
+ /// - Compress content before storage (recommended: zstd)
178
+ /// - Handle concurrent access safely
179
+ /// - Support listing and filtering
180
+ #[async_trait]
181
+ pub trait ArtifactStore: Send + Sync {
182
+ /// Store an artifact
183
+ ///
184
+ /// Returns the generated artifact ID and metadata
185
+ async fn put(&self, request: PutArtifactRequest) -> Result<PutArtifactResponse, ArtifactStoreError>;
186
+
187
+ /// Retrieve an artifact by ID
188
+ async fn get(&self, artifact_id: &ArtifactId) -> Result<GetArtifactResponse, ArtifactStoreError>;
189
+
190
+ /// Check if an artifact exists
191
+ async fn exists(&self, artifact_id: &ArtifactId) -> Result<bool, ArtifactStoreError>;
192
+
193
+ /// Delete an artifact
194
+ async fn delete(&self, artifact_id: &ArtifactId) -> Result<(), ArtifactStoreError>;
195
+
196
+ /// List artifacts matching a query
197
+ async fn list(&self, query: ListArtifactsQuery) -> Result<Vec<ArtifactMetadata>, ArtifactStoreError>;
198
+
199
+ /// Get metadata for an artifact without retrieving content
200
+ async fn get_metadata(&self, artifact_id: &ArtifactId) -> Result<ArtifactMetadata, ArtifactStoreError>;
201
+
202
+ /// Get total storage size for an execution
203
+ async fn get_execution_size(&self, execution_id: &ExecutionId) -> Result<u64, ArtifactStoreError>;
204
+ }
205
+
206
+ // =============================================================================
207
+ // In-Memory Store (for testing)
208
+ // =============================================================================
209
+
210
+ use std::collections::HashMap;
211
+ use tokio::sync::RwLock;
212
+
213
+ /// In-memory artifact store for testing
214
+ pub struct InMemoryArtifactStore {
215
+ artifacts: RwLock<HashMap<ArtifactId, (ArtifactMetadata, Vec<u8>)>>,
216
+ }
217
+
218
+ impl InMemoryArtifactStore {
219
+ /// Create a new in-memory store
220
+ pub fn new() -> Self {
221
+ Self {
222
+ artifacts: RwLock::new(HashMap::new()),
223
+ }
224
+ }
225
+ }
226
+
227
+ impl Default for InMemoryArtifactStore {
228
+ fn default() -> Self {
229
+ Self::new()
230
+ }
231
+ }
232
+
233
+ #[async_trait]
234
+ impl ArtifactStore for InMemoryArtifactStore {
235
+ async fn put(&self, request: PutArtifactRequest) -> Result<PutArtifactResponse, ArtifactStoreError> {
236
+ let artifact_id = ArtifactId::new();
237
+ let original_size = request.content.len() as u64;
238
+
239
+ let metadata = ArtifactMetadata::new(
240
+ artifact_id.clone(),
241
+ request.execution_id,
242
+ request.step_id,
243
+ request.name,
244
+ request.artifact_type,
245
+ )
246
+ .with_original_size(original_size)
247
+ .with_compressed_size(original_size) // No compression in memory
248
+ .with_content_type(request.content_type.unwrap_or_else(|| "application/octet-stream".to_string()));
249
+
250
+ {
251
+ let mut artifacts = self.artifacts.write().await;
252
+ artifacts.insert(artifact_id.clone(), (metadata.clone(), request.content));
253
+ }
254
+
255
+ Ok(PutArtifactResponse {
256
+ artifact_id,
257
+ metadata,
258
+ compressed_size: original_size,
259
+ original_size,
260
+ })
261
+ }
262
+
263
+ async fn get(&self, artifact_id: &ArtifactId) -> Result<GetArtifactResponse, ArtifactStoreError> {
264
+ let artifacts = self.artifacts.read().await;
265
+ match artifacts.get(artifact_id) {
266
+ Some((metadata, content)) => Ok(GetArtifactResponse {
267
+ metadata: metadata.clone(),
268
+ content: content.clone(),
269
+ }),
270
+ None => Err(ArtifactStoreError::NotFound(artifact_id.clone())),
271
+ }
272
+ }
273
+
274
+ async fn exists(&self, artifact_id: &ArtifactId) -> Result<bool, ArtifactStoreError> {
275
+ let artifacts = self.artifacts.read().await;
276
+ Ok(artifacts.contains_key(artifact_id))
277
+ }
278
+
279
+ async fn delete(&self, artifact_id: &ArtifactId) -> Result<(), ArtifactStoreError> {
280
+ let mut artifacts = self.artifacts.write().await;
281
+ artifacts.remove(artifact_id)
282
+ .ok_or_else(|| ArtifactStoreError::NotFound(artifact_id.clone()))?;
283
+ Ok(())
284
+ }
285
+
286
+ async fn list(&self, query: ListArtifactsQuery) -> Result<Vec<ArtifactMetadata>, ArtifactStoreError> {
287
+ let artifacts = self.artifacts.read().await;
288
+ let mut results: Vec<ArtifactMetadata> = artifacts
289
+ .values()
290
+ .filter_map(|(metadata, _)| {
291
+ // Apply filters
292
+ if let Some(ref exec_id) = query.execution_id {
293
+ if metadata.execution_id != *exec_id {
294
+ return None;
295
+ }
296
+ }
297
+ if let Some(ref step_id) = query.step_id {
298
+ if metadata.step_id != *step_id {
299
+ return None;
300
+ }
301
+ }
302
+ if let Some(ref artifact_type) = query.artifact_type {
303
+ if metadata.artifact_type != *artifact_type {
304
+ return None;
305
+ }
306
+ }
307
+ Some(metadata.clone())
308
+ })
309
+ .collect();
310
+
311
+ // Sort by creation time
312
+ results.sort_by(|a, b| a.created_at.cmp(&b.created_at));
313
+
314
+ // Apply pagination
315
+ if let Some(offset) = query.offset {
316
+ results = results.into_iter().skip(offset).collect();
317
+ }
318
+ if let Some(limit) = query.limit {
319
+ results.truncate(limit);
320
+ }
321
+
322
+ Ok(results)
323
+ }
324
+
325
+ async fn get_metadata(&self, artifact_id: &ArtifactId) -> Result<ArtifactMetadata, ArtifactStoreError> {
326
+ let artifacts = self.artifacts.read().await;
327
+ match artifacts.get(artifact_id) {
328
+ Some((metadata, _)) => Ok(metadata.clone()),
329
+ None => Err(ArtifactStoreError::NotFound(artifact_id.clone())),
330
+ }
331
+ }
332
+
333
+ async fn get_execution_size(&self, execution_id: &ExecutionId) -> Result<u64, ArtifactStoreError> {
334
+ let artifacts = self.artifacts.read().await;
335
+ let total: u64 = artifacts
336
+ .values()
337
+ .filter(|(m, _)| m.execution_id == *execution_id)
338
+ .map(|(_, content)| content.len() as u64)
339
+ .sum();
340
+ Ok(total)
341
+ }
342
+ }
343
+
344
+ // =============================================================================
345
+ // Tests
346
+ // =============================================================================
347
+
348
+ #[cfg(test)]
349
+ mod tests {
350
+ use super::*;
351
+
352
+ #[tokio::test]
353
+ async fn test_in_memory_store_put_get() {
354
+ let store = InMemoryArtifactStore::new();
355
+ let exec_id = ExecutionId::new();
356
+ let step_id = StepId::new();
357
+
358
+ let request = PutArtifactRequest::new(
359
+ exec_id.clone(),
360
+ step_id,
361
+ "test.txt",
362
+ ArtifactType::Text,
363
+ b"Hello, World!".to_vec(),
364
+ );
365
+
366
+ let response = store.put(request).await.unwrap();
367
+ assert!(response.artifact_id.as_str().starts_with("artifact_"));
368
+
369
+ let get_response = store.get(&response.artifact_id).await.unwrap();
370
+ assert_eq!(get_response.content, b"Hello, World!");
371
+ assert_eq!(get_response.metadata.name, "test.txt");
372
+ }
373
+
374
+ #[tokio::test]
375
+ async fn test_in_memory_store_list() {
376
+ let store = InMemoryArtifactStore::new();
377
+ let exec_id = ExecutionId::new();
378
+ let step_id = StepId::new();
379
+
380
+ // Store multiple artifacts
381
+ for i in 0..5 {
382
+ let request = PutArtifactRequest::new(
383
+ exec_id.clone(),
384
+ step_id.clone(),
385
+ format!("file{}.txt", i),
386
+ ArtifactType::Text,
387
+ format!("Content {}", i).into_bytes(),
388
+ );
389
+ store.put(request).await.unwrap();
390
+ }
391
+
392
+ // List all for execution
393
+ let query = ListArtifactsQuery::for_execution(exec_id.clone());
394
+ let results = store.list(query).await.unwrap();
395
+ assert_eq!(results.len(), 5);
396
+
397
+ // List with limit
398
+ let query = ListArtifactsQuery {
399
+ execution_id: Some(exec_id),
400
+ limit: Some(3),
401
+ ..Default::default()
402
+ };
403
+ let results = store.list(query).await.unwrap();
404
+ assert_eq!(results.len(), 3);
405
+ }
406
+
407
+ #[tokio::test]
408
+ async fn test_in_memory_store_delete() {
409
+ let store = InMemoryArtifactStore::new();
410
+ let exec_id = ExecutionId::new();
411
+ let step_id = StepId::new();
412
+
413
+ let request = PutArtifactRequest::new(
414
+ exec_id,
415
+ step_id,
416
+ "test.txt",
417
+ ArtifactType::Text,
418
+ b"Hello".to_vec(),
419
+ );
420
+
421
+ let response = store.put(request).await.unwrap();
422
+ assert!(store.exists(&response.artifact_id).await.unwrap());
423
+
424
+ store.delete(&response.artifact_id).await.unwrap();
425
+ assert!(!store.exists(&response.artifact_id).await.unwrap());
426
+ }
427
+ }