@openai/agents-core 0.4.1 → 0.4.3

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 (51) hide show
  1. package/dist/agent.d.ts +5 -4
  2. package/dist/agent.js +22 -3
  3. package/dist/agent.js.map +1 -1
  4. package/dist/agent.mjs +22 -3
  5. package/dist/agent.mjs.map +1 -1
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.js +5 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +1 -0
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/logger.js +2 -2
  12. package/dist/logger.js.map +1 -1
  13. package/dist/logger.mjs +2 -2
  14. package/dist/logger.mjs.map +1 -1
  15. package/dist/mcpServers.d.ts +55 -0
  16. package/dist/mcpServers.js +472 -0
  17. package/dist/mcpServers.js.map +1 -0
  18. package/dist/mcpServers.mjs +467 -0
  19. package/dist/mcpServers.mjs.map +1 -0
  20. package/dist/metadata.js +2 -2
  21. package/dist/metadata.mjs +2 -2
  22. package/dist/result.d.ts +5 -0
  23. package/dist/result.js +62 -17
  24. package/dist/result.js.map +1 -1
  25. package/dist/result.mjs +62 -17
  26. package/dist/result.mjs.map +1 -1
  27. package/dist/run.d.ts +16 -9
  28. package/dist/run.js +55 -0
  29. package/dist/run.js.map +1 -1
  30. package/dist/run.mjs +56 -1
  31. package/dist/run.mjs.map +1 -1
  32. package/dist/runState.d.ts +10 -0
  33. package/dist/runState.js +11 -0
  34. package/dist/runState.js.map +1 -1
  35. package/dist/runState.mjs +11 -0
  36. package/dist/runState.mjs.map +1 -1
  37. package/dist/runner/errorHandlers.d.ts +57 -0
  38. package/dist/runner/errorHandlers.js +65 -0
  39. package/dist/runner/errorHandlers.js.map +1 -0
  40. package/dist/runner/errorHandlers.mjs +61 -0
  41. package/dist/runner/errorHandlers.mjs.map +1 -0
  42. package/dist/runner/runLoop.js +4 -0
  43. package/dist/runner/runLoop.js.map +1 -1
  44. package/dist/runner/runLoop.mjs +4 -0
  45. package/dist/runner/runLoop.mjs.map +1 -1
  46. package/dist/runner/tracing.d.ts +14 -1
  47. package/dist/runner/tracing.js +43 -0
  48. package/dist/runner/tracing.js.map +1 -1
  49. package/dist/runner/tracing.mjs +42 -0
  50. package/dist/runner/tracing.mjs.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,467 @@
