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,535 @@
1
+ //! Prompt Calibrator
2
+ //!
3
+ //! Constructs calibrated prompts for spawned callables by:
4
+ //! - Selecting relevant context segments based on priority
5
+ //! - Applying token budgets for the target model
6
+ //! - Formatting context for optimal model consumption
7
+ //!
8
+ //! @see packages/enact-schemas/src/context.schemas.ts
9
+
10
+ use crate::budget::ContextBudget;
11
+ use crate::segment::{ContextPriority, ContextSegment, ContextSegmentType};
12
+ use crate::token_counter::TokenCounter;
13
+ use crate::window::ContextWindow;
14
+ use chrono::{DateTime, Utc};
15
+ use enact_core::kernel::ExecutionId;
16
+ use serde::{Deserialize, Serialize};
17
+ use std::collections::HashMap;
18
+ use std::sync::atomic::{AtomicU64, Ordering};
19
+
20
+ /// Global sequence counter for segments
21
+ static SEGMENT_SEQUENCE: AtomicU64 = AtomicU64::new(1000);
22
+
23
+ fn next_sequence() -> u64 {
24
+ SEGMENT_SEQUENCE.fetch_add(1, Ordering::SeqCst)
25
+ }
26
+
27
+ /// Prompt calibration configuration
28
+ #[derive(Debug, Clone, Serialize, Deserialize)]
29
+ #[serde(rename_all = "camelCase")]
30
+ pub struct CalibrationConfig {
31
+ /// Maximum tokens for the calibrated prompt
32
+ pub max_tokens: usize,
33
+
34
+ /// Minimum tokens to reserve for response
35
+ pub response_reserve: usize,
36
+
37
+ /// Priority threshold - only include segments at or above this priority
38
+ pub min_priority: ContextPriority,
39
+
40
+ /// Whether to include system context
41
+ pub include_system: bool,
42
+
43
+ /// Whether to include conversation history
44
+ pub include_history: bool,
45
+
46
+ /// Maximum history messages to include
47
+ pub max_history_messages: usize,
48
+
49
+ /// Whether to include working memory
50
+ pub include_working_memory: bool,
51
+
52
+ /// Whether to include RAG context
53
+ pub include_rag: bool,
54
+
55
+ /// Maximum RAG chunks to include
56
+ pub max_rag_chunks: usize,
57
+
58
+ /// Custom segment filters by type
59
+ #[serde(skip_serializing_if = "Option::is_none")]
60
+ pub segment_filters: Option<HashMap<String, bool>>,
61
+ }
62
+
63
+ impl Default for CalibrationConfig {
64
+ fn default() -> Self {
65
+ Self {
66
+ max_tokens: 8000,
67
+ response_reserve: 2000,
68
+ min_priority: ContextPriority::Low,
69
+ include_system: true,
70
+ include_history: true,
71
+ max_history_messages: 20,
72
+ include_working_memory: true,
73
+ include_rag: true,
74
+ max_rag_chunks: 5,
75
+ segment_filters: None,
76
+ }
77
+ }
78
+ }
79
+
80
+ impl CalibrationConfig {
81
+ /// Create a minimal config for quick tasks
82
+ pub fn minimal() -> Self {
83
+ Self {
84
+ max_tokens: 4000,
85
+ response_reserve: 1000,
86
+ min_priority: ContextPriority::High,
87
+ include_system: true,
88
+ include_history: false,
89
+ max_history_messages: 0,
90
+ include_working_memory: false,
91
+ include_rag: false,
92
+ max_rag_chunks: 0,
93
+ segment_filters: None,
94
+ }
95
+ }
96
+
97
+ /// Create a full context config for complex tasks
98
+ pub fn full_context() -> Self {
99
+ Self {
100
+ max_tokens: 32000,
101
+ response_reserve: 4000,
102
+ min_priority: ContextPriority::Low,
103
+ include_system: true,
104
+ include_history: true,
105
+ max_history_messages: 50,
106
+ include_working_memory: true,
107
+ include_rag: true,
108
+ max_rag_chunks: 10,
109
+ segment_filters: None,
110
+ }
111
+ }
112
+
113
+ /// Available tokens after response reserve
114
+ pub fn available_tokens(&self) -> usize {
115
+ self.max_tokens.saturating_sub(self.response_reserve)
116
+ }
117
+ }
118
+
119
+ /// Result of prompt calibration
120
+ #[derive(Debug, Clone, Serialize, Deserialize)]
121
+ #[serde(rename_all = "camelCase")]
122
+ pub struct CalibratedPrompt {
123
+ /// Execution ID this prompt was calibrated for
124
+ pub execution_id: ExecutionId,
125
+
126
+ /// The calibrated segments in order
127
+ pub segments: Vec<ContextSegment>,
128
+
129
+ /// Total tokens used
130
+ pub total_tokens: usize,
131
+
132
+ /// Tokens available for response
133
+ pub response_tokens: usize,
134
+
135
+ /// Segments that were excluded due to budget
136
+ pub excluded_count: usize,
137
+
138
+ /// Calibration timestamp
139
+ pub calibrated_at: DateTime<Utc>,
140
+
141
+ /// Configuration used
142
+ pub config: CalibrationConfig,
143
+ }
144
+
145
+ impl CalibratedPrompt {
146
+ /// Get the formatted prompt as a string
147
+ pub fn as_text(&self) -> String {
148
+ self.segments
149
+ .iter()
150
+ .map(|s| s.content.clone())
151
+ .collect::<Vec<_>>()
152
+ .join("\n\n")
153
+ }
154
+
155
+ /// Get segments by type
156
+ pub fn segments_by_type(&self, segment_type: ContextSegmentType) -> Vec<&ContextSegment> {
157
+ self.segments
158
+ .iter()
159
+ .filter(|s| s.segment_type == segment_type)
160
+ .collect()
161
+ }
162
+
163
+ /// Check if prompt has system context
164
+ pub fn has_system(&self) -> bool {
165
+ self.segments
166
+ .iter()
167
+ .any(|s| s.segment_type == ContextSegmentType::System)
168
+ }
169
+
170
+ /// Check if prompt has history
171
+ pub fn has_history(&self) -> bool {
172
+ self.segments
173
+ .iter()
174
+ .any(|s| s.segment_type == ContextSegmentType::History)
175
+ }
176
+ }
177
+
178
+ /// Prompt Calibrator - constructs calibrated prompts for spawned callables
179
+ pub struct PromptCalibrator {
180
+ token_counter: TokenCounter,
181
+ }
182
+
183
+ impl PromptCalibrator {
184
+ /// Create a new calibrator
185
+ pub fn new() -> Self {
186
+ Self {
187
+ token_counter: TokenCounter::default(),
188
+ }
189
+ }
190
+
191
+ /// Calibrate a prompt from a context window
192
+ pub fn calibrate(
193
+ &self,
194
+ window: &ContextWindow,
195
+ config: &CalibrationConfig,
196
+ ) -> CalibratedPrompt {
197
+ let execution_id = window.budget().execution_id.clone();
198
+ let available = config.available_tokens();
199
+
200
+ // Get all segments sorted by priority (highest first)
201
+ let mut segments = window.segments().to_vec();
202
+ segments.sort_by(|a, b| b.priority.cmp(&a.priority));
203
+
204
+ // Filter and select segments within budget
205
+ let mut selected: Vec<ContextSegment> = Vec::new();
206
+ let mut total_tokens = 0;
207
+ let mut excluded_count = 0;
208
+ let mut history_count = 0;
209
+ let mut rag_count = 0;
210
+
211
+ for segment in segments {
212
+ // Check priority threshold
213
+ if segment.priority < config.min_priority {
214
+ excluded_count += 1;
215
+ continue;
216
+ }
217
+
218
+ // Apply type-specific filters
219
+ match segment.segment_type {
220
+ ContextSegmentType::System if !config.include_system => {
221
+ excluded_count += 1;
222
+ continue;
223
+ }
224
+ ContextSegmentType::History if !config.include_history => {
225
+ excluded_count += 1;
226
+ continue;
227
+ }
228
+ ContextSegmentType::History if history_count >= config.max_history_messages => {
229
+ excluded_count += 1;
230
+ continue;
231
+ }
232
+ ContextSegmentType::WorkingMemory if !config.include_working_memory => {
233
+ excluded_count += 1;
234
+ continue;
235
+ }
236
+ ContextSegmentType::RagContext if !config.include_rag => {
237
+ excluded_count += 1;
238
+ continue;
239
+ }
240
+ ContextSegmentType::RagContext if rag_count >= config.max_rag_chunks => {
241
+ excluded_count += 1;
242
+ continue;
243
+ }
244
+ _ => {}
245
+ }
246
+
247
+ // Check if segment fits in budget
248
+ let segment_tokens = segment.token_count;
249
+ if total_tokens + segment_tokens > available {
250
+ excluded_count += 1;
251
+ continue;
252
+ }
253
+
254
+ // Include segment
255
+ total_tokens += segment_tokens;
256
+ if segment.segment_type == ContextSegmentType::History {
257
+ history_count += 1;
258
+ }
259
+ if segment.segment_type == ContextSegmentType::RagContext {
260
+ rag_count += 1;
261
+ }
262
+ selected.push(segment);
263
+ }
264
+
265
+ // Re-sort by natural order (system first, then by sequence)
266
+ selected.sort_by(|a, b| {
267
+ // System always first
268
+ if a.segment_type == ContextSegmentType::System
269
+ && b.segment_type != ContextSegmentType::System
270
+ {
271
+ return std::cmp::Ordering::Less;
272
+ }
273
+ if b.segment_type == ContextSegmentType::System
274
+ && a.segment_type != ContextSegmentType::System
275
+ {
276
+ return std::cmp::Ordering::Greater;
277
+ }
278
+ // Then by sequence
279
+ a.sequence.cmp(&b.sequence)
280
+ });
281
+
282
+ CalibratedPrompt {
283
+ execution_id,
284
+ segments: selected,
285
+ total_tokens,
286
+ response_tokens: config.max_tokens.saturating_sub(total_tokens),
287
+ excluded_count,
288
+ calibrated_at: Utc::now(),
289
+ config: config.clone(),
290
+ }
291
+ }
292
+
293
+ /// Calibrate from raw segments (without a full window)
294
+ pub fn calibrate_segments(
295
+ &self,
296
+ execution_id: ExecutionId,
297
+ segments: Vec<ContextSegment>,
298
+ config: &CalibrationConfig,
299
+ ) -> CalibratedPrompt {
300
+ // Create a temporary budget and window
301
+ let budget = ContextBudget::new(execution_id.clone(), config.max_tokens, config.response_reserve);
302
+ let mut window = ContextWindow::new(budget).expect("valid budget");
303
+
304
+ for segment in segments {
305
+ let _ = window.add_segment(segment);
306
+ }
307
+
308
+ self.calibrate(&window, config)
309
+ }
310
+
311
+ /// Create a child prompt from parent context
312
+ ///
313
+ /// This is used when spawning child callables to provide them with
314
+ /// relevant context from the parent execution.
315
+ pub fn calibrate_for_child(
316
+ &self,
317
+ parent_window: &ContextWindow,
318
+ child_execution_id: ExecutionId,
319
+ task_description: &str,
320
+ config: &CalibrationConfig,
321
+ ) -> CalibratedPrompt {
322
+ let available = config.available_tokens();
323
+
324
+ // Start with essential context for the child
325
+ let mut selected: Vec<ContextSegment> = Vec::new();
326
+ let mut total_tokens = 0;
327
+
328
+ // Add task description as system context
329
+ let task_content = format!(
330
+ "You are executing a sub-task. Task: {}\n\nParent context follows:",
331
+ task_description
332
+ );
333
+ let task_tokens = self.token_counter.count(&task_content);
334
+ if task_tokens <= available {
335
+ let task_segment = ContextSegment::system(task_content, task_tokens);
336
+ total_tokens += task_tokens;
337
+ selected.push(task_segment);
338
+ }
339
+
340
+ // Get parent segments sorted by priority
341
+ let mut parent_segments = parent_window.segments().to_vec();
342
+ parent_segments.sort_by(|a, b| b.priority.cmp(&a.priority));
343
+
344
+ let mut excluded_count = 0;
345
+
346
+ // Add relevant parent context
347
+ for segment in parent_segments {
348
+ // Skip low priority for child contexts
349
+ if segment.priority < ContextPriority::Medium {
350
+ excluded_count += 1;
351
+ continue;
352
+ }
353
+
354
+ // Check budget
355
+ let segment_tokens = segment.token_count;
356
+ if total_tokens + segment_tokens > available {
357
+ excluded_count += 1;
358
+ continue;
359
+ }
360
+
361
+ total_tokens += segment_tokens;
362
+ selected.push(segment);
363
+ }
364
+
365
+ // Sort for natural reading order
366
+ selected.sort_by(|a, b| {
367
+ if a.segment_type == ContextSegmentType::System
368
+ && b.segment_type != ContextSegmentType::System
369
+ {
370
+ return std::cmp::Ordering::Less;
371
+ }
372
+ if b.segment_type == ContextSegmentType::System
373
+ && a.segment_type != ContextSegmentType::System
374
+ {
375
+ return std::cmp::Ordering::Greater;
376
+ }
377
+ a.sequence.cmp(&b.sequence)
378
+ });
379
+
380
+ CalibratedPrompt {
381
+ execution_id: child_execution_id,
382
+ segments: selected,
383
+ total_tokens,
384
+ response_tokens: config.max_tokens.saturating_sub(total_tokens),
385
+ excluded_count,
386
+ calibrated_at: Utc::now(),
387
+ config: config.clone(),
388
+ }
389
+ }
390
+ }
391
+
392
+ impl Default for PromptCalibrator {
393
+ fn default() -> Self {
394
+ Self::new()
395
+ }
396
+ }
397
+
398
+ #[cfg(test)]
399
+ mod tests {
400
+ use super::*;
401
+
402
+ fn test_execution_id() -> ExecutionId {
403
+ ExecutionId::new()
404
+ }
405
+
406
+ #[test]
407
+ fn test_calibration_config_defaults() {
408
+ let config = CalibrationConfig::default();
409
+ assert_eq!(config.max_tokens, 8000);
410
+ assert_eq!(config.response_reserve, 2000);
411
+ assert_eq!(config.available_tokens(), 6000);
412
+ }
413
+
414
+ #[test]
415
+ fn test_calibration_config_minimal() {
416
+ let config = CalibrationConfig::minimal();
417
+ assert!(!config.include_history);
418
+ assert!(!config.include_working_memory);
419
+ assert_eq!(config.min_priority, ContextPriority::High);
420
+ }
421
+
422
+ #[test]
423
+ fn test_calibrate_empty_window() {
424
+ let calibrator = PromptCalibrator::new();
425
+ let budget = ContextBudget::preset_default(test_execution_id());
426
+ let window = ContextWindow::new(budget).unwrap();
427
+ let config = CalibrationConfig::default();
428
+
429
+ let result = calibrator.calibrate(&window, &config);
430
+ assert_eq!(result.segments.len(), 0);
431
+ assert_eq!(result.total_tokens, 0);
432
+ }
433
+
434
+ #[test]
435
+ fn test_calibrate_with_segments() {
436
+ let calibrator = PromptCalibrator::new();
437
+ let budget = ContextBudget::preset_default(test_execution_id());
438
+ let mut window = ContextWindow::new(budget).unwrap();
439
+
440
+ window
441
+ .add_segment(ContextSegment::system("You are a helpful assistant.", 10))
442
+ .unwrap();
443
+ window
444
+ .add_segment(ContextSegment::user_input("Hello!", 5, 1))
445
+ .unwrap();
446
+
447
+ let config = CalibrationConfig::default();
448
+ let result = calibrator.calibrate(&window, &config);
449
+
450
+ assert_eq!(result.segments.len(), 2);
451
+ assert!(result.total_tokens > 0);
452
+ assert!(result.has_system());
453
+ }
454
+
455
+ #[test]
456
+ fn test_calibrate_respects_priority() {
457
+ let calibrator = PromptCalibrator::new();
458
+ let budget = ContextBudget::preset_default(test_execution_id());
459
+ let mut window = ContextWindow::new(budget).unwrap();
460
+
461
+ window
462
+ .add_segment(ContextSegment::system("System prompt", 10))
463
+ .unwrap();
464
+ window
465
+ .add_segment(
466
+ ContextSegment::new(
467
+ ContextSegmentType::History,
468
+ "Low priority history".to_string(),
469
+ 20,
470
+ 1,
471
+ )
472
+ .with_priority(ContextPriority::Low),
473
+ )
474
+ .unwrap();
475
+
476
+ // With high priority threshold, should exclude low priority
477
+ let config = CalibrationConfig {
478
+ min_priority: ContextPriority::High,
479
+ ..Default::default()
480
+ };
481
+ let result = calibrator.calibrate(&window, &config);
482
+
483
+ // Only system (critical priority) should be included
484
+ assert_eq!(result.segments.len(), 1);
485
+ assert!(result.has_system());
486
+ assert!(!result.has_history());
487
+ }
488
+
489
+ #[test]
490
+ fn test_calibrate_for_child() {
491
+ let calibrator = PromptCalibrator::new();
492
+ let parent_budget = ContextBudget::preset_default(test_execution_id());
493
+ let mut parent_window = ContextWindow::new(parent_budget).unwrap();
494
+
495
+ parent_window
496
+ .add_segment(ContextSegment::system("Parent system prompt", 15))
497
+ .unwrap();
498
+ parent_window
499
+ .add_segment(ContextSegment::user_input("Parent user input", 10, 1))
500
+ .unwrap();
501
+
502
+ let child_id = ExecutionId::new();
503
+ let config = CalibrationConfig::default();
504
+ let result =
505
+ calibrator.calibrate_for_child(&parent_window, child_id, "Analyze data", &config);
506
+
507
+ // Should have task description and parent context
508
+ assert!(result.total_tokens > 0);
509
+ assert!(result
510
+ .segments
511
+ .iter()
512
+ .any(|s| s.content.contains("sub-task")));
513
+ }
514
+
515
+ #[test]
516
+ fn test_calibrated_prompt_as_text() {
517
+ let calibrator = PromptCalibrator::new();
518
+ let budget = ContextBudget::preset_default(test_execution_id());
519
+ let mut window = ContextWindow::new(budget).unwrap();
520
+
521
+ window
522
+ .add_segment(ContextSegment::system("System", 5))
523
+ .unwrap();
524
+ window
525
+ .add_segment(ContextSegment::user_input("User", 5, 1))
526
+ .unwrap();
527
+
528
+ let config = CalibrationConfig::default();
529
+ let result = calibrator.calibrate(&window, &config);
530
+
531
+ let text = result.as_text();
532
+ assert!(text.contains("System"));
533
+ assert!(text.contains("User"));
534
+ }
535
+ }