@cursor/july 0.1.16 → 0.1.17

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 (236) hide show
  1. package/README.md +9 -4
  2. package/dist/bin/agent-serve.js +60 -2
  3. package/dist/channels/slack/api.d.ts.map +1 -1
  4. package/dist/channels/slack/api.js +13 -3
  5. package/dist/channels/slack/auth.d.ts +7 -1
  6. package/dist/channels/slack/auth.d.ts.map +1 -1
  7. package/dist/channels/slack/auth.js +14 -0
  8. package/dist/channels/slack/blocks.d.ts +61 -0
  9. package/dist/channels/slack/blocks.d.ts.map +1 -0
  10. package/dist/channels/slack/blocks.js +90 -0
  11. package/dist/channels/slack/defaults.d.ts +2 -0
  12. package/dist/channels/slack/defaults.d.ts.map +1 -1
  13. package/dist/channels/slack/defaults.js +29 -3
  14. package/dist/channels/slack/dispatch.d.ts +3 -17
  15. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  16. package/dist/channels/slack/index.d.ts +1 -0
  17. package/dist/channels/slack/index.d.ts.map +1 -1
  18. package/dist/channels/slack/index.js +1 -0
  19. package/dist/channels/slack/interactive.d.ts +39 -3
  20. package/dist/channels/slack/interactive.d.ts.map +1 -1
  21. package/dist/channels/slack/interactive.js +152 -7
  22. package/dist/channels/slack/manifest.d.ts +3 -0
  23. package/dist/channels/slack/manifest.d.ts.map +1 -1
  24. package/dist/channels/slack/manifest.js +3 -0
  25. package/dist/channels/slack/setup.d.ts +4 -1
  26. package/dist/channels/slack/setup.d.ts.map +1 -1
  27. package/dist/channels/slack/setup.js +16 -2
  28. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  29. package/dist/channels/slack/slack-channel.js +24 -3
  30. package/dist/channels/slack/types.d.ts +77 -0
  31. package/dist/channels/slack/types.d.ts.map +1 -1
  32. package/dist/connections.d.ts +4 -1
  33. package/dist/connections.d.ts.map +1 -1
  34. package/dist/connections.js +4 -1
  35. package/dist/docs/404.html +2 -2
  36. package/dist/docs/ab.html +3 -3
  37. package/dist/docs/assets/{app.DjHC-Ggf.js → app.BbEXr2KO.js} +1 -1
  38. package/dist/docs/assets/chunks/@localSearchIndexroot.DCBsrfwP.js +1 -0
  39. package/dist/docs/assets/chunks/{VPLocalSearchBox.DwviwmIq.js → VPLocalSearchBox.DBEi4HDp.js} +1 -1
  40. package/dist/docs/assets/chunks/{theme.BIpeYSon.js → theme.DGfptcHw.js} +2 -2
  41. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.js → guides_mcp-oauth.md.Dd8EgSem.js} +3 -2
  42. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.lean.js → guides_mcp-oauth.md.Dd8EgSem.lean.js} +1 -1
  43. package/dist/docs/assets/{guides_slack.md.FWale6Ip.js → guides_slack.md.D_xFKlnF.js} +1 -1
  44. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.js → reference_connections.md.B9Q3TOve.js} +12 -5
  45. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.lean.js → reference_connections.md.B9Q3TOve.lean.js} +1 -1
  46. package/dist/docs/building-with-agents.html +3 -3
  47. package/dist/docs/concepts.html +3 -3
  48. package/dist/docs/deployment.html +3 -3
  49. package/dist/docs/evals.html +3 -3
  50. package/dist/docs/example-agents/approval-buddy.html +3 -3
  51. package/dist/docs/example-agents/benny.html +3 -3
  52. package/dist/docs/example-agents/bugbot.html +3 -3
  53. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  54. package/dist/docs/example-agents/codeowners-review.html +3 -3
  55. package/dist/docs/example-agents/concierge.html +3 -3
  56. package/dist/docs/example-agents/fsd.html +3 -3
  57. package/dist/docs/example-agents/index.html +3 -3
  58. package/dist/docs/example-agents/knowledge-base.html +3 -3
  59. package/dist/docs/example-agents/oncall.html +3 -3
  60. package/dist/docs/example-agents/security-reviewer.html +3 -3
  61. package/dist/docs/example-agents/slack-agent.html +3 -3
  62. package/dist/docs/example-agents/weather-agent.html +3 -3
  63. package/dist/docs/guides/agent-to-agent.html +3 -3
  64. package/dist/docs/guides/cloud-runtime.html +3 -3
  65. package/dist/docs/guides/github.html +3 -3
  66. package/dist/docs/guides/human-in-the-loop.html +3 -3
  67. package/dist/docs/guides/mcp-oauth.html +6 -5
  68. package/dist/docs/guides/slack.html +5 -5
  69. package/dist/docs/guides/webhooks.html +3 -3
  70. package/dist/docs/hashmap.json +1 -1
  71. package/dist/docs/hillclimbing.html +3 -3
  72. package/dist/docs/index.html +3 -3
  73. package/dist/docs/quickstart.html +3 -3
  74. package/dist/docs/reference/agent-config.html +3 -3
  75. package/dist/docs/reference/channels.html +3 -3
  76. package/dist/docs/reference/cli.html +3 -3
  77. package/dist/docs/reference/connections.html +14 -7
  78. package/dist/docs/reference/hooks.html +3 -3
  79. package/dist/docs/reference/http-api.html +3 -3
  80. package/dist/docs/reference/instructions.html +3 -3
  81. package/dist/docs/reference/playground.html +3 -3
  82. package/dist/docs/reference/project-layout.html +3 -3
  83. package/dist/docs/reference/prompt.html +3 -3
  84. package/dist/docs/reference/schedules.html +3 -3
  85. package/dist/docs/reference/sessions.html +3 -3
  86. package/dist/docs/reference/skills.html +3 -3
  87. package/dist/docs/reference/subagents.html +3 -3
  88. package/dist/docs/reference/tools.html +3 -3
  89. package/dist/docs/scaffolding-agents.html +3 -3
  90. package/dist/docs/storage.html +3 -3
  91. package/dist/docs/troubleshooting.html +3 -3
  92. package/dist/evals/assertions.d.ts +190 -0
  93. package/dist/evals/assertions.d.ts.map +1 -0
  94. package/dist/evals/assertions.js +461 -0
  95. package/dist/evals/expect.d.ts +95 -0
  96. package/dist/evals/expect.d.ts.map +1 -0
  97. package/dist/evals/expect.js +194 -0
  98. package/dist/evals/judge.d.ts +133 -0
  99. package/dist/evals/judge.d.ts.map +1 -0
  100. package/dist/evals/judge.js +228 -0
  101. package/dist/evals/loaders.d.ts +51 -0
  102. package/dist/evals/loaders.d.ts.map +1 -0
  103. package/dist/evals/loaders.js +124 -0
  104. package/dist/evals/matchers.d.ts +95 -0
  105. package/dist/evals/matchers.d.ts.map +1 -0
  106. package/dist/evals/matchers.js +145 -0
  107. package/dist/evals/reporters.d.ts +70 -0
  108. package/dist/evals/reporters.d.ts.map +1 -0
  109. package/dist/evals/reporters.js +221 -0
  110. package/dist/evals/results.d.ts +103 -0
  111. package/dist/evals/results.d.ts.map +1 -0
  112. package/dist/evals/results.js +28 -0
  113. package/dist/evals/run-facts.d.ts +77 -0
  114. package/dist/evals/run-facts.d.ts.map +1 -0
  115. package/dist/evals/run-facts.js +187 -0
  116. package/dist/evals.d.ts +118 -31
  117. package/dist/evals.d.ts.map +1 -1
  118. package/dist/evals.js +46 -12
  119. package/dist/index.d.ts +1 -1
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +1 -1
  122. package/dist/internal/cli-ax.d.ts +27 -0
  123. package/dist/internal/cli-ax.d.ts.map +1 -1
  124. package/dist/internal/cli-ax.js +90 -12
  125. package/dist/internal/cli-mcp.d.ts +8 -0
  126. package/dist/internal/cli-mcp.d.ts.map +1 -1
  127. package/dist/internal/cli-mcp.js +98 -0
  128. package/dist/internal/cli-slack.d.ts +29 -1
  129. package/dist/internal/cli-slack.d.ts.map +1 -1
  130. package/dist/internal/cli-slack.js +777 -12
  131. package/dist/internal/deploy-client.d.ts +7 -0
  132. package/dist/internal/deploy-client.d.ts.map +1 -1
  133. package/dist/internal/deploy-client.js +9 -0
  134. package/dist/internal/discovery.d.ts.map +1 -1
  135. package/dist/internal/discovery.js +29 -9
  136. package/dist/internal/distribution.d.ts.map +1 -1
  137. package/dist/internal/distribution.js +2 -0
  138. package/dist/internal/eval-judge-model.d.ts +59 -0
  139. package/dist/internal/eval-judge-model.d.ts.map +1 -0
  140. package/dist/internal/eval-judge-model.js +131 -0
  141. package/dist/internal/eval-run-store.d.ts.map +1 -1
  142. package/dist/internal/eval-run-store.js +12 -20
  143. package/dist/internal/eval-runner.d.ts +31 -25
  144. package/dist/internal/eval-runner.d.ts.map +1 -1
  145. package/dist/internal/eval-runner.js +329 -126
  146. package/dist/internal/evals-client.d.ts.map +1 -1
  147. package/dist/internal/evals-client.js +4 -1
  148. package/dist/internal/local-env.d.ts +8 -0
  149. package/dist/internal/local-env.d.ts.map +1 -0
  150. package/dist/internal/local-env.js +47 -0
  151. package/dist/internal/playground/static.d.ts +3 -0
  152. package/dist/internal/playground/static.d.ts.map +1 -1
  153. package/dist/internal/playground/static.js +3 -0
  154. package/dist/internal/run-client.d.ts +15 -0
  155. package/dist/internal/run-client.d.ts.map +1 -1
  156. package/dist/internal/run-client.js +3 -2
  157. package/dist/internal/sdk-runner.d.ts +36 -1
  158. package/dist/internal/sdk-runner.d.ts.map +1 -1
  159. package/dist/internal/sdk-runner.js +65 -25
  160. package/dist/internal/server.d.ts.map +1 -1
  161. package/dist/internal/server.js +10 -1
  162. package/dist/internal/session-engine.d.ts +18 -5
  163. package/dist/internal/session-engine.d.ts.map +1 -1
  164. package/dist/internal/session-engine.js +72 -19
  165. package/dist/internal/slack-provision-client.d.ts +130 -0
  166. package/dist/internal/slack-provision-client.d.ts.map +1 -0
  167. package/dist/internal/slack-provision-client.js +284 -0
  168. package/dist/playground/assets/cursor-icons-16-f_W_ogc-.woff2 +0 -0
  169. package/dist/playground/assets/index-CidizGZv.css +1 -0
  170. package/dist/playground/assets/index-DNqirsrK.js +85 -0
  171. package/dist/playground/index.html +2 -2
  172. package/dist/types.d.ts +70 -4
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/types.js +26 -0
  175. package/docs/guides/mcp-oauth.md +10 -5
  176. package/docs/guides/slack.md +3 -2
  177. package/docs/reference/connections.md +28 -18
  178. package/package.json +20 -2
  179. package/skills/create-agent/SKILL.md +15 -7
  180. package/skills/debug/SKILL.md +3 -1
  181. package/skills/mcp-auth/SKILL.md +1 -1
  182. package/skills/setup-slack/SKILL.md +173 -11
  183. package/src/bin/agent-serve.ts +63 -2
  184. package/src/channels/slack/api.ts +16 -3
  185. package/src/channels/slack/auth.ts +16 -1
  186. package/src/channels/slack/blocks.ts +139 -0
  187. package/src/channels/slack/defaults.ts +32 -4
  188. package/src/channels/slack/dispatch.ts +3 -18
  189. package/src/channels/slack/index.ts +1 -0
  190. package/src/channels/slack/interactive.ts +183 -19
  191. package/src/channels/slack/manifest.ts +3 -0
  192. package/src/channels/slack/setup.ts +16 -2
  193. package/src/channels/slack/slack-channel.ts +37 -6
  194. package/src/channels/slack/types.ts +89 -0
  195. package/src/connections.ts +4 -1
  196. package/src/evals/assertions.ts +704 -0
  197. package/src/evals/expect.ts +272 -0
  198. package/src/evals/judge.ts +346 -0
  199. package/src/evals/loaders.ts +113 -0
  200. package/src/evals/matchers.ts +246 -0
  201. package/src/evals/reporters.ts +274 -0
  202. package/src/evals/results.ts +132 -0
  203. package/src/evals/run-facts.ts +274 -0
  204. package/src/evals.ts +205 -42
  205. package/src/index.ts +2 -0
  206. package/src/internal/cli-ax.ts +134 -15
  207. package/src/internal/cli-mcp.ts +118 -5
  208. package/src/internal/cli-slack.ts +993 -15
  209. package/src/internal/deploy-client.ts +10 -0
  210. package/src/internal/discovery.ts +31 -5
  211. package/src/internal/distribution.ts +2 -0
  212. package/src/internal/eval-judge-model.ts +148 -0
  213. package/src/internal/eval-run-store.ts +10 -14
  214. package/src/internal/eval-runner.ts +460 -214
  215. package/src/internal/evals-client.ts +5 -0
  216. package/src/internal/local-env.ts +53 -0
  217. package/src/internal/playground/static.ts +3 -0
  218. package/src/internal/run-client.ts +17 -1
  219. package/src/internal/sdk-runner.ts +103 -22
  220. package/src/internal/server.ts +10 -0
  221. package/src/internal/session-engine.ts +89 -21
  222. package/src/internal/slack-provision-client.ts +438 -0
  223. package/src/types.ts +92 -4
  224. package/dist/channels/slack/post-update-delivery.d.ts +0 -85
  225. package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
  226. package/dist/docs/assets/chunks/@localSearchIndexroot.DZtu0ZIc.js +0 -1
  227. package/dist/internal/json-dir-store.d.ts +0 -32
  228. package/dist/internal/json-dir-store.d.ts.map +0 -1
  229. package/dist/internal/persistence-coordinator.d.ts +0 -127
  230. package/dist/internal/persistence-coordinator.d.ts.map +0 -1
  231. package/dist/persistence.d.ts +0 -184
  232. package/dist/persistence.d.ts.map +0 -1
  233. package/dist/playground/assets/cursor-icons-16-CQ50JpfO.woff2 +0 -0
  234. package/dist/playground/assets/index-Bwl4Onx4.js +0 -85
  235. package/dist/playground/assets/index-ByV4nfch.css +0 -1
  236. /package/dist/docs/assets/{guides_slack.md.FWale6Ip.lean.js → guides_slack.md.D_xFKlnF.lean.js} +0 -0
