@cursor/july 0.1.11 → 0.1.14

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 (174) hide show
  1. package/dist/bin/agent-serve.js +32 -9
  2. package/dist/channels/github/api.d.ts.map +1 -1
  3. package/dist/channels/github/api.js +11 -4
  4. package/dist/channels/github/cursor-account.d.ts +21 -1
  5. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  6. package/dist/channels/github/cursor-account.js +29 -1
  7. package/dist/channels/github/github-channel.d.ts.map +1 -1
  8. package/dist/channels/github/github-channel.js +1 -1
  9. package/dist/channels/github/instrument.d.ts +20 -0
  10. package/dist/channels/github/instrument.d.ts.map +1 -0
  11. package/dist/channels/slack/api.d.ts +9 -0
  12. package/dist/channels/slack/api.d.ts.map +1 -1
  13. package/dist/channels/slack/api.js +40 -7
  14. package/dist/channels/slack/eval-directive.d.ts +3 -0
  15. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  16. package/dist/channels/slack/eval-directive.js +20 -1
  17. package/dist/docs/404.html +2 -2
  18. package/dist/docs/ab.html +3 -3
  19. package/dist/docs/assets/{app.BcXUGca7.js → app.CKFFLL4Z.js} +1 -1
  20. package/dist/docs/assets/chunks/@localSearchIndexroot.DGWkvXJc.js +1 -0
  21. package/dist/docs/assets/chunks/{VPLocalSearchBox.CWur6XGZ.js → VPLocalSearchBox.BXk19JBN.js} +1 -1
  22. package/dist/docs/assets/chunks/{theme.BnvulOX2.js → theme.BXSPBMyn.js} +2 -2
  23. package/dist/docs/assets/{evals.md.DAgEc_hL.js → evals.md.DYOjkRCX.js} +10 -4
  24. package/dist/docs/assets/{evals.md.DAgEc_hL.lean.js → evals.md.DYOjkRCX.lean.js} +1 -1
  25. package/dist/docs/assets/{reference_cli.md.B74NrVzb.js → reference_cli.md.DnYfr5V2.js} +4 -1
  26. package/dist/docs/assets/{reference_http-api.md.Dx_nmDG6.js → reference_http-api.md.BncLd3PZ.js} +2 -2
  27. package/dist/docs/assets/{reference_http-api.md.Dx_nmDG6.lean.js → reference_http-api.md.BncLd3PZ.lean.js} +1 -1
  28. package/dist/docs/building-with-agents.html +3 -3
  29. package/dist/docs/concepts.html +3 -3
  30. package/dist/docs/deployment.html +3 -3
  31. package/dist/docs/evals.html +13 -7
  32. package/dist/docs/example-agents/approval-buddy.html +3 -3
  33. package/dist/docs/example-agents/benny.html +3 -3
  34. package/dist/docs/example-agents/bugbot.html +3 -3
  35. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  36. package/dist/docs/example-agents/codeowners-review.html +3 -3
  37. package/dist/docs/example-agents/concierge.html +3 -3
  38. package/dist/docs/example-agents/fsd.html +3 -3
  39. package/dist/docs/example-agents/index.html +3 -3
  40. package/dist/docs/example-agents/knowledge-base.html +3 -3
  41. package/dist/docs/example-agents/oncall.html +3 -3
  42. package/dist/docs/example-agents/security-reviewer.html +3 -3
  43. package/dist/docs/example-agents/slack-agent.html +3 -3
  44. package/dist/docs/example-agents/weather-agent.html +3 -3
  45. package/dist/docs/guides/agent-to-agent.html +3 -3
  46. package/dist/docs/guides/cloud-runtime.html +3 -3
  47. package/dist/docs/guides/github.html +3 -3
  48. package/dist/docs/guides/human-in-the-loop.html +3 -3
  49. package/dist/docs/guides/mcp-oauth.html +3 -3
  50. package/dist/docs/guides/slack.html +3 -3
  51. package/dist/docs/guides/webhooks.html +3 -3
  52. package/dist/docs/hashmap.json +1 -1
  53. package/dist/docs/hillclimbing.html +3 -3
  54. package/dist/docs/index.html +3 -3
  55. package/dist/docs/quickstart.html +3 -3
  56. package/dist/docs/reference/agent-config.html +3 -3
  57. package/dist/docs/reference/channels.html +3 -3
  58. package/dist/docs/reference/cli.html +8 -5
  59. package/dist/docs/reference/connections.html +3 -3
  60. package/dist/docs/reference/hooks.html +3 -3
  61. package/dist/docs/reference/http-api.html +5 -5
  62. package/dist/docs/reference/instructions.html +3 -3
  63. package/dist/docs/reference/playground.html +3 -3
  64. package/dist/docs/reference/project-layout.html +3 -3
  65. package/dist/docs/reference/prompt.html +3 -3
  66. package/dist/docs/reference/schedules.html +3 -3
  67. package/dist/docs/reference/sessions.html +3 -3
  68. package/dist/docs/reference/skills.html +3 -3
  69. package/dist/docs/reference/subagents.html +3 -3
  70. package/dist/docs/reference/tools.html +3 -3
  71. package/dist/docs/scaffolding-agents.html +3 -3
  72. package/dist/docs/storage.html +3 -3
  73. package/dist/docs/troubleshooting.html +3 -3
  74. package/dist/evals.d.ts +41 -2
  75. package/dist/evals.d.ts.map +1 -1
  76. package/dist/evals.js +53 -16
  77. package/dist/internal/cli-ax.d.ts +4 -0
  78. package/dist/internal/cli-ax.d.ts.map +1 -1
  79. package/dist/internal/cli-ax.js +163 -33
  80. package/dist/internal/cli-deploy.d.ts +8 -0
  81. package/dist/internal/cli-deploy.d.ts.map +1 -1
  82. package/dist/internal/cli-deploy.js +92 -12
  83. package/dist/internal/cli-mcp-oauth.d.ts +14 -2
  84. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  85. package/dist/internal/cli-mcp-oauth.js +95 -2
  86. package/dist/internal/cursor/backend-client.d.ts +34 -0
  87. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  88. package/dist/internal/cursor/backend-client.js +73 -9
  89. package/dist/internal/cursor/credentials.d.ts +7 -1
  90. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  91. package/dist/internal/cursor/credentials.js +9 -3
  92. package/dist/internal/cursor-account-mcp-auth.d.ts +55 -0
  93. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -0
  94. package/dist/internal/cursor-account-mcp-auth.js +175 -0
  95. package/dist/internal/cursor-event-relay.d.ts +2 -0
  96. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  97. package/dist/internal/cursor-event-relay.js +3 -0
  98. package/dist/internal/deploy-client.d.ts +6 -0
  99. package/dist/internal/deploy-client.d.ts.map +1 -1
  100. package/dist/internal/deploy-client.js +13 -0
  101. package/dist/internal/eval-run-store.d.ts +15 -0
  102. package/dist/internal/eval-run-store.d.ts.map +1 -1
  103. package/dist/internal/eval-run-store.js +87 -8
  104. package/dist/internal/eval-runner.d.ts +12 -0
  105. package/dist/internal/eval-runner.d.ts.map +1 -1
  106. package/dist/internal/eval-runner.js +97 -22
  107. package/dist/internal/evals-client.d.ts +9 -1
  108. package/dist/internal/evals-client.d.ts.map +1 -1
  109. package/dist/internal/evals-client.js +43 -0
  110. package/dist/internal/http-channel.d.ts.map +1 -1
  111. package/dist/internal/http-channel.js +74 -7
  112. package/dist/internal/map-pool.d.ts +6 -1
  113. package/dist/internal/map-pool.d.ts.map +1 -1
  114. package/dist/internal/map-pool.js +8 -1
  115. package/dist/internal/mcp-host.d.ts +13 -0
  116. package/dist/internal/mcp-host.d.ts.map +1 -1
  117. package/dist/internal/mcp-host.js +68 -13
  118. package/dist/internal/run-client.d.ts +5 -1
  119. package/dist/internal/run-client.d.ts.map +1 -1
  120. package/dist/internal/run-client.js +26 -5
  121. package/dist/internal/server.d.ts.map +1 -1
  122. package/dist/internal/server.js +57 -4
  123. package/dist/internal/session-engine.d.ts +13 -0
  124. package/dist/internal/session-engine.d.ts.map +1 -1
  125. package/dist/internal/session-engine.js +49 -0
  126. package/dist/internal/storage-coordinator.d.ts +7 -0
  127. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  128. package/dist/internal/storage-coordinator.js +29 -4
  129. package/dist/playground/assets/index-CuXb4j4V.css +1 -0
  130. package/dist/playground/assets/index-DeyYpOit.js +86 -0
  131. package/dist/playground/index.html +2 -2
  132. package/dist/types.d.ts +10 -0
  133. package/dist/types.d.ts.map +1 -1
  134. package/docs/evals.md +46 -11
  135. package/docs/reference/cli.md +3 -0
  136. package/docs/reference/http-api.md +2 -1
  137. package/package.json +1 -1
  138. package/src/bin/agent-serve.ts +38 -8
  139. package/src/channels/github/api.ts +12 -1
  140. package/src/channels/github/cursor-account.ts +51 -1
  141. package/src/channels/github/github-channel.ts +4 -1
  142. package/src/channels/slack/api.ts +57 -8
  143. package/src/channels/slack/eval-directive.ts +24 -1
  144. package/src/evals.ts +104 -25
  145. package/src/internal/cli-ax.ts +192 -16
  146. package/src/internal/cli-deploy.ts +140 -13
  147. package/src/internal/cli-mcp-oauth.ts +122 -3
  148. package/src/internal/cursor/backend-client.ts +104 -1
  149. package/src/internal/cursor/credentials.ts +10 -2
  150. package/src/internal/cursor-account-mcp-auth.ts +241 -0
  151. package/src/internal/cursor-event-relay.ts +5 -0
  152. package/src/internal/deploy-client.ts +16 -0
  153. package/src/internal/eval-run-store.ts +89 -6
  154. package/src/internal/eval-runner.ts +113 -18
  155. package/src/internal/evals-client.ts +81 -0
  156. package/src/internal/http-channel.ts +87 -6
  157. package/src/internal/map-pool.ts +8 -1
  158. package/src/internal/mcp-host.ts +74 -16
  159. package/src/internal/run-client.ts +32 -1
  160. package/src/internal/server.ts +69 -2
  161. package/src/internal/session-engine.ts +58 -0
  162. package/src/internal/storage-coordinator.ts +32 -6
  163. package/src/types.ts +10 -0
  164. package/dist/channels/slack/post-update-delivery.d.ts +0 -85
  165. package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
  166. package/dist/channels/slack/post-update-delivery.js +0 -318
  167. package/dist/docs/assets/chunks/@localSearchIndexroot.BIbvK8M1.js +0 -1
  168. package/dist/internal/corp-ca.d.ts +0 -9
  169. package/dist/internal/corp-ca.d.ts.map +0 -1
  170. package/dist/internal/corp-ca.js +0 -44
  171. package/dist/playground/assets/index-BIGLubwK.js +0 -86
  172. package/dist/playground/assets/index-C17ZQKDG.css +0 -1
  173. package/docs/.vitepress/cache/deps/package.json +0 -3
  174. /package/dist/docs/assets/{reference_cli.md.B74NrVzb.lean.js → reference_cli.md.DnYfr5V2.lean.js} +0 -0