1
+ import { getLogger } from "./logger.mjs";
2
+ const DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
3
+ const DEFAULT_CLOSE_TIMEOUT_MS = 10_000;
4
+ const logger = getLogger('openai-agents:mcp-servers');
5
+ class ServerWorker {
6
+ server;
7
+ connectTimeoutMs;
8
+ closeTimeoutMs;
9
+ queue = [];
10
+ draining = false;
11
+ done = false;
12
+ closing = null;
13
+ closeResult = null;
14
+ constructor(server, connectTimeoutMs, closeTimeoutMs) {
15
+ this.server = server;
16
+ this.connectTimeoutMs = connectTimeoutMs;
17
+ this.closeTimeoutMs = closeTimeoutMs;
18
+ }
19
+ get isDone() {
20
+ return this.done;
21
+ }
22
+ connect() {
23
+ return this.submit('connect', this.connectTimeoutMs);
24
+ }
25
+ close() {
26
+ return this.submit('close', this.closeTimeoutMs);
27
+ }
28
+ submit(action, timeoutMs) {
29
+ if (this.done) {
30
+ return Promise.reject(createClosedError(this.server));
31
+ }
32
+ if (this.closeResult || this.closing) {
33
+ if (action === 'close' && this.closeResult) {
34
+ return this.closeResult;
35
+ }
36
+ return Promise.reject(createClosingError(this.server));
37
+ }
38
+ let resolveCommand;
39
+ let rejectCommand;
40
+ const promise = new Promise((resolve, reject) => {
41
+ resolveCommand = resolve;
42
+ rejectCommand = reject;
43
+ });
44
+ const command = {
45
+ action,
46
+ timeoutMs,
47
+ resolve: resolveCommand,
48
+ reject: rejectCommand,
49
+ };
50
+ if (action === 'close') {
51
+ this.closeResult = promise;
52
+ }
53
+ this.queue.push(command);
54
+ void this.drain();
55
+ return promise;
56
+ }
57
+ async drain() {
58
+ if (this.draining) {
59
+ return;
60
+ }
61
+ this.draining = true;
62
+ while (this.queue.length > 0) {
63
+ const command = this.queue.shift();
64
+ if (!command) {
65
+ continue;
66
+ }
67
+ const shouldExit = command.action === 'close';
68
+ let closeError = null;
69
+ try {
70
+ if (command.action === 'connect') {
71
+ await runWithTimeout(() => this.server.connect(), command.timeoutMs, createTimeoutError('connect', this.server, command.timeoutMs));
72
+ }
73
+ else {
74
+ const closeTask = this.server.close();
75
+ this.closing = closeTask
76
+ .then(() => undefined, () => undefined)
77
+ .finally(() => {
78
+ this.closing = null;
79
+ });
80
+ await runWithTimeoutTask(closeTask, command.timeoutMs, createTimeoutError('close', this.server, command.timeoutMs));
81
+ }
82
+ command.resolve();
83
+ }
84
+ catch (error) {
85
+ const err = toError(error);
86
+ command.reject(err);
87
+ if (shouldExit) {
88
+ closeError = err;
89
+ }
90
+ }
91
+ if (shouldExit) {
92
+ const pendingError = closeError ?? createClosedError(this.server);
93
+ while (this.queue.length > 0) {
94
+ const pending = this.queue.shift();
95
+ if (pending) {
96
+ pending.reject(pendingError);
97
+ }
98
+ }
99
+ this.closeResult = null;
100
+ if (!closeError) {
101
+ this.done = true;
102
+ }
103
+ break;
104
+ }
105
+ }
106
+ this.draining = false;
107
+ }
108
+ }
109
+ /**
110
+ * Manages MCP server lifecycle and exposes only connected servers.
111
+ */
112
+ export class MCPServers {
113
+ allServers;
114
+ activeServers;
115
+ failedServers = [];
116
+ failedServerSet = new Set();
117
+ errorsByServer = new Map();
118
+ suppressedAbortFailures = new Set();
119
+ workers = new Map();
120
+ connectTimeoutMs;
121
+ closeTimeoutMs;
122
+ dropFailed;
123
+ strict;
124
+ suppressAbortError;
125
+ connectInParallel;
126
+ static {
127
+ const asyncDispose = Symbol.asyncDispose;
128
+ if (asyncDispose) {
129
+ Object.defineProperty(this.prototype, asyncDispose, {
130
+ value: function () {
131
+ return this.close();
132
+ },
133
+ configurable: true,
134
+ });
135
+ }
136
+ }
137
+ constructor(servers, options) {
138
+ this.allServers = [...servers];
139
+ this.activeServers = [...servers];
140
+ this.connectTimeoutMs =
141
+ options?.connectTimeoutMs === undefined
142
+ ? DEFAULT_CONNECT_TIMEOUT_MS
143
+ : options.connectTimeoutMs;
144
+ this.closeTimeoutMs =
145
+ options?.closeTimeoutMs === undefined
146
+ ? DEFAULT_CLOSE_TIMEOUT_MS
147
+ : options.closeTimeoutMs;
148
+ this.dropFailed = options?.dropFailed ?? true;
149
+ this.strict = options?.strict ?? false;
150
+ this.suppressAbortError = options?.suppressAbortError ?? true;
151
+ this.connectInParallel = options?.connectInParallel ?? false;
152
+ }
153
+ static async open(servers, options) {
154
+ const session = new MCPServers(servers, options);
155
+ logger.debug(`Opening MCPServers with ${session.allServers.length} server(s).`);
156
+ await session.connectAll();
157
+ return session;
158
+ }
159
+ get all() {
160
+ return [...this.allServers];
161
+ }
162
+ get active() {
163
+ return [...this.activeServers];
164
+ }
165
+ get failed() {
166
+ return [...this.failedServers];
167
+ }
168
+ get errors() {
169
+ return new Map(this.errorsByServer);
170
+ }
171
+ async reconnect(options = {}) {
172
+ const failedOnly = options.failedOnly ?? true;
173
+ let serversToRetry;
174
+ if (failedOnly) {
175
+ serversToRetry = uniqueServers(this.failedServers);
176
+ }
177
+ else {
178
+ serversToRetry = [...this.allServers];
179
+ this.failedServers = [];
180
+ this.failedServerSet = new Set();
181
+ this.errorsByServer = new Map();
182
+ this.suppressedAbortFailures = new Set();
183
+ }
184
+ logger.debug(`Reconnecting MCP servers (failedOnly=${failedOnly}) with ${serversToRetry.length} target(s).`);
185
+ if (this.connectInParallel) {
186
+ await this.connectAllParallel(serversToRetry);
187
+ }
188
+ else {
189
+ for (const server of serversToRetry) {
190
+ await this.attemptConnect(server);
191
+ }
192
+ }
193
+ this.refreshActiveServers();
194
+ return this.active;
195
+ }
196
+ async close() {
197
+ await this.closeAll();
198
+ }
199
+ async connectAll() {
200
+ this.failedServers = [];
201
+ this.failedServerSet = new Set();
202
+ this.errorsByServer = new Map();
203
+ this.suppressedAbortFailures = new Set();
204
+ const serversToConnect = [...this.allServers];
205
+ let connectedServers = [];
206
+ logger.debug(`Connecting ${serversToConnect.length} MCP server(s).`);
207
+ try {
208
+ if (this.connectInParallel) {
209
+ await this.connectAllParallel(serversToConnect);
210
+ }
211
+ else {
212
+ for (const server of serversToConnect) {
213
+ await this.attemptConnect(server);
214
+ if (!this.failedServerSet.has(server)) {
215
+ connectedServers.push(server);
216
+ }
217
+ }
218
+ }
219
+ }
220
+ catch (error) {
221
+ if (this.connectInParallel) {
222
+ connectedServers = serversToConnect.filter((server) => !this.failedServerSet.has(server));
223
+ }
224
+ const serversToCleanup = uniqueServers([
225
+ ...connectedServers,
226
+ ...this.failedServers,
227
+ ]);
228
+ await this.closeServers(serversToCleanup);
229
+ this.activeServers = [];
230
+ throw error;
231
+ }
232
+ this.refreshActiveServers();
233
+ return this.active;
234
+ }
235
+ async closeAll() {
236
+ for (const server of [...this.allServers].reverse()) {
237
+ await this.closeServer(server);
238
+ }
239
+ }
240
+ async attemptConnect(server) {
241
+ const raiseOnError = this.strict;
242
+ try {
243
+ logger.debug(`Connecting MCP server '${server.name}'.`);
244
+ await this.runConnect(server);
245
+ logger.debug(`Connected MCP server '${server.name}'.`);
246
+ if (this.failedServerSet.has(server)) {
247
+ this.removeFailedServer(server);
248
+ this.errorsByServer.delete(server);
249
+ }
250
+ }
251
+ catch (error) {
252
+ const err = toError(error);
253
+ if (isAbortError(err)) {
254
+ this.recordFailure(server, err, 'connect');
255
+ if (!this.suppressAbortError) {
256
+ this.suppressedAbortFailures.delete(server);
257
+ throw err;
258
+ }
259
+ this.suppressedAbortFailures.add(server);
260
+ return;
261
+ }
262
+ this.suppressedAbortFailures.delete(server);
263
+ this.recordFailure(server, err, 'connect');
264
+ if (raiseOnError) {
265
+ throw err;
266
+ }
267
+ }
268
+ }
269
+ refreshActiveServers() {
270
+ if (this.dropFailed) {
271
+ const failed = new Set(this.failedServerSet);
272
+ this.activeServers = this.allServers.filter((server) => !failed.has(server));
273
+ }
274
+ else {
275
+ this.activeServers = [...this.allServers];
276
+ }
277
+ logger.debug(`Active MCP servers: ${this.activeServers.length}; failed: ${this.failedServers.length}.`);
278
+ }
279
+ recordFailure(server, error, phase) {
280
+ logger.error(`Failed to ${phase} MCP server '${server.name}':`, error);
281
+ if (!this.failedServerSet.has(server)) {
282
+ this.failedServers.push(server);
283
+ this.failedServerSet.add(server);
284
+ }
285
+ this.errorsByServer.set(server, error);
286
+ }
287
+ async runConnect(server) {
288
+ if (this.connectInParallel) {
289
+ const worker = this.getWorker(server);
290
+ await worker.connect();
291
+ return;
292
+ }
293
+ await runWithTimeout(() => server.connect(), this.connectTimeoutMs, createTimeoutError('connect', server, this.connectTimeoutMs));
294
+ }
295
+ async closeServer(server) {
296
+ try {
297
+ logger.debug(`Closing MCP server '${server.name}'.`);
298
+ await this.runClose(server);
299
+ logger.debug(`Closed MCP server '${server.name}'.`);
300
+ }
301
+ catch (error) {
302
+ const err = toError(error);
303
+ if (isAbortError(err)) {
304
+ if (!this.suppressAbortError) {
305
+ throw err;
306
+ }
307
+ logger.debug(`Close cancelled for MCP server '${server.name}': ${err}`);
308
+ this.errorsByServer.set(server, err);
309
+ return;
310
+ }
311
+ logger.error(`Failed to close MCP server '${server.name}':`, err);
312
+ this.errorsByServer.set(server, err);
313
+ }
314
+ }
315
+ async runClose(server) {
316
+ if (this.connectInParallel && this.workers.has(server)) {
317
+ const worker = this.workers.get(server);
318
+ if (worker) {
319
+ await worker.close();
320
+ if (worker.isDone) {
321
+ this.workers.delete(server);
322
+ }
323
+ return;
324
+ }
325
+ }
326
+ await runWithTimeout(() => server.close(), this.closeTimeoutMs, createTimeoutError('close', server, this.closeTimeoutMs));
327
+ }
328
+ async closeServers(servers) {
329
+ for (const server of [...servers].reverse()) {
330
+ await this.closeServer(server);
331
+ }
332
+ }
333
+ async connectAllParallel(servers) {
334
+ const results = await Promise.allSettled(servers.map((server) => this.attemptConnect(server)));
335
+ const rejection = results.find((result) => result.status === 'rejected');
336
+ if (rejection) {
337
+ throw rejection.reason;
338
+ }
339
+ if (this.strict && this.failedServers.length > 0) {
340
+ const firstFailure = this.failedServers.find((server) => !this.suppressedAbortFailures.has(server));
341
+ if (firstFailure) {
342
+ const error = this.errorsByServer.get(firstFailure);
343
+ if (error) {
344
+ throw error;
345
+ }
346
+ throw new Error(`Failed to connect MCP server '${firstFailure.name}'.`);
347
+ }
348
+ }
349
+ }
350
+ getWorker(server) {
351
+ const worker = this.workers.get(server);
352
+ if (!worker || worker.isDone) {
353
+ const next = new ServerWorker(server, this.connectTimeoutMs, this.closeTimeoutMs);
354
+ this.workers.set(server, next);
355
+ return next;
356
+ }
357
+ return worker;
358
+ }
359
+ removeFailedServer(server) {
360
+ if (this.failedServerSet.has(server)) {
361
+ this.failedServerSet.delete(server);
362
+ }
363
+ this.suppressedAbortFailures.delete(server);
364
+ this.failedServers = this.failedServers.filter((failedServer) => failedServer !== server);
365
+ }
366
+ }
367
+ /**
368
+ * Connect to multiple MCP servers and return a managed MCPServers instance.
369
+ */
370
+ export async function connectMcpServers(servers, options) {
371
+ return MCPServers.open(servers, options);
372
+ }
373
+ function createTimeoutError(action, server, timeoutMs) {
374
+ if (timeoutMs === null) {
375
+ return new Error(`MCP server ${action} timed out.`);
376
+ }
377
+ const error = new Error(`MCP server ${action} timed out after ${timeoutMs}ms for '${server.name}'.`);
378
+ error.name = 'TimeoutError';
379
+ return error;
380
+ }
381
+ function createClosedError(server) {
382
+ const error = new Error(`MCP server '${server.name}' is closed.`);
383
+ error.name = 'ClosedError';
384
+ return error;
385
+ }
386
+ function createClosingError(server) {
387
+ const error = new Error(`MCP server '${server.name}' is closing.`);
388
+ error.name = 'ClosingError';
389
+ return error;
390
+ }
391
+ async function runWithTimeout(fn, timeoutMs, timeoutError) {
392
+ if (timeoutMs === null) {
393
+ await fn();
394
+ return;
395
+ }
396
+ let timer;
397
+ let timedOut = false;
398
+ const task = fn();
399
+ const timeoutPromise = new Promise((_, reject) => {
400
+ timer = setTimeout(() => {
401
+ timedOut = true;
402
+ reject(timeoutError);
403
+ }, timeoutMs);
404
+ });
405
+ try {
406
+ await Promise.race([task, timeoutPromise]);
407
+ }
408
+ finally {
409
+ if (timer) {
410
+ clearTimeout(timer);
411
+ }
412
+ if (timedOut) {
413
+ task.catch(() => undefined);
414
+ }
415
+ }
416
+ }
417
+ async function runWithTimeoutTask(task, timeoutMs, timeoutError) {
418
+ if (timeoutMs === null) {
419
+ await task;
420
+ return;
421
+ }
422
+ let timer;
423
+ let timedOut = false;
424
+ const timeoutPromise = new Promise((_, reject) => {
425
+ timer = setTimeout(() => {
426
+ timedOut = true;
427
+ reject(timeoutError);
428
+ }, timeoutMs);
429
+ });
430
+ try {
431
+ await Promise.race([task, timeoutPromise]);
432
+ }
433
+ finally {
434
+ if (timer) {
435
+ clearTimeout(timer);
436
+ }
437
+ if (timedOut) {
438
+ task.catch(() => undefined);
439
+ }
440
+ }
441
+ }
442
+ function toError(error) {
443
+ if (error instanceof Error) {
444
+ return error;
445
+ }
446
+ return new Error(String(error));
447
+ }
448
+ function isAbortError(error) {
449
+ const code = error.code;
450
+ return (error.name === 'AbortError' ||
451
+ error.name === 'CanceledError' ||
452
+ error.name === 'CancelledError' ||
453
+ code === 'ABORT_ERR' ||
454
+ code === 'ERR_ABORTED');
455
+ }
456
+ function uniqueServers(servers) {
457
+ const seen = new Set();
458
+ const unique = [];
459
+ for (const server of servers) {
460
+ if (!seen.has(server)) {
461
+ seen.add(server);
462
+ unique.push(server);
463
+ }
464
+ }
465
+ return unique;
466
+ }
467
+ //# sourceMappingURL=mcpServers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServers.mjs","sourceRoot":"","sources":["../src/mcpServers.ts"],"names":[],"mappings":"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"}
package/dist/metadata.js CHANGED
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.METADATA = void 0;
5
5
  exports.METADATA = {
6
6
  "name": "@openai/agents-core",
7
- "version": "0.4.1",
7
+ "version": "0.4.3",
8
8
  "versions": {
9
- "@openai/agents-core": "0.4.1",
9
+ "@openai/agents-core": "0.4.3",
10
10
  "openai": "^6"
11
11
  }
12
12
  };