@@ -19,8 +19,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
19
19
  import { readdir } from "node:fs/promises";
20
20
  import { join, relative, resolve } from "node:path";
21
21
  import { pathToFileURL } from "node:url";
22
+ import { computeVerdict, createAssertions, EvalAssertionRecorder, EvalRequireFailure, EvalSkipSignal, } from "../evals/assertions.js";
23
+ import { evaluateExpectation } from "../evals/expect.js";
24
+ import { EVAL_JUDGE_GRADERS, EvalJudgeUnavailableError, renderSubmission, } from "../evals/judge.js";
25
+ import { EVAL_ROOT_ENV } from "../evals/loaders.js";
26
+ import { combineReporters } from "../evals/reporters.js";
27
+ import { summarizeEvalResults } from "../evals/results.js";
22
28
  import { EVAL_MAX_CONCURRENCY_LIMIT, expandEvalDefinition, expandSummarySuiteSelection, isEvalSummaryCase, matchesEvalIdFilter, normalizeEvalMaxConcurrency, } from "../evals.js";
23
29
  import { isDefinitionOfKind } from "./brand.js";
30
+ import { callJudgeModel, EVAL_JUDGE_MODEL_ENV, resolveJudgeModel, } from "./eval-judge-model.js";
24
31
  import { mapPool } from "./map-pool.js";
