eve 0.6.0-beta.8 → 0.7.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 (588) hide show
  1. package/CHANGELOG.md +278 -0
  2. package/README.md +9 -6
  3. package/dist/docs/public/README.md +1 -1
  4. package/dist/docs/public/advanced/auth-and-route-protection.md +3 -1
  5. package/dist/docs/public/advanced/default-harness.md +2 -2
  6. package/dist/docs/public/advanced/dev-tui.md +9 -11
  7. package/dist/docs/public/advanced/instrumentation.md +1 -1
  8. package/dist/docs/public/advanced/meta.json +0 -1
  9. package/dist/docs/public/advanced/security-model.md +1 -1
  10. package/dist/docs/public/advanced/session-context.md +1 -1
  11. package/dist/docs/public/agent-config.md +6 -3
  12. package/dist/docs/public/channels/eve.mdx +1 -1
  13. package/dist/docs/public/channels/slack.mdx +14 -2
  14. package/dist/docs/public/connections.mdx +3 -1
  15. package/dist/docs/public/evals/assertions.mdx +108 -0
  16. package/dist/docs/public/evals/cases.mdx +143 -0
  17. package/dist/docs/public/evals/judge.mdx +94 -0
  18. package/dist/docs/public/evals/meta.json +4 -0
  19. package/dist/docs/public/evals/overview.mdx +118 -0
  20. package/dist/docs/public/evals/reporters.mdx +62 -0
  21. package/dist/docs/public/evals/running.mdx +63 -0
  22. package/dist/docs/public/evals/targets.mdx +54 -0
  23. package/dist/docs/public/frontend/nextjs.mdx +13 -4
  24. package/dist/docs/public/frontend/nuxt.mdx +4 -4
  25. package/dist/docs/public/frontend/sveltekit.mdx +2 -2
  26. package/dist/docs/public/getting-started.mdx +25 -13
  27. package/dist/docs/public/meta.json +1 -0
  28. package/dist/docs/public/reference/cli.md +31 -9
  29. package/dist/docs/public/reference/typescript-api.md +6 -2
  30. package/dist/docs/public/sandbox.mdx +3 -1
  31. package/dist/docs/public/tools.mdx +0 -4
  32. package/dist/docs/public/tutorial/connect-a-warehouse.mdx +1 -1
  33. package/dist/docs/public/tutorial/first-agent.mdx +5 -2
  34. package/dist/src/chunks/{use-eve-agent-DCZbkLG7.js → use-eve-agent-DErQj5hs.js} +125 -37
  35. package/dist/src/chunks/{use-eve-agent-DoheC4_o.js → use-eve-agent-DoR8C4i6.js} +125 -37
  36. package/dist/src/cli/banner.d.ts +7 -0
  37. package/dist/src/cli/banner.js +1 -0
  38. package/dist/src/cli/commands/channel-add-conflicts.d.ts +1 -1
  39. package/dist/src/cli/commands/channels.d.ts +9 -6
  40. package/dist/src/cli/commands/channels.js +1 -1
  41. package/dist/src/cli/commands/deploy.d.ts +21 -0
  42. package/dist/src/cli/commands/deploy.js +1 -0
  43. package/dist/src/cli/commands/init-git.d.ts +15 -0
  44. package/dist/src/cli/commands/init-git.js +1 -0
  45. package/dist/src/cli/commands/init.d.ts +29 -0
  46. package/dist/src/cli/commands/init.js +1 -0
  47. package/dist/src/cli/commands/link.d.ts +21 -0
  48. package/dist/src/cli/commands/link.js +1 -0
  49. package/dist/src/cli/commands/preconditions.d.ts +7 -0
  50. package/dist/src/cli/commands/preconditions.js +1 -0
  51. package/dist/src/cli/commands/register-project-commands.d.ts +12 -0
  52. package/dist/src/cli/commands/register-project-commands.js +1 -0
  53. package/dist/src/cli/dev/tui/agent-header.d.ts +15 -9
  54. package/dist/src/cli/dev/tui/agent-header.js +1 -1
  55. package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
  56. package/dist/src/cli/dev/tui/blocks.js +3 -2
  57. package/dist/src/cli/dev/tui/command-typeahead.d.ts +47 -0
  58. package/dist/src/cli/dev/tui/command-typeahead.js +1 -0
  59. package/dist/src/cli/dev/tui/dev-rebuild-status.d.ts +21 -0
  60. package/dist/src/cli/dev/tui/dev-rebuild-status.js +1 -0
  61. package/dist/src/cli/dev/tui/errors.d.ts +18 -0
  62. package/dist/src/cli/dev/tui/errors.js +1 -1
  63. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +14 -0
  64. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -0
  65. package/dist/src/cli/dev/tui/prompt-commands.d.ts +54 -0
  66. package/dist/src/cli/dev/tui/prompt-commands.js +2 -0
  67. package/dist/src/cli/dev/tui/runner.d.ts +62 -5
  68. package/dist/src/cli/dev/tui/runner.js +1 -1
  69. package/dist/src/cli/dev/tui/setup-commands.d.ts +48 -0
  70. package/dist/src/cli/dev/tui/setup-commands.js +2 -0
  71. package/dist/src/cli/dev/tui/setup-flow.d.ts +35 -0
  72. package/dist/src/cli/dev/tui/setup-issues.d.ts +40 -0
  73. package/dist/src/cli/dev/tui/setup-issues.js +1 -0
  74. package/dist/src/cli/dev/tui/setup-panel.d.ts +103 -0
  75. package/dist/src/cli/dev/tui/setup-panel.js +1 -0
  76. package/dist/src/cli/dev/tui/status-line.d.ts +25 -0
  77. package/dist/src/cli/dev/tui/status-line.js +1 -0
  78. package/dist/src/cli/dev/tui/stream-format.d.ts +16 -1
  79. package/dist/src/cli/dev/tui/stream-format.js +1 -1
  80. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +32 -3
  81. package/dist/src/cli/dev/tui/terminal-renderer.js +5 -2
  82. package/dist/src/cli/dev/tui/test/index.d.ts +3 -1
  83. package/dist/src/cli/dev/tui/test/index.js +1 -1
  84. package/dist/src/cli/dev/tui/test/mock-terminal.d.ts +1 -0
  85. package/dist/src/cli/dev/tui/test/mock-terminal.js +1 -1
  86. package/dist/src/cli/dev/tui/theme.d.ts +10 -0
  87. package/dist/src/cli/dev/tui/theme.js +1 -1
  88. package/dist/src/cli/dev/tui/tui-prompter.d.ts +20 -0
  89. package/dist/src/cli/dev/tui/tui-prompter.js +1 -0
  90. package/dist/src/cli/dev/tui/tui.d.ts +6 -8
  91. package/dist/src/cli/dev/tui/tui.js +1 -1
  92. package/dist/src/cli/dev/tui/types.d.ts +4 -3
  93. package/dist/src/cli/dev/tui/vercel-status.d.ts +47 -0
  94. package/dist/src/cli/dev/tui/vercel-status.js +1 -0
  95. package/dist/src/cli/run.d.ts +12 -19
  96. package/dist/src/cli/run.js +2 -2
  97. package/dist/src/client/client.d.ts +8 -0
  98. package/dist/src/client/client.js +1 -1
  99. package/dist/src/client/file-parts.d.ts +18 -0
  100. package/dist/src/client/file-parts.js +1 -0
  101. package/dist/src/client/index.d.ts +3 -2
  102. package/dist/src/client/index.js +1 -1
  103. package/dist/src/client/message-response.js +1 -1
  104. package/dist/src/client/open-stream.d.ts +6 -0
  105. package/dist/src/client/open-stream.js +1 -1
  106. package/dist/src/client/session-utils.d.ts +5 -0
  107. package/dist/src/client/session-utils.js +1 -1
  108. package/dist/src/client/session.js +1 -1
  109. package/dist/src/client/types.d.ts +9 -2
  110. package/dist/src/compiled/.vendor-stamp.json +8 -8
  111. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +56 -31
  112. package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
  113. package/dist/src/compiled/@ai-sdk/google/index.js +1 -1
  114. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  115. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +16 -9
  116. package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
  117. package/dist/src/compiled/@ai-sdk/otel/index.js +2 -2
  118. package/dist/src/compiled/@vercel/sandbox/index.js +1 -1
  119. package/dist/src/compiled/@workflow/core/index.js +2 -2
  120. package/dist/src/compiled/@workflow/core/runtime/helpers.d.ts +4 -2
  121. package/dist/src/compiled/@workflow/core/runtime/wait-until.d.ts +18 -0
  122. package/dist/src/compiled/@workflow/core/runtime.d.ts +3 -1
  123. package/dist/src/compiled/@workflow/core/runtime.js +28 -28
  124. package/dist/src/compiled/@workflow/core/serialization.d.ts +41 -0
  125. package/dist/src/compiled/@workflow/core/util.d.ts +0 -5
  126. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  127. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  128. package/dist/src/compiled/@workflow/world/index.d.ts +2 -2
  129. package/dist/src/compiled/@workflow/world/queue.d.ts +28 -2
  130. package/dist/src/compiled/_chunks/workflow/{dist-gEXVSMPU.js → dist-CkMRLaRV.js} +1 -1
  131. package/dist/src/compiled/_chunks/workflow/functions-DuPjIvMH.js +1 -0
  132. package/dist/src/compiled/_chunks/workflow/resume-hook-CEAS3opc.js +12 -0
  133. package/dist/src/compiled/_chunks/workflow/sleep-Cup6vPoA.js +1 -0
  134. package/dist/src/compiled/_chunks/workflow/{symbols-BWCAoPHE.js → symbols-BUTtwS7j.js} +1 -1
  135. package/dist/src/compiled/just-bash/index.d.ts +27 -4
  136. package/dist/src/compiler/artifacts.js +1 -1
  137. package/dist/src/compiler/manifest.d.ts +8 -8
  138. package/dist/src/compiler/normalize-agent-config.d.ts +0 -10
  139. package/dist/src/compiler/normalize-agent-config.js +1 -1
  140. package/dist/src/compiler/normalize-channel.d.ts +2 -1
  141. package/dist/src/compiler/normalize-channel.js +1 -1
  142. package/dist/src/compiler/normalize-connection.d.ts +2 -1
  143. package/dist/src/compiler/normalize-connection.js +1 -1
  144. package/dist/src/compiler/normalize-helpers.d.ts +5 -0
  145. package/dist/src/compiler/normalize-helpers.js +1 -1
  146. package/dist/src/compiler/normalize-instructions.d.ts +3 -2
  147. package/dist/src/compiler/normalize-instructions.js +1 -1
  148. package/dist/src/compiler/normalize-manifest.js +2 -2
  149. package/dist/src/compiler/normalize-sandbox.d.ts +2 -1
  150. package/dist/src/compiler/normalize-sandbox.js +1 -1
  151. package/dist/src/compiler/normalize-schedule.d.ts +2 -1
  152. package/dist/src/compiler/normalize-schedule.js +1 -1
  153. package/dist/src/compiler/normalize-skill.d.ts +2 -1
  154. package/dist/src/compiler/normalize-skill.js +1 -1
  155. package/dist/src/compiler/normalize-subagent.d.ts +4 -1
  156. package/dist/src/compiler/normalize-subagent.js +1 -1
  157. package/dist/src/compiler/normalize-tool.d.ts +2 -1
  158. package/dist/src/compiler/normalize-tool.js +1 -1
  159. package/dist/src/compiler/workspace-resources.js +1 -1
  160. package/dist/src/context/node.d.ts +1 -1
  161. package/dist/src/evals/assertions/collector.d.ts +43 -0
  162. package/dist/src/evals/assertions/collector.js +1 -0
  163. package/dist/src/evals/assertions/run.d.ts +72 -0
  164. package/dist/src/evals/assertions/run.js +2 -0
  165. package/dist/src/evals/autoevals-client.js +2 -0
  166. package/dist/src/evals/cli/eval-client.d.ts +22 -0
  167. package/dist/src/evals/cli/eval-client.js +1 -0
  168. package/dist/src/evals/cli/eval.d.ts +12 -3
  169. package/dist/src/evals/cli/eval.js +1 -1
  170. package/dist/src/evals/context.d.ts +19 -0
  171. package/dist/src/evals/context.js +1 -0
  172. package/dist/src/evals/define-eval-config.d.ts +16 -0
  173. package/dist/src/evals/define-eval-config.js +1 -0
  174. package/dist/src/evals/define-eval.d.ts +20 -0
  175. package/dist/src/evals/define-eval.js +1 -0
  176. package/dist/src/evals/expect/index.d.ts +25 -0
  177. package/dist/src/evals/expect/index.js +1 -0
  178. package/dist/src/evals/index.d.ts +7 -2
  179. package/dist/src/evals/index.js +1 -1
  180. package/dist/src/evals/judge.d.ts +20 -0
  181. package/dist/src/evals/judge.js +1 -0
  182. package/dist/src/evals/match.d.ts +67 -0
  183. package/dist/src/evals/match.js +1 -0
  184. package/dist/src/evals/reporters/index.d.ts +1 -0
  185. package/dist/src/evals/reporters/index.js +1 -1
  186. package/dist/src/evals/requirements.d.ts +3 -0
  187. package/dist/src/evals/requirements.js +1 -0
  188. package/dist/src/evals/runner/artifacts.d.ts +7 -6
  189. package/dist/src/evals/runner/artifacts.js +3 -3
  190. package/dist/src/evals/runner/derive-run-facts.d.ts +17 -3
  191. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  192. package/dist/src/evals/runner/discover.d.ts +31 -10
  193. package/dist/src/evals/runner/discover.js +1 -1
  194. package/dist/src/evals/runner/execute-eval.d.ts +25 -0
  195. package/dist/src/evals/runner/execute-eval.js +1 -0
  196. package/dist/src/evals/runner/execute-task.d.ts +31 -0
  197. package/dist/src/evals/runner/execute-task.js +1 -0
  198. package/dist/src/evals/runner/reporters/braintrust.d.ts +7 -5
  199. package/dist/src/evals/runner/reporters/braintrust.js +2 -2
  200. package/dist/src/evals/runner/reporters/console.d.ts +4 -4
  201. package/dist/src/evals/runner/reporters/console.js +1 -1
  202. package/dist/src/evals/runner/reporters/junit.d.ts +10 -0
  203. package/dist/src/evals/runner/reporters/junit.js +4 -0
  204. package/dist/src/evals/runner/reporters/types.d.ts +14 -8
  205. package/dist/src/evals/runner/run-evals.d.ts +38 -0
  206. package/dist/src/evals/runner/run-evals.js +1 -0
  207. package/dist/src/evals/runner/verdict.d.ts +13 -0
  208. package/dist/src/evals/runner/verdict.js +1 -0
  209. package/dist/src/evals/session.d.ts +52 -0
  210. package/dist/src/evals/session.js +1 -0
  211. package/dist/src/evals/target.d.ts +23 -0
  212. package/dist/src/evals/target.js +1 -0
  213. package/dist/src/evals/types.d.ts +353 -165
  214. package/dist/src/execution/compaction.d.ts +14 -0
  215. package/dist/src/execution/compaction.js +1 -0
  216. package/dist/src/execution/delegated-parent-notification.js +1 -1
  217. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  218. package/dist/src/execution/node-step.js +1 -1
  219. package/dist/src/execution/sandbox/bash-tool.d.ts +6 -6
  220. package/dist/src/execution/sandbox/bash-tool.js +1 -1
  221. package/dist/src/execution/sandbox/bindings/local.d.ts +11 -0
  222. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  223. package/dist/src/execution/sandbox/glob-tool.js +3 -3
  224. package/dist/src/execution/sandbox/grep-tool.js +3 -3
  225. package/dist/src/execution/sandbox/read-file-tool.js +1 -1
  226. package/dist/src/execution/subagent-adapter.js +1 -1
  227. package/dist/src/execution/tool-auth.js +1 -1
  228. package/dist/src/execution/turn-workflow.js +1 -1
  229. package/dist/src/execution/workflow-runtime.d.ts +2 -2
  230. package/dist/src/execution/workflow-runtime.js +1 -1
  231. package/dist/src/execution/workflow-steps.js +1 -1
  232. package/dist/src/harness/action-result-helpers.js +1 -1
  233. package/dist/src/harness/authorization.d.ts +26 -0
  234. package/dist/src/harness/authorization.js +1 -1
  235. package/dist/src/harness/code-mode-lifecycle.js +1 -1
  236. package/dist/src/harness/emission.d.ts +12 -5
  237. package/dist/src/harness/emission.js +1 -1
  238. package/dist/src/harness/model-call-error.d.ts +35 -6
  239. package/dist/src/harness/model-call-error.js +1 -1
  240. package/dist/src/harness/step-hooks.d.ts +10 -4
  241. package/dist/src/harness/step-hooks.js +1 -1
  242. package/dist/src/harness/tool-loop.js +1 -1
  243. package/dist/src/harness/tools.d.ts +4 -6
  244. package/dist/src/harness/tools.js +1 -1
  245. package/dist/src/harness/turn-tag-state.d.ts +4 -0
  246. package/dist/src/harness/turn-tag-state.js +1 -1
  247. package/dist/src/harness/types.d.ts +4 -15
  248. package/dist/src/internal/application/cache-metadata.js +1 -1
  249. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  250. package/dist/src/internal/application/package.js +1 -1
  251. package/dist/src/internal/application/paths.js +1 -1
  252. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  253. package/dist/src/internal/authored-module-loader.d.ts +4 -1
  254. package/dist/src/internal/authored-module-loader.js +2 -2
  255. package/dist/src/internal/authored-module-map-loader.js +1 -1
  256. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +11 -0
  257. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  258. package/dist/src/internal/nitro/host/build-application.js +1 -1
  259. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  260. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  261. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  262. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  263. package/dist/src/internal/nitro/host/dev-watcher-log.d.ts +37 -0
  264. package/dist/src/internal/nitro/host/dev-watcher-log.js +1 -0
  265. package/dist/src/internal/nitro/host/ports.d.ts +8 -0
  266. package/dist/src/internal/nitro/host/ports.js +1 -0
  267. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  268. package/dist/src/internal/nitro/host/server-external-packages.d.ts +1 -1
  269. package/dist/src/internal/nitro/host/server-external-packages.js +1 -1
  270. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  271. package/dist/src/internal/nitro/host/start-production-server.js +1 -1
  272. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +5 -0
  273. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -0
  274. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +31 -2
  275. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  276. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.d.ts +13 -0
  277. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.js +1 -1
  278. package/dist/src/internal/nitro/routes/info.d.ts +2 -2
  279. package/dist/src/internal/nitro/routes/info.js +1 -1
  280. package/dist/src/internal/workflow/queue-namespace.d.ts +5 -0
  281. package/dist/src/internal/workflow/queue-namespace.js +1 -0
  282. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  283. package/dist/src/internal/workflow-bundle/builder.js +3 -5
  284. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  285. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +1 -1
  286. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  287. package/dist/src/node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js +4 -4
  288. package/dist/src/protocol/message.d.ts +15 -0
  289. package/dist/src/protocol/message.js +2 -2
  290. package/dist/src/public/channels/slack/api.d.ts +8 -0
  291. package/dist/src/public/channels/slack/api.js +1 -1
  292. package/dist/src/public/channels/slack/connections.d.ts +26 -18
  293. package/dist/src/public/channels/slack/connections.js +1 -1
  294. package/dist/src/public/channels/slack/defaults.d.ts +5 -2
  295. package/dist/src/public/channels/slack/defaults.js +1 -1
  296. package/dist/src/public/channels/slack/index.d.ts +1 -1
  297. package/dist/src/public/channels/slack/slackChannel.d.ts +65 -5
  298. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  299. package/dist/src/public/channels/teams/defaults.js +1 -1
  300. package/dist/src/public/connections/errors.d.ts +8 -0
  301. package/dist/src/public/definitions/tool.d.ts +0 -33
  302. package/dist/src/public/next/index.d.ts +7 -1
  303. package/dist/src/public/next/index.js +1 -1
  304. package/dist/src/public/next/server.d.ts +1 -0
  305. package/dist/src/public/next/server.js +1 -1
  306. package/dist/src/public/nuxt/dev-server.js +1 -1
  307. package/dist/src/public/sandbox/backends/local.d.ts +2 -3
  308. package/dist/src/public/sveltekit/dev-server.js +1 -1
  309. package/dist/src/public/sveltekit/index.d.ts +1 -1
  310. package/dist/src/public/tools/defaults.d.ts +2 -4
  311. package/dist/src/public/tools/defaults.js +1 -1
  312. package/dist/src/public/tools/define-bash-tool.d.ts +3 -3
  313. package/dist/src/public/tools/define-bash-tool.js +1 -1
  314. package/dist/src/public/tools/define-read-file-tool.d.ts +0 -6
  315. package/dist/src/public/tools/define-read-file-tool.js +1 -1
  316. package/dist/src/public/tools/index.d.ts +2 -2
  317. package/dist/src/public/tools/index.js +1 -1
  318. package/dist/src/public/tools/internal.js +1 -1
  319. package/dist/src/runtime/actions/types.d.ts +11 -11
  320. package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
  321. package/dist/src/runtime/agent/mock-model-fixtures.js +3 -2
  322. package/dist/src/runtime/agent/mock-model-skill-selection.js +3 -4
  323. package/dist/src/runtime/connections/callback-route.js +1 -1
  324. package/dist/src/runtime/connections/mcp-client.js +1 -1
  325. package/dist/src/runtime/connections/scoped-authorization.d.ts +21 -5
  326. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  327. package/dist/src/runtime/connections/types.d.ts +33 -0
  328. package/dist/src/runtime/connections/validate-authorization.js +1 -1
  329. package/dist/src/runtime/framework-tools/bash.d.ts +3 -3
  330. package/dist/src/runtime/framework-tools/bash.js +1 -1
  331. package/dist/src/runtime/framework-tools/connection-search-dynamic.d.ts +1 -1
  332. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +1 -1
  333. package/dist/src/runtime/framework-tools/file-state.d.ts +3 -3
  334. package/dist/src/runtime/framework-tools/index.js +1 -1
  335. package/dist/src/runtime/framework-tools/read-file.js +2 -2
  336. package/dist/src/runtime/framework-tools/todo.d.ts +7 -0
  337. package/dist/src/runtime/framework-tools/todo.js +2 -2
  338. package/dist/src/runtime/governance/auth/http-basic.js +1 -1
  339. package/dist/src/runtime/input/types.d.ts +1 -1
  340. package/dist/src/runtime/resolve-tool.d.ts +2 -2
  341. package/dist/src/runtime/resolve-tool.js +1 -1
  342. package/dist/src/runtime/sandbox/keys.js +1 -1
  343. package/dist/src/runtime/session-callback-route.js +1 -1
  344. package/dist/src/runtime/types.d.ts +1 -7
  345. package/dist/src/services/dev-client/client-options.d.ts +8 -0
  346. package/dist/src/services/dev-client/client-options.js +1 -0
  347. package/dist/src/services/dev-client/runtime-artifacts.d.ts +13 -0
  348. package/dist/src/services/dev-client/runtime-artifacts.js +1 -0
  349. package/dist/src/services/dev-client.d.ts +13 -46
  350. package/dist/src/services/dev-client.js +1 -1
  351. package/dist/src/services/inspect-application.js +1 -1
  352. package/dist/src/setup/ask.d.ts +205 -0
  353. package/dist/src/setup/ask.js +1 -0
  354. package/dist/src/setup/boxes/add-channels.d.ts +100 -16
  355. package/dist/src/setup/boxes/add-channels.js +2 -1
  356. package/dist/src/setup/boxes/add-connections.d.ts +13 -23
  357. package/dist/src/setup/boxes/add-connections.js +1 -1
  358. package/dist/src/setup/boxes/apply-ai-gateway-credential.d.ts +2 -2
  359. package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
  360. package/dist/src/setup/boxes/deploy-project.d.ts +46 -14
  361. package/dist/src/setup/boxes/deploy-project.js +1 -1
  362. package/dist/src/setup/boxes/detect-ai-gateway.d.ts +10 -3
  363. package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
  364. package/dist/src/setup/boxes/link-project.d.ts +3 -3
  365. package/dist/src/setup/boxes/link-project.js +1 -1
  366. package/dist/src/setup/boxes/one-shot-next-steps.d.ts +18 -0
  367. package/dist/src/setup/boxes/one-shot-next-steps.js +2 -0
  368. package/dist/src/setup/boxes/preflight.d.ts +14 -6
  369. package/dist/src/setup/boxes/preflight.js +1 -1
  370. package/dist/src/setup/boxes/resolve-provisioning.d.ts +36 -8
  371. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  372. package/dist/src/setup/boxes/resolve-target.d.ts +25 -8
  373. package/dist/src/setup/boxes/resolve-target.js +1 -1
  374. package/dist/src/setup/boxes/scaffold.d.ts +12 -6
  375. package/dist/src/setup/boxes/scaffold.js +1 -1
  376. package/dist/src/setup/boxes/select-channels.d.ts +38 -9
  377. package/dist/src/setup/boxes/select-channels.js +1 -1
  378. package/dist/src/setup/boxes/select-chat.d.ts +15 -11
  379. package/dist/src/setup/boxes/select-chat.js +1 -1
  380. package/dist/src/setup/boxes/select-connections.d.ts +30 -0
  381. package/dist/src/setup/boxes/select-connections.js +1 -0
  382. package/dist/src/setup/boxes/select-model.d.ts +18 -14
  383. package/dist/src/setup/boxes/select-model.js +1 -1
  384. package/dist/src/setup/boxes/select-setup-mode.d.ts +32 -0
  385. package/dist/src/setup/boxes/select-setup-mode.js +1 -0
  386. package/dist/src/setup/channel-add-conflicts.d.ts +28 -0
  387. package/dist/src/setup/channel-add-conflicts.js +1 -0
  388. package/dist/src/setup/cli/channel-setup-prompter.d.ts +23 -0
  389. package/dist/src/setup/cli/channel-setup-prompter.js +1 -0
  390. package/dist/src/setup/cli/connection-add-prompter.d.ts +8 -0
  391. package/dist/src/setup/cli/connection-add-prompter.js +1 -0
  392. package/dist/src/setup/{scaffold/cli → cli}/index.d.ts +4 -3
  393. package/dist/src/setup/cli/index.js +1 -0
  394. package/dist/src/setup/{scaffold/cli → cli}/prompt-ui.d.ts +39 -15
  395. package/dist/src/setup/cli/prompt-ui.js +5 -0
  396. package/dist/src/setup/{scaffold/cli → cli}/rail-log.d.ts +2 -0
  397. package/dist/src/setup/{scaffold/cli → cli}/rail-log.js +2 -2
  398. package/dist/src/setup/{scaffold/cli → cli}/select-component.d.ts +18 -3
  399. package/dist/src/setup/cli/select-component.js +1 -0
  400. package/dist/src/setup/cli/select-option-codec.d.ts +12 -0
  401. package/dist/src/setup/cli/select-option-codec.js +1 -0
  402. package/dist/src/setup/{scaffold/cli → cli}/select-state.d.ts +13 -1
  403. package/dist/src/setup/cli/select-state.js +1 -0
  404. package/dist/src/setup/cli/whimsy.d.ts +16 -0
  405. package/dist/src/setup/cli/whimsy.js +1 -0
  406. package/dist/src/setup/{scaffold/steps/setup-connection.d.ts → connection-connector.d.ts} +3 -2
  407. package/dist/src/setup/connection-connector.js +1 -0
  408. package/dist/src/setup/flows/channels.d.ts +43 -0
  409. package/dist/src/setup/flows/channels.js +1 -0
  410. package/dist/src/setup/flows/deploy.d.ts +40 -0
  411. package/dist/src/setup/flows/deploy.js +1 -0
  412. package/dist/src/setup/flows/in-project.d.ts +16 -0
  413. package/dist/src/setup/flows/in-project.js +1 -0
  414. package/dist/src/setup/flows/link.d.ts +43 -0
  415. package/dist/src/setup/flows/link.js +1 -0
  416. package/dist/src/setup/flows/model.d.ts +112 -0
  417. package/dist/src/setup/flows/model.js +1 -0
  418. package/dist/src/setup/flows/vercel.d.ts +31 -0
  419. package/dist/src/setup/flows/vercel.js +2 -0
  420. package/dist/src/setup/gateway-models.js +1 -1
  421. package/dist/src/setup/headless.d.ts +1 -1
  422. package/dist/src/setup/index.d.ts +10 -4
  423. package/dist/src/setup/index.js +1 -1
  424. package/dist/src/setup/onboarding.d.ts +7 -4
  425. package/dist/src/setup/onboarding.js +1 -1
  426. package/dist/src/setup/package-manager.d.ts +27 -0
  427. package/dist/src/setup/package-manager.js +1 -0
  428. package/dist/src/setup/primitives/index.d.ts +3 -0
  429. package/dist/src/setup/primitives/index.js +1 -0
  430. package/dist/src/setup/primitives/pm/bun.d.ts +10 -0
  431. package/dist/src/setup/primitives/pm/bun.js +1 -0
  432. package/dist/src/setup/primitives/pm/index.d.ts +11 -0
  433. package/dist/src/setup/primitives/pm/index.js +1 -0
  434. package/dist/src/setup/primitives/pm/npm.d.ts +10 -0
  435. package/dist/src/setup/primitives/pm/npm.js +1 -0
  436. package/dist/src/setup/primitives/pm/pnpm.d.ts +27 -0
  437. package/dist/src/setup/primitives/pm/pnpm.js +8 -0
  438. package/dist/src/setup/primitives/pm/run.d.ts +23 -0
  439. package/dist/src/setup/primitives/pm/run.js +1 -0
  440. package/dist/src/setup/primitives/pm/shared.d.ts +8 -0
  441. package/dist/src/setup/primitives/pm/shared.js +1 -0
  442. package/dist/src/setup/primitives/pm/types.d.ts +37 -0
  443. package/dist/src/setup/primitives/pm/types.js +1 -0
  444. package/dist/src/setup/primitives/pm/yarn.d.ts +10 -0
  445. package/dist/src/setup/primitives/pm/yarn.js +1 -0
  446. package/dist/src/setup/primitives/run-pnpm.d.ts +1 -0
  447. package/dist/src/setup/primitives/run-pnpm.js +1 -0
  448. package/dist/src/setup/{scaffold/primitives → primitives}/run-vercel.d.ts +7 -0
  449. package/dist/src/setup/primitives/run-vercel.js +1 -0
  450. package/dist/src/setup/project-name.d.ts +4 -0
  451. package/dist/src/setup/project-name.js +1 -0
  452. package/dist/src/setup/project-resolution.d.ts +54 -0
  453. package/dist/src/setup/project-resolution.js +1 -0
  454. package/dist/src/setup/prompter.d.ts +52 -4
  455. package/dist/src/setup/prompter.js +1 -1
  456. package/dist/src/setup/quit-guard.d.ts +1 -1
  457. package/dist/src/setup/run-vercel-link.d.ts +1 -1
  458. package/dist/src/setup/run-vercel-link.js +1 -1
  459. package/dist/src/setup/runner.d.ts +5 -4
  460. package/dist/src/setup/runner.js +1 -1
  461. package/dist/src/setup/scaffold/channels-catalog.d.ts +3 -3
  462. package/dist/src/setup/scaffold/channels-catalog.js +1 -1
  463. package/dist/src/setup/scaffold/create/add-to-project.d.ts +26 -0
  464. package/dist/src/setup/scaffold/create/add-to-project.js +1 -0
  465. package/dist/src/setup/scaffold/create/project.d.ts +54 -0
  466. package/dist/src/setup/scaffold/create/project.js +80 -0
  467. package/dist/src/setup/scaffold/index.d.ts +4 -4
  468. package/dist/src/setup/scaffold/index.js +1 -1
  469. package/dist/src/setup/scaffold/{channels.d.ts → update/channels.d.ts} +11 -0
  470. package/dist/src/setup/scaffold/update/channels.js +7 -0
  471. package/dist/src/setup/scaffold/{connections.d.ts → update/connections.d.ts} +1 -1
  472. package/dist/src/setup/scaffold/update/connections.js +21 -0
  473. package/dist/src/setup/scaffold/version-tokens.d.ts +11 -0
  474. package/dist/src/setup/scaffold/version-tokens.js +1 -0
  475. package/dist/src/setup/{scaffold/steps/setup-slackbot.d.ts → slackbot.d.ts} +24 -20
  476. package/dist/src/setup/slackbot.js +1 -0
  477. package/dist/src/setup/state.d.ts +62 -15
  478. package/dist/src/setup/state.js +1 -1
  479. package/dist/src/setup/step.d.ts +9 -18
  480. package/dist/src/setup/vercel-project.d.ts +15 -8
  481. package/dist/src/setup/vercel-project.js +1 -1
  482. package/dist/src/shared/agent-definition.d.ts +9 -3
  483. package/dist/src/shared/default-agent-model.d.ts +5 -0
  484. package/dist/src/shared/default-agent-model.js +1 -0
  485. package/dist/src/shared/sandbox-backend.d.ts +11 -11
  486. package/dist/src/source-change/apply-model-name.d.ts +25 -0
  487. package/dist/src/source-change/apply-model-name.js +2 -0
  488. package/dist/src/source-change/static-source-change.d.ts +36 -0
  489. package/dist/src/source-change/static-source-change.js +1 -0
  490. package/dist/src/svelte/index.js +1 -1
  491. package/dist/src/svelte/use-eve-agent.js +1 -1
  492. package/dist/src/vue/index.js +1 -1
  493. package/dist/src/vue/use-eve-agent.js +1 -1
  494. package/package.json +23 -38
  495. package/dist/docs/public/advanced/evals.md +0 -121
  496. package/dist/src/cli/commands/setup.d.ts +0 -55
  497. package/dist/src/cli/commands/setup.js +0 -1
  498. package/dist/src/cli/dev/repl/input-requests.d.ts +0 -38
  499. package/dist/src/cli/dev/repl/input-requests.js +0 -1
  500. package/dist/src/cli/dev/repl/input.d.ts +0 -19
  501. package/dist/src/cli/dev/repl/input.js +0 -1
  502. package/dist/src/cli/dev/repl/repl.d.ts +0 -62
  503. package/dist/src/cli/dev/repl/repl.js +0 -2
  504. package/dist/src/cli/dev/repl/terminal.d.ts +0 -21
  505. package/dist/src/cli/dev/repl/terminal.js +0 -5
  506. package/dist/src/compiled/_chunks/workflow/resume-hook-0Zk0zSvq.js +0 -12
  507. package/dist/src/compiled/_chunks/workflow/sleep-DXZr2BgM.js +0 -1
  508. package/dist/src/evals/define-eval-suite.d.ts +0 -16
  509. package/dist/src/evals/define-eval-suite.js +0 -1
  510. package/dist/src/evals/runner/execute-case.d.ts +0 -23
  511. package/dist/src/evals/runner/execute-case.js +0 -1
  512. package/dist/src/evals/runner/execute-suite.d.ts +0 -24
  513. package/dist/src/evals/runner/execute-suite.js +0 -1
  514. package/dist/src/evals/scorers/autoevals-client.js +0 -2
  515. package/dist/src/evals/scorers/autoevals.d.ts +0 -58
  516. package/dist/src/evals/scorers/autoevals.js +0 -1
  517. package/dist/src/evals/scorers/json.d.ts +0 -10
  518. package/dist/src/evals/scorers/json.js +0 -1
  519. package/dist/src/evals/scorers/run.d.ts +0 -18
  520. package/dist/src/evals/scorers/run.js +0 -1
  521. package/dist/src/evals/scorers/sql.d.ts +0 -9
  522. package/dist/src/evals/scorers/sql.js +0 -1
  523. package/dist/src/evals/scorers/text.d.ts +0 -18
  524. package/dist/src/evals/scorers/text.js +0 -1
  525. package/dist/src/evals/scores/index.d.ts +0 -72
  526. package/dist/src/evals/scores/index.js +0 -1
  527. package/dist/src/execution/tool-compaction.d.ts +0 -9
  528. package/dist/src/execution/tool-compaction.js +0 -1
  529. package/dist/src/services/dev-client/stream.d.ts +0 -5
  530. package/dist/src/services/dev-client/stream.js +0 -1
  531. package/dist/src/services/dev-client/url.d.ts +0 -11
  532. package/dist/src/services/dev-client/url.js +0 -1
  533. package/dist/src/setup/channel-setup-prompter.d.ts +0 -8
  534. package/dist/src/setup/channel-setup-prompter.js +0 -1
  535. package/dist/src/setup/scaffold/channels.js +0 -7
  536. package/dist/src/setup/scaffold/cli/channel-add-prompter.d.ts +0 -12
  537. package/dist/src/setup/scaffold/cli/channel-add-prompter.js +0 -1
  538. package/dist/src/setup/scaffold/cli/channel-setup-prompter.d.ts +0 -56
  539. package/dist/src/setup/scaffold/cli/connection-add-prompter.d.ts +0 -44
  540. package/dist/src/setup/scaffold/cli/connection-add-prompter.js +0 -1
  541. package/dist/src/setup/scaffold/cli/index.js +0 -1
  542. package/dist/src/setup/scaffold/cli/prompt-ui.js +0 -5
  543. package/dist/src/setup/scaffold/cli/select-component.js +0 -1
  544. package/dist/src/setup/scaffold/cli/select-state.js +0 -1
  545. package/dist/src/setup/scaffold/connections.js +0 -21
  546. package/dist/src/setup/scaffold/pnpm-workspace.d.ts +0 -3
  547. package/dist/src/setup/scaffold/pnpm-workspace.js +0 -11
  548. package/dist/src/setup/scaffold/primitives/detect-deployment.d.ts +0 -13
  549. package/dist/src/setup/scaffold/primitives/detect-deployment.js +0 -1
  550. package/dist/src/setup/scaffold/primitives/index.d.ts +0 -3
  551. package/dist/src/setup/scaffold/primitives/index.js +0 -1
  552. package/dist/src/setup/scaffold/primitives/pnpm-invocation.d.ts +0 -12
  553. package/dist/src/setup/scaffold/primitives/pnpm-invocation.js +0 -1
  554. package/dist/src/setup/scaffold/primitives/run-pnpm.d.ts +0 -17
  555. package/dist/src/setup/scaffold/primitives/run-pnpm.js +0 -1
  556. package/dist/src/setup/scaffold/primitives/run-vercel.js +0 -1
  557. package/dist/src/setup/scaffold/project.d.ts +0 -21
  558. package/dist/src/setup/scaffold/project.js +0 -80
  559. package/dist/src/setup/scaffold/steps/deploy-to-vercel.d.ts +0 -17
  560. package/dist/src/setup/scaffold/steps/deploy-to-vercel.js +0 -1
  561. package/dist/src/setup/scaffold/steps/index.d.ts +0 -4
  562. package/dist/src/setup/scaffold/steps/index.js +0 -1
  563. package/dist/src/setup/scaffold/steps/project-resolution.d.ts +0 -19
  564. package/dist/src/setup/scaffold/steps/project-resolution.js +0 -1
  565. package/dist/src/setup/scaffold/steps/run-add-connection.d.ts +0 -40
  566. package/dist/src/setup/scaffold/steps/run-add-connection.js +0 -1
  567. package/dist/src/setup/scaffold/steps/run-add-to-agent.d.ts +0 -81
  568. package/dist/src/setup/scaffold/steps/run-add-to-agent.js +0 -2
  569. package/dist/src/setup/scaffold/steps/setup-connection.js +0 -1
  570. package/dist/src/setup/scaffold/steps/setup-slackbot.js +0 -1
  571. /package/dist/src/{setup/scaffold/cli/channel-setup-prompter.js → cli/dev/tui/setup-flow.js} +0 -0
  572. /package/dist/src/evals/{scorers/autoevals-client.d.ts → autoevals-client.d.ts} +0 -0
  573. /package/dist/src/setup/{scaffold/cli → cli}/command-output.d.ts +0 -0
  574. /package/dist/src/setup/{scaffold/cli → cli}/command-output.js +0 -0
  575. /package/dist/src/setup/{scaffold/human-action.d.ts → human-action.d.ts} +0 -0
  576. /package/dist/src/setup/{scaffold/human-action.js → human-action.js} +0 -0
  577. /package/dist/src/setup/{scaffold/primitives → primitives}/process-output.d.ts +0 -0
  578. /package/dist/src/setup/{scaffold/primitives → primitives}/process-output.js +0 -0
  579. /package/dist/src/setup/scaffold/{web-template.d.ts → create/web-template.d.ts} +0 -0
  580. /package/dist/src/setup/scaffold/{web-template.js → create/web-template.js} +0 -0
  581. /package/dist/src/setup/scaffold/{module-files.d.ts → update/module-files.d.ts} +0 -0
  582. /package/dist/src/setup/scaffold/{module-files.js → update/module-files.js} +0 -0
  583. /package/dist/src/setup/scaffold/{package-json.d.ts → update/package-json.d.ts} +0 -0
  584. /package/dist/src/setup/scaffold/{package-json.js → update/package-json.js} +0 -0
  585. /package/dist/src/setup/scaffold/{primitives → update}/update-connection-connector.d.ts +0 -0
  586. /package/dist/src/setup/scaffold/{primitives → update}/update-connection-connector.js +0 -0
  587. /package/dist/src/setup/scaffold/{primitives → update}/update-slack-channel.d.ts +0 -0
  588. /package/dist/src/setup/scaffold/{primitives → update}/update-slack-channel.js +0 -0
