@jeffreycao/copilot-api 2.5.1 → 2.5.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.
@@ -1,7 +1,7 @@
1
- import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getResponsesTransportConfig, N as PATHS, O as isMessagesApiEnabled, S as getClaudeAutoModel, T as getMessageApiWebSearchModel, _ as resolveMappedModel, b as getAlphaSearchModel, d as getModelResponsesApiCompactThreshold$1, f as getReasoningEffortForModel, g as isGpt56OrAbove, h as isContextManagementEnabledForResponses, i as listEnabledProviders, k as isResponsesApiWebSearchEnabled, l as getExtraPromptForModel, m as isContextManagementEnabledForMessages, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as getSmallModel, s as resolveProviderAuthType, t as getProviderConfig, u as getModelMappings, v as setModelMappings, x as getAnthropicApiKey } from "./config-Cb0atQ6i.js";
2
- import { B as fetchResponsesWithLifecycle, C as compactAutoContinuePromptStarts, D as compactTextOnlyGuard, E as compactSystemPromptStarts, F as forwardCodexResponses, G as createWebSocketUrl, H as encodePoolKeyPart, I as generateTraceId, J as forwardError, K as state, L as requestContext, N as CODEX_API_BASE_URL, O as createAuthMiddleware, P as buildCodexRequestHeaders, R as resolveTraceId$1, U as isTerminalResponsesStreamChunk, V as createResponsesSafeStream, W as createPooledWebSocketStream, b as prepareInteractionHeaders, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, g as copilotHeaders, h as copilotBaseUrl, k as getConfiguredAdminApiKeys, l as isAsyncIterable, o as generateRequestIdFromPayload, p as getCopilotUsage, q as HTTPError, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotWebSocketHeaders, w as compactMessageSections, x as prepareMessageProxyHeaders, y as prepareForCompact, z as createResponsesHttpEventStream } from "./token-DYqRXNhu.js";
1
+ import { A as isResponsesApiWebSocketEnabled, C as getClaudeTokenMultiplier, D as isAlphaSearchCodexPriorityEnabled, E as getUpstreamTransportConfig, N as PATHS, O as isMessagesApiEnabled, S as getClaudeAutoModel, T as getMessageApiWebSearchModel, _ as resolveMappedModel, b as getAlphaSearchModel, d as getModelResponsesApiCompactThreshold$1, f as getReasoningEffortForModel, g as isGpt56OrAbove, h as isContextManagementEnabledForResponses, i as listEnabledProviders, k as isResponsesApiWebSearchEnabled, l as getExtraPromptForModel, m as isContextManagementEnabledForMessages, n as getRawProviderConfig, o as resolveEffectiveProviderType, p as getSmallModel, s as resolveProviderAuthType, t as getProviderConfig, u as getModelMappings, v as setModelMappings, x as getAnthropicApiKey } from "./config-DYtohLpX.js";
2
+ import { A as compactTextOnlyGuard, B as requestContext, C as prepareInteractionHeaders, D as compactMessageSections, E as compactAutoContinuePromptStarts, G as encodePoolKeyPart, H as fetchUpstreamWithLifecycle, I as CODEX_API_BASE_URL, J as createWebSocketUrl, K as isTerminalResponsesStreamChunk, L as buildCodexRequestHeaders, M as getConfiguredAdminApiKeys, R as forwardCodexResponses, S as prepareForCompact, U as createResponsesHttpEventStream, V as resolveTraceId$1, W as createResponsesSafeStream, X as HTTPError, Y as state, Z as forwardError, c as getUUID, d as isResponsesStream, f as parseUserIdMetadata, j as createAuthMiddleware, k as compactSystemPromptStarts, l as isAsyncIterable, m as getCopilotUsage, o as generateRequestIdFromPayload, p as sleep, q as createPooledWebSocketStream, r as setupCodexToken, s as getRootSessionId, u as isNullish, v as copilotBaseUrl, w as prepareMessageProxyHeaders, x as copilotWebSocketHeaders, y as copilotHeaders, z as generateTraceId } from "./token-Bm_dyi5a.js";
3
3
  import { a as isDeferredToolName, c as parseMcpToolSearchSentinel, d as shouldEnableResponsesToolSearch, i as isBridgeToolSearchName, l as resolveBridgeToolSearchName, o as listDeferredToolNames, r as formatToolSearchBridgeArguments, s as normalizeToolSearchBridgeArguments, t as BRIDGE_TOOL_SEARCH_NAME, u as selectDeferredToolsByNames } from "./tool-search-Ds1vbmGG.js";
4
- import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-DvNveb2V.js";
4
+ import { i as toClientModelId, r as normalizeSdkModelId, t as findEndpointModel } from "./models-DRiRPEy3.js";
5
5
  import consola from "consola";
6
6
  import { createHash } from "node:crypto";
7
7
  import fs, { createWriteStream, readFileSync, rmSync } from "node:fs";
@@ -516,6 +516,36 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
516
516
  output: 28
517
517
  }
518
518
  },
519
+ "ZHIPU/GLM-5.3": {
520
+ contextWindow: 1048576,
521
+ inputModalities: ["text"],
522
+ maxOutputTokens: 131072,
523
+ pricing: {
524
+ cachedInput: 2,
525
+ input: 8,
526
+ output: 28
527
+ },
528
+ reasoningEfforts: [
529
+ "low",
530
+ "high",
531
+ "max"
532
+ ]
533
+ },
534
+ "ZHIPU/GLM-5.3-Flash": {
535
+ contextWindow: 1048576,
536
+ inputModalities: ["text", "image"],
537
+ maxOutputTokens: 131072,
538
+ pricing: {
539
+ cachedInput: .23,
540
+ input: .8,
541
+ output: 2.8
542
+ },
543
+ reasoningEfforts: [
544
+ "low",
545
+ "high",
546
+ "max"
547
+ ]
548
+ },
519
549
  "qwen3.7-max": {
520
550
  contextWindow: 1e6,
521
551
  inputModalities: ["text"],
@@ -540,6 +570,30 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
540
570
  output: 36
541
571
  }