@@ -139,27 +139,79 @@ export function runDiscoveredEvals(options) {
139
139
  }
140
140
  const maxConcurrency = resolveEvalMaxConcurrency(config);
141
141
  const defaultTimeoutMs = (_c = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : config.timeoutMs) !== null && _c !== void 0 ? _c : 180000;
142
- return mapPool(selected, maxConcurrency, (discovered) => __awaiter(this, void 0, void 0, function* () {
143
- var _a, _b;
144
- if (options.verbose) {
145
- process.stderr.write(` eval ${discovered.id}…\n`);
142
+ // Iterations of the same authored datapoint share one concurrency slot and
143
+ // run sequentially. maxConcurrency is therefore the max number of distinct
144
+ // datapoints in flight, not datapoints × iterations.
145
+ const groups = groupEvalsForIterationSchedule(selected);
146
+ const nested = yield mapPool(groups, maxConcurrency, (group) => __awaiter(this, void 0, void 0, function* () {
147
+ var _a, _b, _c;
148
+ const results = [];
149
+ for (const discovered of group) {
150
+ if ((_a = options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
151
+ break;
152
+ }
153
+ if (options.verbose) {
154
+ process.stderr.write(` eval ${discovered.id}…\n`);
155
+ }
156
+ (_b = options.onCaseStart) === null || _b === void 0 ? void 0 : _b.call(options, discovered.id);
157
+ const result = yield runOneEval(discovered, {
158
+ baseUrl: options.baseUrl,
159
+ defaultTimeoutMs,
160
+ bearerToken: options.bearerToken,
161
+ headers: options.headers,
162
+ verbose: Boolean(options.verbose),
163
+ signal: options.signal,
164
+ onEvent: (event) => {
165
+ var _a, _b;
166
+ (_a = options.onCaseEvent) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id, event);
167
+ (_b = options.onEvent) === null || _b === void 0 ? void 0 : _b.call(options, event);
168
+ },
169
+ });
170
+ (_c = options.onCaseDone) === null || _c === void 0 ? void 0 : _c.call(options, result);
171
+ results.push(result);
146
172
  }
147
- (_a = options.onCaseStart) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id);
148
- const result = yield runOneEval(discovered, {
149
- baseUrl: options.baseUrl,
150
- defaultTimeoutMs,
151
- bearerToken: options.bearerToken,
152
- headers: options.headers,
153
- verbose: Boolean(options.verbose),
154
- onEvent: (event) => {
155
- var _a, _b;
156
- (_a = options.onCaseEvent) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id, event);
157
- (_b = options.onEvent) === null || _b === void 0 ? void 0 : _b.call(options, event);
158
- },
159
- });
160
- (_b = options.onCaseDone) === null || _b === void 0 ? void 0 : _b.call(options, result);
161
- return result;
162
- }));
173
+ return results;
174
+ }), { signal: options.signal });
175
+ return nested.flat();
176
+ });
177
+ }
178
+ /**
179
+ * Schedule key for {@link groupEvalsForIterationSchedule}: iteration siblings
180
+ * (`weather/nyc/1`…`/3`) share a key; single-iteration ids keep their full id.
181
+ */
182
+ export function iterationScheduleKey(discovered) {
183
+ var _a, _b;
184
+ const iterations = (_a = discovered.definition.iterations) !== null && _a !== void 0 ? _a : 1;
185
+ const iteration = (_b = discovered.definition.iteration) !== null && _b !== void 0 ? _b : 1;
186
+ if (iterations <= 1) {
187
+ return discovered.id;
188
+ }
189
+ const suffix = `/${iteration}`;
190
+ if (discovered.id.endsWith(suffix)) {
191
+ return discovered.id.slice(0, -suffix.length);
192
+ }
193
+ return discovered.id;
194
+ }
195
+ /**
196
+ * Group expanded iteration cases so each authored datapoint's iterations run
197
+ * back-to-back under one {@link mapPool} slot (sorted by iteration index).
198
+ */
199
+ export function groupEvalsForIterationSchedule(evals) {
200
+ const groups = new Map();
201
+ const order = [];
202
+ for (const discovered of evals) {
203
+ const key = iterationScheduleKey(discovered);
204
+ let group = groups.get(key);
205
+ if (group === undefined) {
206
+ group = [];
207
+ groups.set(key, group);
208
+ order.push(key);
209
+ }
210
+ group.push(discovered);
211
+ }
212
+ return order.map((key) => {
213
+ const group = groups.get(key);
214
+ return group.sort((a, b) => { var _a, _b; return ((_a = a.definition.iteration) !== null && _a !== void 0 ? _a : 1) - ((_b = b.definition.iteration) !== null && _b !== void 0 ? _b : 1); });
163
215
  });
164
216
  }