@@ -0,0 +1,2 @@
1
+ import{deepEquals,subagentCallMatches,testRegExp,toolCallMatches}from"#evals/match.js";const PASS={score:1},fail=(e,t)=>({score:0,message:e,metadata:t});function completed(){return{name:`completed`,evaluate(e){return e.status===`failed`?fail(failureDetail(`run failed`,e.derived.failureCode)):e.derived.parked?fail(`run parked on ${e.derived.inputRequests.length} unanswered input request(s)`):PASS}}}function waiting(){return{name:`waiting`,evaluate(e){return e.derived.parked?PASS:fail(`expected the run to park on HITL input; it ended "${e.status}" with no pending requests`)}}}function didNotFail(){return{name:`didNotFail`,evaluate(e){if(e.status===`failed`)return fail(failureDetail(`run failed`,e.derived.failureCode));let t=e.events.find(e=>e.type===`turn.failed`||e.type===`step.failed`);return t===void 0?PASS:fail(`${t.type} (${t.data.code}): ${t.data.message}`)}}}function messageIncludes(e){return{name:`messageIncludes(${String(e)})`,evaluate(t){let r=joinCompletedMessages(t.events);return(typeof e==`string`?r.includes(e):testRegExp(e,r))?PASS:fail(`assistant messages did not include ${String(e)}; got: ${truncate(r)}`)}}}function calledTool(e,t={}){return{name:`calledTool(${e})`,evaluate(n){let i=n.derived.toolCalls.filter(t=>t.name===e),a=i.filter(e=>toolCallMatches(e,t));if(t.times===void 0?a.length>0:a.length===t.times)return{score:1,metadata:{matchingCalls:a.length}};let o=i.length>0?`observed ${e} calls: ${i.map(e=>truncate(JSON.stringify(e.input))).join(`, `)}`:`observed tools: [${n.derived.toolCalls.map(e=>e.name).join(`, `)}]`;return fail(`${t.times===void 0?`expected a matching call to "${e}"`:`expected exactly ${t.times} matching call(s), found ${a.length}`}; ${o}`)}}}function notCalledTool(e){return{name:`notCalledTool(${e})`,evaluate(t){let n=t.derived.toolCalls.filter(t=>t.name===e).length;return n===0?PASS:fail(`"${e}" was called ${n} time(s)`)}}}function toolOrder(e){return{name:`toolOrder(${e.join(` → `)})`,evaluate(t){let n=t.derived.toolCalls.map(e=>e.name),r=0;for(let t of n)if(t===e[r]&&(r+=1),r===e.length)break;return r===e.length?PASS:fail(`missing "${e[r]}" after [${e.slice(0,r).join(`, `)}]; observed order: [${n.join(`, `)}]`)}}}function usedNoTools(){return{name:`usedNoTools`,evaluate(e){let t=e.derived.toolCallCount;return t===0?PASS:fail(`expected no tool calls, got ${t}`,{toolCallCount:t})}}}function maxToolCalls(e){return{name:`maxToolCalls(${e})`,evaluate(t){let n=t.derived.toolCallCount;return n<=e?PASS:fail(`expected at most ${e} tool calls, got ${n}`,{maxAllowed:e,toolCallCount:n})}}}function noFailedActions(){return{name:`noFailedActions`,evaluate(e){let t=e.events.filter(e=>e.type===`action.result`&&(e.data.status===`failed`||e.data.result.isError===!0));if(t.length===0)return PASS;let n=t.map(e=>e.data.result.kind===`tool-result`?e.data.result.toolName:e.data.result.kind);return fail(`${t.length} failed action(s): ${n.join(`, `)}`)}}}function calledSubagent(e,n={}){return{name:`calledSubagent(${e})`,evaluate(r){let a=r.derived.subagentCalls.filter(t=>t.name===e);return a.filter(e=>subagentCallMatches(e,n)).length>0?PASS:a.length===0?fail(`subagent "${e}" was never called; observed: [${r.derived.subagentCalls.map(e=>e.name).join(`, `)}]`,{observedSubagentCalls:r.derived.subagentCalls}):fail(`subagent "${e}" was called but no call matched the constraints`,{observedSubagentCalls:a})}}}function event(e,t){return{name:`event(${t})`,evaluate(n){return e(n.events)?PASS:fail(`event predicate "${t}" did not hold`)}}}function outputEquals(t){return{name:`outputEquals`,evaluate(n){return deepEquals(n.output,t)?PASS:fail(`output ${truncate(JSON.stringify(n.output))} does not equal expected ${truncate(JSON.stringify(t))}`)}}}function outputMatches(e){return{name:`outputMatches`,async evaluate(t){let n=await e[`~standard`].validate(t.output);return!(`issues`in n)||n.issues===void 0?PASS:fail(`output failed schema validation: ${n.issues.map(e=>e.message).join(`; `)}`)}}}function joinCompletedMessages(e){let t=[];for(let n of e)n.type===`message.completed`&&n.data.message!==null&&t.push(n.data.message);return t.join(`
2
+ `)}function failureDetail(e,t){return t===void 0?e:`${e} (code: ${t})`}function truncate(e,t=200){return e===void 0?`undefined`:e.length<=t?e:`${e.slice(0,t)}…`}export{calledSubagent,calledTool,completed,didNotFail,event,maxToolCalls,messageIncludes,noFailedActions,notCalledTool,outputEquals,outputMatches,toolOrder,usedNoTools,waiting};
@@ -0,0 +1,2 @@
1
+ import"../node_modules/.pnpm/autoevals@0.0.132_ws@8.21.0/node_modules/autoevals/jsdist/index.js";import{generateText,jsonSchema}from"ai";function createAutoevalsClient(e){return{chat:{completions:{create:t=>createChatCompletion(t,e)}}}}async function createChatCompletion(t,n){let r=convertTools(t.tools),i=await generateText({model:n.languageModel,messages:convertMessages(t.messages??[]),tools:Object.keys(r).length>0?r:void 0,toolChoice:convertToolChoice(t.tool_choice),providerOptions:n.providerOptions}),a=i.toolCalls.map(e=>({id:e.toolCallId,type:`function`,function:{name:e.toolName,arguments:JSON.stringify(e.input??{})}}));return{choices:[{index:0,finish_reason:a.length>0?`tool_calls`:`stop`,message:{role:`assistant`,content:i.text||null,tool_calls:a.length>0?a:void 0}}]}}function convertMessages(e){return e.map(e=>{let t=contentToText(e.content);switch(e.role){case`assistant`:return{role:`assistant`,content:t};case`developer`:case`system`:return{role:`system`,content:t};default:return{role:`user`,content:t}}})}function contentToText(e){return e==null?``:typeof e==`string`?e:e.map(e=>e.text??``).filter(Boolean).join(`
2
+ `)}function convertTools(e){let n={};for(let r of e??[])r.type!==`function`||r.function?.name===void 0||(n[r.function.name]={description:r.function.description,inputSchema:jsonSchema(r.function.parameters??{})});return n}function convertToolChoice(e){if(e!==void 0)return typeof e==`string`?e:{type:`tool`,toolName:e.function.name}}export{createAutoevalsClient};
@@ -0,0 +1,22 @@
1
+ import { Client } from "#client/client.js";
2
+ import type { ClientOptions } from "#client/types.js";
3
+ import type { EveEvalTargetHandle } from "#evals/types.js";
4
+ /**
5
+ * Resolves the {@link ClientOptions} for an eval target.
6
+ *
7
+ * Local targets need no auth. Remote targets connect with the same options
8
+ * as every other development client (`resolveDevelopmentClientOptions`):
9
+ * per-request headers carrying the Vercel OIDC trusted-IDP token (which
10
+ * bypasses Deployment Protection without a per-project secret) plus
11
+ * `x-vercel-protection-bypass` when `VERCEL_AUTOMATION_BYPASS_SECRET` is
12
+ * set, and a bearer resolved from the same OIDC cascade.
13
+ *
14
+ * `EVE_EVAL_AUTH_TOKEN` overrides the bearer with a static token for
15
+ * targets whose auth is not OIDC-based.
16
+ */
17
+ export declare function resolveEvalClientOptions(target: Pick<EveEvalTargetHandle, "kind" | "url">): ClientOptions;
18
+ /**
19
+ * Creates the Eve {@link Client} for an eval target from
20
+ * {@link resolveEvalClientOptions}.
21
+ */
22
+ export declare function createEvalClient(target: Pick<EveEvalTargetHandle, "kind" | "url">): Client;
@@ -0,0 +1 @@
1
+ import{resolveDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{Client}from"#client/client.js";function resolveEvalClientOptions(t){if(t.kind===`local`)return{host:t.url};let n=resolveDevelopmentClientOptions(t.url),r=process.env.EVE_EVAL_AUTH_TOKEN?.trim();return r?{...n,auth:{bearer:r}}:n}function createEvalClient(e){return new Client(resolveEvalClientOptions(e))}export{createEvalClient,resolveEvalClientOptions};
@@ -1,11 +1,16 @@
1
1
  interface EvalCliOptions {
2
- suite?: string[];
3
2
  url?: string;
4
3
  timeout?: string;
5
4
  maxConcurrency?: string;
6
5
  json?: boolean;
7
- all?: boolean;
6
+ junit?: string;
8
7
  skipReport?: boolean;
8
+ strict?: boolean;
9
+ list?: boolean;
10
+ mockModels?: boolean;
11
+ noSkips?: boolean;
12
+ tag?: string[];
13
+ verbose?: boolean;
9
14
  }
10
15
  type EvalCliLogger = {
11
16
  log(message: string): void;
@@ -13,6 +18,10 @@ type EvalCliLogger = {
13
18
  };
14
19
  /**
15
20
  * Runs the `eve eval` command with already-parsed Commander options.
21
+ *
22
+ * Exit codes: `0` when every executed eval passed its gate assertions (and
23
+ * soft thresholds under `--strict`), `1` when any eval failed, `2` for runner
24
+ * or configuration errors (no evals discovered, no evals matching filters).
16
25
  */
17
- export declare function runEvalCommand(options: EvalCliOptions, logger: EvalCliLogger): Promise<void>;
26
+ export declare function runEvalCommand(evalIds: readonly string[], options: EvalCliOptions, logger: EvalCliLogger): Promise<void>;
18
27
  export {};
@@ -1 +1 @@
1
- import{VERCEL_PROTECTION_BYPASS_HEADER}from"#services/dev-client/request-headers.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{Client}from"#client/client.js";import{getVercelOidcToken}from"#compiled/@vercel/oidc/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{startDevelopmentServer}from"#internal/nitro/host.js";import{discoverAndImportSuites}from"#evals/runner/discover.js";import{executeSuite}from"#evals/runner/execute-suite.js";import{ConsoleReporter}from"#evals/runner/reporters/console.js";async function runEvalCommand(e,n){let r=resolveApplicationRoot();loadDevelopmentEnvironmentFiles(r);let s=e.suite,c=await discoverAndImportSuites(r,s);if(c.length===0){s&&s.length>0?n.error(`No suites found matching: ${s.join(`, `)}`):n.error(`No eval suites found. Create suite files under evals/ with the *.eval.ts extension.`),process.exitCode=1;return}let l,u;e.url?u={kind:`remote`,url:e.url}:(l=await startDevelopmentServer(r,{host:`127.0.0.1`,port:0}),u={kind:`local`,url:l.url});let d=createEvalClient(u);try{let t=[];for(let n of c){let i=applyCliOverrides(n,e),a=buildReporters(i,{json:e.json===!0,skipReport:e.skipReport===!0}),o=await executeSuite({suite:i,target:u,reporters:a,appRoot:r,client:d});t.push(o)}e.json&&n.log(JSON.stringify(t,null,2)),t.some(e=>e.errored>0)&&(process.exitCode=1)}finally{l&&await l.close()}process.exit(process.exitCode??0)}function createEvalClient(t){if(t.kind===`local`)return new Client({host:t.url});let r={},i=process.env.VERCEL_AUTOMATION_BYPASS_SECRET?.trim();return i&&(r[VERCEL_PROTECTION_BYPASS_HEADER]=i),new Client({auth:resolveRemoteBearerAuth(),headers:Object.keys(r).length>0?r:void 0,host:t.url})}function resolveRemoteBearerAuth(){let e=process.env.EVE_EVAL_AUTH_TOKEN?.trim();return e?{bearer:e}:{bearer:resolveOidcBearerToken}}async function resolveOidcBearerToken(){try{let e=(await getVercelOidcToken()).trim();if(e.length>0)return e}catch{}return process.env.VERCEL_OIDC_TOKEN?.trim()??``}function applyCliOverrides(e,t){let n=t.maxConcurrency?Number.parseInt(t.maxConcurrency,10):void 0,r=t.timeout?Number.parseInt(t.timeout,10):void 0;if(n===void 0&&r===void 0)return e;let i={...e};return n!==void 0&&(i.maxConcurrency=n),r!==void 0&&(i.timeoutMs=r),i}function buildReporters(e,t){let n=t.json?[]:[new ConsoleReporter];return!t.skipReport&&e.reporters&&n.push(...e.reporters),n}export{runEvalCommand};
1
+ import{basename,join}from"node:path";import{readFile}from"node:fs/promises";import{resolveApplicationRoot}from"#internal/application/paths.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{startDevelopmentServer}from"#internal/nitro/host.js";import{EVE_MOCK_AUTHORED_MODELS_ENV}from"#runtime/agent/resolve-model.js";import{createEvalClient}from"#evals/cli/eval-client.js";import{discoverAndImportEvals,discoverEvalConfig}from"#evals/runner/discover.js";import{runEvals}from"#evals/runner/run-evals.js";import{ConsoleReporter}from"#evals/runner/reporters/console.js";import{JUnit}from"#evals/runner/reporters/junit.js";import{resolveEvalTargetHandle}from"#evals/target.js";async function runEvalCommand(e,t,n){let s=resolveApplicationRoot();if(t.url&&t.mockModels===!0){n.error(`--mock-models cannot be used with --url. The target's mock-model state is discovered from /eve/v1/info.`),process.exitCode=2;return}let c=t.mockModels===!0?setEnvForRun(EVE_MOCK_AUTHORED_MODELS_ENV,`1`):void 0,l;try{loadDevelopmentEnvironmentFiles(s);let r=e.length>0?e:void 0,a=await discoverAndImportEvals(s,r);if(a.length===0){r?n.error(`No evals found matching: ${r.join(`, `)}`):n.error(`No evals found. Create files under evals/ with the *.eval.ts extension.`),process.exitCode=2;return}let c=filterEvalsByTag(a,t.tag??[]);if(c.length===0){n.error(`No evals matched the provided tags (${(t.tag??[]).join(`, `)}).`),process.exitCode=2;return}let u,d;try{u=parsePositiveInteger(t.maxConcurrency,`--max-concurrency`),d=parseNonNegativeInteger(t.timeout,`--timeout`)}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}if(t.list===!0){printEvalList(c,t.json===!0,n);return}let f;try{f=await discoverEvalConfig(s)}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=2;return}let p,m;try{t.url?m=await resolveEvalTargetHandle({client:createEvalClient({kind:`remote`,url:t.url}),expectedAgentName:await readExpectedAgentName(s),kind:`remote`,url:t.url}):(p=await startDevelopmentServer(s,{host:`127.0.0.1`,port:0}),m=await resolveEvalTargetHandle({client:createEvalClient({kind:`local`,url:p.url}),expectedAgentName:await readExpectedAgentName(s),kind:`local`,url:p.url}));let e=createEvalClient(m),r=t.json===!0?[]:[new ConsoleReporter];t.junit!==void 0&&r.push(JUnit({filePath:t.junit}));let i=await runEvals({evaluations:c,config:f,target:m,client:e,appRoot:s,reporters:r,includeEvalReporters:t.skipReport!==!0,failOnSkip:t.noSkips===!0,maxConcurrency:u,timeoutMs:d,onEvalLog:t.verbose===!0?(e,t)=>n.log(`[${e}] ${t}`):void 0});t.json&&n.log(JSON.stringify(i,null,2));let a=i.failed>0,o=t.strict===!0&&i.scored>0;(a||o)&&(process.exitCode=1)}finally{p&&await p.close()}l=typeof process.exitCode==`number`?process.exitCode:0}finally{c?.()}l!==void 0&&process.exit(l)}function parsePositiveInteger(e,t){if(e===void 0)return;let n=Number(e);if(!Number.isInteger(n)||n<1)throw Error(`${t} must be a positive integer; got "${e}".`);return n}function parseNonNegativeInteger(e,t){if(e===void 0)return;let n=Number(e);if(!Number.isInteger(n)||n<0)throw Error(`${t} must be a non-negative integer; got "${e}".`);return n}function filterEvalsByTag(e,t){return t.length===0?[...e]:e.filter(e=>e.tags?.some(e=>t.includes(e))??!1)}function printEvalList(e,t,n){if(t){let t=e.map(e=>({id:e.id,description:e.description,tags:e.tags}));n.log(JSON.stringify(t,null,2));return}for(let t of e){let e=t.description===void 0?``:` — ${t.description}`,r=t.tags!==void 0&&t.tags.length>0?` [${t.tags.join(`, `)}]`:``;n.log(`${t.id}${r}${e}`)}}function setEnvForRun(e,t){let n=process.env[e];return process.env[e]=t,()=>{n===void 0?delete process.env[e]:process.env[e]=n}}async function readExpectedAgentName(r){try{let i=JSON.parse(await readFile(join(r,`package.json`),`utf8`));return typeof i.name==`string`&&i.name.length>0?i.name:basename(r)}catch{return basename(r)}}export{runEvalCommand};
@@ -0,0 +1,19 @@
1
+ import { EvalSessionManager } from "#evals/session.js";
2
+ import { AssertionCollector } from "#evals/assertions/collector.js";
3
+ import type { EveEvalContext, EveEvalJudgeConfig, EveEvalTargetHandle } from "#evals/types.js";
4
+ /**
5
+ * Builds the `EveEvalContext` (`t`) for one eval run, wiring the session
6
+ * manager (driving), the assertion collector (recording), and the judge
7
+ * namespace. Returns the collector so the runner can {@link
8
+ * AssertionCollector.finalize} it against the completed task result.
9
+ */
10
+ export declare function createEvalContext(deps: {
11
+ readonly manager: EvalSessionManager;
12
+ readonly target: EveEvalTargetHandle;
13
+ readonly signal: AbortSignal;
14
+ readonly judge: EveEvalJudgeConfig | undefined;
15
+ readonly log: (message: string) => void;
16
+ }): {
17
+ readonly context: EveEvalContext;
18
+ readonly collector: AssertionCollector;
19
+ };
@@ -0,0 +1 @@
1
+ import"#evals/session.js";import{AssertionCollector}from"#evals/assertions/collector.js";import*as RunAssertions from"#evals/assertions/run.js";import{buildJudgeContext}from"#evals/judge.js";function createEvalContext(r){let i=new AssertionCollector,a=``,primary=()=>r.manager.primary,replyMessage=()=>r.manager.lastTurnSession()?.lastTurn?.message??null,o=buildJudgeContext({collector:i,getReply:replyMessage,getInput:()=>a,judge:r.judge});return{context:{get events(){return primary().events},get pendingInputRequests(){return primary().pendingInputRequests},get state(){return primary().state},get sessionId(){return primary().sessionId},expectInputRequests:e=>primary().expectInputRequests(e),respond:(...e)=>primary().respond(...e),respondAll:e=>primary().respondAll(e),send:e=>(a=promptText(e),primary().send(e)),sendFile:(e,t,n)=>(a=e,primary().sendFile(e,t,n)),signal:r.signal,target:r.target,get reply(){return replyMessage()},log:r.log,newSession:()=>r.manager.newSession(),completed:()=>i.recordRun(RunAssertions.completed()),didNotFail:()=>i.recordRun(RunAssertions.didNotFail()),waiting:()=>i.recordRun(RunAssertions.waiting()),messageIncludes:e=>i.recordRun(RunAssertions.messageIncludes(e)),calledTool:(e,n)=>i.recordRun(RunAssertions.calledTool(e,n)),notCalledTool:e=>i.recordRun(RunAssertions.notCalledTool(e)),toolOrder:e=>i.recordRun(RunAssertions.toolOrder(e)),usedNoTools:()=>i.recordRun(RunAssertions.usedNoTools()),maxToolCalls:e=>i.recordRun(RunAssertions.maxToolCalls(e)),calledSubagent:(e,n)=>i.recordRun(RunAssertions.calledSubagent(e,n)),noFailedActions:()=>i.recordRun(RunAssertions.noFailedActions()),event:(e,n)=>i.recordRun(RunAssertions.event(e,n)),outputEquals:e=>i.recordRun(RunAssertions.outputEquals(e)),outputMatches:e=>i.recordRun(RunAssertions.outputMatches(e)),check:(e,t)=>recordCheck(i,e,t),judge:o},collector:i}}function recordCheck(e,t,n){return e.recordValue({name:n.name,severity:n.severity,threshold:n.threshold,score:async()=>({score:await n.score(t)})})}function promptText(e){if(typeof e==`string`)return e;let t=e.message;return typeof t==`string`?t:``}export{createEvalContext};
@@ -0,0 +1,16 @@
1
+ import type { EveEvalConfig, EveEvalConfigInput } from "#evals/types.js";
2
+ /**
3
+ * Defines the run-wide configuration shared by every eval, authored as the
4
+ * default export of `evals.config.ts` at the root of the `evals/` directory.
5
+ *
6
+ * Exactly one `evals.config.ts` is required. It supplies the optional default
7
+ * `judge` model for `t.judge.*` assertions (so individual evals need not
8
+ * repeat it), optional run-level `reporters`, a default `maxConcurrency`, and a
9
+ * default `timeoutMs`. CLI flags (`--max-concurrency`, `--timeout`) and
10
+ * per-eval values take precedence over the config defaults.
11
+ *
12
+ * Throws on invalid input: a `judge` without a `model`, a non-positive or
13
+ * non-integer `maxConcurrency`, a negative or non-finite `timeoutMs`, or a
14
+ * non-array `reporters`.
15
+ */
16
+ export declare function defineEvalConfig(input: EveEvalConfigInput): EveEvalConfig;
@@ -0,0 +1 @@
1
+ function defineEvalConfig(e){return validateEvalConfigInput(e),{...e,_tag:`EveEvalConfig`}}function validateEvalConfigInput(e){if(e.judge!==void 0&&(e.judge.model===void 0||e.judge.model===null))throw Error("Eval config `judge` requires a `model`. It is the default judge model for `t.judge.*` assertions across every eval.");if(e.maxConcurrency!==void 0&&(!Number.isInteger(e.maxConcurrency)||e.maxConcurrency<1))throw Error("Eval config `maxConcurrency` must be a positive integer.");if(e.timeoutMs!==void 0&&(e.timeoutMs<0||!Number.isFinite(e.timeoutMs)))throw Error("Eval config `timeoutMs` must be a non-negative finite number.");if(e.reporters!==void 0&&!Array.isArray(e.reporters))throw Error("Eval config `reporters` must be an array of reporters.")}export{defineEvalConfig};
@@ -0,0 +1,20 @@
1
+ import type { EveEvalDefinition, EveEvalInput } from "#evals/types.js";
2
+ /**
3
+ * Defines one Eve eval. Each eval file is exactly one case: an imperative
4
+ * `test(t)` function that drives the agent (`t.send`, `t.respond`, …) and
5
+ * asserts on what it produced (`t.completed()`, `t.check(...)`,
6
+ * `t.judge.autoevals.*`). Organize related evals with directory nesting under
7
+ * `evals/`, or default-export an array of evals to fan one file out over a
8
+ * dataset.
9
+ *
10
+ * A `judge` is optional: `t.judge.*` assertions fall back to the `judge`
11
+ * declared in `evals.config.ts` unless this eval overrides it. The judge model
12
+ * is used solely for scoring, never for the agent under test. Eval identity is
13
+ * derived from the `evals/<path>.eval.ts` file path by the discovery layer, so
14
+ * authoring `id` or `name` throws.
15
+ *
16
+ * Throws on invalid input: a missing `test` function, a removed legacy key
17
+ * (`input`/`run`/`checks`/`scores`/`expected`/`thresholds`/`parseOutput`/
18
+ * `model`), or a negative or non-finite `timeoutMs`.
19
+ */
20
+ export declare function defineEval(input: EveEvalInput): EveEvalDefinition;
@@ -0,0 +1 @@
1
+ function defineEval(e){return validateEvalInput(e),{...e,_tag:`EveEval`}}function validateEvalInput(e){if(`id`in e)throw Error("Eval must not specify `id`. Eval identity is derived from the file path under evals/.");if(`name`in e)throw Error("Eval must not specify `name`. Eval identity is derived from the file path under evals/.");if(rejectLegacyKey(e,`input`,"Send the prompt inside `test`: `async test(t) { await t.send(...) }`."),rejectLegacyKey(e,`run`,"Rename `run` to `test`; it receives the same context `t`."),rejectLegacyKey(e,`checks`,"Assert inline inside `test` (e.g. `t.completed()`, `t.calledTool(...)`)."),rejectLegacyKey(e,`scores`,"Use soft assertions inside `test`: `t.check(...).atLeast(n)` or `t.judge.autoevals.*`."),rejectLegacyKey(e,`expected`,"Pass the reference value to the assertion (e.g. `t.check(t.reply, includes(value))`)."),rejectLegacyKey(e,`thresholds`,"Put the threshold on the assertion: `.atLeast(n)`."),rejectLegacyKey(e,`parseOutput`,"Read the value you want inside `test` and assert on it directly."),rejectLegacyKey(e,`model`,"Rename `model` to `judge: { model }`."),rejectLegacyKey(e,`modelOptions`,"Move it under `judge: { model, modelOptions }`."),rejectLegacyKey(e,`cases`,"Each eval file is one case; default-export an array of `defineEval(...)` for datasets."),typeof e.test!=`function`)throw Error("Eval requires a `test(t)` function.");if(validateRequirements(e.requires,"Eval `requires`"),e.timeoutMs!==void 0&&(e.timeoutMs<0||!Number.isFinite(e.timeoutMs)))throw Error("Eval `timeoutMs` must be a non-negative finite number.")}function rejectLegacyKey(e,t,n){if(t in e)throw Error(`Eval \`${t}\` is no longer supported. ${n}`)}function validateRequirements(e,t){if(e!==void 0){if(!Array.isArray(e))throw Error(`${t} must be an array of requirement strings.`);for(let n of e)if(!(n===`mockModels`||n===`devRoutes`)&&!(n.startsWith(`env:`)&&n.length>4))throw Error(`${t} contains unsupported requirement "${n}". Expected "mockModels", "devRoutes", or "env:<NAME>".`)}}export{defineEval};
@@ -0,0 +1,25 @@
1
+ import type { StandardSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
2
+ import type { Assertion } from "#evals/types.js";
3
+ export type { Assertion, AssertionHandle, AssertionSeverity } from "#evals/types.js";
4
+ /**
5
+ * Passes when the value (coerced to a string) contains `substring`. A hard
6
+ * gate by default. Apply with `t.check(value, includes("..."))`.
7
+ */
8
+ export declare function includes(substring: string): Assertion;
9
+ /**
10
+ * Passes when the value deep-equals `expected` (exact structural equality).
11
+ * A hard gate by default.
12
+ */
13
+ export declare function equals(expected: unknown): Assertion;
14
+ /**
15
+ * Passes when the value validates against a Standard Schema (e.g. a Zod
16
+ * schema). A hard gate by default.
17
+ */
18
+ export declare function matches(schema: StandardSchemaV1): Assertion;
19
+ /**
20
+ * Scores normalized character-level Levenshtein similarity between the value
21
+ * and `expected` (1 = identical, 0 = entirely different). Soft by default —
22
+ * tracked unless you set a bar with `.atLeast(...)`. Use it for fuzzy
23
+ * comparison when exact match is too strict but a judge model is overkill.
24
+ */
25
+ export declare function similarity(expected: string): Assertion;
@@ -0,0 +1 @@
1
+ import{Levenshtein}from"../../node_modules/.pnpm/autoevals@0.0.132_ws@8.21.0/node_modules/autoevals/jsdist/index.js";import{deepEquals}from"#evals/match.js";function makeAssertion(e){return{name:e.name,severity:e.severity,threshold:e.threshold,score:e.score,gate(t){return makeAssertion({...e,severity:`gate`,threshold:t})},soft(t){return makeAssertion({...e,severity:`soft`,threshold:t})},atLeast(t){return makeAssertion({...e,severity:`soft`,threshold:t})}}}function includes(e){return makeAssertion({name:`includes(${e})`,severity:`gate`,score:t=>+!!String(t??``).includes(e)})}function equals(e){return makeAssertion({name:`equals`,severity:`gate`,score:n=>+!!deepEquals(n,e)})}function matches(e){return makeAssertion({name:`matches`,severity:`gate`,score:async t=>{let n=await e[`~standard`].validate(t);return+(!(`issues`in n)||n.issues===void 0)}})}function similarity(t){return makeAssertion({name:`similarity`,severity:`soft`,score:async n=>(await Levenshtein({output:String(n??``),expected:t})).score??0})}export{equals,includes,matches,similarity};
@@ -1,3 +1,8 @@
1
- export { defineEvalSuite } from "#evals/define-eval-suite.js";
1
+ export { defineEval } from "#evals/define-eval.js";
2
+ export { defineEvalConfig } from "#evals/define-eval-config.js";
3
+ export { EveEvalTurnFailedError } from "#evals/session.js";
4
+ export { EveEvalRequirementError } from "#evals/target.js";
2
5
  export type { RuntimeIdentity } from "#protocol/message.js";
3
- export type { EveEvalCase, EveEvalCaseResult, EveEvalDerivedFacts, EveEvalScorer, EveEvalScorerArgs, EveEvalScorerResult, EveEvalSuite, EveEvalSuiteDefinition, EveEvalSuiteInput, EveEvalSuiteResult, EveEvalTarget, EveEvalTask, EveEvalTaskResult, } from "#evals/types.js";
6
+ export type { InputRequest } from "#runtime/input/types.js";
7
+ export type { EveEvalValueMatcher, EveEvalToolCallMatchOptions, EveEvalSubagentCallMatchOptions, } from "#evals/match.js";
8
+ export type { Assertion, AssertionHandle, AssertionResult, AssertionSeverity, AutoevalsJudges, EveEvalContext, EveEvalDerivedFacts, EveEvalJudgeConfig, EveEvalRunSummary, EveEvalSession, EveEvalSessionResult, EveEvalRequirement, EveEvalScheduleDispatchResult, EveEvalSubagentCall, EveEval, EveEvalConfig, EveEvalConfigInput, EveEvalDefinition, EveEvalInput, EveEvalResult, EveEvalTarget, EveEvalTargetCapabilities, EveEvalTargetHandle, EveEvalTaskResult, EveEvalToolCall, EveEvalTurn, EveEvalVerdict, JudgeContext, JudgeOpts, } from "#evals/types.js";
@@ -1 +1 @@
1
- import{defineEvalSuite}from"#evals/define-eval-suite.js";export{defineEvalSuite};
1
+ import{EveEvalRequirementError}from"#evals/target.js";import{EveEvalTurnFailedError}from"#evals/session.js";import{defineEval}from"#evals/define-eval.js";import{defineEvalConfig}from"#evals/define-eval-config.js";export{EveEvalRequirementError,EveEvalTurnFailedError,defineEval,defineEvalConfig};
@@ -0,0 +1,20 @@
1
+ import type { AssertionCollector } from "#evals/assertions/collector.js";
2
+ import type { EveEvalJudgeConfig, JudgeContext } from "#evals/types.js";
3
+ /**
4
+ * Dependencies the judge namespace closes over: where to record assertions,
5
+ * how to resolve the default graded value (`t.reply`) and the original prompt
6
+ * (the autoevals `input`), and the eval/config judge model.
7
+ */
8
+ export interface JudgeDeps {
9
+ readonly collector: AssertionCollector;
10
+ readonly getReply: () => unknown;
11
+ readonly getInput: () => string;
12
+ readonly judge: EveEvalJudgeConfig | undefined;
13
+ }
14
+ /**
15
+ * Builds the `t.judge` namespace bound to the resolved judge model. Each
16
+ * grader records a soft assertion (override with `.atLeast`/`.gate`) that
17
+ * fires the model call immediately; the collector awaits it before the
18
+ * verdict.
19
+ */
20
+ export declare function buildJudgeContext(deps: JudgeDeps): JudgeContext;
@@ -0,0 +1 @@
1
+ import{ClosedQA,Factuality,Sql,Summary}from"../node_modules/.pnpm/autoevals@0.0.132_ws@8.21.0/node_modules/autoevals/jsdist/index.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{createAutoevalsClient}from"#evals/autoevals-client.js";function buildJudgeContext(a){function grade(e,t,n){let r=t?.on??a.getReply(),o=String(r??``),s=a.getInput(),c=t?.model??a.judge?.model,l=t?.modelOptions??a.judge?.modelOptions;return a.collector.recordValue({name:e,severity:`soft`,score:async()=>{if(c===void 0)throw Error(`${e} needs a judge model. Set \`judge\` on the eval or in evals.config.ts, or pass { model } to the call.`);return{score:(await n({input:s,output:o,model:c,modelOptions:l})).score??0,metadata:{judge:formatLanguageModelGatewayId(c)}}}})}return{autoevals:{factuality:(e,n)=>grade(`judge.autoevals.factuality`,n,({input:n,output:r,model:i,modelOptions:a})=>Factuality({input:n,output:r,expected:e,...client(i,a)})),summarizes:(e,t)=>grade(`judge.autoevals.summarizes`,t,({input:t,output:n,model:i,modelOptions:a})=>Summary({input:t,output:n,expected:e,...client(i,a)})),closedQA:(t,n)=>grade(`judge.autoevals.closedQA`,n,({input:n,output:r,model:i,modelOptions:a})=>ClosedQA({input:n,output:r,criteria:t,...client(i,a)})),sql:(e,t)=>grade(`judge.autoevals.sql`,t,({input:t,output:r,model:i,modelOptions:a})=>Sql({input:t,output:r,expected:e,...client(i,a)}))}}}function client(e,t){return{model:formatLanguageModelGatewayId(e),client:createAutoevalsClient({languageModel:e,providerOptions:t?.providerOptions})}}export{buildJudgeContext};
@@ -0,0 +1,67 @@
1
+ import type { EveEvalSubagentCall, EveEvalToolCall } from "#evals/types.js";
2
+ /**
3
+ * One matcher accepted by the assertion options (`t.calledTool`,
4
+ * `t.calledSubagent`):
5
+ *
6
+ * - a **literal** is compared structurally; objects partial-deep-match (every
7
+ * key in the matcher must match the observed value, recursively, and nested
8
+ * values are matchers themselves), arrays match element-wise, primitives
9
+ * compare with `Object.is`
10
+ * - a **RegExp** tests string values directly and the JSON serialization of
11
+ * anything else
12
+ * - a **function** receives the observed value and either returns a boolean
13
+ * verdict, or returns a resolved expected value that is then compared like a
14
+ * literal — e.g. `(o) => o === process.env.EVE_WEATHER_AGENT_HOST`. To assert
15
+ * a literal boolean field, use the literal directly; boolean returns are
16
+ * always treated as verdicts.
17
+ */
18
+ export type EveEvalValueMatcher<T = unknown> = T | RegExp | ((value: T) => unknown);
19
+ /**
20
+ * Constraints applied to tool calls by `t.calledTool`. All provided
21
+ * constraints must hold for a call to match.
22
+ */
23
+ export interface EveEvalToolCallMatchOptions {
24
+ /** Partial-deep matcher over the call input (see {@link EveEvalValueMatcher}). */
25
+ readonly input?: EveEvalValueMatcher;
26
+ /** Matcher over the call output. */
27
+ readonly output?: EveEvalValueMatcher;
28
+ /** Required error state of matching calls. */
29
+ readonly isError?: boolean;
30
+ /** Exact number of matching calls required. Defaults to "at least one". */
31
+ readonly times?: number;
32
+ }
33
+ /**
34
+ * Constraints applied to subagent calls by `t.calledSubagent`.
35
+ */
36
+ export interface EveEvalSubagentCallMatchOptions {
37
+ /** Matcher over the `subagent.called` remote URL. */
38
+ readonly remoteUrl?: EveEvalValueMatcher;
39
+ /** Matcher over the `subagent.completed` output. */
40
+ readonly output?: EveEvalValueMatcher;
41
+ }
42
+ /**
43
+ * Returns true when the observed value satisfies a matcher (literal, RegExp,
44
+ * or function — see {@link EveEvalValueMatcher}).
45
+ */
46
+ export declare function matchesValue(matcher: unknown, value: unknown): boolean;
47
+ /**
48
+ * Returns true when one derived tool call satisfies the `input`/`output`/
49
+ * `isError` constraints (the `times` count is the caller's concern).
50
+ */
51
+ export declare function toolCallMatches(call: EveEvalToolCall, options: EveEvalToolCallMatchOptions): boolean;
52
+ /**
53
+ * Returns true when one derived subagent call satisfies the `remoteUrl`/
54
+ * `output` constraints.
55
+ */
56
+ export declare function subagentCallMatches(call: EveEvalSubagentCall, options: EveEvalSubagentCallMatchOptions): boolean;
57
+ /**
58
+ * Strict structural equality used by `t.outputEquals`: unlike matcher
59
+ * comparison, objects must carry exactly the same keys on both sides.
60
+ */
61
+ export declare function deepEquals(a: unknown, b: unknown): boolean;
62
+ /**
63
+ * Tests a RegExp without carrying `lastIndex` state between calls. Matcher
64
+ * patterns are reused across tool calls and across every case in an eval, so
65
+ * a `g`/`y`-flagged pattern would otherwise return order-dependent results.
66
+ */
67
+ export declare function testRegExp(pattern: RegExp, text: string): boolean;
@@ -0,0 +1 @@
1
+ function matchesValue(e,t){if(e instanceof RegExp)return testRegExpAgainst(e,t);if(typeof e==`function`){let n=e(t);return typeof n==`boolean`?n:typeof n==`function`?Object.is(n,t):matchesValue(n,t)}return Array.isArray(e)?!Array.isArray(t)||t.length!==e.length?!1:e.every((e,n)=>matchesValue(e,t[n])):isPlainObject(e)?isPlainObject(t)?Object.entries(e).every(([e,n])=>matchesValue(n,t[e])):!1:Object.is(e,t)}function toolCallMatches(e,t){return!(t.input!==void 0&&!matchesValue(t.input,e.input)||t.output!==void 0&&!matchesValue(t.output,e.output)||t.isError!==void 0&&e.isError!==t.isError)}function subagentCallMatches(e,t){return!(t.remoteUrl!==void 0&&!matchesValue(t.remoteUrl,e.remoteUrl)||t.output!==void 0&&!matchesValue(t.output,e.output))}function deepEquals(e,t){if(Object.is(e,t))return!0;if(Array.isArray(e)||Array.isArray(t))return!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length?!1:e.every((e,n)=>deepEquals(e,t[n]));if(isPlainObject(e)&&isPlainObject(t)){let n=Object.keys(e),r=Object.keys(t);return n.length===r.length?n.every(n=>deepEquals(e[n],t[n])):!1}return!1}function testRegExpAgainst(e,t){if(typeof t==`string`)return testRegExp(e,t);if(t===void 0)return!1;let n=JSON.stringify(t);return n!==void 0&&testRegExp(e,n)}function testRegExp(e,t){return(e.global||e.sticky)&&(e.lastIndex=0),e.test(t)}function isPlainObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{deepEquals,matchesValue,subagentCallMatches,testRegExp,toolCallMatches};
@@ -1,2 +1,3 @@
1
1
  export { Braintrust, type BraintrustReporterConfig } from "#evals/runner/reporters/braintrust.js";
2
+ export { JUnit, type JUnitReporterConfig } from "#evals/runner/reporters/junit.js";
2
3
  export type { EvalReporter } from "#evals/runner/reporters/types.js";
@@ -1 +1 @@
1
- import{Braintrust}from"#evals/runner/reporters/braintrust.js";export{Braintrust};
1
+ import{JUnit}from"#evals/runner/reporters/junit.js";import{Braintrust}from"#evals/runner/reporters/braintrust.js";export{Braintrust,JUnit};
@@ -0,0 +1,3 @@
1
+ import type { EveEvalRequirement, EveEvalTarget } from "#evals/types.js";
2
+ export declare function findUnmetRequirements(requirements: readonly EveEvalRequirement[], target: EveEvalTarget, env?: NodeJS.ProcessEnv): readonly EveEvalRequirement[];
3
+ export declare function formatUnmetRequirements(requirements: readonly EveEvalRequirement[]): string;
@@ -0,0 +1 @@
1
+ function findUnmetRequirements(e,t,n=process.env){let r=[];for(let i of new Set(e))requirementMet(i,t,n)||r.push(i);return r}function formatUnmetRequirements(e){return e.length===0?``:`Unmet eval requirement${e.length===1?``:`s`}: ${e.map(formatRequirement).join(`, `)}`}function requirementMet(e,t,n){if(e===`mockModels`)return t.capabilities.mockModels;if(e===`devRoutes`)return t.capabilities.devRoutes;let r=e.slice(4);return r.length>0&&n[r]!==void 0}function formatRequirement(e){return e===`mockModels`?`"mockModels" (local evals can enable this with --mock-models)`:e===`devRoutes`?`"devRoutes"`:`"${e}"`}export{findUnmetRequirements,formatUnmetRequirements};
@@ -1,11 +1,12 @@
1
- import type { EveEvalSuiteResult } from "#evals/types.js";
1
+ import type { EveEvalRunSummary } from "#evals/types.js";
2
2
  /**
3
- * Resolves the artifact output directory for one suite run.
3
+ * Resolves the artifact output directory for one `eve eval` run.
4
4
  *
5
- * Layout: `.eve/evals/<timestamp>-<suite-id>/`
5
+ * Layout: `.eve/evals/<timestamp>/`
6
6
  */
7
- export declare function resolveArtifactDirectory(appRoot: string, suiteId: string): string;
7
+ export declare function resolveArtifactDirectory(appRoot: string): string;
8
8
  /**
9
- * Writes all artifacts for a completed suite run.
9
+ * Writes all artifacts for a completed eval run: a run summary, a JSONL
10
+ * results index, and per-eval detail/event files under `evals/`.
10
11
  */
11
- export declare function writeArtifacts(artifactDir: string, suiteResult: EveEvalSuiteResult): Promise<void>;
12
+ export declare function writeArtifacts(artifactDir: string, summary: EveEvalRunSummary): Promise<void>;
@@ -1,3 +1,3 @@
1
- import{join}from"node:path";import{mkdir,writeFile}from"node:fs/promises";function resolveArtifactDirectory(t,n){return join(t,`.eve`,`evals`,`${new Date().toISOString().replace(/[:.]/g,`-`).slice(0,19)}-${n}`)}async function writeArtifacts(r,i){let a=join(r,`cases`);await mkdir(a,{recursive:!0}),await writeFile(join(r,`summary.json`),JSON.stringify(buildSummaryArtifact(i),null,2));let o=i.cases.map(e=>JSON.stringify(buildCaseResultLine(e))).join(`
2
- `);await writeFile(join(r,`results.jsonl`),`${o}\n`),await Promise.all(i.cases.map(async t=>{let r=sanitizeFileName(t.case.id);await writeFile(join(a,`${r}.json`),JSON.stringify(buildCaseArtifact(t),null,2));let i=t.result.events.map(e=>JSON.stringify(e)).join(`
3
- `);await writeFile(join(a,`${r}.events.ndjson`),`${i}\n`)}))}function buildSummaryArtifact(e){return{suite:e.suite,target:e.target,startedAt:e.startedAt,completedAt:e.completedAt,passed:e.passed,errored:e.errored,totalCases:e.cases.length,cases:e.cases.map(e=>({id:e.case.id,status:e.result.status,scores:e.scores.map(e=>({name:e.name,score:e.score})),error:e.error}))}}function buildCaseResultLine(e){return{caseId:e.case.id,status:e.result.status,output:e.result.output,scores:e.scores.map(e=>({name:e.name,score:e.score})),error:e.error}}function buildCaseArtifact(e){return{case:{id:e.case.id,input:e.case.input,expected:e.case.expected,tags:e.case.tags,metadata:e.case.metadata},result:{output:e.result.output,finalMessage:e.result.finalMessage,sessionId:e.result.sessionId,status:e.result.status,derived:e.result.derived},scores:e.scores,error:e.error}}function sanitizeFileName(e){return e.replace(/[^a-zA-Z0-9_-]/g,`_`)}export{resolveArtifactDirectory,writeArtifacts};
1
+ import{dirname,join}from"node:path";import{mkdir,writeFile}from"node:fs/promises";function resolveArtifactDirectory(e){return join(e,`.eve`,`evals`,new Date().toISOString().replace(/[:.]/g,`-`).slice(0,19))}async function writeArtifacts(t,n){let r=join(t,`evals`);await mkdir(r,{recursive:!0}),await writeFile(join(t,`summary.json`),JSON.stringify(buildSummaryArtifact(n),null,2));let i=n.results.map(e=>JSON.stringify(buildResultLine(e))).join(`
2
+ `);await writeFile(join(t,`results.jsonl`),`${i}\n`),await Promise.all(n.results.map(async t=>{let n=join(r,`${sanitizeArtifactPath(t.id)}.json`);await mkdir(dirname(n),{recursive:!0}),await writeFile(n,JSON.stringify(buildEvalArtifact(t),null,2));let i=t.result.events.map(e=>JSON.stringify(e)).join(`
3
+ `);await writeFile(join(r,`${sanitizeArtifactPath(t.id)}.events.ndjson`),`${i}\n`)}))}function buildSummaryArtifact(e){return{target:e.target,startedAt:e.startedAt,completedAt:e.completedAt,passed:e.passed,failed:e.failed,scored:e.scored,skipped:e.skipped,errored:e.errored,totalEvals:e.results.length,evals:e.results.map(e=>({id:e.id,verdict:e.verdict,status:e.result.status,assertions:e.assertions.map(e=>({name:e.name,score:e.score,severity:e.severity,passed:e.passed})),error:e.error,skipReason:e.skipReason}))}}function buildResultLine(e){return{id:e.id,verdict:e.verdict,status:e.result.status,output:e.result.output,assertions:e.assertions,error:e.error,skipReason:e.skipReason}}function buildEvalArtifact(e){return{id:e.id,result:{output:e.result.output,finalMessage:e.result.finalMessage,sessionId:e.result.sessionId,status:e.result.status,logs:e.result.logs,derived:e.result.derived,sessions:e.result.sessions},verdict:e.verdict,assertions:e.assertions,error:e.error,skipReason:e.skipReason}}function sanitizeArtifactPath(e){return e.split(`/`).map(e=>e.replace(/[^a-zA-Z0-9_-]/g,`_`)).join(`/`)}export{resolveArtifactDirectory,writeArtifacts};
@@ -1,9 +1,23 @@
1
1
  import type { HandleMessageStreamEvent } from "#protocol/message.js";
2
2
  import type { EveEvalDerivedFacts } from "#evals/types.js";
3
+ /**
4
+ * Options for {@link deriveRunFacts}.
5
+ */
6
+ export interface DeriveRunFactsOptions {
7
+ /** Session id stamped onto every derived tool and subagent call. */
8
+ readonly sessionId?: string;
9
+ }
3
10
  /**
4
11
  * Extracts derived execution facts from a completed run's stream events.
5
12
  *
6
- * These facts summarize tool usage, subagent calls, message counts, and
7
- * failure information for scoring and reporting.
13
+ * Tool calls pair each `actions.requested` entry with its matching
14
+ * `action.result` by call id; subagent calls join `subagent.called` /
15
+ * `subagent.started` with `subagent.completed` the same way. These facts
16
+ * power checks, scorers, and reporters.
17
+ */
18
+ export declare function deriveRunFacts(events: readonly HandleMessageStreamEvent[], options?: DeriveRunFactsOptions): EveEvalDerivedFacts;
19
+ /**
20
+ * Returns empty derived facts, used when a case produced no events
21
+ * (execution errors, transport failures).
8
22
  */
9
- export declare function deriveRunFacts(events: readonly HandleMessageStreamEvent[]): EveEvalDerivedFacts;
23
+ export declare function createEmptyDerivedFacts(): EveEvalDerivedFacts;
@@ -1 +1 @@
1
- function deriveRunFacts(e){let t=[],n=[],r=0,i=0,a;for(let o of e)switch(o.type){case`actions.requested`:for(let e of o.data.actions)`toolName`in e&&typeof e.toolName==`string`&&t.push(e.toolName);break;case`subagent.called`:n.push(o.data.name);break;case`subagent.started`:n.push(o.data.subagentName);break;case`message.completed`:o.data.finishReason!==`tool-calls`&&(r+=1);break;case`reasoning.completed`:i+=1;break;case`session.failed`:a=o.data.code;break}return{toolCalls:t,toolCallCount:t.length,subagentCalls:deduplicateStrings(n),subagentCallCount:n.length,messageCount:r,reasoningBlockCount:i,failureCode:a}}function deduplicateStrings(e){return[...new Set(e)]}export{deriveRunFacts};
1
+ const TURN_EPILOGUE_EVENT_TYPES=new Set([`turn.completed`,`session.waiting`,`session.completed`]);function deriveRunFacts(e,t){let n=t?.sessionId,r=[],i=new Map,a=[],o=new Map,s=[],c=-1,l=0,u=0,d,ensureSubagentCall=(e,t)=>{let r=o.get(e);if(r!==void 0)return r;let i={name:t,isError:!1,turnIndex:Math.max(c,0),sessionId:n};return a.push(i),o.set(e,i),i};for(let t of e)switch(t.type){case`turn.started`:c+=1;break;case`actions.requested`:for(let e of t.data.actions){if(e.kind!==`tool-call`)continue;let t={name:e.toolName,input:e.input,output:void 0,isError:!1,turnIndex:Math.max(c,0),sessionId:n};r.push(t),i.set(e.callId,t)}break;case`action.result`:{let{result:e,status:n}=t.data,r=n===`failed`||e.isError===!0;if(e.kind===`tool-result`){let t=i.get(e.callId);t!==void 0&&(t.output=e.output,t.isError=r)}else if(e.kind===`subagent-result`){let t=o.get(e.callId);t!==void 0&&(t.output=t.output??e.output,t.isError=r)}break}case`subagent.called`:{let e=ensureSubagentCall(t.data.callId,t.data.name);t.data.remote!==void 0&&(e.remoteUrl=t.data.remote.url);break}case`subagent.started`:ensureSubagentCall(t.data.callId,t.data.subagentName);break;case`subagent.completed`:{let e=ensureSubagentCall(t.data.callId,t.data.subagentName);e.output=t.data.output;break}case`input.requested`:s.push(...t.data.requests);break;case`message.completed`:t.data.finishReason!==`tool-calls`&&(l+=1);break;case`reasoning.completed`:u+=1;break;case`session.failed`:d=t.data.code;break}return{toolCalls:r,toolCallCount:r.length,subagentCalls:a,subagentCallCount:a.length,inputRequests:s,parked:endedParkedOnInput(e),messageCount:l,reasoningBlockCount:u,failureCode:d}}function createEmptyDerivedFacts(){return{toolCalls:[],toolCallCount:0,subagentCalls:[],subagentCallCount:0,inputRequests:[],parked:!1,messageCount:0,reasoningBlockCount:0}}function endedParkedOnInput(t){for(let n=t.length-1;n>=0;n--){let r=t[n];if(!(r===void 0||TURN_EPILOGUE_EVENT_TYPES.has(r.type)))return r.type===`input.requested`}return!1}export{createEmptyDerivedFacts,deriveRunFacts};
@@ -1,20 +1,41 @@
1
- import type { EveEvalSuite } from "#evals/types.js";
1
+ import type { EveEval, EveEvalConfig } from "#evals/types.js";
2
2
  /**
3
- * Discovers eval suite files under `<appRoot>/evals/` by recursively
3
+ * Discovers eval files under `<appRoot>/evals/` by recursively
4
4
  * scanning for files matching `*.eval.ts`.
5
5
  *
6
6
  * Returns absolute paths sorted alphabetically by relative path.
7
7
  */
8
- export declare function discoverSuiteFiles(appRoot: string): Promise<string[]>;
8
+ export declare function discoverEvalFiles(appRoot: string): Promise<string[]>;
9
9
  /**
10
- * Imports a discovered suite file and stamps the path-derived id onto
11
- * the suite definition.
10
+ * Returns true when `evalId` matches one of the requested filters. A filter
11
+ * matches its exact eval id or any eval nested under it, so `"runtime"`
12
+ * matches both `evals/runtime.eval.ts` and every eval in `evals/runtime/`
13
+ * (and every entry of an array-exported `evals/runtime.eval.ts`).
14
+ */
15
+ export declare function matchesEvalFilter(evalId: string, filters: readonly string[]): boolean;
16
+ /**
17
+ * Imports a discovered eval file and stamps the path-derived id(s) onto
18
+ * the eval definition(s).
19
+ *
20
+ * The file must `export default` either one `EveEvalDefinition` (produced
21
+ * by `defineEval()`) or an array of them. A single definition derives its
22
+ * id from the file path; array entries derive `<file-id>/<index>` ids with
23
+ * the index zero-padded to four digits (e.g. `"weather/0000"`).
24
+ */
25
+ export declare function importEvalFile(appRoot: string, filePath: string): Promise<EveEval[]>;
26
+ /**
27
+ * Discovers and imports all eval files, optionally filtering by eval id.
28
+ * Filters match exactly or by directory prefix (see {@link matchesEvalFilter}).
12
29
  *
13
- * The file must `export default` an `EveEvalSuiteDefinition` (produced
14
- * by `defineEvalSuite()`).
30
+ * Throws when two files derive the same eval id (e.g. an array-exported
31
+ * `evals/weather.eval.ts` colliding with `evals/weather/0000.eval.ts`).
15
32
  */
16
- export declare function importSuiteFile(appRoot: string, filePath: string): Promise<EveEvalSuite>;
33
+ export declare function discoverAndImportEvals(appRoot: string, evalIds?: readonly string[]): Promise<EveEval[]>;
17
34
  /**
18
- * Discovers and imports all suite files, optionally filtering by suite ID.
35
+ * Discovers and imports the required `evals/evals.config.ts` run-wide
36
+ * configuration (produced by `defineEvalConfig()`).
37
+ *
38
+ * Throws when the file is missing or does not default-export a valid
39
+ * `EveEvalConfig`.
19
40
  */
20
- export declare function discoverAndImportSuites(appRoot: string, suiteIds?: readonly string[]): Promise<EveEvalSuite[]>;
41
+ export declare function discoverEvalConfig(appRoot: string): Promise<EveEvalConfig>;
@@ -1 +1 @@
1
- import{join,relative}from"node:path";import{readdir}from"node:fs/promises";import{loadAuthoredModuleNamespace}from"#internal/authored-module-loader.js";const EVAL_SUITE_GLOB_SUFFIX=`.eval.ts`;async function discoverSuiteFiles(n){let r=join(n,`evals`),i=[];try{await collectSuiteFiles(r,i)}catch(e){if(isNoEntryError(e))return[];throw e}return i.sort((e,n)=>relative(r,e).localeCompare(relative(r,n))),i}function deriveSuiteId(n,r){let a=relative(join(n,`evals`),r).split(/[\\/]/u).join(`/`);return a.endsWith(EVAL_SUITE_GLOB_SUFFIX)?a.slice(0,-8):a}async function importSuiteFile(e,t){let n=(await loadAuthoredModuleNamespace(t)).default;if(!isEveEvalSuiteDefinition(n))throw Error(`Suite file "${t}" does not export a valid EveEvalSuite as its default export. Use defineEvalSuite() to create the suite.`);return{...n,id:deriveSuiteId(e,t)}}async function discoverAndImportSuites(e,t){let n=await discoverSuiteFiles(e);if(n.length===0)return[];let r=[];for(let i of n){let n=await importSuiteFile(e,i);(t===void 0||t.length===0||t.includes(n.id))&&r.push(n)}return r}function isEveEvalSuiteDefinition(e){return typeof e==`object`&&!!e&&`_tag`in e&&e._tag===`EveEvalSuite`}async function collectSuiteFiles(t,r){let a=await readdir(t,{withFileTypes:!0});for(let n of a){let a=join(t,n.name);n.isDirectory()?await collectSuiteFiles(a,r):n.isFile()&&n.name.endsWith(EVAL_SUITE_GLOB_SUFFIX)&&r.push(a)}}function isNoEntryError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}export{discoverAndImportSuites,discoverSuiteFiles,importSuiteFile};
1
+ import{join,relative}from"node:path";import{access,readdir}from"node:fs/promises";import{loadAuthoredModuleNamespace}from"#internal/authored-module-loader.js";const EVAL_FILE_SUFFIX=`.eval.ts`,EVAL_CONFIG_FILE=`evals.config.ts`;async function discoverEvalFiles(n){let r=join(n,`evals`),i=[];try{await collectEvalFiles(r,i)}catch(e){if(isNoEntryError(e))return[];throw e}return i.sort((e,n)=>relative(r,e).localeCompare(relative(r,n))),i}function deriveEvalId(n,r){let i=relative(join(n,`evals`),r).split(/[\\/]/u).join(`/`);return i.endsWith(EVAL_FILE_SUFFIX)?i.slice(0,-8):i}function matchesEvalFilter(e,t){return t.length===0?!0:t.some(t=>e===t||e.startsWith(`${t}/`))}async function importEvalFile(e,t){let n=(await loadAuthoredModuleNamespace(t)).default,r=deriveEvalId(e,t);if(isEveEvalDefinition(n))return[{...n,id:r}];if(Array.isArray(n))return n.map((e,n)=>{if(!isEveEvalDefinition(e))throw Error(`Eval file "${t}" exports an array whose entry at index ${n} is not a valid EveEval. Use defineEval() to create every entry.`);return{...e,id:`${r}/${String(n).padStart(4,`0`)}`}});throw Error(`Eval file "${t}" does not export a valid EveEval (or array of EveEvals) as its default export. Use defineEval() to create the eval.`)}async function discoverAndImportEvals(e,t){let n=await discoverEvalFiles(e);if(n.length===0)return[];let r=t??[],i=[],a=new Map;for(let t of n)for(let n of await importEvalFile(e,t)){let e=a.get(n.id);if(e!==void 0)throw Error(`Duplicate eval id "${n.id}" derived from both "${e}" and "${t}".`);a.set(n.id,t),matchesEvalFilter(n.id,r)&&i.push(n)}return i}async function discoverEvalConfig(t){let r=join(t,`evals`,EVAL_CONFIG_FILE);try{await access(r)}catch(e){throw isNoEntryError(e)?Error(`Missing required eval config at evals/${EVAL_CONFIG_FILE}. Create it with defineEvalConfig({}) (optionally \`{ judge: { model } }\` to set the default judge model for \`t.judge.*\` assertions).`):e}let a=(await loadAuthoredModuleNamespace(r)).default;if(!isEveEvalConfig(a))throw Error(`Eval config "evals/${EVAL_CONFIG_FILE}" must default-export a defineEvalConfig() value.`);return a}function isEveEvalConfig(e){return typeof e==`object`&&!!e&&`_tag`in e&&e._tag===`EveEvalConfig`}function isEveEvalDefinition(e){return typeof e==`object`&&!!e&&`_tag`in e&&e._tag===`EveEval`}async function collectEvalFiles(t,n){let i=await readdir(t,{withFileTypes:!0});for(let r of i){let i=join(t,r.name);r.isDirectory()?await collectEvalFiles(i,n):r.isFile()&&r.name.endsWith(EVAL_FILE_SUFFIX)&&n.push(i)}}function isNoEntryError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}export{discoverAndImportEvals,discoverEvalConfig,discoverEvalFiles,importEvalFile,matchesEvalFilter};
@@ -0,0 +1,25 @@
1
+ import type { Client } from "#client/client.js";
2
+ import type { EveEval, EveEvalResult, EveEvalTargetHandle } from "#evals/types.js";
3
+ /**
4
+ * Options for executing one eval.
5
+ */
6
+ export interface ExecuteEvalOptions {
7
+ readonly evaluation: EveEval;
8
+ readonly failOnSkip?: boolean;
9
+ /** Receives `t.log` lines as the eval runs (used by `--verbose`). */
10
+ readonly onLog?: (message: string) => void;
11
+ readonly target: EveEvalTargetHandle;
12
+ /** Overrides the eval's own `timeoutMs` when set (CLI `--timeout`). */
13
+ readonly timeoutMs?: number;
14
+ /**
15
+ * Pre-configured client for communicating with the Eve agent.
16
+ * The CLI constructs this once with the appropriate auth and headers,
17
+ * and every eval creates fresh sessions from it.
18
+ */
19
+ readonly client: Client;
20
+ }
21
+ /**
22
+ * Executes one eval end to end: verifies requirements, runs `test(t)`,
23
+ * collects its assertions, and computes the verdict.
24
+ */
25
+ export declare function executeEval(options: ExecuteEvalOptions): Promise<EveEvalResult>;
@@ -0,0 +1 @@
1
+ import{toErrorMessage}from"#shared/errors.js";import{createEmptyDerivedFacts}from"#evals/runner/derive-run-facts.js";import{executeTask}from"#evals/runner/execute-task.js";import{findUnmetRequirements,formatUnmetRequirements}from"#evals/requirements.js";import{computeEvalVerdict}from"#evals/runner/verdict.js";async function executeEval(i){let{evaluation:a,target:o,client:s}=i,c=new Date().toISOString(),l=a.requires??[],u=findUnmetRequirements(l,o);if(u.length>0)return createRequirementResult(a,u,{failOnSkip:i.failOnSkip===!0,startedAt:c});let d,f=[],p;try{let e=await executeTask({client:s,evaluation:a,onLog:i.onLog,requirements:l,target:o,timeoutMs:i.timeoutMs??a.timeoutMs});d=e.result,f=e.assertions,p=e.error}catch(n){p=toErrorMessage(n),d={output:null,finalMessage:null,status:`failed`,events:[],derived:createEmptyDerivedFacts()}}let m=computeEvalVerdict({error:p,assertions:f});return{id:a.id,result:d,assertions:f,verdict:m,error:p,startedAt:c,completedAt:new Date().toISOString()}}function createRequirementResult(e,t,n){let r=formatUnmetRequirements(t);return{id:e.id,result:createEmptyTaskResult(),assertions:[],verdict:n.failOnSkip?`failed`:`skipped`,skipReason:r,startedAt:n.startedAt,completedAt:new Date().toISOString()}}function createEmptyTaskResult(){return{output:null,finalMessage:null,status:`completed`,events:[],derived:createEmptyDerivedFacts()}}export{executeEval};
@@ -0,0 +1,31 @@
1
+ import type { Client } from "#client/client.js";
2
+ import type { AssertionResult, EveEval, EveEvalRequirement, EveEvalTargetHandle, EveEvalTaskResult } from "#evals/types.js";
3
+ /**
4
+ * Options for executing one eval's task.
5
+ */
6
+ interface ExecuteTaskOptions {
7
+ readonly client: Client;
8
+ readonly evaluation: EveEval;
9
+ /** Receives each `t.log` line as it is written (used by `--verbose`). */
10
+ readonly onLog?: (message: string) => void;
11
+ readonly requirements?: readonly EveEvalRequirement[];
12
+ readonly target: EveEvalTargetHandle;
13
+ readonly timeoutMs?: number;
14
+ }
15
+ /**
16
+ * Task result plus the assertions the eval's `test(t)` recorded. `error` is
17
+ * set when the `test` body threw (e.g. a failed `expectOk()` or a bespoke
18
+ * `throw`); the partial run is still captured so recorded assertions report.
19
+ */
20
+ export interface ExecuteTaskResult {
21
+ readonly result: EveEvalTaskResult;
22
+ readonly assertions: readonly AssertionResult[];
23
+ readonly error?: string;
24
+ }
25
+ /**
26
+ * Executes one eval's `test(t)` against an Eve agent target: drives the
27
+ * session(s), captures the run, then finalizes the recorded assertions
28
+ * against the completed task result.
29
+ */
30
+ export declare function executeTask(options: ExecuteTaskOptions): Promise<ExecuteTaskResult>;
31
+ export {};
@@ -0,0 +1 @@
1
+ import{toErrorMessage}from"#shared/errors.js";import{scopeEvalTargetHandle}from"#evals/target.js";import{EvalSessionManager}from"#evals/session.js";import{createEmptyDerivedFacts}from"#evals/runner/derive-run-facts.js";import{createEvalContext}from"#evals/context.js";async function executeTask(r){let{client:a,evaluation:o,target:s,timeoutMs:c}=r,l=c===void 0?neverAbortSignal():AbortSignal.timeout(c),u=new EvalSessionManager({client:a,signal:l}),d=scopeEvalTargetHandle(s,{requirements:r.requirements??[],sessions:u}),f=[],{context:p,collector:m}=createEvalContext({manager:u,target:d,signal:l,judge:o.judge,log:e=>{f.push(e),r.onLog?.(e)}}),h;try{await o.test(p)}catch(t){h=toErrorMessage(t)}let g=buildTaskResult({logs:f,sessions:u.snapshots(),turn:u.lastTurnSession()?.lastTurn});return{result:g,assertions:await m.finalize(g),error:h}}function buildTaskResult(e){let t=e.sessions.flatMap(e=>e.events),n=e.turn?.message??null;return{output:n,finalMessage:n,sessionId:selectPrimarySessionId(e.sessions),status:e.turn?.status??`completed`,events:t,logs:e.logs,derived:combineDerivedFacts(e.sessions),sessions:e.sessions,runtimeIdentity:extractRuntimeIdentity(t)}}function combineDerivedFacts(e){if(e.length===0)return createEmptyDerivedFacts();let t=e.flatMap(e=>e.derived.toolCalls),n=e.flatMap(e=>e.derived.subagentCalls),i=e.flatMap(e=>e.derived.inputRequests),a=e.find(e=>e.derived.failureCode!==void 0)?.derived.failureCode;return{toolCalls:t,toolCallCount:t.length,subagentCalls:n,subagentCallCount:n.length,inputRequests:i,parked:e.some(e=>e.derived.parked),messageCount:sum(e,e=>e.derived.messageCount),reasoningBlockCount:sum(e,e=>e.derived.reasoningBlockCount),failureCode:a}}function selectPrimarySessionId(e){return e.find(e=>e.primary)?.sessionId??e[0]?.sessionId}function extractRuntimeIdentity(e){for(let t of e)if(t.type===`session.started`&&t.data.runtime!==void 0)return t.data.runtime}function sum(e,t){return e.reduce((e,n)=>e+t(n),0)}function neverAbortSignal(){return new AbortController().signal}export{executeTask};
@@ -6,7 +6,7 @@ import type { EvalReporter } from "#evals/runner/reporters/types.js";
6
6
  export interface BraintrustReporterConfig {
7
7
  /** Braintrust project id. Maps to the `projectId` init option. */
8
8
  readonly projectId?: string;
9
- /** Braintrust project name. Defaults to the suite id when omitted. */
9
+ /** Braintrust project name. Defaults to the eval id when omitted. */
10
10
  readonly projectName?: string;
11
11
  /** Name for the created experiment. When omitted, Braintrust names it. */
12
12
  readonly experimentName?: string;
@@ -19,9 +19,11 @@ export interface BraintrustReporterConfig {
19
19
  }
20
20
  /**
21
21
  * Creates an {@link EvalReporter} that uploads eval results to Braintrust as an
22
- * experiment. Add it to a suite's `reporters` array. Requires the optional
23
- * `braintrust` peer package; the reporter throws a descriptive error when the
24
- * suite starts if it is missing. `config` is optional and defaults to an empty
25
- * object (the project name then falls back to the suite id).
22
+ * experiment. Add it to an eval's `reporters` array; share one instance
23
+ * across several evals (e.g. every entry of an array export) to group them
24
+ * into a single experiment. Requires the optional `braintrust` peer package;
25
+ * the reporter throws a descriptive error when the run starts if it is
26
+ * missing. `config` is optional and defaults to an empty object (the project
27
+ * name then falls back to the first observed eval id).
26
28
  */
27
29
  export declare function Braintrust(config?: BraintrustReporterConfig): EvalReporter;