542
572
  },
573
+ "qwen3.8-max-0902": {
574
+ contextWindow: 1e6,
575
+ inputModalities: ["text", "image"],
576
+ maxOutputTokens: 131072,
577
+ pricing: {
578
+ cachedInput: 1.5,
579
+ cacheCreationInput: 15,
580
+ explicitCachedInput: 1,
581
+ input: 12,
582
+ output: 36
583
+ }
584
+ },
585
+ "qwen3.8-flash": {
586
+ contextWindow: 1e6,
587
+ inputModalities: ["text", "image"],
588
+ maxOutputTokens: 131072,
589
+ pricing: {
590
+ cachedInput: .1,
591
+ cacheCreationInput: 1.25,
592
+ explicitCachedInput: .1,
593
+ input: .8,
594
+ output: 2.7
595
+ }
596
+ },
543
597
  "deepseek-v4-flash-0731": {
544
598
  contextWindow: 1e6,
545
599
  inputModalities: ["text"],
@@ -947,7 +1001,8 @@ const builtinProviderModelRegistry = new class BuiltinProviderModelRegistry {
947
1001
  this.modelCatalog = BuiltinProviderModelRegistry.catalog;
948
1002
  }
949
1003
  getModelConfig(providerName, modelName) {
950
- return this.modelCatalog[this.normalizeKey(providerName)]?.[this.normalizeKey(modelName)];
1004
+ const models = this.modelCatalog[this.normalizeKey(providerName)];
1005
+ return models?.[modelName.trim()] ?? models?.[this.normalizeKey(modelName)];
951
1006
  }
952
1007
  getModelIds(providerName) {
953
1008
  return Object.keys(this.modelCatalog[this.normalizeKey(providerName)] ?? {});
@@ -2156,7 +2211,9 @@ const isCopilotQuotaSnapshot = (value) => {
2156
2211
  };
2157
2212
  //#endregion
2158
2213
  //#region src/services/copilot/create-responses.ts
2159
- const createResponses = async (payload, { vision, initiator, subagentMarker, requestId, sessionId, compactType, transport = "http", signal }) => {
2214
+ const ROOT_AGENT_MESSAGE_DELAY_MS = 1e3;
2215
+ const createResponsesDependencies = { sleep };
2216
+ const createResponses = async (payload, { vision, initiator, subagentMarker, requestId, sessionId, compactType, transport = "http", clientSignal }) => {
2160
2217
  if (!state.copilotToken) throw new Error("Copilot token not found");
2161
2218
  const headers = {
2162
2219
  ...copilotHeaders(state, requestId, vision),
@@ -2167,22 +2224,30 @@ const createResponses = async (payload, { vision, initiator, subagentMarker, req
2167
2224
  payload.service_tier = void 0;
2168
2225
  consola.log(`<-- model: ${payload.model}`);
2169
2226
  const effectiveTransport = compactType === 1 ? "http" : transport;
2170
- if (payload.stream === true && effectiveTransport === "websocket") return createPooledResponsesWebSocketStream(prepareResponsesWebSocketRequest(payload, headers, {
2171
- requestId,
2172
- signal,
2173
- subagentMarker
2174
- }));
2175
- return await createHttpResponses(payload, headers, signal);
2227
+ if (payload.stream === true && effectiveTransport === "websocket") {
2228
+ clientSignal?.throwIfAborted();
2229
+ if (shouldDelaySubagentRequestAfterRootMessage(payload.input)) await createResponsesDependencies.sleep(ROOT_AGENT_MESSAGE_DELAY_MS);
2230
+ return createPooledResponsesWebSocketStream(prepareResponsesWebSocketRequest(payload, headers, {
2231
+ requestId,
2232
+ subagentMarker
2233
+ }), clientSignal);
2234
+ }
2235
+ return await createHttpResponses(payload, headers, clientSignal);
2236
+ };
2237
+ const shouldDelaySubagentRequestAfterRootMessage = (input) => {
2238
+ if (!Array.isArray(input)) return false;
2239
+ const lastItem = input.at(-1);
2240
+ return typeof lastItem === "object" && lastItem !== null && "type" in lastItem && lastItem.type === "agent_message" && "author" in lastItem && lastItem.author === "/root";
2176
2241
  };
2177
- const createHttpResponses = async (payload, headers, signal) => {
2178
- const transportConfig = getResponsesTransportConfig();
2179
- const response = await fetchResponsesWithLifecycle(`${copilotBaseUrl(state)}/responses`, {
2242
+ const createHttpResponses = async (payload, headers, clientSignal) => {
2243
+ const transportConfig = getUpstreamTransportConfig();
2244
+ const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/responses`, {
2180
2245
  method: "POST",
2181
2246
  headers,
2182
2247
  body: JSON.stringify(payload)
2183
2248
  }, {
2249
+ clientSignal,
2184
2250
  headersTimeoutMs: transportConfig.headersTimeoutMs,
2185
- signal,
2186
2251
  streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
2187
2252
  });
2188
2253
  logCopilotRateLimits(response.headers);
@@ -2190,7 +2255,7 @@ const createHttpResponses = async (payload, headers, signal) => {
2190
2255
  consola.error("Failed to create responses", response);
2191
2256
  throw new HTTPError("Failed to create responses", response);
2192
2257
  }
2193
- if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response, signal), { signal });
2258
+ if (payload.stream) return createResponsesSafeStream(createResponsesHttpEventStream(response));
2194
2259
  return await response.json();
2195
2260
  };
2196
2261
  const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) => {
@@ -2199,7 +2264,6 @@ const prepareResponsesWebSocketRequest = (payload, preparedHeaders, options) =>
2199
2264
  headers: copilotWebSocketHeaders(preparedHeaders),
2200
2265
  poolKey: buildResponsesWebSocketPoolKey(payload, options),
2201
2266
  payload: buildResponsesWebSocketPayload(payload, initiator),
2202
- signal: options.signal,
2203
2267
  url: buildResponsesWebSocketUrl(copilotBaseUrl(state))
2204
2268
  };
2205
2269
  };
@@ -2220,9 +2284,10 @@ const buildResponsesWebSocketPoolKey = (payload, { requestId, subagentMarker })
2220
2284
  const getResponsesWebSocketInitiator = (preparedHeaders) => {
2221
2285
  return getHeaderValue(preparedHeaders, "x-initiator")?.toLowerCase() === "agent" ? "agent" : "user";
2222
2286
  };
2223
- const createPooledResponsesWebSocketStream = (request) => {
2224
- const transportConfig = getResponsesTransportConfig();
2225
- return createResponsesSafeStream(createPooledWebSocketStream(request, {
2287
+ const createPooledResponsesWebSocketStream = (request, clientSignal) => createResponsesSafeStream(createClientPreflightStream(createPooledWebSocketStream(request, { ...getResponsesWebSocketOptions() }), clientSignal));
2288
+ const getResponsesWebSocketOptions = () => {
2289
+ const transportConfig = getUpstreamTransportConfig();
2290
+ return {
2226
2291
  createChunk: createResponsesWebSocketStreamChunk,
2227
2292
  maxBufferedBytes: transportConfig.websocketMaxBufferedBytes,
2228
2293
  maxBufferedMessages: transportConfig.websocketMaxBufferedMessages,
@@ -2233,7 +2298,11 @@ const createPooledResponsesWebSocketStream = (request) => {
2233
2298
  streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs,
2234
2299
  streamErrorMessage: "Upstream connection lost, Responses websocket stream error",
2235
2300
  terminalChunkMissingMessage: "Responses websocket ended without a terminal response, retry your request."
2236
- }), { signal: request.signal });
2301
+ };
2302
+ };
2303
+ const createClientPreflightStream = async function* (source, clientSignal) {
2304
+ if (clientSignal?.aborted) return;
2305
+ yield* source;
2237
2306
  };
2238
2307
  const buildResponsesWebSocketPayload = (payload, initiator) => {
2239
2308
  const websocketPayload = {
@@ -2345,38 +2414,48 @@ function createProviderProxyResponse(upstreamResponse, body) {
2345
2414
  statusText: upstreamResponse.statusText
2346
2415
  });
2347
2416
  }
2348
- async function forwardProviderMessages(providerConfig, payload, requestHeaders) {
2417
+ async function forwardProviderMessages(providerConfig, payload, requestHeaders, options = {}) {
2349
2418
  consola.log(`<-- model: ${payload.model}`);
2350
2419
  const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
2351
2420
  applyOpencodeSessionHeader(providerConfig, headers, resolveOpencodeMessagesSession(payload));
2352
- return await fetch(`${providerConfig.baseUrl}/v1/messages`, {
2421
+ const transportConfig = getUpstreamTransportConfig();
2422
+ return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/messages`, {
2353
2423
  method: "POST",
2354
2424
  headers,
2355
2425
  body: JSON.stringify(payload)
2426
+ }, {
2427
+ clientSignal: options.clientSignal,
2428
+ headersTimeoutMs: transportConfig.headersTimeoutMs,
2429
+ streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
2356
2430
  });
2357
2431
  }
2358
- async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders) {
2432
+ async function forwardProviderChatCompletions(providerConfig, payload, requestHeaders, options = {}) {
2359
2433
  consola.log(`<-- model: ${payload.model}`);
2360
2434
  const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
2361
2435
  applyOpencodeSessionHeader(providerConfig, headers, payload.prompt_cache_key?.trim() || void 0);
2362
- return await fetch(`${providerConfig.baseUrl}/v1/chat/completions`, {
2436
+ const transportConfig = getUpstreamTransportConfig();
2437
+ return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/chat/completions`, {
2363
2438
  method: "POST",
2364
2439
  headers,
2365
2440
  body: JSON.stringify(payload)
2441
+ }, {
2442
+ clientSignal: options.clientSignal,
2443
+ headersTimeoutMs: transportConfig.headersTimeoutMs,
2444
+ streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
2366
2445
  });
2367
2446
  }
2368
2447
  async function forwardProviderResponses(providerConfig, payload, requestHeaders, options = {}) {
2369
2448
  consola.log(`<-- model: ${payload.model}`);
2370
- const transportConfig = getResponsesTransportConfig();
2449
+ const transportConfig = getUpstreamTransportConfig();
2371
2450
  const headers = buildProviderUpstreamHeaders(providerConfig, requestHeaders);
2372
2451
  applyOpencodeSessionHeader(providerConfig, headers, payload.prompt_cache_key?.trim() || void 0);
2373
- return await fetchResponsesWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
2452
+ return await fetchUpstreamWithLifecycle(`${providerConfig.baseUrl}/v1/responses`, {
2374
2453
  method: "POST",
2375
2454
  headers,
2376
2455
  body: JSON.stringify(payload)
2377
2456
  }, {
2378
2457
  headersTimeoutMs: transportConfig.headersTimeoutMs,
2379
- signal: options.signal,
2458
+ clientSignal: options.clientSignal,
2380
2459
  streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
2381
2460
  });
2382
2461
  }
@@ -2396,13 +2475,18 @@ function resolveProviderRequestUrl(providerConfig, requestUrl, path) {
2396
2475
  upstreamUrl.search = new URL(requestUrl, "http://localhost").search;
2397
2476
  return upstreamUrl.toString();
2398
2477
  }
2399
- async function forwardProviderAlphaSearch(providerConfig, request) {
2478
+ async function forwardProviderAlphaSearch(providerConfig, request, options = {}) {
2400
2479
  const headers = buildProviderUpstreamHeaders(providerConfig, request.headers);
2401
2480
  const body = await request.arrayBuffer();
2402
- return await fetch(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
2481
+ const transportConfig = getUpstreamTransportConfig();
2482
+ return await fetchUpstreamWithLifecycle(resolveProviderRequestUrl(providerConfig, request.url, "/v1/alpha/search"), {
2403
2483
  method: "POST",
2404
2484
  headers,
2405
2485
  body
2486
+ }, {
2487
+ clientSignal: options.clientSignal,
2488
+ headersTimeoutMs: transportConfig.headersTimeoutMs,
2489
+ streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
2406
2490
  });
2407
2491
  }
2408
2492
  async function forwardProviderImages(providerConfig, request, operation) {
@@ -2788,7 +2872,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
2788
2872
  payload,
2789
2873
  provider: providerConfig.name
2790
2874
  });
2791
- const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { signal: c.req.raw.signal });
2875
+ const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
2792
2876
  if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${providerConfig.name} responses for alpha search`, upstreamResponse);
2793
2877
  const result = await upstreamResponse.json();
2794
2878
  debugJson(logger$17, "Alpha search provider Responses result:", {
@@ -2806,7 +2890,7 @@ async function requestProviderSearch(c, providerConfig, payload, model, sessionI
2806
2890
  })(normalizeResponsesUsage(result.usage));
2807
2891
  return result;
2808
2892
  }
2809
- async function requestCopilotSearch(payload, model, requestId, sessionId, signal) {
2893
+ async function requestCopilotSearch(payload, model, requestId, sessionId, clientSignal) {
2810
2894
  debugJson(logger$17, "Alpha search Copilot Responses request:", payload);
2811
2895
  const result = await alphaSearchResponsesDependencies.createResponses(payload, {
2812
2896
  vision: false,
@@ -2814,7 +2898,7 @@ async function requestCopilotSearch(payload, model, requestId, sessionId, signal
2814
2898
  transport: "http",
2815
2899
  requestId,
2816
2900
  sessionId,
2817
- signal
2901
+ clientSignal
2818
2902
  });
2819
2903
  debugJson(logger$17, "Alpha search Copilot Responses result:", result);
2820
2904
  alphaSearchResponsesDependencies.createUsageRecorder(model, sessionId)({
@@ -3069,6 +3153,18 @@ alphaSearchRoutes.post("/", async (c) => {
3069
3153
  }
3070
3154
  });
3071
3155
  //#endregion
3156
+ //#region src/lib/sse.ts
3157
+ async function writeSSEIfConnected(stream, message) {
3158
+ if (stream.aborted) return false;
3159
+ try {
3160
+ await stream.writeSSE(message);
3161
+ return true;
3162
+ } catch (error) {
3163
+ if (stream.aborted) return false;
3164
+ throw error;
3165
+ }
3166
+ }
3167
+ //#endregion
3072
3168
  //#region src/lib/dashscope.ts
3073
3169
  const OPENAI_COMPATIBLE_CONTEXT_CACHE_MARKER_LIMIT = 4;
3074
3170
  const OPENAI_COMPATIBLE_CONTEXT_CACHE_CONTROL = { type: "ephemeral" };
@@ -3210,7 +3306,7 @@ async function handleProviderChatCompletionsForProvider(c, options) {
3210
3306
  payload,
3211
3307
  provider
3212
3308
  });
3213
- const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers);
3309
+ const upstreamResponse = await forwardProviderChatCompletions(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
3214
3310
  if (!upstreamResponse.ok) {
3215
3311
  logger$15.error("Failed to create provider chat completions", {
3216
3312
  provider,
@@ -3258,7 +3354,7 @@ const streamProviderChatCompletions = (c, upstreamResponse, options) => {
3258
3354
  const parsedChunk = parseChatCompletionChunkData(chunk.data);
3259
3355
  if (parsedChunk?.usage) usage = normalizeOpenAIUsage(parsedChunk.usage);
3260
3356
  }
3261
- await stream.writeSSE({
3357
+ await writeSSEIfConnected(stream, {
3262
3358
  event: chunk.event,
3263
3359
  data: chunk.data ?? ""
3264
3360
  });
@@ -3292,10 +3388,15 @@ const createChatCompletions = async (payload, options) => {
3292
3388
  prepareInteractionHeaders(options.sessionId, Boolean(options.subagentMarker), headers);
3293
3389
  prepareForCompact(headers, options.compactType);
3294
3390
  consola.log(`<-- model: ${payload.model}`);
3295
- const response = await fetch(`${copilotBaseUrl(state)}/chat/completions`, {
3391
+ const transportConfig = getUpstreamTransportConfig();
3392
+ const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/chat/completions`, {
3296
3393
  method: "POST",
3297
3394
  headers,
3298
3395
  body: JSON.stringify(payload)
3396
+ }, {
3397
+ clientSignal: options.clientSignal,
3398
+ headersTimeoutMs: transportConfig.headersTimeoutMs,
3399
+ streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
3299
3400
  });
3300
3401
  logCopilotRateLimits(response.headers);
3301
3402
  if (!response.ok) {
@@ -3345,6 +3446,7 @@ async function handleCompletion$1(c) {
3345
3446
  model: payload.model
3346
3447
  });
3347
3448
  const response = await createChatCompletions(payload, {
3449
+ clientSignal: c.req.raw.signal,
3348
3450
  requestId,
3349
3451
  sessionId
3350
3452
  });
@@ -3366,7 +3468,7 @@ async function handleCompletion$1(c) {
3366
3468
  ...normalizeOpenAIUsage(parsedChunk.usage),
3367
3469
  total_nano_aiu: normalizeOptionalToken(parsedChunk.copilot_usage?.total_nano_aiu)
3368
3470
  };
3369
- await stream.writeSSE(chunk);
3471
+ await writeSSEIfConnected(stream, chunk);
3370
3472
  }
3371
3473
  recordUsage(usage);
3372
3474
  });
@@ -6579,7 +6681,8 @@ const MESSAGES_TOOL_CALL_TIPS = [
6579
6681
  "- Construct all tools.exec_command(...) arguments strictly according to its tool definition, and use OS/shell-compatible commands for Windows, Linux, and macOS.",
6580
6682
  "- Always assign the awaited tools.exec_command(...) call to a variable and forward the full result with text(JSON.stringify(r)); unforwarded output is silently dropped and makes results look empty.",
6581
6683
  "- Yielded execution is not truncated output. Resume a running `cell_id` with `functions.wait`, and a live `session_id` with `tools.write_stdin`, until the command reaches a terminal result.",
6582
- "- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read."
6684
+ "- Read files with the OS-native command (Get-Content/Test-Path on Windows PowerShell, cat/ls on POSIX), quote paths containing spaces, and verify the forwarded output is non-empty before concluding a file was read.",
6685
+ "- For long-running commands, keep the returned `session_id` and poll it with `tools.write_stdin` until the command finishes; do not redirect output to a temp file and read it back in a second call."
6583
6686
  ].join("\n");
6584
6687
  const COMPACTION_REPLAY_PROMPT = "The previous conversation was compacted. Continue from this handoff summary:\n\n";
6585
6688
  const MAX_DEVELOPER_PROMPTS = 5;
@@ -7667,7 +7770,7 @@ const handleWebSearchViaResponses = async (c, payload, options) => {
7667
7770
  subagentMarker: options.subagentMarker,
7668
7771
  requestId: options.requestId,
7669
7772
  sessionId: options.sessionId,
7670
- signal: c.req?.raw?.signal,
7773
+ clientSignal: c.req?.raw?.signal,
7671
7774
  compactType: options.compactType
7672
7775
  });
7673
7776
  const result = isWebSearchResponsesStream(upstreamResult) ? await collectResponsesStreamResult({
@@ -7686,7 +7789,7 @@ const handleWebSearchViaResponses = async (c, payload, options) => {
7686
7789
  for (const event of buildSyntheticStreamEvents(response)) {
7687
7790
  const data = JSON.stringify(event);
7688
7791
  logger.debug(`Web search stream event`, data);
7689
- await stream.writeSSE({
7792
+ await writeSSEIfConnected(stream, {
7690
7793
  event: event.type,
7691
7794
  data
7692
7795
  });
@@ -8005,7 +8108,7 @@ async function handleProviderMessagesForProvider(c, options) {
8005
8108
  ...providerConfig,
8006
8109
  type: effectiveType,
8007
8110
  authType: resolveOverrideProviderAuthType(providerConfig, effectiveType)
8008
- }, payload, c.req.raw.headers);
8111
+ }, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
8009
8112
  if (!upstreamResponse.ok) {
8010
8113
  logger$10.error("Failed to create responses", upstreamResponse);
8011
8114
  throw new HTTPError("Failed to create responses", upstreamResponse);
@@ -8046,7 +8149,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
8046
8149
  provider
8047
8150
  });
8048
8151
  if (providerConfig.name === "codex") {
8049
- const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { signal: c.req.raw.signal });
8152
+ const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
8050
8153
  if (isResponsesStream(upstreamResponse)) return respondWebSearchProviderMessagesJson(c, {
8051
8154
  body: await collectResponsesStreamResult({
8052
8155
  errorMessagePrefix: `${provider} web search responses stream`,
@@ -8069,7 +8172,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
8069
8172
  usageEndpoint
8070
8173
  });
8071
8174
  }
8072
- const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
8175
+ const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
8073
8176
  if (!upstreamResponse.ok) {
8074
8177
  logger$10.error("Failed to create provider web search responses", {
8075
8178
  provider,
@@ -8081,7 +8184,7 @@ const handleOpenAIResponsesProviderWebSearchMessages = async (c, options) => {
8081
8184
  body: await collectResponsesStreamResult({
8082
8185
  errorMessagePrefix: `${provider} web search responses stream`,
8083
8186
  parseEvent: (data) => parseResponsesProviderStreamChunk(data, providerConfig),
8084
- upstreamResponse: createResponsesHttpEventStream(upstreamResponse, c.req.raw.signal),
8187
+ upstreamResponse: createResponsesHttpEventStream(upstreamResponse),
8085
8188
  logger: logger$10
8086
8189
  }),
8087
8190
  modelConfig,
@@ -8113,7 +8216,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
8113
8216
  provider
8114
8217
  });
8115
8218
  if (providerConfig.name === "codex") {
8116
- const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { signal: c.req.raw.signal });
8219
+ const upstreamResponse = await forwardCodexResponses(responsesPayload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
8117
8220
  if (isResponsesStream(upstreamResponse)) {
8118
8221
  if (wantsStream) return streamResponsesProviderMessages({
8119
8222
  c,
@@ -8150,7 +8253,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
8150
8253
  usageEndpoint
8151
8254
  });
8152
8255
  }
8153
- const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { signal: c.req.raw.signal });
8256
+ const upstreamResponse = await forwardProviderResponses(providerConfig, responsesPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
8154
8257
  if (!upstreamResponse.ok) {
8155
8258
  logger$10.error("Failed to create provider responses", upstreamResponse);
8156
8259
  throw new HTTPError("Failed to create provider responses", upstreamResponse);
@@ -8162,7 +8265,7 @@ const handleOpenAIResponsesProviderMessages = async (c, options) => {
8162
8265
  pricingCurrency: providerConfig.pricingCurrency,
8163
8266
  provider,
8164
8267
  providerConfig,
8165
- upstreamResponse: createResponsesSafeStream(createResponsesHttpEventStream(upstreamResponse, c.req.raw.signal), { signal: c.req.raw.signal }),
8268
+ upstreamResponse: createResponsesSafeStream(createResponsesHttpEventStream(upstreamResponse)),
8166
8269
  usageEndpoint
8167
8270
  });
8168
8271
  return respondResponsesProviderMessagesJson(c, {
@@ -8201,7 +8304,7 @@ const handleOpenAICompatibleProviderMessages = async (c, options) => {
8201
8304
  payload: openAIPayload,
8202
8305
  provider
8203
8306
  });
8204
- const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers);
8307
+ const upstreamResponse = await forwardProviderChatCompletions(providerConfig, openAIPayload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
8205
8308
  if (!upstreamResponse.ok) {
8206
8309
  logger$10.error("Failed to create openai-compatible responses", upstreamResponse);
8207
8310
  throw new HTTPError("Failed to create openai-compatible responses", upstreamResponse);
@@ -8283,7 +8386,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
8283
8386
  logger$10.debug("provider.messages.raw_stream_event:", chunk.data);
8284
8387
  const eventName = chunk.event;
8285
8388
  if (eventName === "ping") {
8286
- await stream.writeSSE({
8389
+ await writeSSEIfConnected(stream, {
8287
8390
  event: "ping",
8288
8391
  data: "{\"type\":\"ping\"}"
8289
8392
  });
@@ -8303,7 +8406,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
8303
8406
  data,
8304
8407
  event: eventName
8305
8408
  }];
8306
- for (const streamEvent of streamEvents) await stream.writeSSE({
8409
+ for (const streamEvent of streamEvents) await writeSSEIfConnected(stream, {
8307
8410
  event: streamEvent.event,
8308
8411
  data: streamEvent.data
8309
8412
  });
@@ -8317,7 +8420,7 @@ const streamProviderMessages = ({ c, modelConfig, payload, pricingCurrency, prov
8317
8420
  if (!messageStopSeen && !errorSeen) {
8318
8421
  logger$10.warn("provider.messages.stream_incomplete:", { provider });
8319
8422
  const errorEvent = translateErrorToAnthropicErrorEvent();
8320
- await stream.writeSSE({
8423
+ await writeSSEIfConnected(stream, {
8321
8424
  event: errorEvent.type,
8322
8425
  data: JSON.stringify(errorEvent)
8323
8426
  });
@@ -8342,7 +8445,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
8342
8445
  for await (const chunk of events(upstreamResponse)) {
8343
8446
  logger$10.debug("provider.messages.openai_compatible.raw_stream_event:", chunk.data);
8344
8447
  if (chunk.event === "ping") {
8345
- await stream.writeSSE({
8448
+ await writeSSEIfConnected(stream, {
8346
8449
  event: "ping",
8347
8450
  data: "{\"type\":\"ping\"}"
8348
8451
  });
@@ -8359,7 +8462,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
8359
8462
  for (const event of events) {
8360
8463
  const eventData = JSON.stringify(event);
8361
8464
  debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
8362
- await stream.writeSSE({
8465
+ await writeSSEIfConnected(stream, {
8363
8466
  event: event.type,
8364
8467
  data: eventData
8365
8468
  });
@@ -8374,7 +8477,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
8374
8477
  for (const event of flushPendingAnthropicStreamEvents(streamState)) {
8375
8478
  const eventData = JSON.stringify(event);
8376
8479
  debugLazy(logger$10, () => ["provider.messages.openai_compatible.translated_event:", eventData]);
8377
- await stream.writeSSE({
8480
+ await writeSSEIfConnected(stream, {
8378
8481
  event: event.type,
8379
8482
  data: eventData
8380
8483
  });
@@ -8382,7 +8485,7 @@ const streamOpenAICompatibleProviderMessages = ({ c, modelConfig, payload, prici
8382
8485
  if (!streamState.messageCompleted) {
8383
8486
  logger$10.warn("provider.messages.openai_compatible.stream_incomplete:", { provider });
8384
8487
  const errorEvent = translateErrorToAnthropicErrorEvent();
8385
- await stream.writeSSE({
8488
+ await writeSSEIfConnected(stream, {
8386
8489
  event: errorEvent.type,
8387
8490
  data: JSON.stringify(errorEvent)
8388
8491
  });
@@ -8399,7 +8502,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
8399
8502
  for await (const chunk of upstreamResponse) {
8400
8503
  logger$10.debug("provider.messages.responses.raw_stream_event:", chunk.data);
8401
8504
  if (chunk.event === "ping") {
8402
- await stream.writeSSE({
8505
+ await writeSSEIfConnected(stream, {
8403
8506
  event: "ping",
8404
8507
  data: "{\"type\":\"ping\"}"
8405
8508
  });
@@ -8416,7 +8519,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
8416
8519
  for (const event of events) {
8417
8520
  const eventData = JSON.stringify(event);
8418
8521
  debugLazy(logger$10, () => ["provider.messages.responses.translated_event:", eventData]);
8419
- await stream.writeSSE({
8522
+ await writeSSEIfConnected(stream, {
8420
8523
  event: event.type,
8421
8524
  data: eventData
8422
8525
  });
@@ -8424,7 +8527,7 @@ const streamResponsesProviderMessages = ({ c, modelConfig, payload, pricingCurre
8424
8527
  }
8425
8528
  if (!streamState.messageCompleted) {
8426
8529
  const errorEvent = buildErrorEvent(`${provider} stream ended without a completion event, retry your request.`);
8427
- await stream.writeSSE({
8530
+ await writeSSEIfConnected(stream, {
8428
8531
  event: errorEvent.type,
8429
8532
  data: JSON.stringify(errorEvent)
8430
8533
  });
@@ -8567,7 +8670,7 @@ const respondWebSearchProviderMessagesJson = (c, options) => {
8567
8670
  for (const event of buildSyntheticStreamEvents(response)) {
8568
8671
  const data = JSON.stringify(event);
8569
8672
  logger$10.debug(`Web search stream event`, data);
8570
- await stream.writeSSE({
8673
+ await writeSSEIfConnected(stream, {
8571
8674
  event: event.type,
8572
8675
  data
8573
8676
  });
@@ -8619,10 +8722,15 @@ const createMessages = async (payload, anthropicBetaHeader, options) => {
8619
8722
  const anthropicBeta = buildAnthropicBetaHeader(anthropicBetaHeader, payload.thinking, payload.model);
8620
8723
  if (anthropicBeta) headers["anthropic-beta"] = anthropicBeta;
8621
8724
  consola.log(`<-- model: ${payload.model}`);
8622
- const response = await fetch(`${copilotBaseUrl(state)}/v1/messages`, {
8725
+ const transportConfig = getUpstreamTransportConfig();
8726
+ const response = await fetchUpstreamWithLifecycle(`${copilotBaseUrl(state)}/v1/messages`, {
8623
8727
  method: "POST",
8624
8728
  headers,
8625
8729
  body: JSON.stringify(payload)
8730
+ }, {
8731
+ clientSignal: options.clientSignal,
8732
+ headersTimeoutMs: transportConfig.headersTimeoutMs,
8733
+ streamInactivityTimeoutMs: transportConfig.streamInactivityTimeoutMs
8626
8734
  });
8627
8735
  logCopilotRateLimits(response.headers);
8628
8736
  if (!response.ok) {
@@ -8657,6 +8765,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
8657
8765
  });
8658
8766
  debugJson(logger, "Translated OpenAI request payload:", openAIPayload);
8659
8767
  const response = await messagesApiFlowDependencies.createChatCompletions(openAIPayload, {
8768
+ clientSignal: c.req?.raw?.signal,
8660
8769
  subagentMarker,
8661
8770
  requestId,
8662
8771
  sessionId,
@@ -8697,7 +8806,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
8697
8806
  for (const event of events) {
8698
8807
  const eventData = JSON.stringify(event);
8699
8808
  debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
8700
- await stream.writeSSE({
8809
+ await writeSSEIfConnected(stream, {
8701
8810
  event: event.type,
8702
8811
  data: eventData
8703
8812
  });
@@ -8709,7 +8818,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
8709
8818
  for (const event of flushPendingAnthropicStreamEvents(streamState)) {
8710
8819
  const eventData = JSON.stringify(event);
8711
8820
  debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
8712
- await stream.writeSSE({
8821
+ await writeSSEIfConnected(stream, {
8713
8822
  event: event.type,
8714
8823
  data: eventData
8715
8824
  });
@@ -8717,7 +8826,7 @@ const handleWithChatCompletions = async (c, anthropicPayload, options) => {
8717
8826
  if (!streamState.messageCompleted) {
8718
8827
  logger.warn("Chat completions stream ended without completion; sending error event");
8719
8828
  const errorEvent = translateErrorToAnthropicErrorEvent();
8720
- await stream.writeSSE({
8829
+ await writeSSEIfConnected(stream, {
8721
8830
  event: errorEvent.type,
8722
8831
  data: JSON.stringify(errorEvent)
8723
8832
  });
@@ -8741,7 +8850,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
8741
8850
  const response = await messagesApiFlowDependencies.createResponses(responsesPayload, {
8742
8851
  vision,
8743
8852
  initiator,
8744
- signal: c.req?.raw?.signal,
8853
+ clientSignal: c.req?.raw?.signal,
8745
8854
  transport,
8746
8855
  ...requestOptions
8747
8856
  });
@@ -8752,7 +8861,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
8752
8861
  let usage = {};
8753
8862
  for await (const chunk of response) {
8754
8863
  if (chunk.event === "ping") {
8755
- await stream.writeSSE({
8864
+ await writeSSEIfConnected(stream, {
8756
8865
  event: "ping",
8757
8866
  data: "{\"type\":\"ping\"}"
8758
8867
  });
@@ -8770,7 +8879,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
8770
8879
  for (const event of events) {
8771
8880
  const eventData = JSON.stringify(event);
8772
8881
  debugLazy(logger, () => ["Translated Anthropic event:", eventData]);
8773
- await stream.writeSSE({
8882
+ await writeSSEIfConnected(stream, {
8774
8883
  event: event.type,
8775
8884
  data: eventData
8776
8885
  });
@@ -8783,7 +8892,7 @@ const handleWithResponsesApi = async (c, anthropicPayload, options) => {
8783
8892
  if (!streamState.messageCompleted) {
8784
8893
  logger.warn("Responses stream ended without completion; sending error event");
8785
8894
  const errorEvent = buildErrorEvent("Responses stream ended without completion, retry your request.");
8786
- await stream.writeSSE({
8895
+ await writeSSEIfConnected(stream, {
8787
8896
  event: errorEvent.type,
8788
8897
  data: JSON.stringify(errorEvent)
8789
8898
  });
@@ -8812,6 +8921,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
8812
8921
  });
8813
8922
  debugJson(logger, "Translated Messages payload:", anthropicPayload);
8814
8923
  const response = await messagesApiFlowDependencies.createMessages(anthropicPayload, anthropicBetaHeader, {
8924
+ clientSignal: c.req?.raw?.signal,
8815
8925
  subagentMarker,
8816
8926
  requestId,
8817
8927
  sessionId,
@@ -8841,7 +8951,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
8841
8951
  });
8842
8952
  if (parsedEvent?.type === "message_stop" || eventName === "message_stop") messageStopSeen = true;
8843
8953
  else if (parsedEvent?.type === "error" || eventName === "error") errorSeen = true;
8844
- await stream.writeSSE({
8954
+ await writeSSEIfConnected(stream, {
8845
8955
  event: eventName,
8846
8956
  data
8847
8957
  });
@@ -8852,7 +8962,7 @@ const handleWithMessagesApi = async (c, anthropicPayload, options) => {
8852
8962
  if (!messageStopSeen && !errorSeen) {
8853
8963
  logger.warn("Messages stream ended without completion; sending error event");
8854
8964
  const errorEvent = translateErrorToAnthropicErrorEvent();
8855
- await stream.writeSSE({
8965
+ await writeSSEIfConnected(stream, {
8856
8966
  event: errorEvent.type,
8857
8967
  data: JSON.stringify(errorEvent)
8858
8968
  });
@@ -10875,7 +10985,7 @@ providerAlphaSearchRoutes.post("/", async (c) => {
10875
10985
  body: await c.req.raw.clone().text(),
10876
10986
  provider
10877
10987
  }));
10878
- const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw);
10988
+ const upstreamResponse = await providerAlphaSearchRouteDependencies.forwardProviderAlphaSearch(providerConfig, c.req.raw, { clientSignal: c.req.raw.signal });
10879
10989
  await debugJsonAsync(logger$6, "provider.alpha_search.response", async () => ({
10880
10990
  body: await upstreamResponse.clone().text(),
10881
10991
  provider,
@@ -11875,7 +11985,7 @@ async function handleResponsesViaMessages(c, options) {
11875
11985
  debugJson(logger$3, "Translated Responses result:", result);
11876
11986
  if (!translation.messagesPayload.stream) return c.json(result);
11877
11987
  return streamSSE(c, async (stream) => {
11878
- for (const event of responsesResultToStreamEvents(result)) await stream.writeSSE({
11988
+ for (const event of responsesResultToStreamEvents(result)) await writeSSEIfConnected(stream, {
11879
11989
  event: event.type,
11880
11990
  data: JSON.stringify(event)
11881
11991
  });
@@ -11892,7 +12002,7 @@ function streamTranslatedMessagesEvents(c, response, context) {
11892
12002
  return streamSSE(c, async (stream) => {
11893
12003
  for await (const event of translateMessagesStream(events(response), context)) {
11894
12004
  debugJson(logger$3, "Translated Responses stream event:", event);
11895
- await stream.writeSSE({
12005
+ await writeSSEIfConnected(stream, {
11896
12006
  event: event.type,
11897
12007
  data: JSON.stringify(event)
11898
12008
  });
@@ -11943,7 +12053,7 @@ async function handleProviderResponsesForProvider(c, options) {
11943
12053
  });
11944
12054
  const modelConfig = providerConfig.models?.[payload.model];
11945
12055
  if (providerConfig.name === "codex") {
11946
- const upstreamResponse = await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl, { signal: c.req.raw.signal });
12056
+ const upstreamResponse = await forwardCodexResponses(payload, c.req.raw.headers, providerConfig.baseUrl, { clientSignal: c.req.raw.signal });
11947
12057
  const recordUsage = createProviderResponsesUsageRecorder(payload, provider, modelConfig, providerConfig.pricingCurrency);
11948
12058
  if (payload.stream && isResponsesStream(upstreamResponse)) return streamProviderResponses(c, upstreamResponse, {
11949
12059
  normalizeCodex: true,
@@ -11954,10 +12064,10 @@ async function handleProviderResponsesForProvider(c, options) {
11954
12064
  recordUsage(normalizeResponsesUsage(responseBody.usage));
11955
12065
  return c.json(responseBody);
11956
12066
  }
11957
- const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { signal: c.req.raw.signal });
12067
+ const upstreamResponse = await forwardProviderResponses(providerConfig, payload, c.req.raw.headers, { clientSignal: c.req.raw.signal });
11958
12068
  if (!upstreamResponse.ok) throw new HTTPError(`Failed to create ${provider} responses`, upstreamResponse);
11959
12069
  const recordUsage = createProviderResponsesUsageRecorder(payload, provider, modelConfig, providerConfig.pricingCurrency);
11960
- if (payload.stream) return streamProviderResponses(c, getResponsesEvents(upstreamResponse, c.req.raw.signal), {
12070
+ if (payload.stream) return streamProviderResponses(c, getResponsesEvents(upstreamResponse), {
11961
12071
  normalizeCodex: false,
11962
12072
  provider,
11963
12073
  recordUsage
@@ -12025,7 +12135,7 @@ const streamProviderResponses = async (c, upstreamResponse, options) => {
12025
12135
  const nextUsage = getResponsesStreamEventUsage(event);
12026
12136
  if (nextUsage) usage = nextUsage;
12027
12137
  }
12028
- await stream.writeSSE({
12138
+ await writeSSEIfConnected(stream, {
12029
12139
  data: responseChunk.data ?? "",
12030
12140
  event: responseChunk.event
12031
12141
  });
@@ -12057,7 +12167,7 @@ const getResponsesStreamEventUsage = (event) => {
12057
12167
  if (event.type === "response.completed" || event.type === "response.failed" || event.type === "response.incomplete") return normalizeResponsesUsage(event.response.usage);
12058
12168
  return null;
12059
12169
  };
12060
- const getResponsesEvents = (response, signal) => createResponsesSafeStream(createResponsesHttpEventStream(response, signal), { signal });
12170
+ const getResponsesEvents = (response) => createResponsesSafeStream(createResponsesHttpEventStream(response));
12061
12171
  //#endregion
12062
12172
  //#region src/routes/provider/responses/route.ts
12063
12173
  const providerResponsesRoutes = new Hono();
@@ -12190,7 +12300,7 @@ const handleResponses = async (c) => {
12190
12300
  subagentMarker,
12191
12301
  requestId,
12192
12302
  sessionId: fallbackSessionId,
12193
- signal: c.req.raw.signal,
12303
+ clientSignal: c.req.raw.signal,
12194
12304
  transport: responsesTransport
12195
12305
  });
12196
12306
  if (isStreamingRequested(payload) && isAsyncIterable(response)) {
@@ -12208,7 +12318,7 @@ const handleResponses = async (c) => {
12208
12318
  total_nano_aiu: normalizeOptionalToken(parsedEvent.copilot_usage?.total_nano_aiu)
12209
12319
  };
12210
12320
  const processedData = fixStreamIds(chunk.data ?? "", chunk.event, idTracker);
12211
- await stream.writeSSE({
12321
+ await writeSSEIfConnected(stream, {
12212
12322
  id: chunk.id,
12213
12323
  event: chunk.event,
12214
12324
  data: processedData
@@ -12443,4 +12553,4 @@ createServer();
12443
12553
  //#endregion
12444
12554
  export { createServer };
12445
12555
 
12446
- //# sourceMappingURL=server-D5XuGc4z.js.map
12556
+ //# sourceMappingURL=server-DriTUys0.js.map