165
217
  function resolveEvalMaxConcurrency(config) {
@@ -173,16 +225,23 @@ function resolveEvalMaxConcurrency(config) {
173
225
  function runOneEval(discovered, opts) {
174
226
  return __awaiter(this, void 0, void 0, function* () {
175
227
  var _a;
228
+ var _b;
176
229
  const logs = [];
177
230
  const assertions = [];
178
231
  const def = discovered.definition;
179
- const timeoutMs = (_a = def.timeoutMs) !== null && _a !== void 0 ? _a : opts.defaultTimeoutMs;
232
+ const timeoutMs = (_b = def.timeoutMs) !== null && _b !== void 0 ? _b : opts.defaultTimeoutMs;
180
233
  const startedAt = Date.now();
181
234
  let sessionId;
182
235
  let continuationToken;
183
236
  const allEvents = [];
184
237
  const inputs = [];
185
238
  let reply = null;
239
+ if ((_a = opts.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
240
+ return Object.assign(Object.assign({ id: discovered.id, path: discovered.path }, (def.description === undefined
241
+ ? {}
242
+ : { description: def.description })), { ok: false, assertions, error: "cancelled", logs,
243
+ inputs, toolCalls: [], tools: [], durationMs: Date.now() - startedAt });
244
+ }
186
245
  const record = (name, passed, detail) => {
187
246
  assertions.push(Object.assign({ name,
188
247
  passed }, (detail === undefined ? {} : { detail })));
@@ -199,6 +258,14 @@ function runOneEval(discovered, opts) {
199
258
  get events() {
200
259
  return allEvents;
201
260
  },
261
+ get iteration() {
262
+ var _a;
263
+ return (_a = def.iteration) !== null && _a !== void 0 ? _a : 1;
264
+ },
265
+ get iterations() {
266
+ var _a;
267
+ return (_a = def.iterations) !== null && _a !== void 0 ? _a : 1;
268
+ },
202
269
  send(message_1) {
203
270
  return __awaiter(this, arguments, void 0, function* (message, options = {}) {
204
271
  inputs.push(message);
@@ -213,7 +280,9 @@ function runOneEval(discovered, opts) {
213
280
  headers: opts.headers,
214
281
  workspaceDir: options.workspaceDir,
215
282
  workspaceFiles: options.workspaceFiles,
283
+ cloud: options.cloud,
216
284
  timeoutMs,
285
+ signal: opts.signal,
217
286
  onEvent: opts.onEvent,
218
287
  });
219
288
  sessionId = result.sessionId;
@@ -297,7 +366,13 @@ function matchExpectation(value, assertion) {
297
366
  }
298
367
  case "equals": {
299
368
  const passed = deepEqual(value, assertion.value);
300
- return Object.assign({ passed }, (passed ? {} : { detail: `got ${JSON.stringify(value)}` }));
369
+ // Always attach a short detail so values like recall `40.0% (4/10)`
370
+ // show up on PASS lines / playground, not only on failure.
371
+ const rendered = typeof value === "string" ? value : JSON.stringify(value);
372
+ return {
373
+ passed,
374
+ detail: passed ? rendered : `got ${rendered}`,
375
+ };
301
376
  }
302
377
  case "satisfies": {
303
378
  const passed = assertion.predicate(value);
@@ -9,7 +9,7 @@
9
9
  import type { EvalRunSnapshot } from "../evals.js";
10
10
  import type { EvalRunResult } from "./eval-runner.js";
11
11
  import { type RequestAuth } from "./request-headers.js";
12
- export type RemoteEvalErrorCode = "no_matching_evals" | "eval_run_in_progress" | "unknown_eval_run" | "start_failed" | "poll_failed" | "aborted";
12
+ export type RemoteEvalErrorCode = "no_matching_evals" | "eval_run_in_progress" | "eval_run_not_running" | "unknown_eval_run" | "start_failed" | "poll_failed" | "cancel_failed" | "aborted";
13
13
  export declare class RemoteEvalError extends Error {
14
14
  readonly status?: number | undefined;
15
15
  readonly code?: RemoteEvalErrorCode | undefined;
@@ -65,6 +65,14 @@ export declare function startRemoteEvalRun(args: {
65
65
  verbose?: boolean;
66
66
  signal?: AbortSignal;
67
67
  }): Promise<EvalRunSnapshot>;
68
+ /** Cancel a running batch via `POST /v1/dev/evals/runs/:runId/cancel`. */
69
+ export declare function cancelRemoteEvalRun(args: {
70
+ baseUrl: string;
71
+ runId: string;
72
+ auth?: RequestAuth;
73
+ fetchImpl?: typeof fetch;
74
+ signal?: AbortSignal;
75
+ }): Promise<EvalRunSnapshot>;
68
76
  /** One-shot `GET /v1/dev/evals/runs/:runId` (no polling). */
69
77
  export declare function getRemoteEvalRun(args: {
70
78
  baseUrl: string;
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI7E,MAAM,MAAM,mBAAmB,GAC3B,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,aAAa,GACb,eAAe,GACf,SAAS,CAAC;AAEd,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,mBAAmB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;IAJ/B,YACE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,IAAI,CAAC,EAAE,mBAAmB,YAAA,EAC1B,WAAW,CAAC,EAAE,MAAM,YAAA,EAI9B;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oDAAoD;IACpD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CA+BlE;AAED,iFAAiF;AACjF,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAgEhC;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuF3B;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAsE3B;AAED,6DAA6D;AAC7D,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmC3B;AAED,oDAAoD;AACpD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC7D;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB3B;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,eAAe,GACxB,aAAa,EAAE,CAgBjB"}
@@ -162,6 +162,49 @@ export function startRemoteEvalRun(args) {
162
162
  return json;
163
163
  });
164
164
  }
165
+ /** Cancel a running batch via `POST /v1/dev/evals/runs/:runId/cancel`. */
166
+ export function cancelRemoteEvalRun(args) {
167
+ return __awaiter(this, void 0, void 0, function* () {
168
+ var _a;
169
+ const baseUrl = args.baseUrl.replace(/\/$/, "");
170
+ const fetchImpl = (_a = args.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
171
+ let resp;
172
+ try {
173
+ resp = yield fetchImpl(`${baseUrl}/v1/dev/evals/runs/${encodeURIComponent(args.runId)}/cancel`, {
174
+ method: "POST",
175
+ headers: mergeRequestHeaders(args.auth),
176
+ signal: args.signal,
177
+ });
178
+ }
179
+ catch (error) {
180
+ throw new RemoteEvalError(error instanceof Error ? error.message : "Could not cancel eval run.", undefined, "cancel_failed");
181
+ }
182
+ const json = (yield resp.json().catch(() => ({})));
183
+ if (resp.status === 404 || json.error === "unknown_eval_run") {
184
+ throw new RemoteEvalError(`Unknown eval run ${args.runId}.`, 404, "unknown_eval_run");
185
+ }
186
+ if (resp.status === 409 || json.error === "eval_run_not_running") {
187
+ const status = typeof json.status === "string" && json.status !== ""
188
+ ? json.status
189
+ : "unknown";
190
+ throw new RemoteEvalError(typeof json.message === "string" && json.message !== ""
191
+ ? json.message
192
+ : `Eval run ${args.runId} is not running (status: ${status}).`, 409, "eval_run_not_running");
193
+ }
194
+ if (!resp.ok) {
195
+ const detail = typeof json.message === "string" && json.message !== ""
196
+ ? json.message
197
+ : typeof json.error === "string" && json.error !== ""
198
+ ? json.error
199
+ : `HTTP ${resp.status}`;
200
+ throw new RemoteEvalError(`Could not cancel eval run: ${detail}`, resp.status, "cancel_failed");
201
+ }
202
+ if (typeof json.runId !== "string" || json.runId === "") {
203
+ throw new RemoteEvalError("Eval cancel response missing runId.", undefined, "cancel_failed");
204
+ }
205
+ return json;
206
+ });
207
+ }
165
208
  /** One-shot `GET /v1/dev/evals/runs/:runId` (no polling). */
166
209
  export function getRemoteEvalRun(args) {
167
210
  return __awaiter(this, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAkYhB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AA0BD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
1
+ {"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAwYhB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AAoGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
@@ -50,7 +50,10 @@ export function buildHttpChannelRoutes(args) {
50
50
  }
51
51
  const message = yield transformMessage(body.message, ctx.auth);
52
52
  const workspaceFiles = readWorkspaceFiles(body.workspaceFiles);
53
- const session = yield engine.send(HTTP_CHANNEL_ID, message, Object.assign(Object.assign(Object.assign(Object.assign({ auth: ctx.auth }, (body.state === undefined ? {} : { state: body.state })), (typeof body.title === "string" ? { title: body.title } : {})), (body.purpose === "eval" ? { purpose: "eval" } : {})), (workspaceFiles === undefined ? {} : { workspaceFiles })));
53
+ // Per-session cloud attach (create only). Eval harness uses this to pin
54
+ // fixture repos without putting them on the agent's default cloud.repos.
55
+ const cloud = readCloudOptions(body.cloud);
56
+ const session = yield engine.send(HTTP_CHANNEL_ID, message, Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ auth: ctx.auth }, (body.state === undefined ? {} : { state: body.state })), (typeof body.title === "string" ? { title: body.title } : {})), (body.purpose === "eval" ? { purpose: "eval" } : {})), (workspaceFiles === undefined ? {} : { workspaceFiles })), (cloud === undefined ? {} : { cloud })));
54
57
  return jsonResponse({
55
58
  ok: true,
56
59
  sessionId: session.id,
@@ -67,7 +70,7 @@ export function buildHttpChannelRoutes(args) {
67
70
  handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
68
71
  var _a;
69
72
  const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
70
- const record = yield engine.sessions.get(sessionId);
73
+ const record = yield engine.getOrRestoreSession(sessionId);
71
74
  if (record === undefined) {
72
75
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
73
76
  }
@@ -138,7 +141,9 @@ export function buildHttpChannelRoutes(args) {
138
141
  // custom channels or schedules are observable here too when the caller
139
142
  // matches the session's stored principal (or `--dev` relax). Follow-ups
140
143
  // use the same ownership gate plus the session's continuation token.
141
- const record = yield engine.sessions.get(sessionId);
144
+ // Lazy-restore by id so playground Open-trace works after redeploy
145
+ // when the session is durable but not in the local state root yet.
146
+ const record = yield engine.getOrRestoreSession(sessionId);
142
147
  if (record === undefined) {
143
148
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
144
149
  }
@@ -175,7 +180,7 @@ export function buildHttpChannelRoutes(args) {
175
180
  handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
176
181
  var _a;
177
182
  const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
178
- const record = yield engine.sessions.get(sessionId);
183
+ const record = yield engine.getOrRestoreSession(sessionId);
179
184
  if (record === undefined) {
180
185
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
181
186
  }
@@ -216,7 +221,7 @@ export function buildHttpChannelRoutes(args) {
216
221
  handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
217
222
  var _a;
218
223
  const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
219
- const record = yield engine.sessions.get(sessionId);
224
+ const record = yield engine.getOrRestoreSession(sessionId);
220
225
  if (record === undefined) {
221
226
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
222
227
  }
@@ -241,7 +246,7 @@ export function buildHttpChannelRoutes(args) {
241
246
  var _b, _c;
242
247
  const sessionId = (_b = ctx.params.sessionId) !== null && _b !== void 0 ? _b : "";
243
248
  const callId = (_c = ctx.params.callId) !== null && _c !== void 0 ? _c : "";
244
- const record = yield engine.sessions.get(sessionId);
249
+ const record = yield engine.getOrRestoreSession(sessionId);
245
250
  if (record === undefined) {
246
251
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
247
252
  }
@@ -296,7 +301,7 @@ export function buildHttpChannelRoutes(args) {
296
301
  handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
297
302
  var _a;
298
303
  const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
299
- const record = yield engine.sessions.get(sessionId);
304
+ const record = yield engine.getOrRestoreSession(sessionId);
300
305
  if (record === undefined) {
301
306
  return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
302
307
  }
@@ -364,6 +369,68 @@ function readWorkspaceFiles(value) {
364
369
  }
365
370
  return Object.keys(files).length === 0 ? undefined : files;
366
371
  }
372
+ function isRecord(value) {
373
+ return typeof value === "object" && value !== null && !Array.isArray(value);
374
+ }
375
+ /** Best-effort parse of {@link AgentCloudOptions} from a JSON body field. */
376
+ function readCloudOptions(value) {
377
+ if (!isRecord(value)) {
378
+ return undefined;
379
+ }
380
+ const cloud = {};
381
+ if (isRecord(value.env) && typeof value.env.type === "string") {
382
+ const name = typeof value.env.name === "string" ? value.env.name : undefined;
383
+ if (value.env.type === "cloud") {
384
+ cloud.env =
385
+ name === undefined ? { type: "cloud" } : { type: "cloud", name };
386
+ }
387
+ else if (value.env.type === "pool") {
388
+ cloud.env =
389
+ name === undefined ? { type: "pool" } : { type: "pool", name };
390
+ }
391
+ else if (value.env.type === "machine") {
392
+ cloud.env =
393
+ name === undefined ? { type: "machine" } : { type: "machine", name };
394
+ }
395
+ }
396
+ if (Array.isArray(value.repos)) {
397
+ const repos = [];
398
+ for (const entry of value.repos) {
399
+ if (!isRecord(entry) ||
400
+ typeof entry.url !== "string" ||
401
+ entry.url === "") {
402
+ continue;
403
+ }
404
+ repos.push(Object.assign(Object.assign({ url: entry.url }, (typeof entry.startingRef === "string"
405
+ ? { startingRef: entry.startingRef }
406
+ : {})), (typeof entry.prUrl === "string" ? { prUrl: entry.prUrl } : {})));
407
+ }
408
+ if (repos.length > 0) {
409
+ cloud.repos = repos;
410
+ }
411
+ }
412
+ if (typeof value.workOnCurrentBranch === "boolean") {
413
+ cloud.workOnCurrentBranch = value.workOnCurrentBranch;
414
+ }
415
+ if (typeof value.autoCreatePR === "boolean") {
416
+ cloud.autoCreatePR = value.autoCreatePR;
417
+ }
418
+ if (typeof value.skipReviewerRequest === "boolean") {
419
+ cloud.skipReviewerRequest = value.skipReviewerRequest;
420
+ }
421
+ if (isRecord(value.envVars)) {
422
+ const envVars = {};
423
+ for (const [key, envValue] of Object.entries(value.envVars)) {
424
+ if (typeof key === "string" && typeof envValue === "string") {
425
+ envVars[key] = envValue;
426
+ }
427
+ }
428
+ if (Object.keys(envVars).length > 0) {
429
+ cloud.envVars = envVars;
430
+ }
431
+ }
432
+ return Object.keys(cloud).length === 0 ? undefined : cloud;
433
+ }
367
434
  export function readJsonObject(request) {
368
435
  return __awaiter(this, void 0, void 0, function* () {
369
436
  try {
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * Run `fn` over `items` with at most `concurrency` in flight; preserve order
3
3
  * of results (and of side-effect completion relative to index assignment).
4
+ *
5
+ * When `signal` aborts, workers stop claiming new items; in-flight `fn` calls
6
+ * are responsible for honoring the same signal.
4
7
  */
5
- export declare function mapPool<T, R>(items: readonly T[], concurrency: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
8
+ export declare function mapPool<T, R>(items: readonly T[], concurrency: number, fn: (item: T, index: number) => Promise<R>, options?: {
9
+ signal?: AbortSignal;
10
+ }): Promise<R[]>;
6
11
  //# sourceMappingURL=map-pool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-pool.d.ts","sourceRoot":"","sources":["../../src/internal/map-pool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAuBd"}
1
+ {"version":3,"file":"map-pool.d.ts","sourceRoot":"","sources":["../../src/internal/map-pool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACjC,OAAO,CAAC,CAAC,EAAE,CAAC,CA0Bd"}
@@ -10,14 +10,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  /**
11
11
  * Run `fn` over `items` with at most `concurrency` in flight; preserve order
12
12
  * of results (and of side-effect completion relative to index assignment).
13
+ *
14
+ * When `signal` aborts, workers stop claiming new items; in-flight `fn` calls
15
+ * are responsible for honoring the same signal.
13
16
  */
14
- export function mapPool(items, concurrency, fn) {
17
+ export function mapPool(items, concurrency, fn, options) {
15
18
  return __awaiter(this, void 0, void 0, function* () {
16
19
  const results = new Array(items.length);
17
20
  let next = 0;
18
21
  function worker() {
19
22
  return __awaiter(this, void 0, void 0, function* () {
23
+ var _a;
20
24
  for (;;) {
25
+ if ((_a = options === null || options === void 0 ? void 0 : options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
26
+ return;
27
+ }
21
28
  const index = next;
22
29
  next += 1;
23
30
  if (index >= items.length) {
@@ -22,7 +22,20 @@ export declare class McpHost implements HostMcpRegistry {
22
22
  listTools(connectionName: string): Promise<HostMcpToolInfo[]>;
23
23
  callTool(connectionName: string, toolName: string, args?: Record<string, unknown>): Promise<HostMcpCallResult>;
24
24
  close(): Promise<void>;
25
+ /**
26
+ * Run against a cached host MCP client, reconnecting once when the remote
27
+ * Streamable HTTP session is gone (`session_terminated` / HTTP 404).
28
+ *
29
+ * Anytool (and the MCP spec) return 404 for unknown/terminated
30
+ * `Mcp-Session-Id`s so clients can re-initialize. The SDK transport keeps
31
+ * the dead session id, so without this invalidation every later host.mcp
32
+ * call fails until the serve process restarts.
33
+ */
34
+ private withClient;
25
35
  private getClient;
36
+ private invalidateClient;
26
37
  private connect;
27
38
  }
39
+ /** Exported for unit tests. */
40
+ export declare function isStaleMcpSessionError(error: unknown): boolean;
28
41
  //# sourceMappingURL=mcp-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AASrB,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAYlE;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAO5B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED,OAAO,CAAC,SAAS;YAYH,OAAO;CAUtB"}
1
+ {"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AASrB,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAalE;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;;;;;;;OAQG;YACW,UAAU;IAiBxB,OAAO,CAAC,SAAS;YAYH,gBAAgB;YAiBhB,OAAO;CAUtB;AAED,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D"}
@@ -44,23 +44,25 @@ export class McpHost {
44
44
  }
45
45
  listTools(connectionName) {
46
46
  return __awaiter(this, void 0, void 0, function* () {
47
- const { client } = yield this.getClient(connectionName);
48
- const listed = yield client.listTools();
49
- return listed.tools.map((tool) => (Object.assign(Object.assign({ name: tool.name }, (tool.description === undefined
50
- ? {}
51
- : { description: tool.description })), (tool.inputSchema === undefined
52
- ? {}
53
- : { inputSchema: tool.inputSchema }))));
47
+ return this.withClient(connectionName, (client) => __awaiter(this, void 0, void 0, function* () {
48
+ const listed = yield client.listTools();
49
+ return listed.tools.map((tool) => (Object.assign(Object.assign({ name: tool.name }, (tool.description === undefined
50
+ ? {}
51
+ : { description: tool.description })), (tool.inputSchema === undefined
52
+ ? {}
53
+ : { inputSchema: tool.inputSchema }))));
54
+ }));
54
55
  });
55
56
  }
56
57
  callTool(connectionName_1, toolName_1) {
57
58
  return __awaiter(this, arguments, void 0, function* (connectionName, toolName, args = {}) {
58
- const { client } = yield this.getClient(connectionName);
59
- const result = yield client.callTool({
60
- name: toolName,
61
- arguments: args,
62
- });
63
- return normalizeCallResult(result);
59
+ return this.withClient(connectionName, (client) => __awaiter(this, void 0, void 0, function* () {
60
+ const result = yield client.callTool({
61
+ name: toolName,
62
+ arguments: args,
63
+ });
64
+ return normalizeCallResult(result);
65
+ }));
64
66
  });
65
67
  }
66
68
  close() {
@@ -74,6 +76,31 @@ export class McpHost {
74
76
  })));
75
77
  });
76
78
  }
79
+ /**
80
+ * Run against a cached host MCP client, reconnecting once when the remote
81
+ * Streamable HTTP session is gone (`session_terminated` / HTTP 404).
82
+ *
83
+ * Anytool (and the MCP spec) return 404 for unknown/terminated
84
+ * `Mcp-Session-Id`s so clients can re-initialize. The SDK transport keeps
85
+ * the dead session id, so without this invalidation every later host.mcp
86
+ * call fails until the serve process restarts.
87
+ */
88
+ withClient(name, run) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const opened = yield this.getClient(name);
91
+ try {
92
+ return yield run(opened.client);
93
+ }
94
+ catch (error) {
95
+ if (!isStaleMcpSessionError(error)) {
96
+ throw error;
97
+ }
98
+ yield this.invalidateClient(name, opened);
99
+ const reopened = yield this.getClient(name);
100
+ return yield run(reopened.client);
101
+ }
102
+ });
103
+ }
77
104
  getClient(name) {
78
105
  let pending = this.clients.get(name);
79
106
  if (pending === undefined) {
@@ -85,6 +112,22 @@ export class McpHost {
85
112
  }
86
113
  return pending;
87
114
  }
115
+ invalidateClient(name, opened) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ const pending = this.clients.get(name);
118
+ if (pending !== undefined) {
119
+ try {
120
+ if ((yield pending) === opened) {
121
+ this.clients.delete(name);
122
+ }
123
+ }
124
+ catch (_a) {
125
+ this.clients.delete(name);
126
+ }
127
+ }
128
+ yield opened.close();
129
+ });
130
+ }
88
131
  connect(name) {
89
132
  return __awaiter(this, void 0, void 0, function* () {
90
133
  const connection = this.byName.get(name);
@@ -96,6 +139,18 @@ export class McpHost {
96
139
  });
97
140
  }
98
141
  }
142
+ /** Exported for unit tests. */
143
+ export function isStaleMcpSessionError(error) {
144
+ if (!(error instanceof Error)) {
145
+ return false;
146
+ }
147
+ if (error.message.includes("session_terminated")) {
148
+ return true;
149
+ }
150
+ // StreamableHTTPError from the MCP SDK carries the HTTP status as `.code`.
151
+ const code = error.code;
152
+ return code === 404;
153
+ }
99
154
  function openConnection(connection) {
100
155
  return __awaiter(this, void 0, void 0, function* () {
101
156
  const client = new Client({
@@ -5,7 +5,7 @@
5
5
  * session, collect the NDJSON stream until the turn parks, and return a
6
6
  * compact {@link Trajectory} plus the continuation token for follow-ups.
7
7
  */
8
- import type { SessionEvent, SessionPurpose } from "../types.js";
8
+ import type { AgentCloudOptions, SessionEvent, SessionPurpose } from "../types.js";
9
9
  import { type RequestAuth } from "./request-headers.js";
10
10
  import { type Trajectory } from "./trajectory.js";
11
11
  /** Thrown when a turn stream exceeds `timeoutMs`; carries the session id. */
@@ -17,6 +17,8 @@ export interface RunClientOptions extends RequestAuth {
17
17
  baseUrl: string;
18
18
  /** Abort a hung turn. */
19
19
  timeoutMs?: number;
20
+ /** External cancel (combined with {@link timeoutMs} when both are set). */
21
+ signal?: AbortSignal;
20
22
  /** Called for each stream event as it arrives (for CLI progress). */
21
23
  onEvent?: (event: SessionEvent) => void;
22
24
  /**
@@ -45,5 +47,7 @@ export declare function runSession(options: RunClientOptions & {
45
47
  workspaceDir?: string;
46
48
  /** Applied only when creating a new session (first message). */
47
49
  workspaceFiles?: Record<string, string>;
50
+ /** Applied only when creating a new session (first message). */
51
+ cloud?: AgentCloudOptions;
48
52
  }): Promise<RunSessionResult>;
49
53
  //# sourceMappingURL=run-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC,GACA,OAAO,CAAC,gBAAgB,CAAC,CAuD3B"}
1
+ {"version":3,"file":"run-client.d.ts","sourceRoot":"","sources":["../../src/internal/run-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAF5B,YACE,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM,EAI3B;CACF;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,OAAO,CAAC;CACb;AAQD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,gBAAgB,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GACA,OAAO,CAAC,gBAAgB,CAAC,CAyD3B"}