package/dist/metadata.mjs CHANGED
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated
2
2
  export const METADATA = {
3
3
  "name": "@openai/agents-core",
4
- "version": "0.4.1",
4
+ "version": "0.4.3",
5
5
  "versions": {
6
- "@openai/agents-core": "0.4.1",
6
+ "@openai/agents-core": "0.4.3",
7
7
  "openai": "^6"
8
8
  }
9
9
  };
package/dist/result.d.ts CHANGED
@@ -105,6 +105,11 @@ declare class RunResultBase<TContext, TAgent extends Agent<TContext, any>> imple
105
105
  * The last agent that was run
106
106
  */
107
107
  get lastAgent(): TAgent | undefined;
108
+ /**
109
+ * The agent that should handle the next turn.
110
+ * This is an alias for the last agent that completed a turn.
111
+ */
112
+ get activeAgent(): TAgent | undefined;
108
113
  /**
109
114
  * Guardrail results for the input messages.
110
115
  */
package/dist/result.js CHANGED
@@ -8,6 +8,13 @@ const _shims_1 = require("@openai/agents-core/_shims");
8
8
  const items_1 = require("./runner/items.js");
9
9
  const logger_1 = __importDefault(require("./logger.js"));
10
10
  const protocol_1 = require("./types/protocol.js");