25
32
  import { RunSessionTimeoutError, runSession } from "./run-client.js";
26
33
  import { buildTrajectory } from "./trajectory.js";
@@ -69,6 +76,10 @@ export function discoverEvals(projectRoot_1) {
69
76
  const files = yield listEvalFiles(evalsDir);
70
77
  const evals = [];
71
78
  let config = {};
79
+ // Fixture loaders resolve relative paths against the app root, so a dataset
80
+ // path reads the same however deep the eval file sits and whatever cwd the
81
+ // CLI ran from.
82
+ process.env[EVAL_ROOT_ENV] = root;
72
83
  for (const abs of files) {
73
84
  const rel = relative(evalsDir, abs).replace(/\\/g, "/");
74
85
  if (rel === "evals.config.ts" || rel === "evals.config.js") {
@@ -82,13 +93,9 @@ export function discoverEvals(projectRoot_1) {
82
93
  continue;
83
94
  }
84
95
  const mod = yield importModule(abs);
85
- const def = mod.default;
86
- if (!isDefinitionOfKind(def, "eval")) {
87
- throw new Error(`${rel}: default export must be defineEval({ ... })`);
88
- }
89
96
  const fileId = rel.replace(/\.eval\.(ts|js)$/, "").replace(/\/index$/, "");
90
97
  try {
91
- for (const expanded of expandEvalDefinition(fileId, def)) {
98
+ for (const expanded of expandEvalModule(fileId, mod.default)) {
92
99
  evals.push({
93
100
  id: expanded.id,
94
101
  fileId,
@@ -105,6 +112,32 @@ export function discoverEvals(projectRoot_1) {
105
112
  return { evals, config };
106
113
  });
107
114
  }
115
+ /**
116
+ * Expand one eval module's default export into runnable datapoints.
117
+ *
118
+ * A file normally exports a single `defineEval(...)`. It may instead export an
119
+ * **array** of them to fan out over a dataset, in which case ids come from the
120
+ * file name plus a zero-padded index in array order (`sql/0000`, `sql/0001`, …).
121
+ * Prefer `cases` when the datapoints are hand-written and deserve stable names;
122
+ * the array form is for generated datasets where the index *is* the name.
123
+ */
124
+ export function expandEvalModule(fileId, defaultExport) {
125
+ if (Array.isArray(defaultExport)) {
126
+ if (defaultExport.length === 0) {
127
+ throw new Error("default export array is empty; export at least one defineEval({ ... })");
128
+ }
129
+ return defaultExport.flatMap((entry, index) => {
130
+ if (!isDefinitionOfKind(entry, "eval")) {
131
+ throw new Error(`default export array entry ${index} must be defineEval({ ... })`);
132
+ }
133
+ return expandEvalDefinition(`${fileId}/${String(index).padStart(4, "0")}`, entry);
134
+ });
135
+ }
136
+ if (!isDefinitionOfKind(defaultExport, "eval")) {
137
+ throw new Error("default export must be defineEval({ ... }) or an array of them");
138
+ }
139
+ return expandEvalDefinition(fileId, defaultExport);
140
+ }
108
141
  /** Apply id/tag filters used by CLI, playground, and `runDiscoveredEvals`. */
109
142
  export function filterDiscoveredEvals(evals, options = {}) {
110
143
  let selected = evals;
@@ -119,7 +152,7 @@ export function filterDiscoveredEvals(evals, options = {}) {
119
152
  }
120
153
  export function runDiscoveredEvals(options) {
121
154
  return __awaiter(this, void 0, void 0, function* () {
122
- var _a, _b, _c;
155
+ var _a, _b, _c, _d;
123
156
  let selected;
124
157
  let config;
125
158
  if (options.discovered !== undefined) {
@@ -138,14 +171,20 @@ export function runDiscoveredEvals(options) {
138
171
  if (selected.length === 0) {
139
172
  return [];
140
173
  }
141
- const maxConcurrency = resolveEvalMaxConcurrency(config);
174
+ const maxConcurrency = options.maxConcurrency === undefined
175
+ ? resolveEvalMaxConcurrency(config)
176
+ : normalizeEvalMaxConcurrency(options.maxConcurrency);
142
177
  const defaultTimeoutMs = (_c = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : config.timeoutMs) !== null && _c !== void 0 ? _c : 180000;
178
+ const reporter = buildReporterHub(options, config, selected);
179
+ const startedAt = new Date().toISOString();
180
+ yield reporter === null || reporter === void 0 ? void 0 : reporter.runStart(selected, (_d = options.target) !== null && _d !== void 0 ? _d : { baseUrl: options.baseUrl, mode: "local" });
143
181
  // Iterations of the same authored datapoint share one concurrency slot and
144
182
  // run sequentially. maxConcurrency is therefore the max number of distinct
145
183
  // datapoints in flight, not datapoints × iterations.
146
184
  const groups = groupEvalsForIterationSchedule(selected);
147
185
  const nested = yield mapPool(groups, maxConcurrency, (group) => __awaiter(this, void 0, void 0, function* () {
148
- var _a, _b, _c;
186
+ var _a, _b, _c, _d;
187
+ var _e;
149
188
  const results = [];
150
189
  for (const discovered of group) {
151
190
  if ((_a = options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
@@ -162,20 +201,92 @@ export function runDiscoveredEvals(options) {
162
201
  headers: options.headers,
163
202
  verbose: Boolean(options.verbose),
164
203
  signal: options.signal,
204
+ judge: {
205
+ configModel: (_c = config.judge) === null || _c === void 0 ? void 0 : _c.model,
206
+ caller: (_e = options.judgeCaller) !== null && _e !== void 0 ? _e : callJudgeModel,
207
+ },
165
208
  onEvent: (event) => {
166
209
  var _a, _b;
167
210
  (_a = options.onCaseEvent) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id, event);
168
211
  (_b = options.onEvent) === null || _b === void 0 ? void 0 : _b.call(options, event);
169
212
  },
170
213
  });
171
- (_c = options.onCaseDone) === null || _c === void 0 ? void 0 : _c.call(options, result);
214
+ (_d = options.onCaseDone) === null || _d === void 0 ? void 0 : _d.call(options, result);
215
+ yield reporter === null || reporter === void 0 ? void 0 : reporter.caseComplete(discovered, result);
172
216
  results.push(result);
173
217
  }
174
218
  return results;
175
219
  }), { signal: options.signal });
176
- return nested.flat();
220
+ const results = nested.flat();
221
+ yield reporter === null || reporter === void 0 ? void 0 : reporter.runComplete(summarizeEvalResults(results, {
222
+ strict: options.strict === true,
223
+ startedAt,
224
+ finishedAt: new Date().toISOString(),
225
+ }));
226
+ return results;
177
227
  });
178
228
  }
229
+ /**
230
+ * Fan results out to the reporters that observe them.
231
+ *
232
+ * Run-wide reporters (CLI flags plus `evals.config.ts`) see every case; an
233
+ * eval's own `reporters` only see that eval. The run lifecycle hooks fire on
234
+ * every reporter in the run, so a per-eval destination still gets its
235
+ * `onRunStart` / `onRunComplete` pair.
236
+ */
237
+ function buildReporterHub(options, config, selected) {
238
+ var _a, _b;
239
+ const skip = options.skipReport === true;
240
+ const runWide = [
241
+ ...((_a = options.reporters) !== null && _a !== void 0 ? _a : []),
242
+ ...(skip ? [] : ((_b = config.reporters) !== null && _b !== void 0 ? _b : [])),
243
+ ];
244
+ const perEval = skip
245
+ ? []
246
+ : selected.flatMap((e) => { var _a; return (_a = e.definition.reporters) !== null && _a !== void 0 ? _a : []; });
247
+ const everyReporter = [...new Set([...runWide, ...perEval])];
248
+ if (everyReporter.length === 0) {
249
+ return undefined;
250
+ }
251
+ const onError = (error) => {
252
+ // A broken destination must not fail the eval run itself.
253
+ const detail = error instanceof Error ? error.message : String(error);
254
+ process.stderr.write(`eval reporter error: ${detail}\n`);
255
+ };
256
+ const all = combineReporters(everyReporter, onError);
257
+ return {
258
+ runStart(evals, target) {
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ var _a;
261
+ yield (_a = all.onRunStart) === null || _a === void 0 ? void 0 : _a.call(all, evals.map((e) => ({
262
+ id: e.id,
263
+ fileId: e.fileId,
264
+ description: e.definition.description,
265
+ tags: e.definition.tags,
266
+ })), target);
267
+ });
268
+ },
269
+ caseComplete(discovered, result) {
270
+ return __awaiter(this, void 0, void 0, function* () {
271
+ var _a, _b;
272
+ var _c;
273
+ const observers = [
274
+ ...new Set([
275
+ ...runWide,
276
+ ...(skip ? [] : ((_c = discovered.definition.reporters) !== null && _c !== void 0 ? _c : [])),
277
+ ]),
278
+ ];
279
+ yield (_b = (_a = combineReporters(observers, onError)).onEvalComplete) === null || _b === void 0 ? void 0 : _b.call(_a, result);
280
+ });
281
+ },
282
+ runComplete(summary) {
283
+ return __awaiter(this, void 0, void 0, function* () {
284
+ var _a;
285
+ yield (_a = all.onRunComplete) === null || _a === void 0 ? void 0 : _a.call(all, summary);
286
+ });
287
+ },
288
+ };
289
+ }
179
290
  /**
180
291
  * Schedule key for {@link groupEvalsForIterationSchedule}: iteration siblings
181
292
  * (`weather/nyc/1`…`/3`) share a key; single-iteration ids keep their full id.
@@ -225,34 +336,58 @@ function resolveEvalMaxConcurrency(config) {
225
336
  }
226
337
  function runOneEval(discovered, opts) {
227
338
  return __awaiter(this, void 0, void 0, function* () {
228
- var _a;
229
- var _b;
339
+ var _a, _b;
340
+ var _c;
230
341
  const logs = [];
231
342
  const metrics = {};
232
- const assertions = [];
343
+ const recorder = new EvalAssertionRecorder();
233
344
  const def = discovered.definition;
234
- const timeoutMs = (_b = def.timeoutMs) !== null && _b !== void 0 ? _b : opts.defaultTimeoutMs;
345
+ const timeoutMs = (_c = def.timeoutMs) !== null && _c !== void 0 ? _c : opts.defaultTimeoutMs;
235
346
  const startedAt = Date.now();
236
347
  let sessionId;
237
348
  let continuationToken;
349
+ // The session stream replays from an index and the client stops at the first
350
+ // terminal event, so each send must resume after the previous turn's last
351
+ // event or it would re-read that turn instead of the new one.
352
+ let nextEventIndex = 0;
238
353
  const allEvents = [];
239
354
  const inputs = [];
355
+ const turns = [];
240
356
  let reply = null;
241
- if ((_a = opts.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
242
- return Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined
243
- ? {}
244
- : { description: def.description })), { ok: false, assertions, error: "cancelled", logs,
245
- metrics,
246
- inputs, toolCalls: [], tools: [], durationMs: Date.now() - startedAt });
247
- }
248
- const record = (name, passed, detail) => {
249
- assertions.push(Object.assign({ name,
250
- passed }, (detail === undefined ? {} : { detail })));
251
- };
252
357
  const toolsUsed = () => buildTrajectory(allEvents).turns.flatMap((t) => t.toolCalls.map((c) => c.toolName));
253
358
  const toolCallIo = () => buildTrajectory(allEvents).turns.flatMap((turn) => turn.toolCalls.map((c) => (Object.assign(Object.assign(Object.assign({ toolName: c.toolName }, (c.args === undefined ? {} : { args: c.args })), (c.output === undefined ? {} : { output: c.output })), { isError: c.isError }))));
254
- const t = {
255
- get reply() {
359
+ const finish = (extra) => (Object.assign(Object.assign(Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined ? {} : { description: def.description })), { ok: extra.ok, verdict: extra.verdict, skipReason: extra.skipReason, assertions: recorder.results(), error: extra.error, logs,
360
+ metrics, metadata: def.metadata, tags: def.tags, inputs, toolCalls: toolCallIo() }), (sessionId === undefined ? {} : { sessionId })), { finalText: extra.finalText, tools: toolsUsed(), durationMs: Date.now() - startedAt }));
361
+ if ((_a = opts.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
362
+ return finish({ verdict: "failed", ok: false, error: "cancelled" });
363
+ }
364
+ // A judge that cannot reach a model must not look like a quality regression:
365
+ // the case is skipped visibly instead.
366
+ let judgeUnavailable;
367
+ const timeout = new AbortController();
368
+ const timer = setTimeout(() => timeout.abort(), clampTimerDelay(timeoutMs));
369
+ // A pending case timer must not hold the process open on its own.
370
+ (_b = timer.unref) === null || _b === void 0 ? void 0 : _b.call(timer);
371
+ const runAssertions = createAssertions({
372
+ recorder,
373
+ events: () => allEvents,
374
+ });
375
+ const judge = createJudgeSurface({
376
+ recorder,
377
+ grader: (name) => EVAL_JUDGE_GRADERS[name],
378
+ resolveModel: (callModel) => { var _a; return resolveJudgeModel({
379
+ call: callModel,
380
+ evalLevel: (_a = def.judge) === null || _a === void 0 ? void 0 : _a.model,
381
+ config: opts.judge.configModel,
382
+ env: process.env[EVAL_JUDGE_MODEL_ENV],
383
+ }); },
384
+ caller: opts.judge.caller,
385
+ defaultValue: () => reply,
386
+ onUnavailable: (message) => {
387
+ judgeUnavailable = judgeUnavailable !== null && judgeUnavailable !== void 0 ? judgeUnavailable : message;
388
+ },
389
+ });
390
+ const t = Object.assign(Object.assign({}, runAssertions), { get reply() {
256
391
  return reply;
257
392
  },
258
393
  get sessionId() {
@@ -261,6 +396,9 @@ function runOneEval(discovered, opts) {
261
396
  get events() {
262
397
  return allEvents;
263
398
  },
399
+ get turns() {
400
+ return turns;
401
+ },
264
402
  get iteration() {
265
403
  var _a;
266
404
  return (_a = def.iteration) !== null && _a !== void 0 ? _a : 1;
@@ -269,14 +407,20 @@ function runOneEval(discovered, opts) {
269
407
  var _a;
270
408
  return (_a = def.iterations) !== null && _a !== void 0 ? _a : 1;
271
409
  },
410
+ get signal() {
411
+ return timeout.signal;
412
+ },
413
+ judge,
272
414
  send(message_1) {
273
415
  return __awaiter(this, arguments, void 0, function* (message, options = {}) {
416
+ var _a;
274
417
  inputs.push(message);
275
418
  const result = yield runSession({
276
419
  baseUrl: opts.baseUrl,
277
420
  messages: [message],
278
421
  sessionId,
279
422
  continuationToken,
423
+ startIndex: nextEventIndex,
280
424
  // Keep defineEval traffic out of live defineAB enrollment/metrics.
281
425
  purpose: "eval",
282
426
  bearerToken: opts.bearerToken,
@@ -290,39 +434,50 @@ function runOneEval(discovered, opts) {
290
434
  });
291
435
  sessionId = result.sessionId;
292
436
  continuationToken = result.continuationToken;
437
+ nextEventIndex = (_a = result.nextEventIndex) !== null && _a !== void 0 ? _a : nextEventIndex;
293
438
  allEvents.push(...result.events);
294
439
  if (result.trajectory.finalText !== "") {
295
440
  reply = result.trajectory.finalText;
296
441
  }
297
- return {
298
- message: result.trajectory.finalText,
299
- sessionId: result.sessionId,
300
- events: result.events,
301
- toolCalls: result.trajectory.turns.flatMap((turn) => turn.toolCalls.map((c) => c.toolName)),
302
- ok: result.ok,
303
- };
442
+ const index = turns.length + 1;
443
+ // The turn is immutable, so its assertions read a frozen event slice
444
+ // even after later turns append to the run.
445
+ const turnEvents = [...result.events];
446
+ const turn = Object.assign(Object.assign({}, createAssertions({
447
+ recorder,
448
+ events: () => turnEvents,
449
+ scope: `turn[${index}]`,
450
+ })), { message: result.trajectory.finalText, sessionId: result.sessionId, events: turnEvents, toolCalls: result.trajectory.turns.flatMap((turn) => turn.toolCalls.map((c) => c.toolName)), ok: result.ok, index,
451
+ expectOk() {
452
+ var _a;
453
+ var _b;
454
+ if (!result.ok) {
455
+ throw new Error(`turn[${index}] failed: ${(_b = (_a = result.trajectory.turns.find((x) => x.failed)) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : "unknown error"}`);
456
+ }
457
+ return turn;
458
+ } });
459
+ turns.push(turn);
460
+ return turn;
304
461
  });
305
462
  },
306
- succeeded() {
307
- const traj = buildTrajectory(allEvents);
308
- record("succeeded", traj.ok && traj.turns.length > 0, traj.ok ? undefined : "turn failed");
309
- },
310
- calledTool(name) {
311
- const tools = toolsUsed();
312
- record(`calledTool(${name})`, tools.includes(name), tools.includes(name) ? undefined : `got [${tools.join(", ")}]`);
313
- },
314
- notCalledTool(name) {
315
- const tools = toolsUsed();
316
- record(`notCalledTool(${name})`, !tools.includes(name), tools.includes(name) ? "tool was called" : undefined);
317
- },
318
- messageIncludes(token) {
319
- const text = reply !== null && reply !== void 0 ? reply : "";
320
- const passed = typeof token === "string" ? text.includes(token) : token.test(text);
321
- record(`messageIncludes(${String(token)})`, passed, passed ? undefined : `reply=${JSON.stringify(text.slice(0, 120))}`);
463
+ require(value, assertion) {
464
+ return __awaiter(this, void 0, void 0, function* () {
465
+ const outcome = evaluateExpectation(value, assertion);
466
+ recorder.record({
467
+ name: `require(${assertion.kind})`,
468
+ passed: outcome.passed,
469
+ detail: outcome.detail,
470
+ score: outcome.score,
471
+ severity: "gate",
472
+ });
473
+ if (!outcome.passed) {
474
+ throw new EvalRequireFailure(`require(${assertion.kind})`);
475
+ }
476
+ return value;
477
+ });
322
478
  },
323
- check(value, assertion) {
324
- const { passed, detail } = matchExpectation(value, assertion);
325
- record(`check(${assertion.kind})`, passed, detail);
479
+ skip(reason) {
480
+ throw new EvalSkipSignal(reason);
326
481
  },
327
482
  log(message) {
328
483
  logs.push(message);
@@ -339,90 +494,138 @@ function runOneEval(discovered, opts) {
339
494
  if (opts.verbose) {
340
495
  process.stderr.write(` metric ${key}=${String(value)}\n`);
341
496
  }
342
- },
343
- };
497
+ } });
344
498
  try {
345
499
  yield def.test(t);
346
500
  }
347
501
  catch (error) {
348
- const message = error instanceof Error ? error.message : String(error);
349
- if (error instanceof RunSessionTimeoutError && sessionId === undefined) {
350
- sessionId = error.sessionId;
502
+ if (error instanceof EvalSkipSignal) {
503
+ clearTimeout(timer);
504
+ return finish({
505
+ verdict: "skipped",
506
+ ok: true,
507
+ skipReason: error.reason,
508
+ finalText: reply !== null && reply !== void 0 ? reply : undefined,
509
+ });
351
510
  }
352
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined
353
- ? {}
354
- : { description: def.description })), { ok: false, assertions, error: message, logs,
355
- metrics,
356
- inputs, toolCalls: toolCallIo() }), (sessionId === undefined ? {} : { sessionId })), (reply === null ? {} : { finalText: reply })), { tools: toolsUsed(), durationMs: Date.now() - startedAt });
511
+ if (!(error instanceof EvalRequireFailure)) {
512
+ const message = error instanceof Error ? error.message : String(error);
513
+ if (error instanceof RunSessionTimeoutError && sessionId === undefined) {
514
+ sessionId = error.sessionId;
515
+ }
516
+ yield recorder.waitForPending().catch(() => undefined);
517
+ clearTimeout(timer);
518
+ return finish({
519
+ verdict: "failed",
520
+ ok: false,
521
+ error: message,
522
+ finalText: reply !== null && reply !== void 0 ? reply : undefined,
523
+ });
524
+ }
525
+ // `require` already recorded the failing gate; fall through so the verdict
526
+ // comes from the assertions rather than a duplicate execution error.
357
527
  }
528
+ yield recorder.waitForPending();
529
+ clearTimeout(timer);
530
+ const assertions = recorder.results();
358
531
  const traj = buildTrajectory(allEvents);
359
- const ok = assertions.length > 0
360
- ? assertions.every((a) => a.passed)
361
- : traj.ok && traj.turns.length > 0;
362
- return Object.assign(Object.assign(Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined ? {} : { description: def.description })), { ok,
363
- assertions,
364
- logs,
365
- metrics,
366
- inputs, toolCalls: toolCallIo() }), (sessionId === undefined ? {} : { sessionId })), { finalText: reply !== null && reply !== void 0 ? reply : traj.finalText, tools: toolsUsed(), durationMs: Date.now() - startedAt });
532
+ // With no assertions at all, keep the historical fallback: a case that just
533
+ // drives the agent passes when the run itself succeeded.
534
+ const verdict = assertions.length > 0
535
+ ? computeVerdict(assertions)
536
+ : traj.ok && traj.turns.length > 0
537
+ ? "passed"
538
+ : "failed";
539
+ const finalText = reply !== null && reply !== void 0 ? reply : traj.finalText;
540
+ // An unreachable judge means the *judged* signal is unknown, so the case is
541
+ // reported as skipped rather than as a quality regression. It must not also
542
+ // bury a deterministic gate that already failed: skipping a failed case would
543
+ // turn a red eval green on any machine that happens to lack credentials.
544
+ if (judgeUnavailable !== undefined && verdict !== "failed") {
545
+ logs.push(`judge skipped: ${judgeUnavailable}`);
546
+ return finish({
547
+ verdict: "skipped",
548
+ ok: true,
549
+ skipReason: judgeUnavailable,
550
+ finalText,
551
+ });
552
+ }
553
+ if (judgeUnavailable !== undefined) {
554
+ logs.push(`judge unavailable (${judgeUnavailable}), but a gate already failed — reporting the failure`);
555
+ }
556
+ return finish({
557
+ verdict,
558
+ ok: verdict !== "failed",
559
+ finalText,
560
+ });
367
561
  });
368
562
  }
369
- function matchExpectation(value, assertion) {
370
- switch (assertion.kind) {
371
- case "includes": {
372
- const text = value === null || value === undefined ? "" : String(value);
373
- const passed = typeof assertion.value === "string"
374
- ? text.includes(assertion.value)
375
- : assertion.value.test(text);
376
- return Object.assign({ passed }, (passed
377
- ? {}
378
- : {
379
- detail: `value=${JSON.stringify(text.slice(0, 120))}`,
380
- }));
563
+ /** Clamp a case timeout to a delay `setTimeout` can represent. */
564
+ function clampTimerDelay(timeoutMs) {
565
+ const MAX_TIMER = 2147483647;
566
+ return Math.min(Math.max(timeoutMs, 0), MAX_TIMER);
567
+ }
568
+ /**
569
+ * Build `t.judge`. Each grader records its slot immediately and resolves it
570
+ * during finalization, so several judges overlap instead of serializing.
571
+ */
572
+ function createJudgeSurface(args) {
573
+ const grade = (graderName, reference, options) => {
574
+ const grader = args.grader(graderName);
575
+ const model = args.resolveModel(options === null || options === void 0 ? void 0 : options.model);
576
+ const name = `judge.${graderName}(${truncateForName(reference)})`;
577
+ if (model === undefined) {
578
+ // A missing judge model is an authoring error, not a flaky provider.
579
+ return args.recorder.record({
580
+ name,
581
+ passed: false,
582
+ severity: "gate",
583
+ detail: "no judge model configured; set judge.model in evals.config.ts, on the eval, or on the call",
584
+ });
381
585
  }
382
- case "equals": {
383
- const passed = deepEqual(value, assertion.value);
384
- // Always attach a short detail so values like recall `40.0% (4/10)`
385
- // show up on PASS lines / playground, not only on failure.
386
- const rendered = typeof value === "string" ? value : JSON.stringify(value);
586
+ const submission = renderSubmission(options !== undefined && "on" in options
587
+ ? options.on
588
+ : args.defaultValue());
589
+ const settle = (() => __awaiter(this, void 0, void 0, function* () {
590
+ const reply = yield args.caller({
591
+ prompt: grader.buildPrompt({ submission, reference }),
592
+ model,
593
+ });
594
+ const result = grader.parse(reply);
387
595
  return {
388
- passed,
389
- detail: passed ? rendered : `got ${rendered}`,
596
+ passed: true,
597
+ score: result.score,
598
+ detail: result.rationale === undefined
599
+ ? `${result.choice} (${result.score.toFixed(2)})`
600
+ : `${result.choice} (${result.score.toFixed(2)}) — ${result.rationale}`,
390
601
  };
391
- }
392
- case "satisfies": {
393
- const passed = assertion.predicate(value);
394
- return Object.assign({ passed }, (passed ? {} : { detail: assertion.label }));
395
- }
396
- }
602
+ }))().catch((error) => {
603
+ if (error instanceof EvalJudgeUnavailableError) {
604
+ args.onUnavailable(error.message);
605
+ return { passed: true, detail: `skipped: ${error.message}` };
606
+ }
607
+ throw error;
608
+ });
609
+ // Soft by default: a judge is a tracked score until given a bar.
610
+ return args.recorder.recordAsync({ name, passed: true, severity: "soft", detail: "grading…" }, settle);
611
+ };
612
+ return {
613
+ model(prompt, options) {
614
+ return __awaiter(this, void 0, void 0, function* () {
615
+ const model = args.resolveModel(options === null || options === void 0 ? void 0 : options.model);
616
+ if (model === undefined) {
617
+ throw new Error("t.judge.model: no judge model configured; set judge.model in evals.config.ts, on the eval, or on the call");
618
+ }
619
+ return args.caller({ prompt, model });
620
+ });
621
+ },
622
+ factuality: (expected, options) => grade("factuality", expected, options),
623
+ summarizes: (expected, options) => grade("summarizes", expected, options),
624
+ closedQA: (criteria, options) => grade("closedQA", criteria, options),
625
+ sql: (expected, options) => grade("sql", expected, options),
626
+ };
397
627
  }
398
- function deepEqual(a, b) {
399
- if (Object.is(a, b)) {
400
- return true;
401
- }
402
- if (typeof a !== "object" ||
403
- typeof b !== "object" ||
404
- a === null ||
405
- b === null) {
406
- return false;
407
- }
408
- if (Array.isArray(a) !== Array.isArray(b)) {
409
- return false;
410
- }
411
- if (Array.isArray(a) && Array.isArray(b)) {
412
- if (a.length !== b.length) {
413
- return false;
414
- }
415
- return a.every((item, i) => deepEqual(item, b[i]));
416
- }
417
- const aKeys = Object.keys(a);
418
- const bKeys = Object.keys(b);
419
- if (aKeys.length !== bKeys.length) {
420
- return false;
421
- }
422
- for (const key of aKeys) {
423
- if (!deepEqual(a[key], b[key])) {
424
- return false;
425
- }
426
- }
427
- return true;
628
+ function truncateForName(text) {
629
+ const oneLine = text.replace(/\s+/g, " ").trim();
630
+ return oneLine.length > 60 ? `${oneLine.slice(0, 59)}…` : oneLine;
428
631
  }
@@ -1 +1 @@
1
- {"version":3,"file":"evals-client.d.ts","sourceRoot":"","sources":["../../src/internal/evals-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evals-client.d.ts","sourceRoot":"","sources":["../../src/internal/evals-client.ts"],"names":[],"mappings":"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"}
@@ -285,7 +285,10 @@ export function pollRemoteEvalRun(args) {
285
285
  });
286
286
  }
287
287
  export function snapshotToEvalRunResults(snapshot) {
288
- return snapshot.cases.map((c) => { var _a, _b, _c, _d, _e; return (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id: c.id, path: c.fileId }, (c.description === undefined ? {} : { description: c.description })), { ok: c.ok === true, assertions: (_a = c.assertions) !== null && _a !== void 0 ? _a : [] }), (c.sessionId === undefined ? {} : { sessionId: c.sessionId })), { inputs: (_b = c.inputs) !== null && _b !== void 0 ? _b : [] }), (c.finalText === undefined ? {} : { finalText: c.finalText })), (c.tools === undefined ? {} : { tools: c.tools })), (c.toolCalls === undefined ? {} : { toolCalls: c.toolCalls })), (c.error === undefined ? {} : { error: c.error })), { logs: (_c = c.logs) !== null && _c !== void 0 ? _c : [], metrics: (_d = c.metrics) !== null && _d !== void 0 ? _d : {}, durationMs: (_e = c.durationMs) !== null && _e !== void 0 ? _e : 0 })); });
288
+ return snapshot.cases.map((c) => { var _a, _b, _c, _d, _e, _f; return (Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ id: c.id, path: c.fileId }, (c.description === undefined ? {} : { description: c.description })), { ok: c.ok === true,
289
+ // Older serve processes send no verdict; infer it from `ok` so a remote
290
+ // batch still prints and reports consistently.
291
+ verdict: (_a = c.verdict) !== null && _a !== void 0 ? _a : (c.ok === true ? "passed" : "failed") }), (c.skipReason === undefined ? {} : { skipReason: c.skipReason })), (c.metadata === undefined ? {} : { metadata: c.metadata })), { assertions: (_b = c.assertions) !== null && _b !== void 0 ? _b : [] }), (c.sessionId === undefined ? {} : { sessionId: c.sessionId })), { inputs: (_c = c.inputs) !== null && _c !== void 0 ? _c : [] }), (c.finalText === undefined ? {} : { finalText: c.finalText })), (c.tools === undefined ? {} : { tools: c.tools })), (c.toolCalls === undefined ? {} : { toolCalls: c.toolCalls })), (c.error === undefined ? {} : { error: c.error })), { logs: (_d = c.logs) !== null && _d !== void 0 ? _d : [], metrics: (_e = c.metrics) !== null && _e !== void 0 ? _e : {}, durationMs: (_f = c.durationMs) !== null && _f !== void 0 ? _f : 0 })); });
289
292
  }
290
293
  function sleep(ms, signal) {
291
294
  return new Promise((resolve, reject) => {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Loads an agent directory's `.env.local` (and each immediate child's,
3
+ * for multi-agent hosts) into process.env. Real env always wins —
4
+ * `process.loadEnvFile` never overrides. Values a previous call loaded are
5
+ * refreshed, so a reload picks up edits made since.
6
+ */
7
+ export declare function loadAgentLocalEnv(dir: string): string[];
8
+ //# sourceMappingURL=local-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-env.d.ts","sourceRoot":"","sources":["../../src/internal/local-env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsCvD"}