11
+ function createAbortHandlerRef() {
12
+ const ref = {};
13
+ const handler = () => {
14
+ ref.current?.();
15
+ };
16
+ return { ref, handler };
17
+ }
11
18
  function combineAbortSignals(...signals) {
12
19
  const active = signals.filter(Boolean);
13
20
  if (active.length === 0) {
@@ -99,6 +106,13 @@ class RunResultBase {
99
106
  get lastAgent() {
100
107
  return this.state._currentAgent;
101
108
  }
109
+ /**
110
+ * The agent that should handle the next turn.
111
+ * This is an alias for the last agent that completed a turn.
112
+ */
113
+ get activeAgent() {
114
+ return this.lastAgent;
115
+ }
102
116
  /**
103
117
  * Guardrail results for the input messages.
104
118
  */
@@ -173,6 +187,7 @@ class StreamedRunResult extends RunResultBase {
173
187
  maxTurns;
174
188
  #error = null;
175
189
  #combinedSignal;
190
+ #abortSignalSnapshot;
176
191
  #abortController;
177
192
  #readableController;
178
193
  #readableStream;
@@ -181,10 +196,13 @@ class StreamedRunResult extends RunResultBase {
181
196
  #completedPromiseReject;
182
197
  #cancelled = false;
183
198
  #streamLoopPromise;
199
+ #abortHandler;
200
+ #abortHandlerRef;
184
201
  constructor(result = {}) {
185
202
  super(result.state);
186
203
  this.#abortController = new AbortController();
187
204
  this.#combinedSignal = combineAbortSignals(result.signal, this.#abortController.signal);
205
+ this.#abortSignalSnapshot = this.#combinedSignal;
188
206
  this.#readableStream = new _shims_1.ReadableStream({
189
207
  start: (controller) => {
190
208
  this.#readableController = controller;
@@ -200,23 +218,13 @@ class StreamedRunResult extends RunResultBase {
200
218
  this.#completedPromiseReject = reject;
201
219
  });
202
220
  if (this.#combinedSignal) {
203
- const handleAbort = () => {
204
- if (this.#cancelled) {
205
- return;
206
- }
207
- this.#cancelled = true;
208
- const controller = this.#readableController;
209
- this.#readableController = undefined;
210
- if (controller) {
211
- try {
212
- controller.close();
213
- }
214
- catch (err) {
215
- logger_1.default.debug(`Failed to close readable stream on abort: ${err}`);
216
- }
217
- }
218
- this.#completedPromiseResolve?.();
221
+ // Create the handler outside this scope so it cannot capture the run via lexical this.
222
+ const { ref: abortRef, handler: handleAbort } = createAbortHandlerRef();
223
+ abortRef.current = () => {
224
+ this.#handleAbort();
219
225
  };
226
+ this.#abortHandler = handleAbort;
227
+ this.#abortHandlerRef = abortRef;
220
228
  if (this.#combinedSignal.aborted) {
221
229
  handleAbort();
222
230
  }
@@ -246,6 +254,7 @@ class StreamedRunResult extends RunResultBase {
246
254
  this.#readableController = undefined;
247
255
  this.#completedPromiseResolve?.();
248
256
  }
257
+ this.#detachAbortHandler();
249
258
  }
250
259
  /**
251
260
  * @internal
@@ -261,6 +270,7 @@ class StreamedRunResult extends RunResultBase {
261
270
  this.#completedPromise.catch((e) => {
262
271
  logger_1.default.debug(`Resulted in an error: ${e}`);
263
272
  });
273
+ this.#detachAbortHandler();
264
274
  }
265
275
  /**
266
276
  * Returns true if the stream has been cancelled.
@@ -327,7 +337,42 @@ class StreamedRunResult extends RunResultBase {
327
337
  * Returns the abort signal that should be used to cancel the streaming run.
328
338
  */
329
339
  _getAbortSignal() {
330
- return this.#combinedSignal;
340
+ return this.#abortSignalSnapshot ?? this.#combinedSignal;
341
+ }
342
+ #handleAbort() {
343
+ if (this.#cancelled) {
344
+ this.#detachAbortHandler();
345
+ return;
346
+ }
347
+ this.#cancelled = true;
348
+ const controller = this.#readableController;
349
+ this.#readableController = undefined;
350
+ if (controller) {
351
+ try {
352
+ controller.close();
353
+ }
354
+ catch (err) {
355
+ logger_1.default.debug(`Failed to close readable stream on abort: ${err}`);
356
+ }
357
+ }
358
+ this.#completedPromiseResolve?.();
359
+ this.#detachAbortHandler();
360
+ }
361
+ #detachAbortHandler() {
362
+ // Clear the indirection first so a retained signal cannot keep this run alive.
363
+ if (this.#abortHandlerRef) {
364
+ this.#abortHandlerRef.current = undefined;
365
+ }
366
+ if (this.#combinedSignal && this.#abortHandler) {
367
+ try {
368
+ this.#combinedSignal.removeEventListener('abort', this.#abortHandler);
369
+ }
370
+ catch (err) {
371
+ logger_1.default.debug(`Failed to remove abort listener: ${err}`);
372
+ }
373
+ }
374
+ this.#abortHandler = undefined;
375
+ this.#abortHandlerRef = undefined;
331
376
  }
332
377
  }
333
378
  exports.StreamedRunResult = StreamedRunResult;