oricore 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -559,6 +559,22 @@ var init_models = __esm({
559
559
  open_weights: false,
560
560
  limit: { context: 2e5, output: 65536 }
561
561
  },
562
+ "gemini-3.1-pro-preview": {
563
+ name: "Gemini 3.1 Pro Preview",
564
+ attachment: true,
565
+ reasoning: true,
566
+ temperature: true,
567
+ tool_call: true,
568
+ knowledge: "2025-01",
569
+ release_date: "2026-02-19",
570
+ last_updated: "2026-02-19",
571
+ modalities: {
572
+ input: ["text", "image", "audio", "video", "pdf"],
573
+ output: ["text"]
574
+ },
575
+ open_weights: false,
576
+ limit: { context: 1048576, output: 65536 }
577
+ },
562
578
  "gemini-3-flash-preview": {
563
579
  name: "Gemini 3 Flash Preview",
564
580
  attachment: true,
@@ -845,6 +861,19 @@ var init_models = __esm({
845
861
  open_weights: false,
846
862
  limit: { context: 4e5, output: 128e3 }
847
863
  },
864
+ "gpt-5.3-codex": {
865
+ name: "GPT-5.3 Codex",
866
+ attachment: true,
867
+ reasoning: true,
868
+ temperature: false,
869
+ tool_call: true,
870
+ knowledge: "2025-08-31",
871
+ release_date: "2026-02-05",
872
+ last_updated: "2026-02-05",
873
+ modalities: { input: ["text", "image", "pdf"], output: ["text"] },
874
+ open_weights: false,
875
+ limit: { context: 4e5, output: 128e3 }
876
+ },
848
877
  "gpt-4.1": {
849
878
  name: "GPT-4.1",
850
879
  attachment: true,
@@ -1027,6 +1056,19 @@ var init_models = __esm({
1027
1056
  open_weights: true,
1028
1057
  limit: { context: 204800, output: 131072 }
1029
1058
  },
1059
+ "glm-5": {
1060
+ name: "GLM-5",
1061
+ attachment: false,
1062
+ reasoning: true,
1063
+ temperature: true,
1064
+ tool_call: true,
1065
+ knowledge: "2025-06",
1066
+ release_date: "2026-02-10",
1067
+ last_updated: "2026-02-10",
1068
+ modalities: { input: ["text"], output: ["text"] },
1069
+ open_weights: true,
1070
+ limit: { context: 262144, output: 131072 }
1071
+ },
1030
1072
  "sonoma-dusk-alpha": {
1031
1073
  name: "Sonoma Dusk Alpha",
1032
1074
  attachment: true,
@@ -1105,6 +1147,33 @@ var init_models = __esm({
1105
1147
  open_weights: false,
1106
1148
  limit: { context: 2e5, output: 64e3 }
1107
1149
  },
1150
+ "claude-opus-4-6": {
1151
+ name: "Claude Opus 4.6",
1152
+ attachment: true,
1153
+ reasoning: true,
1154
+ temperature: true,
1155
+ tool_call: true,
1156
+ knowledge: "2025-05-31",
1157
+ release_date: "2026-02-05",
1158
+ last_updated: "2026-02-05",
1159
+ modalities: { input: ["text", "image", "pdf"], output: ["text"] },
1160
+ open_weights: false,
1161
+ limit: { context: 2e5, output: 128e3 }
1162
+ },
1163
+ "claude-sonnet-4-6": {
1164
+ name: "Claude Sonnet 4.6",
1165
+ shortName: "Sonnet 4.6",
1166
+ attachment: true,
1167
+ reasoning: true,
1168
+ temperature: true,
1169
+ tool_call: true,
1170
+ knowledge: "2025-07-31",
1171
+ release_date: "2026-02-17",
1172
+ last_updated: "2026-02-17",
1173
+ modalities: { input: ["text", "image", "pdf"], output: ["text"] },
1174
+ open_weights: false,
1175
+ limit: { context: 1e6, output: 64e3 }
1176
+ },
1108
1177
  "ling-1t": {
1109
1178
  name: "InclusionAI Ling-1T",
1110
1179
  attachment: true,
@@ -1247,6 +1316,32 @@ var init_models = __esm({
1247
1316
  modalities: { input: ["text"], output: ["text"] },
1248
1317
  open_weights: true,
1249
1318
  limit: { context: 204800, output: 131072 }
1319
+ },
1320
+ "minimax-m2.5": {
1321
+ name: "MiniMax M2.5",
1322
+ attachment: false,
1323
+ reasoning: true,
1324
+ temperature: true,
1325
+ tool_call: true,
1326
+ knowledge: "",
1327
+ release_date: "2026-02-13",
1328
+ last_updated: "2026-02-13",
1329
+ modalities: { input: ["text"], output: ["text"] },
1330
+ open_weights: true,
1331
+ limit: { context: 204800, output: 131072 }
1332
+ },
1333
+ "minimax-m2.7": {
1334
+ name: "MiniMax M2.7",
1335
+ attachment: false,
1336
+ reasoning: true,
1337
+ temperature: true,
1338
+ tool_call: true,
1339
+ knowledge: "",
1340
+ release_date: "2026-03-18",
1341
+ last_updated: "2026-03-18",
1342
+ modalities: { input: ["text"], output: ["text"] },
1343
+ open_weights: true,
1344
+ limit: { context: 204800, output: 131072 }
1250
1345
  }
1251
1346
  };
1252
1347
  }
@@ -1392,12 +1487,16 @@ var require_symbols = __commonJS({
1392
1487
  kListeners: /* @__PURE__ */ Symbol("listeners"),
1393
1488
  kHTTPContext: /* @__PURE__ */ Symbol("http context"),
1394
1489
  kMaxConcurrentStreams: /* @__PURE__ */ Symbol("max concurrent streams"),
1490
+ kHTTP2InitialWindowSize: /* @__PURE__ */ Symbol("http2 initial window size"),
1491
+ kHTTP2ConnectionWindowSize: /* @__PURE__ */ Symbol("http2 connection window size"),
1395
1492
  kEnableConnectProtocol: /* @__PURE__ */ Symbol("http2session connect protocol"),
1396
1493
  kRemoteSettings: /* @__PURE__ */ Symbol("http2session remote settings"),
1397
1494
  kHTTP2Stream: /* @__PURE__ */ Symbol("http2session client stream"),
1495
+ kPingInterval: /* @__PURE__ */ Symbol("ping interval"),
1398
1496
  kNoProxyAgent: /* @__PURE__ */ Symbol("no proxy agent"),
1399
1497
  kHttpProxyAgent: /* @__PURE__ */ Symbol("http proxy agent"),
1400
- kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent")
1498
+ kHttpsProxyAgent: /* @__PURE__ */ Symbol("https proxy agent"),
1499
+ kSocks5ProxyAgent: /* @__PURE__ */ Symbol("socks5 proxy agent")
1401
1500
  };
1402
1501
  }
1403
1502
  });
@@ -1987,6 +2086,29 @@ var require_errors = __commonJS({
1987
2086
  return true;
1988
2087
  }
1989
2088
  };
2089
+ var Socks5ProxyError = class extends UndiciError {
2090
+ constructor(message, code) {
2091
+ super(message);
2092
+ this.name = "Socks5ProxyError";
2093
+ this.message = message || "SOCKS5 proxy error";
2094
+ this.code = code || "UND_ERR_SOCKS5";
2095
+ }
2096
+ };
2097
+ var kMessageSizeExceededError = /* @__PURE__ */ Symbol.for("undici.error.UND_ERR_WS_MESSAGE_SIZE_EXCEEDED");
2098
+ var MessageSizeExceededError = class extends UndiciError {
2099
+ constructor(message) {
2100
+ super(message);
2101
+ this.name = "MessageSizeExceededError";
2102
+ this.message = message || "Max decompressed message size exceeded";
2103
+ this.code = "UND_ERR_WS_MESSAGE_SIZE_EXCEEDED";
2104
+ }
2105
+ static [Symbol.hasInstance](instance) {
2106
+ return instance && instance[kMessageSizeExceededError] === true;
2107
+ }
2108
+ get [kMessageSizeExceededError]() {
2109
+ return true;
2110
+ }
2111
+ };
1990
2112
  module2.exports = {
1991
2113
  AbortError,
1992
2114
  HTTPParserError,
@@ -2010,7 +2132,9 @@ var require_errors = __commonJS({
2010
2132
  RequestRetryError,
2011
2133
  ResponseError,
2012
2134
  SecureProxyConnectionError,
2013
- MaxOriginsReachedError
2135
+ MaxOriginsReachedError,
2136
+ Socks5ProxyError,
2137
+ MessageSizeExceededError
2014
2138
  };
2015
2139
  }
2016
2140
  });
@@ -2330,6 +2454,8 @@ var require_util = __commonJS({
2330
2454
  return body;
2331
2455
  } else if (body && typeof body.pipeTo === "function") {
2332
2456
  return new BodyAsyncIterable(body);
2457
+ } else if (body && isFormDataLike(body)) {
2458
+ return body;
2333
2459
  } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) {
2334
2460
  return new BodyAsyncIterable(body);
2335
2461
  } else {
@@ -2454,6 +2580,11 @@ var require_util = __commonJS({
2454
2580
  function isIterable(obj) {
2455
2581
  return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function"));
2456
2582
  }
2583
+ function hasSafeIterator(obj) {
2584
+ const prototype = Object.getPrototypeOf(obj);
2585
+ const ownIterator = Object.prototype.hasOwnProperty.call(obj, Symbol.iterator);
2586
+ return ownIterator || prototype != null && prototype !== Object.prototype && typeof obj[Symbol.iterator] === "function";
2587
+ }
2457
2588
  function bodyLength(body) {
2458
2589
  if (body == null) {
2459
2590
  return 0;
@@ -2504,51 +2635,46 @@ var require_util = __commonJS({
2504
2635
  for (let i = 0; i < headers.length; i += 2) {
2505
2636
  const key = headerNameToString(headers[i]);
2506
2637
  let val = obj[key];
2507
- if (val) {
2508
- if (typeof val === "string") {
2509
- val = [val];
2510
- obj[key] = val;
2511
- }
2512
- val.push(headers[i + 1].toString("utf8"));
2513
- } else {
2514
- const headersValue = headers[i + 1];
2515
- if (typeof headersValue === "string") {
2516
- obj[key] = headersValue;
2638
+ if (val !== void 0) {
2639
+ if (!Object.hasOwn(obj, key)) {
2640
+ const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1");
2641
+ if (key === "__proto__") {
2642
+ Object.defineProperty(obj, key, {
2643
+ value: headersValue,
2644
+ enumerable: true,
2645
+ configurable: true,
2646
+ writable: true
2647
+ });
2648
+ } else {
2649
+ obj[key] = headersValue;
2650
+ }
2517
2651
  } else {
2518
- obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8");
2652
+ if (typeof val === "string") {
2653
+ val = [val];
2654
+ obj[key] = val;
2655
+ }
2656
+ val.push(headers[i + 1].toString("latin1"));
2519
2657
  }
2658
+ } else {
2659
+ const headersValue = typeof headers[i + 1] === "string" ? headers[i + 1] : Array.isArray(headers[i + 1]) ? headers[i + 1].map((x) => x.toString("latin1")) : headers[i + 1].toString("latin1");
2660
+ obj[key] = headersValue;
2520
2661
  }
2521
2662
  }
2522
- if ("content-length" in obj && "content-disposition" in obj) {
2523
- obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1");
2524
- }
2525
2663
  return obj;
2526
2664
  }
2527
2665
  function parseRawHeaders(headers) {
2528
2666
  const headersLength = headers.length;
2529
2667
  const ret = new Array(headersLength);
2530
- let hasContentLength = false;
2531
- let contentDispositionIdx = -1;
2532
2668
  let key;
2533
2669
  let val;
2534
- let kLen = 0;
2535
2670
  for (let n = 0; n < headersLength; n += 2) {
2536
2671
  key = headers[n];
2537
2672
  val = headers[n + 1];
2538
2673
  typeof key !== "string" && (key = key.toString());
2539
- typeof val !== "string" && (val = val.toString("utf8"));
2540
- kLen = key.length;
2541
- if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) {
2542
- hasContentLength = true;
2543
- } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) {
2544
- contentDispositionIdx = n + 1;
2545
- }
2674
+ typeof val !== "string" && (val = val.toString("latin1"));
2546
2675
  ret[n] = key;
2547
2676
  ret[n + 1] = val;
2548
2677
  }
2549
- if (hasContentLength && contentDispositionIdx !== -1) {
2550
- ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1");
2551
- }
2552
2678
  return ret;
2553
2679
  }
2554
2680
  function encodeRawHeaders(headers) {
@@ -3063,6 +3189,7 @@ var require_util = __commonJS({
3063
3189
  getServerName,
3064
3190
  isStream,
3065
3191
  isIterable,
3192
+ hasSafeIterator,
3066
3193
  isAsyncIterable,
3067
3194
  isDestroyed,
3068
3195
  headerNameToString,
@@ -3301,10 +3428,12 @@ var require_diagnostics = __commonJS({
3301
3428
  diagnosticsChannel.subscribe(
3302
3429
  "undici:websocket:open",
3303
3430
  (evt) => {
3304
- const {
3305
- address: { address, port }
3306
- } = evt;
3307
- debugLog("connection opened %s%s", address, port ? `:${port}` : "");
3431
+ if (evt.address != null) {
3432
+ const { address, port } = evt.address;
3433
+ debugLog("connection opened %s%s", address, port ? `:${port}` : "");
3434
+ } else {
3435
+ debugLog("connection opened");
3436
+ }
3308
3437
  }
3309
3438
  );
3310
3439
  diagnosticsChannel.subscribe(
@@ -3369,6 +3498,7 @@ var require_request = __commonJS({
3369
3498
  isBuffer,
3370
3499
  isFormDataLike,
3371
3500
  isIterable,
3501
+ hasSafeIterator,
3372
3502
  isBlobLike,
3373
3503
  serializePathWithQuery,
3374
3504
  assertRequestHandler,
@@ -3396,7 +3526,8 @@ var require_request = __commonJS({
3396
3526
  expectContinue,
3397
3527
  servername,
3398
3528
  throwOnError,
3399
- maxRedirections
3529
+ maxRedirections,
3530
+ typeOfService
3400
3531
  }, handler) {
3401
3532
  if (typeof path26 !== "string") {
3402
3533
  throw new InvalidArgumentError("path must be a string");
@@ -3413,6 +3544,9 @@ var require_request = __commonJS({
3413
3544
  if (upgrade && typeof upgrade !== "string") {
3414
3545
  throw new InvalidArgumentError("upgrade must be a string");
3415
3546
  }
3547
+ if (upgrade && !isValidHeaderValue(upgrade)) {
3548
+ throw new InvalidArgumentError("invalid upgrade header");
3549
+ }
3416
3550
  if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
3417
3551
  throw new InvalidArgumentError("invalid headersTimeout");
3418
3552
  }
@@ -3431,9 +3565,13 @@ var require_request = __commonJS({
3431
3565
  if (maxRedirections != null && maxRedirections !== 0) {
3432
3566
  throw new InvalidArgumentError("maxRedirections is not supported, use the redirect interceptor");
3433
3567
  }
3568
+ if (typeOfService != null && (!Number.isInteger(typeOfService) || typeOfService < 0 || typeOfService > 255)) {
3569
+ throw new InvalidArgumentError("typeOfService must be an integer between 0 and 255");
3570
+ }
3434
3571
  this.headersTimeout = headersTimeout;
3435
3572
  this.bodyTimeout = bodyTimeout;
3436
3573
  this.method = method;
3574
+ this.typeOfService = typeOfService ?? 0;
3437
3575
  this.abort = null;
3438
3576
  if (body == null) {
3439
3577
  this.body = null;
@@ -3489,7 +3627,7 @@ var require_request = __commonJS({
3489
3627
  processHeader(this, headers[i], headers[i + 1]);
3490
3628
  }
3491
3629
  } else if (headers && typeof headers === "object") {
3492
- if (headers[Symbol.iterator]) {
3630
+ if (hasSafeIterator(headers)) {
3493
3631
  for (const header of headers) {
3494
3632
  if (!Array.isArray(header) || header.length !== 2) {
3495
3633
  throw new InvalidArgumentError("headers must be in key-value pair format");
@@ -3658,12 +3796,18 @@ var require_request = __commonJS({
3658
3796
  } else {
3659
3797
  val = `${val}`;
3660
3798
  }
3661
- if (request.host === null && headerName === "host") {
3799
+ if (headerName === "host") {
3800
+ if (request.host !== null) {
3801
+ throw new InvalidArgumentError("duplicate host header");
3802
+ }
3662
3803
  if (typeof val !== "string") {
3663
3804
  throw new InvalidArgumentError("invalid host header");
3664
3805
  }
3665
3806
  request.host = val;
3666
- } else if (request.contentLength === null && headerName === "content-length") {
3807
+ } else if (headerName === "content-length") {
3808
+ if (request.contentLength !== null) {
3809
+ throw new InvalidArgumentError("duplicate content-length header");
3810
+ }
3667
3811
  request.contentLength = parseInt(val, 10);
3668
3812
  if (!Number.isFinite(request.contentLength)) {
3669
3813
  throw new InvalidArgumentError("invalid content-length header");
@@ -3674,12 +3818,18 @@ var require_request = __commonJS({
3674
3818
  } else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") {
3675
3819
  throw new InvalidArgumentError(`invalid ${headerName} header`);
3676
3820
  } else if (headerName === "connection") {
3677
- const value = typeof val === "string" ? val.toLowerCase() : null;
3678
- if (value !== "close" && value !== "keep-alive") {
3821
+ const value = typeof val === "string" ? val : null;
3822
+ if (value === null) {
3679
3823
  throw new InvalidArgumentError("invalid connection header");
3680
3824
  }
3681
- if (value === "close") {
3682
- request.reset = true;
3825
+ for (const token of value.toLowerCase().split(",")) {
3826
+ const trimmed = token.trim();
3827
+ if (!isValidHTTPToken(trimmed)) {
3828
+ throw new InvalidArgumentError("invalid connection header");
3829
+ }
3830
+ if (trimmed === "close") {
3831
+ request.reset = true;
3832
+ }
3683
3833
  }
3684
3834
  } else if (headerName === "expect") {
3685
3835
  throw new NotSupportedError("expect header not supported");
@@ -3708,6 +3858,9 @@ var require_wrap_handler = __commonJS({
3708
3858
  onConnect(abort, context) {
3709
3859
  return this.#handler.onConnect?.(abort, context);
3710
3860
  }
3861
+ onResponseStarted() {
3862
+ return this.#handler.onResponseStarted?.();
3863
+ }
3711
3864
  onHeaders(statusCode, rawHeaders, resume, statusMessage) {
3712
3865
  return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage);
3713
3866
  }
@@ -3733,14 +3886,14 @@ var require_wrap_handler = __commonJS({
3733
3886
  onRequestUpgrade(controller, statusCode, headers, socket) {
3734
3887
  const rawHeaders = [];
3735
3888
  for (const [key, val] of Object.entries(headers)) {
3736
- rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val));
3889
+ rawHeaders.push(Buffer.from(key, "latin1"), toRawHeaderValue(val));
3737
3890
  }
3738
3891
  this.#handler.onUpgrade?.(statusCode, rawHeaders, socket);
3739
3892
  }
3740
3893
  onResponseStart(controller, statusCode, headers, statusMessage) {
3741
3894
  const rawHeaders = [];
3742
3895
  for (const [key, val] of Object.entries(headers)) {
3743
- rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val));
3896
+ rawHeaders.push(Buffer.from(key, "latin1"), toRawHeaderValue(val));
3744
3897
  }
3745
3898
  if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) {
3746
3899
  controller.pause();
@@ -3754,7 +3907,7 @@ var require_wrap_handler = __commonJS({
3754
3907
  onResponseEnd(controller, trailers) {
3755
3908
  const rawTrailers = [];
3756
3909
  for (const [key, val] of Object.entries(trailers)) {
3757
- rawTrailers.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val));
3910
+ rawTrailers.push(Buffer.from(key, "latin1"), toRawHeaderValue(val));
3758
3911
  }
3759
3912
  this.#handler.onComplete?.(rawTrailers);
3760
3913
  }
@@ -3765,6 +3918,9 @@ var require_wrap_handler = __commonJS({
3765
3918
  this.#handler.onError?.(err);
3766
3919
  }
3767
3920
  };
3921
+ function toRawHeaderValue(value) {
3922
+ return Array.isArray(value) ? value.map((item) => Buffer.from(item, "latin1")) : Buffer.from(value, "latin1");
3923
+ }
3768
3924
  }
3769
3925
  });
3770
3926
 
@@ -3865,6 +4021,9 @@ var require_unwrap_handler = __commonJS({
3865
4021
  this.#controller = new UnwrapController(abort);
3866
4022
  this.#handler.onRequestStart?.(this.#controller, context);
3867
4023
  }
4024
+ onResponseStarted() {
4025
+ return this.#handler.onResponseStarted?.();
4026
+ }
3868
4027
  onUpgrade(statusCode, rawHeaders, socket) {
3869
4028
  this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket);
3870
4029
  }
@@ -5584,6 +5743,7 @@ var require_runtime_features = __commonJS({
5584
5743
  var require_webidl = __commonJS({
5585
5744
  "node_modules/undici/lib/web/webidl/index.js"(exports2, module2) {
5586
5745
  "use strict";
5746
+ var assert5 = require("assert");
5587
5747
  var { types, inspect } = require("util");
5588
5748
  var { runtimeFeatures } = require_runtime_features();
5589
5749
  var UNDEFINED = 1;
@@ -5870,6 +6030,7 @@ var require_webidl = __commonJS({
5870
6030
  };
5871
6031
  };
5872
6032
  webidl.dictionaryConverter = function(converters) {
6033
+ converters.sort((a, b) => (a.key > b.key) - (a.key < b.key));
5873
6034
  return (dictionary, prefix, argument) => {
5874
6035
  const dict = {};
5875
6036
  if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) {
@@ -5928,6 +6089,27 @@ var require_webidl = __commonJS({
5928
6089
  webidl.is.BufferSource = function(V) {
5929
6090
  return types.isArrayBuffer(V) || ArrayBuffer.isView(V) && types.isArrayBuffer(V.buffer);
5930
6091
  };
6092
+ webidl.util.getCopyOfBytesHeldByBufferSource = function(bufferSource) {
6093
+ const jsBufferSource = bufferSource;
6094
+ let jsArrayBuffer = jsBufferSource;
6095
+ let offset = 0;
6096
+ let length = 0;
6097
+ if (types.isTypedArray(jsBufferSource) || types.isDataView(jsBufferSource)) {
6098
+ jsArrayBuffer = jsBufferSource.buffer;
6099
+ offset = jsBufferSource.byteOffset;
6100
+ length = jsBufferSource.byteLength;
6101
+ } else {
6102
+ assert5(types.isAnyArrayBuffer(jsBufferSource));
6103
+ length = jsBufferSource.byteLength;
6104
+ }
6105
+ if (jsArrayBuffer.detached) {
6106
+ return new Uint8Array(0);
6107
+ }
6108
+ const bytes = new Uint8Array(length);
6109
+ const view = new Uint8Array(jsArrayBuffer, offset, length);
6110
+ bytes.set(view);
6111
+ return bytes;
6112
+ };
5931
6113
  webidl.converters.DOMString = function(V, prefix, argument, flags) {
5932
6114
  if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {
5933
6115
  return "";
@@ -6852,6 +7034,15 @@ var require_util2 = __commonJS({
6852
7034
  }
6853
7035
  return gettingDecodingSplitting(value);
6854
7036
  }
7037
+ function hasAuthenticationEntry(request) {
7038
+ return false;
7039
+ }
7040
+ function includesCredentials(url) {
7041
+ return !!(url.username || url.password);
7042
+ }
7043
+ function isTraversableNavigable(navigable) {
7044
+ return true;
7045
+ }
6855
7046
  var EnvironmentSettingsObjectBase = class {
6856
7047
  get baseUrl() {
6857
7048
  return getGlobalOrigin();
@@ -6909,7 +7100,10 @@ var require_util2 = __commonJS({
6909
7100
  extractMimeType,
6910
7101
  getDecodeSplit,
6911
7102
  environmentSettingsObject,
6912
- isOriginIPPotentiallyTrustworthy
7103
+ isOriginIPPotentiallyTrustworthy,
7104
+ hasAuthenticationEntry,
7105
+ includesCredentials,
7106
+ isTraversableNavigable
6913
7107
  };
6914
7108
  }
6915
7109
  });
@@ -7086,9 +7280,9 @@ var require_formdata_parser = __commonJS({
7086
7280
  var { webidl } = require_webidl();
7087
7281
  var assert5 = require("assert");
7088
7282
  var { isomorphicDecode } = require_infra();
7089
- var { utf8DecodeBytes } = require_encoding();
7090
7283
  var dd = Buffer.from("--");
7091
7284
  var decoder = new TextDecoder();
7285
+ var decoderIgnoreBOM = new TextDecoder("utf-8", { ignoreBOM: true });
7092
7286
  function isAsciiString(chars) {
7093
7287
  for (let i = 0; i < chars.length; ++i) {
7094
7288
  if ((chars.charCodeAt(i) & ~127) !== 0) {
@@ -7165,7 +7359,7 @@ var require_formdata_parser = __commonJS({
7165
7359
  }
7166
7360
  value = new File([body], filename, { type: contentType });
7167
7361
  } else {
7168
- value = utf8DecodeBytes(Buffer.from(body));
7362
+ value = decoderIgnoreBOM.decode(Buffer.from(body));
7169
7363
  }
7170
7364
  assert5(webidl.is.USVString(name));
7171
7365
  assert5(typeof value === "string" && webidl.is.USVString(value) || webidl.is.File(value));
@@ -7434,7 +7628,7 @@ var require_body = __commonJS({
7434
7628
  var { webidl } = require_webidl();
7435
7629
  var assert5 = require("assert");
7436
7630
  var { isErrored, isDisturbed } = require("stream");
7437
- var { isArrayBuffer } = require("util/types");
7631
+ var { isUint8Array } = require("util/types");
7438
7632
  var { serializeAMimeType } = require_data_url();
7439
7633
  var { multipartFormDataParser } = require_formdata_parser();
7440
7634
  var { createDeferredPromise } = require_promise();
@@ -7453,20 +7647,19 @@ var require_body = __commonJS({
7453
7647
  });
7454
7648
  function extractBody(object, keepalive = false) {
7455
7649
  let stream = null;
7650
+ let controller = null;
7456
7651
  if (webidl.is.ReadableStream(object)) {
7457
7652
  stream = object;
7458
7653
  } else if (webidl.is.Blob(object)) {
7459
7654
  stream = object.stream();
7460
7655
  } else {
7461
7656
  stream = new ReadableStream({
7462
- pull(controller) {
7463
- const buffer = typeof source === "string" ? textEncoder.encode(source) : source;
7464
- if (buffer.byteLength) {
7465
- controller.enqueue(buffer);
7466
- }
7467
- queueMicrotask(() => readableStreamClose(controller));
7657
+ pull() {
7468
7658
  },
7469
- start() {
7659
+ start(c) {
7660
+ controller = c;
7661
+ },
7662
+ cancel() {
7470
7663
  },
7471
7664
  type: "bytes"
7472
7665
  });
@@ -7483,7 +7676,7 @@ var require_body = __commonJS({
7483
7676
  source = object.toString();
7484
7677
  type = "application/x-www-form-urlencoded;charset=UTF-8";
7485
7678
  } else if (webidl.is.BufferSource(object)) {
7486
- source = isArrayBuffer(object) ? new Uint8Array(object.slice()) : new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength));
7679
+ source = webidl.util.getCopyOfBytesHeldByBufferSource(object);
7487
7680
  } else if (webidl.is.FormData(object)) {
7488
7681
  const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, "0")}`;
7489
7682
  const prefix = `--${boundary}\r
@@ -7550,38 +7743,29 @@ Content-Type: ${value.type || "application/octet-stream"}\r
7550
7743
  }
7551
7744
  stream = webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object);
7552
7745
  }
7553
- if (typeof source === "string" || util.isBuffer(source)) {
7554
- length = Buffer.byteLength(source);
7746
+ if (typeof source === "string" || isUint8Array(source)) {
7747
+ action = () => {
7748
+ length = typeof source === "string" ? Buffer.byteLength(source) : source.length;
7749
+ return source;
7750
+ };
7555
7751
  }
7556
7752
  if (action != null) {
7557
- let iterator;
7558
- stream = new ReadableStream({
7559
- start() {
7560
- iterator = action(object)[Symbol.asyncIterator]();
7561
- },
7562
- pull(controller) {
7563
- return iterator.next().then(({ value, done }) => {
7564
- if (done) {
7565
- queueMicrotask(() => {
7566
- controller.close();
7567
- controller.byobRequest?.respond(0);
7568
- });
7569
- } else {
7570
- if (!isErrored(stream)) {
7571
- const buffer = new Uint8Array(value);
7572
- if (buffer.byteLength) {
7573
- controller.enqueue(buffer);
7574
- }
7575
- }
7753
+ ;
7754
+ (async () => {
7755
+ const result = action();
7756
+ const iterator = result?.[Symbol.asyncIterator]?.();
7757
+ if (iterator) {
7758
+ for await (const bytes of iterator) {
7759
+ if (isErrored(stream)) break;
7760
+ if (bytes.length) {
7761
+ controller.enqueue(new Uint8Array(bytes));
7576
7762
  }
7577
- return controller.desiredSize > 0;
7578
- });
7579
- },
7580
- cancel(reason) {
7581
- return iterator.return();
7582
- },
7583
- type: "bytes"
7584
- });
7763
+ }
7764
+ } else if (result?.length && !isErrored(stream)) {
7765
+ controller.enqueue(typeof result === "string" ? textEncoder.encode(result) : new Uint8Array(result));
7766
+ }
7767
+ queueMicrotask(() => readableStreamClose(controller));
7768
+ })();
7585
7769
  }
7586
7770
  const body = { stream, source, length };
7587
7771
  return [body, type];
@@ -7669,13 +7853,10 @@ Content-Type: ${value.type || "application/octet-stream"}\r
7669
7853
  } catch (e) {
7670
7854
  return Promise.reject(e);
7671
7855
  }
7672
- const state = getInternalState(object);
7673
- if (bodyUnusable(state)) {
7856
+ object = getInternalState(object);
7857
+ if (bodyUnusable(object)) {
7674
7858
  return Promise.reject(new TypeError("Body is unusable: Body has already been read"));
7675
7859
  }
7676
- if (state.aborted) {
7677
- return Promise.reject(new DOMException("The operation was aborted.", "AbortError"));
7678
- }
7679
7860
  const promise = createDeferredPromise();
7680
7861
  const errorSteps = promise.reject;
7681
7862
  const successSteps = (data) => {
@@ -7685,11 +7866,11 @@ Content-Type: ${value.type || "application/octet-stream"}\r
7685
7866
  errorSteps(e);
7686
7867
  }
7687
7868
  };
7688
- if (state.body == null) {
7869
+ if (object.body == null) {
7689
7870
  successSteps(Buffer.allocUnsafe(0));
7690
7871
  return promise.promise;
7691
7872
  }
7692
- fullyReadBody(state.body, successSteps, errorSteps);
7873
+ fullyReadBody(object.body, successSteps, errorSteps);
7693
7874
  return promise.promise;
7694
7875
  }
7695
7876
  function bodyUnusable(object) {
@@ -8291,8 +8472,12 @@ var require_client_h1 = __commonJS({
8291
8472
  return 0;
8292
8473
  }
8293
8474
  };
8294
- function onParserTimeout(parser) {
8295
- const { socket, timeoutType, client, paused } = parser.deref();
8475
+ function onParserTimeout(parserWeakRef) {
8476
+ const parser = parserWeakRef.deref();
8477
+ if (!parser) {
8478
+ return;
8479
+ }
8480
+ const { socket, timeoutType, client, paused } = parser;
8296
8481
  if (timeoutType === TIMEOUT_HEADERS) {
8297
8482
  if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {
8298
8483
  assert5(!paused, "cannot be paused while waiting for headers");
@@ -8528,6 +8713,9 @@ var require_client_h1 = __commonJS({
8528
8713
  if (blocking) {
8529
8714
  socket[kBlocking] = true;
8530
8715
  }
8716
+ if (socket.setTypeOfService) {
8717
+ socket.setTypeOfService(request.typeOfService);
8718
+ }
8531
8719
  let header = `${method} ${path26} HTTP/1.1\r
8532
8720
  `;
8533
8721
  if (typeof host === "string") {
@@ -8902,7 +9090,10 @@ var require_client_h2 = __commonJS({
8902
9090
  kStrictContentLength,
8903
9091
  kOnError,
8904
9092
  kMaxConcurrentStreams,
9093
+ kPingInterval,
8905
9094
  kHTTP2Session,
9095
+ kHTTP2InitialWindowSize,
9096
+ kHTTP2ConnectionWindowSize,
8906
9097
  kResume,
8907
9098
  kSize,
8908
9099
  kHTTPContext,
@@ -8910,7 +9101,8 @@ var require_client_h2 = __commonJS({
8910
9101
  kBodyTimeout,
8911
9102
  kEnableConnectProtocol,
8912
9103
  kRemoteSettings,
8913
- kHTTP2Stream
9104
+ kHTTP2Stream,
9105
+ kHTTP2SessionState
8914
9106
  } = require_symbols();
8915
9107
  var { channels } = require_diagnostics();
8916
9108
  var kOpenStreams = /* @__PURE__ */ Symbol("open streams");
@@ -8950,20 +9142,31 @@ var require_client_h2 = __commonJS({
8950
9142
  }
8951
9143
  function connectH2(client, socket) {
8952
9144
  client[kSocket] = socket;
9145
+ const http2InitialWindowSize = client[kHTTP2InitialWindowSize];
9146
+ const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize];
8953
9147
  const session = http2.connect(client[kUrl], {
8954
9148
  createConnection: () => socket,
8955
9149
  peerMaxConcurrentStreams: client[kMaxConcurrentStreams],
8956
9150
  settings: {
8957
9151
  // TODO(metcoder95): add support for PUSH
8958
- enablePush: false
9152
+ enablePush: false,
9153
+ ...http2InitialWindowSize != null ? { initialWindowSize: http2InitialWindowSize } : null
8959
9154
  }
8960
9155
  });
9156
+ client[kSocket] = socket;
8961
9157
  session[kOpenStreams] = 0;
8962
9158
  session[kClient] = client;
8963
9159
  session[kSocket] = socket;
8964
- session[kHTTP2Session] = null;
9160
+ session[kHTTP2SessionState] = {
9161
+ ping: {
9162
+ interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref()
9163
+ }
9164
+ };
8965
9165
  session[kEnableConnectProtocol] = false;
8966
9166
  session[kRemoteSettings] = false;
9167
+ if (http2ConnectionWindowSize) {
9168
+ util.addListener(session, "connect", applyConnectionWindowSize.bind(session, http2ConnectionWindowSize));
9169
+ }
8967
9170
  util.addListener(session, "error", onHttp2SessionError);
8968
9171
  util.addListener(session, "frameError", onHttp2FrameError);
8969
9172
  util.addListener(session, "end", onHttp2SessionEnd);
@@ -9041,6 +9244,14 @@ var require_client_h2 = __commonJS({
9041
9244
  }
9042
9245
  }
9043
9246
  }
9247
+ function applyConnectionWindowSize(connectionWindowSize) {
9248
+ try {
9249
+ if (typeof this.setLocalWindowSize === "function") {
9250
+ this.setLocalWindowSize(connectionWindowSize);
9251
+ }
9252
+ } catch {
9253
+ }
9254
+ }
9044
9255
  function onHttp2RemoteSettings(settings) {
9045
9256
  this[kClient][kMaxConcurrentStreams] = settings.maxConcurrentStreams ?? this[kClient][kMaxConcurrentStreams];
9046
9257
  if (this[kRemoteSettings] === true && this[kEnableConnectProtocol] === true && settings.enableConnectProtocol === false) {
@@ -9053,6 +9264,26 @@ var require_client_h2 = __commonJS({
9053
9264
  this[kRemoteSettings] = true;
9054
9265
  this[kClient][kResume]();
9055
9266
  }
9267
+ function onHttp2SendPing(session) {
9268
+ const state = session[kHTTP2SessionState];
9269
+ if ((session.closed || session.destroyed) && state.ping.interval != null) {
9270
+ clearInterval(state.ping.interval);
9271
+ state.ping.interval = null;
9272
+ return;
9273
+ }
9274
+ session.ping(onPing.bind(session));
9275
+ function onPing(err, duration) {
9276
+ const client = this[kClient];
9277
+ const socket = this[kClient];
9278
+ if (err != null) {
9279
+ const error = new InformationalError(`HTTP/2: "PING" errored - type ${err.message}`);
9280
+ socket[kError] = error;
9281
+ client[kOnError](error);
9282
+ } else {
9283
+ client.emit("ping", duration);
9284
+ }
9285
+ }
9286
+ }
9056
9287
  function onHttp2SessionError(err) {
9057
9288
  assert5(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
9058
9289
  this[kSocket][kError] = err;
@@ -9090,11 +9321,15 @@ var require_client_h2 = __commonJS({
9090
9321
  client[kResume]();
9091
9322
  }
9092
9323
  function onHttp2SessionClose() {
9093
- const { [kClient]: client } = this;
9324
+ const { [kClient]: client, [kHTTP2SessionState]: state } = this;
9094
9325
  const { [kSocket]: socket } = client;
9095
9326
  const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket));
9096
9327
  client[kSocket] = null;
9097
9328
  client[kHTTPContext] = null;
9329
+ if (state.ping.interval != null) {
9330
+ clearInterval(state.ping.interval);
9331
+ state.ping.interval = null;
9332
+ }
9098
9333
  if (client.destroyed) {
9099
9334
  assert5(client[kPending] === 0);
9100
9335
  const requests = client[kQueue].splice(client[kRunningIdx]);
@@ -9299,9 +9534,11 @@ var require_client_h2 = __commonJS({
9299
9534
  }
9300
9535
  ++session[kOpenStreams];
9301
9536
  stream.setTimeout(requestTimeout);
9537
+ let responseReceived = false;
9302
9538
  stream.once("response", (headers2) => {
9303
9539
  const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
9304
9540
  request.onResponseStarted();
9541
+ responseReceived = true;
9305
9542
  if (request.aborted) {
9306
9543
  stream.removeAllListeners("data");
9307
9544
  return;
@@ -9309,26 +9546,25 @@ var require_client_h2 = __commonJS({
9309
9546
  if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) {
9310
9547
  stream.pause();
9311
9548
  }
9549
+ stream.on("data", (chunk) => {
9550
+ if (request.aborted || request.completed) {
9551
+ return;
9552
+ }
9553
+ if (request.onData(chunk) === false) {
9554
+ stream.pause();
9555
+ }
9556
+ });
9312
9557
  });
9313
- stream.on("data", (chunk) => {
9314
- if (request.onData(chunk) === false) {
9315
- stream.pause();
9316
- }
9317
- });
9318
- stream.once("end", (err) => {
9558
+ stream.once("end", () => {
9319
9559
  stream.removeAllListeners("data");
9320
- if (stream.state?.state == null || stream.state.state < 6) {
9560
+ if (responseReceived) {
9321
9561
  if (!request.aborted && !request.completed) {
9322
9562
  request.onComplete({});
9323
9563
  }
9324
9564
  client[kQueue][client[kRunningIdx]++] = null;
9325
9565
  client[kResume]();
9326
9566
  } else {
9327
- --session[kOpenStreams];
9328
- if (session[kOpenStreams] === 0) {
9329
- session.unref();
9330
- }
9331
- abort(err ?? new InformationalError("HTTP/2: stream half-closed (remote)"));
9567
+ abort(new InformationalError("HTTP/2: stream half-closed (remote)"));
9332
9568
  client[kQueue][client[kRunningIdx]++] = null;
9333
9569
  client[kPendingIdx] = client[kRunningIdx];
9334
9570
  client[kResume]();
@@ -9365,6 +9601,7 @@ var require_client_h2 = __commonJS({
9365
9601
  if (request.aborted || request.completed) {
9366
9602
  return;
9367
9603
  }
9604
+ stream.removeAllListeners("data");
9368
9605
  request.onComplete(trailers);
9369
9606
  });
9370
9607
  return true;
@@ -9608,7 +9845,10 @@ var require_client = __commonJS({
9608
9845
  kOnError,
9609
9846
  kHTTPContext,
9610
9847
  kMaxConcurrentStreams,
9611
- kResume
9848
+ kHTTP2InitialWindowSize,
9849
+ kHTTP2ConnectionWindowSize,
9850
+ kResume,
9851
+ kPingInterval
9612
9852
  } = require_symbols();
9613
9853
  var connectH1 = require_client_h1();
9614
9854
  var connectH2 = require_client_h2();
@@ -9654,7 +9894,10 @@ var require_client = __commonJS({
9654
9894
  // h2
9655
9895
  maxConcurrentStreams,
9656
9896
  allowH2,
9657
- useH2c
9897
+ useH2c,
9898
+ initialWindowSize,
9899
+ connectionWindowSize,
9900
+ pingInterval
9658
9901
  } = {}) {
9659
9902
  if (keepAlive !== void 0) {
9660
9903
  throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
@@ -9723,6 +9966,15 @@ var require_client = __commonJS({
9723
9966
  if (useH2c != null && typeof useH2c !== "boolean") {
9724
9967
  throw new InvalidArgumentError("useH2c must be a valid boolean value");
9725
9968
  }
9969
+ if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {
9970
+ throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0");
9971
+ }
9972
+ if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {
9973
+ throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0");
9974
+ }
9975
+ if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) {
9976
+ throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0");
9977
+ }
9726
9978
  super();
9727
9979
  if (typeof connect2 !== "function") {
9728
9980
  connect2 = buildConnector({
@@ -9735,6 +9987,9 @@ var require_client = __commonJS({
9735
9987
  ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
9736
9988
  ...connect2
9737
9989
  });
9990
+ } else if (socketPath != null) {
9991
+ const customConnect = connect2;
9992
+ connect2 = (opts, callback) => customConnect({ ...opts, socketPath }, callback);
9738
9993
  }
9739
9994
  this[kUrl] = util.parseOrigin(url);
9740
9995
  this[kConnector] = connect2;
@@ -9756,8 +10011,11 @@ var require_client = __commonJS({
9756
10011
  this[kMaxRequests] = maxRequestsPerClient;
9757
10012
  this[kClosedResolve] = null;
9758
10013
  this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
9759
- this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100;
9760
10014
  this[kHTTPContext] = null;
10015
+ this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100;
10016
+ this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144;
10017
+ this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288;
10018
+ this[kPingInterval] = pingInterval != null ? pingInterval : 6e4;
9761
10019
  this[kQueue] = [];
9762
10020
  this[kRunningIdx] = 0;
9763
10021
  this[kPendingIdx] = 0;
@@ -9880,56 +10138,61 @@ var require_client = __commonJS({
9880
10138
  connector: client[kConnector]
9881
10139
  });
9882
10140
  }
9883
- client[kConnector]({
9884
- host,
9885
- hostname,
9886
- protocol,
9887
- port,
9888
- servername: client[kServerName],
9889
- localAddress: client[kLocalAddress]
9890
- }, (err, socket) => {
9891
- if (err) {
9892
- handleConnectError(client, err, { host, hostname, protocol, port });
9893
- client[kResume]();
9894
- return;
9895
- }
9896
- if (client.destroyed) {
9897
- util.destroy(socket.on("error", noop), new ClientDestroyedError());
9898
- client[kResume]();
9899
- return;
9900
- }
9901
- assert5(socket);
9902
- try {
9903
- client[kHTTPContext] = socket.alpnProtocol === "h2" ? connectH2(client, socket) : connectH1(client, socket);
9904
- } catch (err2) {
9905
- socket.destroy().on("error", noop);
9906
- handleConnectError(client, err2, { host, hostname, protocol, port });
10141
+ try {
10142
+ client[kConnector]({
10143
+ host,
10144
+ hostname,
10145
+ protocol,
10146
+ port,
10147
+ servername: client[kServerName],
10148
+ localAddress: client[kLocalAddress]
10149
+ }, (err, socket) => {
10150
+ if (err) {
10151
+ handleConnectError(client, err, { host, hostname, protocol, port });
10152
+ client[kResume]();
10153
+ return;
10154
+ }
10155
+ if (client.destroyed) {
10156
+ util.destroy(socket.on("error", noop), new ClientDestroyedError());
10157
+ client[kResume]();
10158
+ return;
10159
+ }
10160
+ assert5(socket);
10161
+ try {
10162
+ client[kHTTPContext] = socket.alpnProtocol === "h2" ? connectH2(client, socket) : connectH1(client, socket);
10163
+ } catch (err2) {
10164
+ socket.destroy().on("error", noop);
10165
+ handleConnectError(client, err2, { host, hostname, protocol, port });
10166
+ client[kResume]();
10167
+ return;
10168
+ }
10169
+ client[kConnecting] = false;
10170
+ socket[kCounter] = 0;
10171
+ socket[kMaxRequests] = client[kMaxRequests];
10172
+ socket[kClient] = client;
10173
+ socket[kError] = null;
10174
+ if (channels.connected.hasSubscribers) {
10175
+ channels.connected.publish({
10176
+ connectParams: {
10177
+ host,
10178
+ hostname,
10179
+ protocol,
10180
+ port,
10181
+ version: client[kHTTPContext]?.version,
10182
+ servername: client[kServerName],
10183
+ localAddress: client[kLocalAddress]
10184
+ },
10185
+ connector: client[kConnector],
10186
+ socket
10187
+ });
10188
+ }
10189
+ client.emit("connect", client[kUrl], [client]);
9907
10190
  client[kResume]();
9908
- return;
9909
- }
9910
- client[kConnecting] = false;
9911
- socket[kCounter] = 0;
9912
- socket[kMaxRequests] = client[kMaxRequests];
9913
- socket[kClient] = client;
9914
- socket[kError] = null;
9915
- if (channels.connected.hasSubscribers) {
9916
- channels.connected.publish({
9917
- connectParams: {
9918
- host,
9919
- hostname,
9920
- protocol,
9921
- port,
9922
- version: client[kHTTPContext]?.version,
9923
- servername: client[kServerName],
9924
- localAddress: client[kLocalAddress]
9925
- },
9926
- connector: client[kConnector],
9927
- socket
9928
- });
9929
- }
9930
- client.emit("connect", client[kUrl], [client]);
10191
+ });
10192
+ } catch (err) {
10193
+ handleConnectError(client, err, { host, hostname, protocol, port });
9931
10194
  client[kResume]();
9932
- });
10195
+ }
9933
10196
  }
9934
10197
  function handleConnectError(client, err, { host, hostname, protocol, port }) {
9935
10198
  if (client.destroyed) {
@@ -10011,6 +10274,9 @@ var require_client = __commonJS({
10011
10274
  return;
10012
10275
  }
10013
10276
  const request = client[kQueue][client[kPendingIdx]];
10277
+ if (request === null) {
10278
+ return;
10279
+ }
10014
10280
  if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) {
10015
10281
  if (client[kRunning] > 0) {
10016
10282
  return;
@@ -10157,9 +10423,12 @@ var require_pool_base = __commonJS({
10157
10423
  this.emit("drain", origin, [this, ...targets]);
10158
10424
  }
10159
10425
  if (this[kClosedResolve] && queue.isEmpty()) {
10160
- const closeAll = new Array(this[kClients].length);
10426
+ const closeAll = [];
10161
10427
  for (let i = 0; i < this[kClients].length; i++) {
10162
- closeAll[i] = this[kClients][i].close();
10428
+ const client2 = this[kClients][i];
10429
+ if (!client2.destroyed) {
10430
+ closeAll.push(client2.close());
10431
+ }
10163
10432
  }
10164
10433
  return Promise.all(closeAll).then(this[kClosedResolve]);
10165
10434
  }
@@ -10216,9 +10485,12 @@ var require_pool_base = __commonJS({
10216
10485
  }
10217
10486
  [kClose]() {
10218
10487
  if (this[kQueue].isEmpty()) {
10219
- const closeAll = new Array(this[kClients].length);
10488
+ const closeAll = [];
10220
10489
  for (let i = 0; i < this[kClients].length; i++) {
10221
- closeAll[i] = this[kClients][i].close();
10490
+ const client = this[kClients][i];
10491
+ if (!client.destroyed) {
10492
+ closeAll.push(client.close());
10493
+ }
10222
10494
  }
10223
10495
  return Promise.all(closeAll);
10224
10496
  } else {
@@ -10349,7 +10621,7 @@ var require_pool = __commonJS({
10349
10621
  super();
10350
10622
  this[kConnections] = connections || null;
10351
10623
  this[kUrl] = util.parseOrigin(origin);
10352
- this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
10624
+ this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
10353
10625
  this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0;
10354
10626
  this[kFactory] = factory;
10355
10627
  this.on("connect", (origin2, targets) => {
@@ -10406,7 +10678,7 @@ var require_balanced_pool = __commonJS({
10406
10678
  } = require_pool_base();
10407
10679
  var Pool = require_pool();
10408
10680
  var { kUrl } = require_symbols();
10409
- var { parseOrigin } = require_util();
10681
+ var util = require_util();
10410
10682
  var kFactory = /* @__PURE__ */ Symbol("factory");
10411
10683
  var kOptions = /* @__PURE__ */ Symbol("options");
10412
10684
  var kGreatestCommonDivisor = /* @__PURE__ */ Symbol("kGreatestCommonDivisor");
@@ -10433,7 +10705,8 @@ var require_balanced_pool = __commonJS({
10433
10705
  throw new InvalidArgumentError("factory must be a function.");
10434
10706
  }
10435
10707
  super();
10436
- this[kOptions] = opts;
10708
+ this[kOptions] = { ...util.deepClone(opts) };
10709
+ this[kOptions].interceptors = opts.interceptors ? { ...opts.interceptors } : void 0;
10437
10710
  this[kIndex] = -1;
10438
10711
  this[kCurrentWeight] = 0;
10439
10712
  this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100;
@@ -10448,11 +10721,11 @@ var require_balanced_pool = __commonJS({
10448
10721
  this._updateBalancedPoolStats();
10449
10722
  }
10450
10723
  addUpstream(upstream) {
10451
- const upstreamOrigin = parseOrigin(upstream).origin;
10724
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
10452
10725
  if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) {
10453
10726
  return this;
10454
10727
  }
10455
- const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions]));
10728
+ const pool = this[kFactory](upstreamOrigin, this[kOptions]);
10456
10729
  this[kAddClient](pool);
10457
10730
  pool.on("connect", () => {
10458
10731
  pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]);
@@ -10482,7 +10755,7 @@ var require_balanced_pool = __commonJS({
10482
10755
  this[kGreatestCommonDivisor] = result;
10483
10756
  }
10484
10757
  removeUpstream(upstream) {
10485
- const upstreamOrigin = parseOrigin(upstream).origin;
10758
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
10486
10759
  const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true);
10487
10760
  if (pool) {
10488
10761
  this[kRemoveClient](pool);
@@ -10490,7 +10763,7 @@ var require_balanced_pool = __commonJS({
10490
10763
  return this;
10491
10764
  }
10492
10765
  getUpstream(upstream) {
10493
- const upstreamOrigin = parseOrigin(upstream).origin;
10766
+ const upstreamOrigin = util.parseOrigin(upstream).origin;
10494
10767
  return this[kClients].find((pool) => pool[kUrl].origin === upstreamOrigin && pool.closed !== true && pool.destroyed !== true);
10495
10768
  }
10496
10769
  get upstreams() {
@@ -10599,7 +10872,7 @@ var require_round_robin_pool = __commonJS({
10599
10872
  super();
10600
10873
  this[kConnections] = connections || null;
10601
10874
  this[kUrl] = util.parseOrigin(origin);
10602
- this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl };
10875
+ this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl, socketPath };
10603
10876
  this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0;
10604
10877
  this[kFactory] = factory;
10605
10878
  this[kIndex] = -1;
@@ -10730,7 +11003,9 @@ var require_agent = __commonJS({
10730
11003
  if (connected) result2.count -= 1;
10731
11004
  if (result2.count <= 0) {
10732
11005
  this[kClients].delete(key);
10733
- result2.dispatcher.close();
11006
+ if (!result2.dispatcher.destroyed) {
11007
+ result2.dispatcher.close();
11008
+ }
10734
11009
  }
10735
11010
  this[kOrigins].delete(key);
10736
11011
  }
@@ -10783,6 +11058,667 @@ var require_agent = __commonJS({
10783
11058
  }
10784
11059
  });
10785
11060
 
11061
+ // node_modules/undici/lib/core/socks5-utils.js
11062
+ var require_socks5_utils = __commonJS({
11063
+ "node_modules/undici/lib/core/socks5-utils.js"(exports2, module2) {
11064
+ "use strict";
11065
+ var { Buffer: Buffer2 } = require("buffer");
11066
+ var net = require("net");
11067
+ var { InvalidArgumentError } = require_errors();
11068
+ function parseAddress(address) {
11069
+ if (net.isIPv4(address)) {
11070
+ const parts = address.split(".").map(Number);
11071
+ return {
11072
+ type: 1,
11073
+ // IPv4
11074
+ buffer: Buffer2.from(parts)
11075
+ };
11076
+ }
11077
+ if (net.isIPv6(address)) {
11078
+ return {
11079
+ type: 4,
11080
+ // IPv6
11081
+ buffer: parseIPv6(address)
11082
+ };
11083
+ }
11084
+ const domainBuffer = Buffer2.from(address, "utf8");
11085
+ if (domainBuffer.length > 255) {
11086
+ throw new InvalidArgumentError("Domain name too long (max 255 bytes)");
11087
+ }
11088
+ return {
11089
+ type: 3,
11090
+ // Domain
11091
+ buffer: Buffer2.concat([Buffer2.from([domainBuffer.length]), domainBuffer])
11092
+ };
11093
+ }
11094
+ function parseIPv6(address) {
11095
+ const buffer = Buffer2.alloc(16);
11096
+ const parts = address.split(":");
11097
+ let partIndex = 0;
11098
+ let bufferIndex = 0;
11099
+ const doubleColonIndex = address.indexOf("::");
11100
+ if (doubleColonIndex !== -1) {
11101
+ const nonEmptyParts = parts.filter((p) => p.length > 0).length;
11102
+ const skipParts = 8 - nonEmptyParts;
11103
+ for (let i = 0; i < parts.length; i++) {
11104
+ if (parts[i] === "" && i === doubleColonIndex / 3) {
11105
+ bufferIndex += skipParts * 2;
11106
+ } else if (parts[i] !== "") {
11107
+ const value = parseInt(parts[i], 16);
11108
+ buffer.writeUInt16BE(value, bufferIndex);
11109
+ bufferIndex += 2;
11110
+ }
11111
+ }
11112
+ } else {
11113
+ for (const part of parts) {
11114
+ if (part === "") continue;
11115
+ const value = parseInt(part, 16);
11116
+ buffer.writeUInt16BE(value, partIndex * 2);
11117
+ partIndex++;
11118
+ }
11119
+ }
11120
+ return buffer;
11121
+ }
11122
+ function buildAddressBuffer(type, addressBuffer, port) {
11123
+ const portBuffer = Buffer2.allocUnsafe(2);
11124
+ portBuffer.writeUInt16BE(port, 0);
11125
+ return Buffer2.concat([
11126
+ Buffer2.from([type]),
11127
+ addressBuffer,
11128
+ portBuffer
11129
+ ]);
11130
+ }
11131
+ function parseResponseAddress(buffer, offset = 0) {
11132
+ if (buffer.length < offset + 1) {
11133
+ throw new InvalidArgumentError("Buffer too small to contain address type");
11134
+ }
11135
+ const addressType = buffer[offset];
11136
+ let address;
11137
+ let currentOffset = offset + 1;
11138
+ switch (addressType) {
11139
+ case 1: {
11140
+ if (buffer.length < currentOffset + 6) {
11141
+ throw new InvalidArgumentError("Buffer too small for IPv4 address");
11142
+ }
11143
+ address = Array.from(buffer.subarray(currentOffset, currentOffset + 4)).join(".");
11144
+ currentOffset += 4;
11145
+ break;
11146
+ }
11147
+ case 3: {
11148
+ if (buffer.length < currentOffset + 1) {
11149
+ throw new InvalidArgumentError("Buffer too small for domain length");
11150
+ }
11151
+ const domainLength = buffer[currentOffset];
11152
+ currentOffset += 1;
11153
+ if (buffer.length < currentOffset + domainLength + 2) {
11154
+ throw new InvalidArgumentError("Buffer too small for domain address");
11155
+ }
11156
+ address = buffer.subarray(currentOffset, currentOffset + domainLength).toString("utf8");
11157
+ currentOffset += domainLength;
11158
+ break;
11159
+ }
11160
+ case 4: {
11161
+ if (buffer.length < currentOffset + 18) {
11162
+ throw new InvalidArgumentError("Buffer too small for IPv6 address");
11163
+ }
11164
+ const parts = [];
11165
+ for (let i = 0; i < 8; i++) {
11166
+ const value = buffer.readUInt16BE(currentOffset + i * 2);
11167
+ parts.push(value.toString(16));
11168
+ }
11169
+ address = parts.join(":");
11170
+ currentOffset += 16;
11171
+ break;
11172
+ }
11173
+ default:
11174
+ throw new InvalidArgumentError(`Invalid address type: ${addressType}`);
11175
+ }
11176
+ if (buffer.length < currentOffset + 2) {
11177
+ throw new InvalidArgumentError("Buffer too small for port");
11178
+ }
11179
+ const port = buffer.readUInt16BE(currentOffset);
11180
+ currentOffset += 2;
11181
+ return {
11182
+ address,
11183
+ port,
11184
+ bytesRead: currentOffset - offset
11185
+ };
11186
+ }
11187
+ function createReplyError(replyCode) {
11188
+ const messages = {
11189
+ 1: "General SOCKS server failure",
11190
+ 2: "Connection not allowed by ruleset",
11191
+ 3: "Network unreachable",
11192
+ 4: "Host unreachable",
11193
+ 5: "Connection refused",
11194
+ 6: "TTL expired",
11195
+ 7: "Command not supported",
11196
+ 8: "Address type not supported"
11197
+ };
11198
+ const message = messages[replyCode] || `Unknown SOCKS5 error code: ${replyCode}`;
11199
+ const error = new Error(message);
11200
+ error.code = `SOCKS5_${replyCode}`;
11201
+ return error;
11202
+ }
11203
+ module2.exports = {
11204
+ parseAddress,
11205
+ parseIPv6,
11206
+ buildAddressBuffer,
11207
+ parseResponseAddress,
11208
+ createReplyError
11209
+ };
11210
+ }
11211
+ });
11212
+
11213
+ // node_modules/undici/lib/core/socks5-client.js
11214
+ var require_socks5_client = __commonJS({
11215
+ "node_modules/undici/lib/core/socks5-client.js"(exports2, module2) {
11216
+ "use strict";
11217
+ var { EventEmitter: EventEmitter2 } = require("events");
11218
+ var { Buffer: Buffer2 } = require("buffer");
11219
+ var { InvalidArgumentError, Socks5ProxyError } = require_errors();
11220
+ var { debuglog } = require("util");
11221
+ var { parseAddress } = require_socks5_utils();
11222
+ var debug9 = debuglog("undici:socks5");
11223
+ var SOCKS_VERSION = 5;
11224
+ var AUTH_METHODS = {
11225
+ NO_AUTH: 0,
11226
+ GSSAPI: 1,
11227
+ USERNAME_PASSWORD: 2,
11228
+ NO_ACCEPTABLE: 255
11229
+ };
11230
+ var COMMANDS = {
11231
+ CONNECT: 1,
11232
+ BIND: 2,
11233
+ UDP_ASSOCIATE: 3
11234
+ };
11235
+ var ADDRESS_TYPES = {
11236
+ IPV4: 1,
11237
+ DOMAIN: 3,
11238
+ IPV6: 4
11239
+ };
11240
+ var REPLY_CODES = {
11241
+ SUCCEEDED: 0,
11242
+ GENERAL_FAILURE: 1,
11243
+ CONNECTION_NOT_ALLOWED: 2,
11244
+ NETWORK_UNREACHABLE: 3,
11245
+ HOST_UNREACHABLE: 4,
11246
+ CONNECTION_REFUSED: 5,
11247
+ TTL_EXPIRED: 6,
11248
+ COMMAND_NOT_SUPPORTED: 7,
11249
+ ADDRESS_TYPE_NOT_SUPPORTED: 8
11250
+ };
11251
+ var STATES = {
11252
+ INITIAL: "initial",
11253
+ HANDSHAKING: "handshaking",
11254
+ AUTHENTICATING: "authenticating",
11255
+ CONNECTING: "connecting",
11256
+ CONNECTED: "connected",
11257
+ ERROR: "error",
11258
+ CLOSED: "closed"
11259
+ };
11260
+ var Socks5Client = class extends EventEmitter2 {
11261
+ constructor(socket, options = {}) {
11262
+ super();
11263
+ if (!socket) {
11264
+ throw new InvalidArgumentError("socket is required");
11265
+ }
11266
+ this.socket = socket;
11267
+ this.options = options;
11268
+ this.state = STATES.INITIAL;
11269
+ this.buffer = Buffer2.alloc(0);
11270
+ this.authMethods = [];
11271
+ if (options.username && options.password) {
11272
+ this.authMethods.push(AUTH_METHODS.USERNAME_PASSWORD);
11273
+ }
11274
+ this.authMethods.push(AUTH_METHODS.NO_AUTH);
11275
+ this.socket.on("data", this.onData.bind(this));
11276
+ this.socket.on("error", this.onError.bind(this));
11277
+ this.socket.on("close", this.onClose.bind(this));
11278
+ }
11279
+ /**
11280
+ * Handle incoming data from the socket
11281
+ */
11282
+ onData(data) {
11283
+ debug9("received data", data.length, "bytes in state", this.state);
11284
+ this.buffer = Buffer2.concat([this.buffer, data]);
11285
+ try {
11286
+ switch (this.state) {
11287
+ case STATES.HANDSHAKING:
11288
+ this.handleHandshakeResponse();
11289
+ break;
11290
+ case STATES.AUTHENTICATING:
11291
+ this.handleAuthResponse();
11292
+ break;
11293
+ case STATES.CONNECTING:
11294
+ this.handleConnectResponse();
11295
+ break;
11296
+ }
11297
+ } catch (err) {
11298
+ this.onError(err);
11299
+ }
11300
+ }
11301
+ /**
11302
+ * Handle socket errors
11303
+ */
11304
+ onError(err) {
11305
+ debug9("socket error", err);
11306
+ this.state = STATES.ERROR;
11307
+ this.emit("error", err);
11308
+ this.destroy();
11309
+ }
11310
+ /**
11311
+ * Handle socket close
11312
+ */
11313
+ onClose() {
11314
+ debug9("socket closed");
11315
+ this.state = STATES.CLOSED;
11316
+ this.emit("close");
11317
+ }
11318
+ /**
11319
+ * Destroy the client and underlying socket
11320
+ */
11321
+ destroy() {
11322
+ if (this.socket && !this.socket.destroyed) {
11323
+ this.socket.destroy();
11324
+ }
11325
+ }
11326
+ /**
11327
+ * Start the SOCKS5 handshake
11328
+ */
11329
+ handshake() {
11330
+ if (this.state !== STATES.INITIAL) {
11331
+ throw new InvalidArgumentError("Handshake already started");
11332
+ }
11333
+ debug9("starting handshake with", this.authMethods.length, "auth methods");
11334
+ this.state = STATES.HANDSHAKING;
11335
+ const request = Buffer2.alloc(2 + this.authMethods.length);
11336
+ request[0] = SOCKS_VERSION;
11337
+ request[1] = this.authMethods.length;
11338
+ this.authMethods.forEach((method, i) => {
11339
+ request[2 + i] = method;
11340
+ });
11341
+ this.socket.write(request);
11342
+ }
11343
+ /**
11344
+ * Handle handshake response from server
11345
+ */
11346
+ handleHandshakeResponse() {
11347
+ if (this.buffer.length < 2) {
11348
+ return;
11349
+ }
11350
+ const version = this.buffer[0];
11351
+ const method = this.buffer[1];
11352
+ if (version !== SOCKS_VERSION) {
11353
+ throw new Socks5ProxyError(`Invalid SOCKS version: ${version}`, "UND_ERR_SOCKS5_VERSION");
11354
+ }
11355
+ if (method === AUTH_METHODS.NO_ACCEPTABLE) {
11356
+ throw new Socks5ProxyError("No acceptable authentication method", "UND_ERR_SOCKS5_AUTH_REJECTED");
11357
+ }
11358
+ this.buffer = this.buffer.subarray(2);
11359
+ debug9("server selected auth method", method);
11360
+ if (method === AUTH_METHODS.NO_AUTH) {
11361
+ this.emit("authenticated");
11362
+ } else if (method === AUTH_METHODS.USERNAME_PASSWORD) {
11363
+ this.state = STATES.AUTHENTICATING;
11364
+ this.sendAuthRequest();
11365
+ } else {
11366
+ throw new Socks5ProxyError(`Unsupported authentication method: ${method}`, "UND_ERR_SOCKS5_AUTH_METHOD");
11367
+ }
11368
+ }
11369
+ /**
11370
+ * Send username/password authentication request
11371
+ */
11372
+ sendAuthRequest() {
11373
+ const { username, password } = this.options;
11374
+ if (!username || !password) {
11375
+ throw new InvalidArgumentError("Username and password required for authentication");
11376
+ }
11377
+ debug9("sending username/password auth");
11378
+ const usernameBuffer = Buffer2.from(username);
11379
+ const passwordBuffer = Buffer2.from(password);
11380
+ if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {
11381
+ throw new InvalidArgumentError("Username or password too long");
11382
+ }
11383
+ const request = Buffer2.alloc(3 + usernameBuffer.length + passwordBuffer.length);
11384
+ request[0] = 1;
11385
+ request[1] = usernameBuffer.length;
11386
+ usernameBuffer.copy(request, 2);
11387
+ request[2 + usernameBuffer.length] = passwordBuffer.length;
11388
+ passwordBuffer.copy(request, 3 + usernameBuffer.length);
11389
+ this.socket.write(request);
11390
+ }
11391
+ /**
11392
+ * Handle authentication response
11393
+ */
11394
+ handleAuthResponse() {
11395
+ if (this.buffer.length < 2) {
11396
+ return;
11397
+ }
11398
+ const version = this.buffer[0];
11399
+ const status = this.buffer[1];
11400
+ if (version !== 1) {
11401
+ throw new Socks5ProxyError(`Invalid auth sub-negotiation version: ${version}`, "UND_ERR_SOCKS5_AUTH_VERSION");
11402
+ }
11403
+ if (status !== 0) {
11404
+ throw new Socks5ProxyError("Authentication failed", "UND_ERR_SOCKS5_AUTH_FAILED");
11405
+ }
11406
+ this.buffer = this.buffer.subarray(2);
11407
+ debug9("authentication successful");
11408
+ this.emit("authenticated");
11409
+ }
11410
+ /**
11411
+ * Send CONNECT command
11412
+ * @param {string} address - Target address (IP or domain)
11413
+ * @param {number} port - Target port
11414
+ */
11415
+ connect(address, port) {
11416
+ if (this.state === STATES.CONNECTED) {
11417
+ throw new InvalidArgumentError("Already connected");
11418
+ }
11419
+ debug9("connecting to", address, port);
11420
+ this.state = STATES.CONNECTING;
11421
+ const request = this.buildConnectRequest(COMMANDS.CONNECT, address, port);
11422
+ this.socket.write(request);
11423
+ }
11424
+ /**
11425
+ * Build a SOCKS5 request
11426
+ */
11427
+ buildConnectRequest(command, address, port) {
11428
+ const { type: addressType, buffer: addressBuffer } = parseAddress(address);
11429
+ const request = Buffer2.alloc(4 + addressBuffer.length + 2);
11430
+ request[0] = SOCKS_VERSION;
11431
+ request[1] = command;
11432
+ request[2] = 0;
11433
+ request[3] = addressType;
11434
+ addressBuffer.copy(request, 4);
11435
+ request.writeUInt16BE(port, 4 + addressBuffer.length);
11436
+ return request;
11437
+ }
11438
+ /**
11439
+ * Handle CONNECT response
11440
+ */
11441
+ handleConnectResponse() {
11442
+ if (this.buffer.length < 4) {
11443
+ return;
11444
+ }
11445
+ const version = this.buffer[0];
11446
+ const reply = this.buffer[1];
11447
+ const addressType = this.buffer[3];
11448
+ if (version !== SOCKS_VERSION) {
11449
+ throw new Socks5ProxyError(`Invalid SOCKS version in reply: ${version}`, "UND_ERR_SOCKS5_REPLY_VERSION");
11450
+ }
11451
+ let responseLength = 4;
11452
+ if (addressType === ADDRESS_TYPES.IPV4) {
11453
+ responseLength += 4 + 2;
11454
+ } else if (addressType === ADDRESS_TYPES.DOMAIN) {
11455
+ if (this.buffer.length < 5) {
11456
+ return;
11457
+ }
11458
+ responseLength += 1 + this.buffer[4] + 2;
11459
+ } else if (addressType === ADDRESS_TYPES.IPV6) {
11460
+ responseLength += 16 + 2;
11461
+ } else {
11462
+ throw new Socks5ProxyError(`Invalid address type in reply: ${addressType}`, "UND_ERR_SOCKS5_ADDR_TYPE");
11463
+ }
11464
+ if (this.buffer.length < responseLength) {
11465
+ return;
11466
+ }
11467
+ if (reply !== REPLY_CODES.SUCCEEDED) {
11468
+ const errorMessage = this.getReplyErrorMessage(reply);
11469
+ throw new Socks5ProxyError(`SOCKS5 connection failed: ${errorMessage}`, `UND_ERR_SOCKS5_REPLY_${reply}`);
11470
+ }
11471
+ let boundAddress;
11472
+ let offset = 4;
11473
+ if (addressType === ADDRESS_TYPES.IPV4) {
11474
+ boundAddress = Array.from(this.buffer.subarray(offset, offset + 4)).join(".");
11475
+ offset += 4;
11476
+ } else if (addressType === ADDRESS_TYPES.DOMAIN) {
11477
+ const domainLength = this.buffer[offset];
11478
+ offset += 1;
11479
+ boundAddress = this.buffer.subarray(offset, offset + domainLength).toString();
11480
+ offset += domainLength;
11481
+ } else if (addressType === ADDRESS_TYPES.IPV6) {
11482
+ const parts = [];
11483
+ for (let i = 0; i < 8; i++) {
11484
+ const value = this.buffer.readUInt16BE(offset + i * 2);
11485
+ parts.push(value.toString(16));
11486
+ }
11487
+ boundAddress = parts.join(":");
11488
+ offset += 16;
11489
+ }
11490
+ const boundPort = this.buffer.readUInt16BE(offset);
11491
+ this.buffer = this.buffer.subarray(responseLength);
11492
+ this.state = STATES.CONNECTED;
11493
+ debug9("connected, bound address:", boundAddress, "port:", boundPort);
11494
+ this.emit("connected", { address: boundAddress, port: boundPort });
11495
+ }
11496
+ /**
11497
+ * Get human-readable error message for reply code
11498
+ */
11499
+ getReplyErrorMessage(reply) {
11500
+ switch (reply) {
11501
+ case REPLY_CODES.GENERAL_FAILURE:
11502
+ return "General SOCKS server failure";
11503
+ case REPLY_CODES.CONNECTION_NOT_ALLOWED:
11504
+ return "Connection not allowed by ruleset";
11505
+ case REPLY_CODES.NETWORK_UNREACHABLE:
11506
+ return "Network unreachable";
11507
+ case REPLY_CODES.HOST_UNREACHABLE:
11508
+ return "Host unreachable";
11509
+ case REPLY_CODES.CONNECTION_REFUSED:
11510
+ return "Connection refused";
11511
+ case REPLY_CODES.TTL_EXPIRED:
11512
+ return "TTL expired";
11513
+ case REPLY_CODES.COMMAND_NOT_SUPPORTED:
11514
+ return "Command not supported";
11515
+ case REPLY_CODES.ADDRESS_TYPE_NOT_SUPPORTED:
11516
+ return "Address type not supported";
11517
+ default:
11518
+ return `Unknown error code: ${reply}`;
11519
+ }
11520
+ }
11521
+ };
11522
+ module2.exports = {
11523
+ Socks5Client,
11524
+ AUTH_METHODS,
11525
+ COMMANDS,
11526
+ ADDRESS_TYPES,
11527
+ REPLY_CODES,
11528
+ STATES
11529
+ };
11530
+ }
11531
+ });
11532
+
11533
+ // node_modules/undici/lib/dispatcher/socks5-proxy-agent.js
11534
+ var require_socks5_proxy_agent = __commonJS({
11535
+ "node_modules/undici/lib/dispatcher/socks5-proxy-agent.js"(exports2, module2) {
11536
+ "use strict";
11537
+ var net = require("net");
11538
+ var { URL: URL2 } = require("url");
11539
+ var tls;
11540
+ var DispatcherBase = require_dispatcher_base();
11541
+ var { InvalidArgumentError } = require_errors();
11542
+ var { Socks5Client } = require_socks5_client();
11543
+ var { kDispatch, kClose, kDestroy } = require_symbols();
11544
+ var Pool = require_pool();
11545
+ var buildConnector = require_connect();
11546
+ var { debuglog } = require("util");
11547
+ var debug9 = debuglog("undici:socks5-proxy");
11548
+ var kProxyUrl = /* @__PURE__ */ Symbol("proxy url");
11549
+ var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers");
11550
+ var kProxyAuth = /* @__PURE__ */ Symbol("proxy auth");
11551
+ var kPool = /* @__PURE__ */ Symbol("pool");
11552
+ var kConnector = /* @__PURE__ */ Symbol("connector");
11553
+ var experimentalWarningEmitted = false;
11554
+ var Socks5ProxyAgent = class extends DispatcherBase {
11555
+ constructor(proxyUrl, options = {}) {
11556
+ super();
11557
+ if (!experimentalWarningEmitted) {
11558
+ process.emitWarning(
11559
+ "SOCKS5 proxy support is experimental and subject to change",
11560
+ "ExperimentalWarning"
11561
+ );
11562
+ experimentalWarningEmitted = true;
11563
+ }
11564
+ if (!proxyUrl) {
11565
+ throw new InvalidArgumentError("Proxy URL is mandatory");
11566
+ }
11567
+ const url = typeof proxyUrl === "string" ? new URL2(proxyUrl) : proxyUrl;
11568
+ if (url.protocol !== "socks5:" && url.protocol !== "socks:") {
11569
+ throw new InvalidArgumentError("Proxy URL must use socks5:// or socks:// protocol");
11570
+ }
11571
+ this[kProxyUrl] = url;
11572
+ this[kProxyHeaders] = options.headers || {};
11573
+ this[kProxyAuth] = {
11574
+ username: options.username || (url.username ? decodeURIComponent(url.username) : null),
11575
+ password: options.password || (url.password ? decodeURIComponent(url.password) : null)
11576
+ };
11577
+ this[kConnector] = options.connect || buildConnector({
11578
+ ...options.proxyTls,
11579
+ servername: options.proxyTls?.servername || url.hostname
11580
+ });
11581
+ this[kPool] = null;
11582
+ }
11583
+ /**
11584
+ * Create a SOCKS5 connection to the proxy
11585
+ */
11586
+ async createSocks5Connection(targetHost, targetPort) {
11587
+ const proxyHost = this[kProxyUrl].hostname;
11588
+ const proxyPort = parseInt(this[kProxyUrl].port) || 1080;
11589
+ debug9("creating SOCKS5 connection to", proxyHost, proxyPort);
11590
+ const socket = await new Promise((resolve4, reject) => {
11591
+ const onConnect = () => {
11592
+ socket2.removeListener("error", onError);
11593
+ resolve4(socket2);
11594
+ };
11595
+ const onError = (err) => {
11596
+ socket2.removeListener("connect", onConnect);
11597
+ reject(err);
11598
+ };
11599
+ const socket2 = net.connect({
11600
+ host: proxyHost,
11601
+ port: proxyPort
11602
+ });
11603
+ socket2.once("connect", onConnect);
11604
+ socket2.once("error", onError);
11605
+ });
11606
+ const socks5Client = new Socks5Client(socket, this[kProxyAuth]);
11607
+ socks5Client.on("error", (err) => {
11608
+ debug9("SOCKS5 error:", err);
11609
+ socket.destroy();
11610
+ });
11611
+ await socks5Client.handshake();
11612
+ await new Promise((resolve4, reject) => {
11613
+ const timeout = setTimeout(() => {
11614
+ reject(new Error("SOCKS5 authentication timeout"));
11615
+ }, 5e3);
11616
+ const onAuthenticated = () => {
11617
+ clearTimeout(timeout);
11618
+ socks5Client.removeListener("error", onError);
11619
+ resolve4();
11620
+ };
11621
+ const onError = (err) => {
11622
+ clearTimeout(timeout);
11623
+ socks5Client.removeListener("authenticated", onAuthenticated);
11624
+ reject(err);
11625
+ };
11626
+ if (socks5Client.state === "authenticated") {
11627
+ clearTimeout(timeout);
11628
+ resolve4();
11629
+ } else {
11630
+ socks5Client.once("authenticated", onAuthenticated);
11631
+ socks5Client.once("error", onError);
11632
+ }
11633
+ });
11634
+ await socks5Client.connect(targetHost, targetPort);
11635
+ await new Promise((resolve4, reject) => {
11636
+ const timeout = setTimeout(() => {
11637
+ reject(new Error("SOCKS5 connection timeout"));
11638
+ }, 5e3);
11639
+ const onConnected = (info) => {
11640
+ debug9("SOCKS5 tunnel established to", targetHost, targetPort, "via", info);
11641
+ clearTimeout(timeout);
11642
+ socks5Client.removeListener("error", onError);
11643
+ resolve4();
11644
+ };
11645
+ const onError = (err) => {
11646
+ clearTimeout(timeout);
11647
+ socks5Client.removeListener("connected", onConnected);
11648
+ reject(err);
11649
+ };
11650
+ socks5Client.once("connected", onConnected);
11651
+ socks5Client.once("error", onError);
11652
+ });
11653
+ return socket;
11654
+ }
11655
+ /**
11656
+ * Dispatch a request through the SOCKS5 proxy
11657
+ */
11658
+ async [kDispatch](opts, handler) {
11659
+ const { origin } = opts;
11660
+ debug9("dispatching request to", origin, "via SOCKS5");
11661
+ try {
11662
+ if (!this[kPool] || this[kPool].destroyed || this[kPool].closed) {
11663
+ this[kPool] = new Pool(origin, {
11664
+ pipelining: opts.pipelining,
11665
+ connections: opts.connections,
11666
+ connect: async (connectOpts, callback) => {
11667
+ try {
11668
+ const url = new URL2(origin);
11669
+ const targetHost = url.hostname;
11670
+ const targetPort = parseInt(url.port) || (url.protocol === "https:" ? 443 : 80);
11671
+ debug9("establishing SOCKS5 connection to", targetHost, targetPort);
11672
+ const socket = await this.createSocks5Connection(targetHost, targetPort);
11673
+ let finalSocket = socket;
11674
+ if (url.protocol === "https:") {
11675
+ if (!tls) {
11676
+ tls = require("tls");
11677
+ }
11678
+ debug9("upgrading to TLS");
11679
+ finalSocket = tls.connect({
11680
+ socket,
11681
+ servername: targetHost,
11682
+ ...connectOpts.tls || {}
11683
+ });
11684
+ await new Promise((resolve4, reject) => {
11685
+ finalSocket.once("secureConnect", resolve4);
11686
+ finalSocket.once("error", reject);
11687
+ });
11688
+ }
11689
+ callback(null, finalSocket);
11690
+ } catch (err) {
11691
+ debug9("SOCKS5 connection error:", err);
11692
+ callback(err);
11693
+ }
11694
+ }
11695
+ });
11696
+ }
11697
+ return this[kPool][kDispatch](opts, handler);
11698
+ } catch (err) {
11699
+ debug9("dispatch error:", err);
11700
+ if (typeof handler.onError === "function") {
11701
+ handler.onError(err);
11702
+ } else {
11703
+ throw err;
11704
+ }
11705
+ }
11706
+ }
11707
+ async [kClose]() {
11708
+ if (this[kPool]) {
11709
+ await this[kPool].close();
11710
+ }
11711
+ }
11712
+ async [kDestroy](err) {
11713
+ if (this[kPool]) {
11714
+ await this[kPool].destroy(err);
11715
+ }
11716
+ }
11717
+ };
11718
+ module2.exports = Socks5ProxyAgent;
11719
+ }
11720
+ });
11721
+
10786
11722
  // node_modules/undici/lib/dispatcher/proxy-agent.js
10787
11723
  var require_proxy_agent = __commonJS({
10788
11724
  "node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) {
@@ -10795,6 +11731,7 @@ var require_proxy_agent = __commonJS({
10795
11731
  var buildConnector = require_connect();
10796
11732
  var Client = require_client();
10797
11733
  var { channels } = require_diagnostics();
11734
+ var Socks5ProxyAgent = require_socks5_proxy_agent();
10798
11735
  var kAgent = /* @__PURE__ */ Symbol("proxy agent");
10799
11736
  var kClient = /* @__PURE__ */ Symbol("proxy client");
10800
11737
  var kProxyHeaders = /* @__PURE__ */ Symbol("proxy headers");
@@ -10893,6 +11830,16 @@ var require_proxy_agent = __commonJS({
10893
11830
  const agentFactory = opts.factory || defaultAgentFactory;
10894
11831
  const factory = (origin2, options) => {
10895
11832
  const { protocol: protocol2 } = new URL(origin2);
11833
+ if (this[kProxy].protocol === "socks5:" || this[kProxy].protocol === "socks:") {
11834
+ return new Socks5ProxyAgent(this[kProxy].uri, {
11835
+ headers: this[kProxyHeaders],
11836
+ connect,
11837
+ factory: agentFactory,
11838
+ username: opts.username || username,
11839
+ password: opts.password || password,
11840
+ proxyTls: opts.proxyTls
11841
+ });
11842
+ }
10896
11843
  if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") {
10897
11844
  return new Http1ProxyWrapper(this[kProxy].uri, {
10898
11845
  headers: this[kProxyHeaders],
@@ -10902,11 +11849,19 @@ var require_proxy_agent = __commonJS({
10902
11849
  }
10903
11850
  return agentFactory(origin2, options);
10904
11851
  };
10905
- this[kClient] = clientFactory(url, { connect });
11852
+ if (protocol === "socks5:" || protocol === "socks:") {
11853
+ this[kClient] = null;
11854
+ } else {
11855
+ this[kClient] = clientFactory(url, { connect });
11856
+ }
10906
11857
  this[kAgent] = new Agent({
10907
11858
  ...opts,
10908
11859
  factory,
10909
11860
  connect: async (opts2, callback) => {
11861
+ if (!this[kClient]) {
11862
+ callback(new InvalidArgumentError("Cannot establish tunnel connection without a proxy client"));
11863
+ return;
11864
+ }
10910
11865
  let requestedPath = opts2.host;
10911
11866
  if (!opts2.port) {
10912
11867
  requestedPath += `:${defaultProtocolPort(opts2.protocol)}`;
@@ -10986,16 +11941,18 @@ var require_proxy_agent = __commonJS({
10986
11941
  }
10987
11942
  }
10988
11943
  [kClose]() {
10989
- return Promise.all([
10990
- this[kAgent].close(),
10991
- this[kClient].close()
10992
- ]);
11944
+ const promises = [this[kAgent].close()];
11945
+ if (this[kClient]) {
11946
+ promises.push(this[kClient].close());
11947
+ }
11948
+ return Promise.all(promises);
10993
11949
  }
10994
11950
  [kDestroy]() {
10995
- return Promise.all([
10996
- this[kAgent].destroy(),
10997
- this[kClient].destroy()
10998
- ]);
11951
+ const promises = [this[kAgent].destroy()];
11952
+ if (this[kClient]) {
11953
+ promises.push(this[kClient].destroy());
11954
+ }
11955
+ return Promise.all(promises);
10999
11956
  }
11000
11957
  };
11001
11958
  function buildHeaders(headers) {
@@ -11099,14 +12056,11 @@ var require_env_http_proxy_agent = __commonJS({
11099
12056
  if (entry.port && entry.port !== port) {
11100
12057
  continue;
11101
12058
  }
11102
- if (!/^[.*]/.test(entry.hostname)) {
11103
- if (hostname === entry.hostname) {
11104
- return false;
11105
- }
11106
- } else {
11107
- if (hostname.endsWith(entry.hostname.replace(/^\*/, ""))) {
11108
- return false;
11109
- }
12059
+ if (hostname === entry.hostname) {
12060
+ return false;
12061
+ }
12062
+ if (hostname.slice(-(entry.hostname.length + 1)) === `.${entry.hostname}`) {
12063
+ return false;
11110
12064
  }
11111
12065
  }
11112
12066
  return true;
@@ -11122,7 +12076,8 @@ var require_env_http_proxy_agent = __commonJS({
11122
12076
  }
11123
12077
  const parsed = entry.match(/^(.+):(\d+)$/);
11124
12078
  noProxyEntries.push({
11125
- hostname: (parsed ? parsed[1] : entry).toLowerCase(),
12079
+ // strip leading dot or asterisk with dot
12080
+ hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, "").toLowerCase(),
11126
12081
  port: parsed ? Number.parseInt(parsed[2], 10) : 0
11127
12082
  });
11128
12083
  }
@@ -12036,6 +12991,7 @@ var require_api_request = __commonJS({
12036
12991
  try {
12037
12992
  this.runInAsyncScope(callback, null, null, {
12038
12993
  statusCode,
12994
+ statusText: statusMessage,
12039
12995
  headers,
12040
12996
  trailers: this.trailers,
12041
12997
  opaque,
@@ -12777,7 +13733,8 @@ var require_mock_symbols = __commonJS({
12777
13733
  kMockAgentAddCallHistoryLog: /* @__PURE__ */ Symbol("mock agent add call history log"),
12778
13734
  kMockAgentIsCallHistoryEnabled: /* @__PURE__ */ Symbol("mock agent is call history enabled"),
12779
13735
  kMockAgentAcceptsNonStandardSearchParameters: /* @__PURE__ */ Symbol("mock agent accepts non standard search parameters"),
12780
- kMockCallHistoryAddLog: /* @__PURE__ */ Symbol("mock call history add log")
13736
+ kMockCallHistoryAddLog: /* @__PURE__ */ Symbol("mock call history add log"),
13737
+ kTotalDispatchCount: /* @__PURE__ */ Symbol("total dispatch count")
12781
13738
  };
12782
13739
  }
12783
13740
  });
@@ -12792,7 +13749,8 @@ var require_mock_utils = __commonJS({
12792
13749
  kMockAgent,
12793
13750
  kOriginalDispatch,
12794
13751
  kOrigin,
12795
- kGetNetConnect
13752
+ kGetNetConnect,
13753
+ kTotalDispatchCount
12796
13754
  } = require_mock_symbols();
12797
13755
  var { serializePathWithQuery } = require_util();
12798
13756
  var { STATUS_CODES } = require("http");
@@ -12952,6 +13910,7 @@ var require_mock_utils = __commonJS({
12952
13910
  const replyData = typeof data === "function" ? { callback: data } : { ...data };
12953
13911
  const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } };
12954
13912
  mockDispatches.push(newMockDispatch);
13913
+ mockDispatches[kTotalDispatchCount] = (mockDispatches[kTotalDispatchCount] || 0) + 1;
12955
13914
  return newMockDispatch;
12956
13915
  }
12957
13916
  function deleteMockDispatch(mockDispatches, key) {
@@ -13027,23 +13986,43 @@ var require_mock_utils = __commonJS({
13027
13986
  handler.onError(error);
13028
13987
  return true;
13029
13988
  }
13989
+ let aborted = false;
13990
+ let timer = null;
13991
+ function abort(err) {
13992
+ if (aborted) {
13993
+ return;
13994
+ }
13995
+ aborted = true;
13996
+ if (timer !== null) {
13997
+ clearTimeout(timer);
13998
+ timer = null;
13999
+ }
14000
+ handler.onError(err);
14001
+ }
14002
+ handler.onConnect?.(abort, null);
13030
14003
  if (typeof delay === "number" && delay > 0) {
13031
- setTimeout(() => {
14004
+ timer = setTimeout(() => {
14005
+ timer = null;
13032
14006
  handleReply(this[kDispatches]);
13033
14007
  }, delay);
13034
14008
  } else {
13035
14009
  handleReply(this[kDispatches]);
13036
14010
  }
13037
14011
  function handleReply(mockDispatches, _data = data) {
14012
+ if (aborted) {
14013
+ return;
14014
+ }
13038
14015
  const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers;
13039
14016
  const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data;
13040
14017
  if (isPromise2(body)) {
13041
14018
  return body.then((newData) => handleReply(mockDispatches, newData));
13042
14019
  }
14020
+ if (aborted) {
14021
+ return;
14022
+ }
13043
14023
  const responseData = getResponseData(body);
13044
14024
  const responseHeaders = generateKeyValues(headers);
13045
14025
  const responseTrailers = generateKeyValues(trailers);
13046
- handler.onConnect?.((err) => handler.onError(err), null);
13047
14026
  handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode));
13048
14027
  handler.onData?.(Buffer.from(responseData));
13049
14028
  handler.onComplete?.(responseTrailers);
@@ -13064,13 +14043,16 @@ var require_mock_utils = __commonJS({
13064
14043
  } catch (error) {
13065
14044
  if (error.code === "UND_MOCK_ERR_MOCK_NOT_MATCHED") {
13066
14045
  const netConnect = agent[kGetNetConnect]();
14046
+ const totalInterceptsCount = this[kDispatches][kTotalDispatchCount] || this[kDispatches].length;
14047
+ const pendingInterceptsCount = this[kDispatches].filter(({ consumed }) => !consumed).length;
14048
+ const interceptsMessage = `, ${pendingInterceptsCount} interceptor(s) remaining out of ${totalInterceptsCount} defined`;
13067
14049
  if (netConnect === false) {
13068
- throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`);
14050
+ throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)${interceptsMessage}`);
13069
14051
  }
13070
14052
  if (checkNetConnect(netConnect, origin)) {
13071
14053
  originalDispatch.call(this, opts, handler);
13072
14054
  } else {
13073
- throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`);
14055
+ throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)${interceptsMessage}`);
13074
14056
  }
13075
14057
  } else {
13076
14058
  throw error;
@@ -13090,6 +14072,15 @@ var require_mock_utils = __commonJS({
13090
14072
  }
13091
14073
  return false;
13092
14074
  }
14075
+ function normalizeOrigin(origin) {
14076
+ if (typeof origin !== "string" && !(origin instanceof URL)) {
14077
+ return origin;
14078
+ }
14079
+ if (origin instanceof URL) {
14080
+ return origin.origin;
14081
+ }
14082
+ return origin.toLowerCase();
14083
+ }
13093
14084
  function buildAndValidateMockOptions(opts) {
13094
14085
  const { agent, ...mockOptions } = opts;
13095
14086
  if ("enableCallHistory" in mockOptions && typeof mockOptions.enableCallHistory !== "boolean") {
@@ -13119,7 +14110,8 @@ var require_mock_utils = __commonJS({
13119
14110
  buildAndValidateMockOptions,
13120
14111
  getHeaderByName,
13121
14112
  buildHeadersFromArray,
13122
- normalizeSearchParams
14113
+ normalizeSearchParams,
14114
+ normalizeOrigin
13123
14115
  };
13124
14116
  }
13125
14117
  });
@@ -13677,7 +14669,7 @@ var require_mock_agent = __commonJS({
13677
14669
  } = require_mock_symbols();
13678
14670
  var MockClient = require_mock_client();
13679
14671
  var MockPool = require_mock_pool();
13680
- var { matchValue, normalizeSearchParams, buildAndValidateMockOptions } = require_mock_utils();
14672
+ var { matchValue, normalizeSearchParams, buildAndValidateMockOptions, normalizeOrigin } = require_mock_utils();
13681
14673
  var { InvalidArgumentError, UndiciError } = require_errors();
13682
14674
  var Dispatcher = require_dispatcher();
13683
14675
  var PendingInterceptorsFormatter = require_pending_interceptors_formatter();
@@ -13703,7 +14695,8 @@ var require_mock_agent = __commonJS({
13703
14695
  }
13704
14696
  }
13705
14697
  get(origin) {
13706
- const originKey = this[kIgnoreTrailingSlash] ? origin.replace(/\/$/, "") : origin;
14698
+ const normalizedOrigin = normalizeOrigin(origin);
14699
+ const originKey = this[kIgnoreTrailingSlash] ? normalizedOrigin.replace(/\/$/, "") : normalizedOrigin;
13707
14700
  let dispatcher = this[kMockAgentGet](originKey);
13708
14701
  if (!dispatcher) {
13709
14702
  dispatcher = this[kFactory](originKey);
@@ -13712,6 +14705,7 @@ var require_mock_agent = __commonJS({
13712
14705
  return dispatcher;
13713
14706
  }
13714
14707
  dispatch(opts, handler) {
14708
+ opts.origin = normalizeOrigin(opts.origin);
13715
14709
  this.get(opts.origin);
13716
14710
  this[kMockAgentAddCallHistoryLog](opts);
13717
14711
  const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters];
@@ -14830,7 +15824,7 @@ var require_redirect_handler = __commonJS({
14830
15824
  }
14831
15825
  }
14832
15826
  } else if (headers && typeof headers === "object") {
14833
- const entries = typeof headers[Symbol.iterator] === "function" ? headers : Object.entries(headers);
15827
+ const entries = util.hasSafeIterator(headers) ? headers : Object.entries(headers);
14834
15828
  for (const [key, value] of entries) {
14835
15829
  if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
14836
15830
  ret.push(key, value);
@@ -15068,6 +16062,85 @@ var require_dns = __commonJS({
15068
16062
  var DecoratorHandler = require_decorator_handler();
15069
16063
  var { InvalidArgumentError, InformationalError } = require_errors();
15070
16064
  var maxInt = Math.pow(2, 31) - 1;
16065
+ function hasSafeIterator(headers) {
16066
+ const prototype = Object.getPrototypeOf(headers);
16067
+ const ownIterator = Object.prototype.hasOwnProperty.call(headers, Symbol.iterator);
16068
+ return ownIterator || prototype != null && prototype !== Object.prototype && typeof headers[Symbol.iterator] === "function";
16069
+ }
16070
+ function isHostHeader(key) {
16071
+ return typeof key === "string" && key.toLowerCase() === "host";
16072
+ }
16073
+ function normalizeHeaders(headers) {
16074
+ if (headers == null) {
16075
+ return null;
16076
+ }
16077
+ if (Array.isArray(headers)) {
16078
+ if (headers.length === 0 || !Array.isArray(headers[0])) {
16079
+ return headers;
16080
+ }
16081
+ const normalized = [];
16082
+ for (const header of headers) {
16083
+ if (Array.isArray(header) && header.length === 2) {
16084
+ normalized.push(header[0], header[1]);
16085
+ } else {
16086
+ normalized.push(header);
16087
+ }
16088
+ }
16089
+ return normalized;
16090
+ }
16091
+ if (typeof headers === "object" && hasSafeIterator(headers)) {
16092
+ const normalized = [];
16093
+ for (const header of headers) {
16094
+ if (Array.isArray(header) && header.length === 2) {
16095
+ normalized.push(header[0], header[1]);
16096
+ } else {
16097
+ normalized.push(header);
16098
+ }
16099
+ }
16100
+ return normalized;
16101
+ }
16102
+ return headers;
16103
+ }
16104
+ function hasHostHeader(headers) {
16105
+ if (headers == null) {
16106
+ return false;
16107
+ }
16108
+ if (Array.isArray(headers)) {
16109
+ if (headers.length === 0) {
16110
+ return false;
16111
+ }
16112
+ for (let i = 0; i < headers.length; i += 2) {
16113
+ if (isHostHeader(headers[i])) {
16114
+ return true;
16115
+ }
16116
+ }
16117
+ return false;
16118
+ }
16119
+ if (typeof headers === "object") {
16120
+ for (const key in headers) {
16121
+ if (isHostHeader(key)) {
16122
+ return true;
16123
+ }
16124
+ }
16125
+ }
16126
+ return false;
16127
+ }
16128
+ function withHostHeader(host, headers) {
16129
+ const normalizedHeaders = normalizeHeaders(headers);
16130
+ if (hasHostHeader(normalizedHeaders)) {
16131
+ return normalizedHeaders;
16132
+ }
16133
+ if (Array.isArray(normalizedHeaders)) {
16134
+ return ["host", host, ...normalizedHeaders];
16135
+ }
16136
+ if (normalizedHeaders && typeof normalizedHeaders === "object") {
16137
+ return {
16138
+ host,
16139
+ ...normalizedHeaders
16140
+ };
16141
+ }
16142
+ return { host };
16143
+ }
15071
16144
  var DNSStorage = class {
15072
16145
  #maxItems = 0;
15073
16146
  #records = /* @__PURE__ */ new Map();
@@ -15326,7 +16399,8 @@ var require_dns = __commonJS({
15326
16399
  }
15327
16400
  const dispatchOpts = {
15328
16401
  ...this.#opts,
15329
- origin: `${this.#origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`
16402
+ origin: `${this.#origin.protocol}//${ip.family === 6 ? `[${ip.address}]` : ip.address}${port}`,
16403
+ headers: withHostHeader(this.#origin.host, this.#opts.headers)
15330
16404
  };
15331
16405
  this.#dispatch(dispatchOpts, this);
15332
16406
  return;
@@ -15401,10 +16475,7 @@ var require_dns = __commonJS({
15401
16475
  servername: origin.hostname,
15402
16476
  // For SNI on TLS
15403
16477
  origin: newOrigin.origin,
15404
- headers: {
15405
- host: origin.host,
15406
- ...origDispatchOpts.headers
15407
- }
16478
+ headers: withHostHeader(origin.host, origDispatchOpts.headers)
15408
16479
  };
15409
16480
  dispatch(
15410
16481
  dispatchOpts,
@@ -15427,7 +16498,8 @@ var require_cache = __commonJS({
15427
16498
  "use strict";
15428
16499
  var {
15429
16500
  safeHTTPMethods,
15430
- pathHasQueryOrFragment
16501
+ pathHasQueryOrFragment,
16502
+ hasSafeIterator
15431
16503
  } = require_util();
15432
16504
  var { serializePathWithQuery } = require_util();
15433
16505
  function makeCacheKey(opts) {
@@ -15449,22 +16521,23 @@ var require_cache = __commonJS({
15449
16521
  let headers;
15450
16522
  if (opts.headers == null) {
15451
16523
  headers = {};
15452
- } else if (typeof opts.headers[Symbol.iterator] === "function") {
16524
+ } else if (typeof opts.headers === "object") {
15453
16525
  headers = {};
15454
- for (const x of opts.headers) {
15455
- if (!Array.isArray(x)) {
15456
- throw new Error("opts.headers is not a valid header map");
16526
+ if (hasSafeIterator(opts.headers)) {
16527
+ for (const x of opts.headers) {
16528
+ if (!Array.isArray(x)) {
16529
+ throw new Error("opts.headers is not a valid header map");
16530
+ }
16531
+ const [key, val] = x;
16532
+ if (typeof key !== "string" || typeof val !== "string") {
16533
+ throw new Error("opts.headers is not a valid header map");
16534
+ }
16535
+ headers[key.toLowerCase()] = val;
15457
16536
  }
15458
- const [key, val] = x;
15459
- if (typeof key !== "string" || typeof val !== "string") {
15460
- throw new Error("opts.headers is not a valid header map");
16537
+ } else {
16538
+ for (const key of Object.keys(opts.headers)) {
16539
+ headers[key.toLowerCase()] = opts.headers[key];
15461
16540
  }
15462
- headers[key.toLowerCase()] = val;
15463
- }
15464
- } else if (typeof opts.headers === "object") {
15465
- headers = {};
15466
- for (const key of Object.keys(opts.headers)) {
15467
- headers[key.toLowerCase()] = opts.headers[key];
15468
16541
  }
15469
16542
  } else {
15470
16543
  throw new Error("opts.headers is not an object");
@@ -16288,7 +17361,7 @@ var require_cache_handler = __commonJS({
16288
17361
  return downstreamOnHeaders();
16289
17362
  }
16290
17363
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
16291
- if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives)) {
17364
+ if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
16292
17365
  return downstreamOnHeaders();
16293
17366
  }
16294
17367
  const now = Date.now();
@@ -16326,40 +17399,67 @@ var require_cache_handler = __commonJS({
16326
17399
  deleteAt
16327
17400
  };
16328
17401
  if (statusCode === 304) {
16329
- const cachedValue = this.#store.get(this.#cacheKey);
16330
- if (!cachedValue) {
16331
- return downstreamOnHeaders();
16332
- }
16333
- value.statusCode = cachedValue.statusCode;
16334
- value.statusMessage = cachedValue.statusMessage;
16335
- value.etag = cachedValue.etag;
16336
- value.headers = { ...cachedValue.headers, ...strippedHeaders };
16337
- downstreamOnHeaders();
16338
- this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value);
16339
- if (!this.#writeStream || !cachedValue?.body) {
16340
- return;
16341
- }
16342
- const bodyIterator = cachedValue.body.values();
16343
- const streamCachedBody = () => {
16344
- for (const chunk of bodyIterator) {
16345
- const full = this.#writeStream.write(chunk) === false;
16346
- this.#handler.onResponseData?.(controller, chunk);
16347
- if (full) {
16348
- break;
16349
- }
17402
+ const handle304 = (cachedValue) => {
17403
+ if (!cachedValue) {
17404
+ return downstreamOnHeaders();
16350
17405
  }
16351
- };
16352
- this.#writeStream.on("error", function() {
16353
- handler.#writeStream = void 0;
16354
- handler.#store.delete(handler.#cacheKey);
16355
- }).on("drain", () => {
16356
- streamCachedBody();
16357
- }).on("close", function() {
16358
- if (handler.#writeStream === this) {
16359
- handler.#writeStream = void 0;
17406
+ value.statusCode = cachedValue.statusCode;
17407
+ value.statusMessage = cachedValue.statusMessage;
17408
+ value.etag = cachedValue.etag;
17409
+ value.headers = { ...cachedValue.headers, ...strippedHeaders };
17410
+ downstreamOnHeaders();
17411
+ this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value);
17412
+ if (!this.#writeStream || !cachedValue?.body) {
17413
+ return;
16360
17414
  }
16361
- });
16362
- streamCachedBody();
17415
+ if (typeof cachedValue.body.values === "function") {
17416
+ const bodyIterator = cachedValue.body.values();
17417
+ const streamCachedBody = () => {
17418
+ for (const chunk of bodyIterator) {
17419
+ const full = this.#writeStream.write(chunk) === false;
17420
+ this.#handler.onResponseData?.(controller, chunk);
17421
+ if (full) {
17422
+ break;
17423
+ }
17424
+ }
17425
+ };
17426
+ this.#writeStream.on("error", function() {
17427
+ handler.#writeStream = void 0;
17428
+ handler.#store.delete(handler.#cacheKey);
17429
+ }).on("drain", () => {
17430
+ streamCachedBody();
17431
+ }).on("close", function() {
17432
+ if (handler.#writeStream === this) {
17433
+ handler.#writeStream = void 0;
17434
+ }
17435
+ });
17436
+ streamCachedBody();
17437
+ } else if (typeof cachedValue.body.on === "function") {
17438
+ cachedValue.body.on("data", (chunk) => {
17439
+ this.#writeStream.write(chunk);
17440
+ this.#handler.onResponseData?.(controller, chunk);
17441
+ }).on("end", () => {
17442
+ this.#writeStream.end();
17443
+ }).on("error", () => {
17444
+ this.#writeStream = void 0;
17445
+ this.#store.delete(this.#cacheKey);
17446
+ });
17447
+ this.#writeStream.on("error", function() {
17448
+ handler.#writeStream = void 0;
17449
+ handler.#store.delete(handler.#cacheKey);
17450
+ }).on("close", function() {
17451
+ if (handler.#writeStream === this) {
17452
+ handler.#writeStream = void 0;
17453
+ }
17454
+ });
17455
+ }
17456
+ };
17457
+ const result = this.#store.get(this.#cacheKey);
17458
+ if (result && typeof result.then === "function") {
17459
+ result.then(handle304);
17460
+ } else {
17461
+ handle304(result);
17462
+ }
16363
17463
  } else {
16364
17464
  if (typeof resHeaders.etag === "string" && isEtagUsable(resHeaders.etag)) {
16365
17465
  value.etag = resHeaders.etag;
@@ -16396,7 +17496,7 @@ var require_cache_handler = __commonJS({
16396
17496
  this.#handler.onResponseError?.(controller, err);
16397
17497
  }
16398
17498
  };
16399
- function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives) {
17499
+ function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
16400
17500
  if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
16401
17501
  return false;
16402
17502
  }
@@ -16413,8 +17513,11 @@ var require_cache_handler = __commonJS({
16413
17513
  if (resHeaders.vary?.includes("*")) {
16414
17514
  return false;
16415
17515
  }
16416
- if (resHeaders.authorization) {
16417
- if (!cacheControlDirectives.public || typeof resHeaders.authorization !== "string") {
17516
+ if (reqHeaders?.authorization) {
17517
+ if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) {
17518
+ return false;
17519
+ }
17520
+ if (typeof reqHeaders.authorization !== "string") {
16418
17521
  return false;
16419
17522
  }
16420
17523
  if (Array.isArray(cacheControlDirectives["no-cache"]) && cacheControlDirectives["no-cache"].includes("authorization")) {
@@ -16483,9 +17586,13 @@ var require_cache_handler = __commonJS({
16483
17586
  if (cacheControlDirectives["stale-if-error"]) {
16484
17587
  staleIfError = staleAt + cacheControlDirectives["stale-if-error"] * 1e3;
16485
17588
  }
16486
- if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
17589
+ if (cacheControlDirectives.immutable && staleWhileRevalidate === -Infinity && staleIfError === -Infinity) {
16487
17590
  immutable = now + 31536e6;
16488
17591
  }
17592
+ if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
17593
+ const freshnessLifetime = staleAt - now;
17594
+ return staleAt + freshnessLifetime;
17595
+ }
16489
17596
  return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable);
16490
17597
  }
16491
17598
  function stripNecessaryHeaders(resHeaders, cacheControlDirectives) {
@@ -16806,6 +17913,18 @@ var require_cache2 = __commonJS({
16806
17913
  var CacheRevalidationHandler = require_cache_revalidation_handler();
16807
17914
  var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require_cache();
16808
17915
  var { AbortError } = require_errors();
17916
+ function assertCacheOrigins(origins, name) {
17917
+ if (origins === void 0) return;
17918
+ if (!Array.isArray(origins)) {
17919
+ throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`);
17920
+ }
17921
+ for (let i = 0; i < origins.length; i++) {
17922
+ const origin = origins[i];
17923
+ if (typeof origin !== "string" && !(origin instanceof RegExp)) {
17924
+ throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`);
17925
+ }
17926
+ }
17927
+ }
16809
17928
  var nop = () => {
16810
17929
  };
16811
17930
  function needsRevalidation(result, cacheControlDirectives, { headers = {} }) {
@@ -16950,7 +18069,7 @@ var require_cache2 = __commonJS({
16950
18069
  if (!revalidate && withinStaleWhileRevalidateWindow(result)) {
16951
18070
  sendCachedValue(handler, opts, result, age, null, true);
16952
18071
  queueMicrotask(() => {
16953
- let headers2 = {
18072
+ const headers2 = {
16954
18073
  ...opts.headers,
16955
18074
  "if-modified-since": new Date(result.cachedAt).toUTCString()
16956
18075
  };
@@ -16958,10 +18077,11 @@ var require_cache2 = __commonJS({
16958
18077
  headers2["if-none-match"] = result.etag;
16959
18078
  }
16960
18079
  if (result.vary) {
16961
- headers2 = {
16962
- ...headers2,
16963
- ...result.vary
16964
- };
18080
+ for (const key in result.vary) {
18081
+ if (result.vary[key] != null) {
18082
+ headers2[key] = result.vary[key];
18083
+ }
18084
+ }
16965
18085
  }
16966
18086
  dispatch(
16967
18087
  {
@@ -16992,7 +18112,7 @@ var require_cache2 = __commonJS({
16992
18112
  if (staleIfErrorExpiry) {
16993
18113
  withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3;
16994
18114
  }
16995
- let headers = {
18115
+ const headers = {
16996
18116
  ...opts.headers,
16997
18117
  "if-modified-since": new Date(result.cachedAt).toUTCString()
16998
18118
  };
@@ -17000,10 +18120,11 @@ var require_cache2 = __commonJS({
17000
18120
  headers["if-none-match"] = result.etag;
17001
18121
  }
17002
18122
  if (result.vary) {
17003
- headers = {
17004
- ...headers,
17005
- ...result.vary
17006
- };
18123
+ for (const key in result.vary) {
18124
+ if (result.vary[key] != null) {
18125
+ headers[key] = result.vary[key];
18126
+ }
18127
+ }
17007
18128
  }
17008
18129
  return dispatch(
17009
18130
  {
@@ -17033,13 +18154,15 @@ var require_cache2 = __commonJS({
17033
18154
  store = new MemoryCacheStore(),
17034
18155
  methods = ["GET"],
17035
18156
  cacheByDefault = void 0,
17036
- type = "shared"
18157
+ type = "shared",
18158
+ origins = void 0
17037
18159
  } = opts;
17038
18160
  if (typeof opts !== "object" || opts === null) {
17039
18161
  throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`);
17040
18162
  }
17041
18163
  assertCacheStore(store, "opts.store");
17042
18164
  assertCacheMethods(methods, "opts.methods");
18165
+ assertCacheOrigins(origins, "opts.origins");
17043
18166
  if (typeof cacheByDefault !== "undefined" && typeof cacheByDefault !== "number") {
17044
18167
  throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`);
17045
18168
  }
@@ -17058,6 +18181,25 @@ var require_cache2 = __commonJS({
17058
18181
  if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) {
17059
18182
  return dispatch(opts2, handler);
17060
18183
  }
18184
+ if (origins !== void 0) {
18185
+ const requestOrigin = opts2.origin.toString().toLowerCase();
18186
+ let isAllowed = false;
18187
+ for (let i = 0; i < origins.length; i++) {
18188
+ const allowed = origins[i];
18189
+ if (typeof allowed === "string") {
18190
+ if (allowed.toLowerCase() === requestOrigin) {
18191
+ isAllowed = true;
18192
+ break;
18193
+ }
18194
+ } else if (allowed.test(requestOrigin)) {
18195
+ isAllowed = true;
18196
+ break;
18197
+ }
18198
+ }
18199
+ if (!isAllowed) {
18200
+ return dispatch(opts2, handler);
18201
+ }
18202
+ }
17061
18203
  opts2 = {
17062
18204
  ...opts2,
17063
18205
  headers: normalizeHeaders(opts2)
@@ -17123,8 +18265,6 @@ var require_decompress = __commonJS({
17123
18265
  var DecompressHandler = class extends DecoratorHandler {
17124
18266
  /** @type {Transform[]} */
17125
18267
  #decompressors = [];
17126
- /** @type {NodeJS.WritableStream&NodeJS.ReadableStream|null} */
17127
- #pipelineStream;
17128
18268
  /** @type {Readonly<number[]>} */
17129
18269
  #skipStatusCodes;
17130
18270
  /** @type {boolean} */
@@ -17211,7 +18351,7 @@ var require_decompress = __commonJS({
17211
18351
  #setupMultipleDecompressors(controller) {
17212
18352
  const lastDecompressor = this.#decompressors[this.#decompressors.length - 1];
17213
18353
  this.#setupDecompressorEvents(lastDecompressor, controller);
17214
- this.#pipelineStream = pipeline(this.#decompressors, (err) => {
18354
+ pipeline(this.#decompressors, (err) => {
17215
18355
  if (err) {
17216
18356
  super.onResponseError(controller, err);
17217
18357
  return;
@@ -17225,7 +18365,6 @@ var require_decompress = __commonJS({
17225
18365
  */
17226
18366
  #cleanupDecompressors() {
17227
18367
  this.#decompressors.length = 0;
17228
- this.#pipelineStream = null;
17229
18368
  }
17230
18369
  /**
17231
18370
  * @param {Controller} controller
@@ -17251,7 +18390,7 @@ var require_decompress = __commonJS({
17251
18390
  } else {
17252
18391
  this.#setupMultipleDecompressors(controller);
17253
18392
  }
17254
- super.onResponseStart(controller, statusCode, newHeaders, statusMessage);
18393
+ return super.onResponseStart(controller, statusCode, newHeaders, statusMessage);
17255
18394
  }
17256
18395
  /**
17257
18396
  * @param {Controller} controller
@@ -17316,19 +18455,21 @@ var require_decompress = __commonJS({
17316
18455
  var require_deduplication_handler = __commonJS({
17317
18456
  "node_modules/undici/lib/handler/deduplication-handler.js"(exports2, module2) {
17318
18457
  "use strict";
18458
+ var { RequestAbortedError } = require_errors();
18459
+ var DEFAULT_MAX_BUFFER_SIZE = 5 * 1024 * 1024;
17319
18460
  var DeduplicationHandler = class {
17320
18461
  /**
17321
18462
  * @type {DispatchHandler}
17322
18463
  */
17323
18464
  #primaryHandler;
17324
18465
  /**
17325
- * @type {DispatchHandler[]}
18466
+ * @type {WaitingHandler[]}
17326
18467
  */
17327
18468
  #waitingHandlers = [];
17328
18469
  /**
17329
- * @type {Buffer[]}
18470
+ * @type {number}
17330
18471
  */
17331
- #chunks = [];
18472
+ #maxBufferSize = DEFAULT_MAX_BUFFER_SIZE;
17332
18473
  /**
17333
18474
  * @type {number}
17334
18475
  */
@@ -17345,6 +18486,18 @@ var require_deduplication_handler = __commonJS({
17345
18486
  * @type {boolean}
17346
18487
  */
17347
18488
  #aborted = false;
18489
+ /**
18490
+ * @type {boolean}
18491
+ */
18492
+ #responseStarted = false;
18493
+ /**
18494
+ * @type {boolean}
18495
+ */
18496
+ #responseDataStarted = false;
18497
+ /**
18498
+ * @type {boolean}
18499
+ */
18500
+ #completed = false;
17348
18501
  /**
17349
18502
  * @type {import('../../types/dispatcher.d.ts').default.DispatchController | null}
17350
18503
  */
@@ -17356,20 +18509,51 @@ var require_deduplication_handler = __commonJS({
17356
18509
  /**
17357
18510
  * @param {DispatchHandler} primaryHandler The primary handler
17358
18511
  * @param {() => void} onComplete Callback when request completes
18512
+ * @param {number} [maxBufferSize] Maximum paused buffer size per waiting handler
17359
18513
  */
17360
- constructor(primaryHandler, onComplete) {
18514
+ constructor(primaryHandler, onComplete, maxBufferSize = DEFAULT_MAX_BUFFER_SIZE) {
17361
18515
  this.#primaryHandler = primaryHandler;
17362
18516
  this.#onComplete = onComplete;
18517
+ this.#maxBufferSize = maxBufferSize;
17363
18518
  }
17364
18519
  /**
17365
- * Add a waiting handler that will receive the buffered response
18520
+ * Add a waiting handler that will receive response events.
18521
+ * Returns false if deduplication can no longer safely attach this handler.
18522
+ *
17366
18523
  * @param {DispatchHandler} handler
18524
+ * @returns {boolean}
17367
18525
  */
17368
18526
  addWaitingHandler(handler) {
17369
- this.#waitingHandlers.push(handler);
18527
+ if (this.#completed || this.#responseDataStarted) {
18528
+ return false;
18529
+ }
18530
+ const waitingHandler = this.#createWaitingHandler(handler);
18531
+ const waitingController = waitingHandler.controller;
18532
+ try {
18533
+ handler.onRequestStart?.(waitingController, null);
18534
+ if (waitingController.aborted) {
18535
+ waitingHandler.done = true;
18536
+ return true;
18537
+ }
18538
+ if (this.#responseStarted) {
18539
+ handler.onResponseStart?.(
18540
+ waitingController,
18541
+ this.#statusCode,
18542
+ this.#headers,
18543
+ this.#statusMessage
18544
+ );
18545
+ }
18546
+ } catch {
18547
+ waitingHandler.done = true;
18548
+ return true;
18549
+ }
18550
+ if (!waitingController.aborted) {
18551
+ this.#waitingHandlers.push(waitingHandler);
18552
+ }
18553
+ return true;
17370
18554
  }
17371
18555
  /**
17372
- * @param {() => void} abort
18556
+ * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller
17373
18557
  * @param {any} context
17374
18558
  */
17375
18559
  onRequestStart(controller, context) {
@@ -17392,26 +18576,95 @@ var require_deduplication_handler = __commonJS({
17392
18576
  * @param {string} statusMessage
17393
18577
  */
17394
18578
  onResponseStart(controller, statusCode, headers, statusMessage) {
18579
+ this.#responseStarted = true;
17395
18580
  this.#statusCode = statusCode;
17396
18581
  this.#headers = headers;
17397
18582
  this.#statusMessage = statusMessage;
17398
18583
  this.#primaryHandler.onResponseStart?.(controller, statusCode, headers, statusMessage);
18584
+ for (const waitingHandler of this.#waitingHandlers) {
18585
+ const { handler, controller: waitingController } = waitingHandler;
18586
+ if (waitingHandler.done || waitingController.aborted) {
18587
+ waitingHandler.done = true;
18588
+ continue;
18589
+ }
18590
+ try {
18591
+ handler.onResponseStart?.(
18592
+ waitingController,
18593
+ statusCode,
18594
+ headers,
18595
+ statusMessage
18596
+ );
18597
+ } catch {
18598
+ }
18599
+ if (waitingController.aborted) {
18600
+ waitingHandler.done = true;
18601
+ }
18602
+ }
18603
+ this.#pruneDoneWaitingHandlers();
17399
18604
  }
17400
18605
  /**
17401
18606
  * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller
17402
18607
  * @param {Buffer} chunk
17403
18608
  */
17404
18609
  onResponseData(controller, chunk) {
17405
- this.#chunks.push(Buffer.from(chunk));
18610
+ if (this.#aborted || this.#completed) {
18611
+ return;
18612
+ }
18613
+ this.#responseDataStarted = true;
17406
18614
  this.#primaryHandler.onResponseData?.(controller, chunk);
18615
+ for (const waitingHandler of this.#waitingHandlers) {
18616
+ const { handler, controller: waitingController } = waitingHandler;
18617
+ if (waitingHandler.done || waitingController.aborted) {
18618
+ waitingHandler.done = true;
18619
+ continue;
18620
+ }
18621
+ if (waitingController.paused) {
18622
+ this.#bufferWaitingChunk(waitingHandler, chunk);
18623
+ continue;
18624
+ }
18625
+ try {
18626
+ handler.onResponseData?.(waitingController, chunk);
18627
+ } catch {
18628
+ }
18629
+ if (waitingController.aborted) {
18630
+ waitingHandler.done = true;
18631
+ waitingHandler.bufferedChunks = [];
18632
+ waitingHandler.bufferedBytes = 0;
18633
+ }
18634
+ }
18635
+ this.#pruneDoneWaitingHandlers();
17407
18636
  }
17408
18637
  /**
17409
18638
  * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller
17410
18639
  * @param {object} trailers
17411
18640
  */
17412
18641
  onResponseEnd(controller, trailers) {
18642
+ if (this.#aborted || this.#completed) {
18643
+ return;
18644
+ }
18645
+ this.#completed = true;
17413
18646
  this.#primaryHandler.onResponseEnd?.(controller, trailers);
17414
- this.#notifyWaitingHandlers();
18647
+ for (const waitingHandler of this.#waitingHandlers) {
18648
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
18649
+ waitingHandler.done = true;
18650
+ continue;
18651
+ }
18652
+ this.#flushWaitingHandler(waitingHandler);
18653
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
18654
+ waitingHandler.done = true;
18655
+ continue;
18656
+ }
18657
+ if (waitingHandler.controller.paused && waitingHandler.bufferedChunks.length > 0) {
18658
+ waitingHandler.pendingTrailers = trailers;
18659
+ continue;
18660
+ }
18661
+ try {
18662
+ waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, trailers);
18663
+ } catch {
18664
+ }
18665
+ waitingHandler.done = true;
18666
+ }
18667
+ this.#pruneDoneWaitingHandlers();
17415
18668
  this.#onComplete?.();
17416
18669
  }
17417
18670
  /**
@@ -17419,89 +18672,138 @@ var require_deduplication_handler = __commonJS({
17419
18672
  * @param {Error} err
17420
18673
  */
17421
18674
  onResponseError(controller, err) {
18675
+ if (this.#completed) {
18676
+ return;
18677
+ }
17422
18678
  this.#aborted = true;
18679
+ this.#completed = true;
17423
18680
  this.#primaryHandler.onResponseError?.(controller, err);
17424
- this.#notifyWaitingHandlersError(err);
18681
+ for (const waitingHandler of this.#waitingHandlers) {
18682
+ this.#errorWaitingHandler(waitingHandler, err);
18683
+ }
18684
+ this.#waitingHandlers = [];
17425
18685
  this.#onComplete?.();
17426
18686
  }
17427
18687
  /**
17428
- * Notify all waiting handlers with the buffered response
18688
+ * @param {DispatchHandler} handler
18689
+ * @returns {WaitingHandler}
17429
18690
  */
17430
- #notifyWaitingHandlers() {
17431
- const body = Buffer.concat(this.#chunks);
17432
- for (const handler of this.#waitingHandlers) {
17433
- const waitingController = {
17434
- resume() {
17435
- },
17436
- pause() {
17437
- },
17438
- get paused() {
17439
- return false;
17440
- },
17441
- get aborted() {
17442
- return false;
17443
- },
17444
- get reason() {
17445
- return null;
17446
- },
17447
- abort() {
17448
- }
17449
- };
17450
- try {
17451
- handler.onRequestStart?.(waitingController, null);
17452
- if (waitingController.aborted) {
17453
- continue;
18691
+ #createWaitingHandler(handler) {
18692
+ const waitingHandler = {
18693
+ handler,
18694
+ controller: null,
18695
+ bufferedChunks: [],
18696
+ bufferedBytes: 0,
18697
+ pendingTrailers: null,
18698
+ done: false
18699
+ };
18700
+ const state = {
18701
+ aborted: false,
18702
+ paused: false,
18703
+ reason: null
18704
+ };
18705
+ waitingHandler.controller = {
18706
+ resume: () => {
18707
+ if (state.aborted) {
18708
+ return;
17454
18709
  }
17455
- handler.onResponseStart?.(
17456
- waitingController,
17457
- this.#statusCode,
17458
- this.#headers,
17459
- this.#statusMessage
17460
- );
17461
- if (waitingController.aborted) {
17462
- continue;
18710
+ state.paused = false;
18711
+ this.#flushWaitingHandler(waitingHandler);
18712
+ if (this.#completed && waitingHandler.pendingTrailers && waitingHandler.bufferedChunks.length === 0 && !state.paused && !state.aborted) {
18713
+ try {
18714
+ waitingHandler.handler.onResponseEnd?.(waitingHandler.controller, waitingHandler.pendingTrailers);
18715
+ } catch {
18716
+ }
18717
+ waitingHandler.pendingTrailers = null;
18718
+ waitingHandler.done = true;
17463
18719
  }
17464
- if (body.length > 0) {
17465
- handler.onResponseData?.(waitingController, body);
18720
+ this.#pruneDoneWaitingHandlers();
18721
+ },
18722
+ pause: () => {
18723
+ if (!state.aborted) {
18724
+ state.paused = true;
17466
18725
  }
17467
- handler.onResponseEnd?.(waitingController, {});
17468
- } catch {
18726
+ },
18727
+ get paused() {
18728
+ return state.paused;
18729
+ },
18730
+ get aborted() {
18731
+ return state.aborted;
18732
+ },
18733
+ get reason() {
18734
+ return state.reason;
18735
+ },
18736
+ abort: (reason) => {
18737
+ state.aborted = true;
18738
+ state.reason = reason ?? null;
18739
+ waitingHandler.done = true;
18740
+ waitingHandler.pendingTrailers = null;
18741
+ waitingHandler.bufferedChunks = [];
18742
+ waitingHandler.bufferedBytes = 0;
17469
18743
  }
18744
+ };
18745
+ return waitingHandler;
18746
+ }
18747
+ /**
18748
+ * @param {WaitingHandler} waitingHandler
18749
+ * @param {Buffer} chunk
18750
+ */
18751
+ #bufferWaitingChunk(waitingHandler, chunk) {
18752
+ if (waitingHandler.done || waitingHandler.controller.aborted) {
18753
+ waitingHandler.done = true;
18754
+ waitingHandler.bufferedChunks = [];
18755
+ waitingHandler.bufferedBytes = 0;
18756
+ return;
18757
+ }
18758
+ const bufferedChunk = Buffer.from(chunk);
18759
+ waitingHandler.bufferedChunks.push(bufferedChunk);
18760
+ waitingHandler.bufferedBytes += bufferedChunk.length;
18761
+ if (waitingHandler.bufferedBytes > this.#maxBufferSize) {
18762
+ const err = new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`);
18763
+ this.#errorWaitingHandler(waitingHandler, err);
17470
18764
  }
17471
- this.#waitingHandlers = [];
17472
- this.#chunks = [];
17473
18765
  }
17474
18766
  /**
17475
- * Notify all waiting handlers of an error
17476
- * @param {Error} err
18767
+ * @param {WaitingHandler} waitingHandler
17477
18768
  */
17478
- #notifyWaitingHandlersError(err) {
17479
- for (const handler of this.#waitingHandlers) {
17480
- const waitingController = {
17481
- resume() {
17482
- },
17483
- pause() {
17484
- },
17485
- get paused() {
17486
- return false;
17487
- },
17488
- get aborted() {
17489
- return true;
17490
- },
17491
- get reason() {
17492
- return err;
17493
- },
17494
- abort() {
17495
- }
17496
- };
18769
+ #flushWaitingHandler(waitingHandler) {
18770
+ const { handler, controller } = waitingHandler;
18771
+ while (!waitingHandler.done && !controller.aborted && !controller.paused && waitingHandler.bufferedChunks.length > 0) {
18772
+ const bufferedChunk = waitingHandler.bufferedChunks.shift();
18773
+ waitingHandler.bufferedBytes -= bufferedChunk.length;
17497
18774
  try {
17498
- handler.onRequestStart?.(waitingController, null);
17499
- handler.onResponseError?.(waitingController, err);
18775
+ handler.onResponseData?.(controller, bufferedChunk);
17500
18776
  } catch {
17501
18777
  }
18778
+ if (controller.aborted) {
18779
+ waitingHandler.done = true;
18780
+ waitingHandler.pendingTrailers = null;
18781
+ waitingHandler.bufferedChunks = [];
18782
+ waitingHandler.bufferedBytes = 0;
18783
+ break;
18784
+ }
17502
18785
  }
17503
- this.#waitingHandlers = [];
17504
- this.#chunks = [];
18786
+ }
18787
+ /**
18788
+ * @param {WaitingHandler} waitingHandler
18789
+ * @param {Error} err
18790
+ */
18791
+ #errorWaitingHandler(waitingHandler, err) {
18792
+ if (waitingHandler.done) {
18793
+ return;
18794
+ }
18795
+ waitingHandler.done = true;
18796
+ waitingHandler.pendingTrailers = null;
18797
+ waitingHandler.bufferedChunks = [];
18798
+ waitingHandler.bufferedBytes = 0;
18799
+ try {
18800
+ waitingHandler.controller.abort(err);
18801
+ waitingHandler.handler.onResponseError?.(waitingHandler.controller, err);
18802
+ } catch {
18803
+ }
18804
+ }
18805
+ #pruneDoneWaitingHandlers() {
18806
+ this.#waitingHandlers = this.#waitingHandlers.filter((waitingHandler) => waitingHandler.done === false);
17505
18807
  }
17506
18808
  };
17507
18809
  module2.exports = DeduplicationHandler;
@@ -17521,7 +18823,8 @@ var require_deduplicate = __commonJS({
17521
18823
  const {
17522
18824
  methods = ["GET"],
17523
18825
  skipHeaderNames = [],
17524
- excludeHeaderNames = []
18826
+ excludeHeaderNames = [],
18827
+ maxBufferSize = 5 * 1024 * 1024
17525
18828
  } = opts;
17526
18829
  if (typeof opts !== "object" || opts === null) {
17527
18830
  throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? "null" : typeof opts}`);
@@ -17540,13 +18843,15 @@ var require_deduplicate = __commonJS({
17540
18843
  if (!Array.isArray(excludeHeaderNames)) {
17541
18844
  throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`);
17542
18845
  }
18846
+ if (!Number.isFinite(maxBufferSize) || maxBufferSize <= 0) {
18847
+ throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`);
18848
+ }
17543
18849
  const skipHeaderNamesSet = new Set(skipHeaderNames.map((name) => name.toLowerCase()));
17544
18850
  const excludeHeaderNamesSet = new Set(excludeHeaderNames.map((name) => name.toLowerCase()));
17545
- const safeMethodsToNotDeduplicate = util.safeHTTPMethods.filter((method) => methods.includes(method) === false);
17546
18851
  const pendingRequests = /* @__PURE__ */ new Map();
17547
18852
  return (dispatch) => {
17548
18853
  return (opts2, handler) => {
17549
- if (!opts2.origin || safeMethodsToNotDeduplicate.includes(opts2.method)) {
18854
+ if (!opts2.origin || methods.includes(opts2.method) === false) {
17550
18855
  return dispatch(opts2, handler);
17551
18856
  }
17552
18857
  opts2 = {
@@ -17564,8 +18869,10 @@ var require_deduplicate = __commonJS({
17564
18869
  const dedupeKey = makeDeduplicationKey(cacheKey, excludeHeaderNamesSet);
17565
18870
  const pendingHandler = pendingRequests.get(dedupeKey);
17566
18871
  if (pendingHandler) {
17567
- pendingHandler.addWaitingHandler(handler);
17568
- return true;
18872
+ if (pendingHandler.addWaitingHandler(handler)) {
18873
+ return true;
18874
+ }
18875
+ return dispatch(opts2, handler);
17569
18876
  }
17570
18877
  const deduplicationHandler = new DeduplicationHandler(
17571
18878
  handler,
@@ -17574,7 +18881,8 @@ var require_deduplicate = __commonJS({
17574
18881
  if (pendingRequestsChannel.hasSubscribers) {
17575
18882
  pendingRequestsChannel.publish({ size: pendingRequests.size, key: dedupeKey, type: "removed" });
17576
18883
  }
17577
- }
18884
+ },
18885
+ maxBufferSize
17578
18886
  );
17579
18887
  pendingRequests.set(dedupeKey, deduplicationHandler);
17580
18888
  if (pendingRequestsChannel.hasSubscribers) {
@@ -18555,7 +19863,7 @@ var require_response = __commonJS({
18555
19863
  });
18556
19864
  }
18557
19865
  const clonedResponse = cloneResponse(this.#state);
18558
- if (this.#state.body?.stream) {
19866
+ if (this.#state.urlList.length !== 0 && this.#state.body?.stream) {
18559
19867
  streamRegistry.register(this, new WeakRef(this.#state.body.stream));
18560
19868
  }
18561
19869
  return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers));
@@ -18766,7 +20074,7 @@ var require_response = __commonJS({
18766
20074
  setResponseHeaders(response, headers);
18767
20075
  setHeadersList(headers, innerResponse.headersList);
18768
20076
  setHeadersGuard(headers, guard);
18769
- if (innerResponse.body?.stream) {
20077
+ if (innerResponse.urlList.length !== 0 && innerResponse.body?.stream) {
18770
20078
  streamRegistry.register(response, new WeakRef(innerResponse.body.stream));
18771
20079
  }
18772
20080
  return response;
@@ -19425,6 +20733,8 @@ var require_request2 = __commonJS({
19425
20733
  preventNoCacheCacheControlHeaderModification: init.preventNoCacheCacheControlHeaderModification ?? false,
19426
20734
  done: init.done ?? false,
19427
20735
  timingAllowFailed: init.timingAllowFailed ?? false,
20736
+ useURLCredentials: init.useURLCredentials ?? void 0,
20737
+ traversableForUserPrompts: init.traversableForUserPrompts ?? "client",
19428
20738
  urlList: init.urlList,
19429
20739
  url: init.urlList[0],
19430
20740
  headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList()
@@ -19766,7 +21076,10 @@ var require_fetch = __commonJS({
19766
21076
  simpleRangeHeaderValue,
19767
21077
  buildContentRange,
19768
21078
  createInflate,
19769
- extractMimeType
21079
+ extractMimeType,
21080
+ hasAuthenticationEntry,
21081
+ includesCredentials,
21082
+ isTraversableNavigable
19770
21083
  } = require_util2();
19771
21084
  var assert5 = require("assert");
19772
21085
  var { safelyExtractBody, extractBody } = require_body();
@@ -19837,7 +21150,7 @@ var require_fetch = __commonJS({
19837
21150
  }
19838
21151
  const request = getRequestState(requestObject);
19839
21152
  if (requestObject.signal.aborted) {
19840
- abortFetch(p, request, null, requestObject.signal.reason);
21153
+ abortFetch(p, request, null, requestObject.signal.reason, null);
19841
21154
  return p.promise;
19842
21155
  }
19843
21156
  const globalObject = request.client.globalObject;
@@ -19854,7 +21167,7 @@ var require_fetch = __commonJS({
19854
21167
  assert5(controller != null);
19855
21168
  controller.abort(requestObject.signal.reason);
19856
21169
  const realResponse = responseObject?.deref();
19857
- abortFetch(p, request, realResponse, requestObject.signal.reason);
21170
+ abortFetch(p, request, realResponse, requestObject.signal.reason, controller.controller);
19858
21171
  }
19859
21172
  );
19860
21173
  const processResponse = (response) => {
@@ -19862,7 +21175,7 @@ var require_fetch = __commonJS({
19862
21175
  return;
19863
21176
  }
19864
21177
  if (response.aborted) {
19865
- abortFetch(p, request, responseObject, controller.serializedAbortReason);
21178
+ abortFetch(p, request, responseObject, controller.serializedAbortReason, controller.controller);
19866
21179
  return;
19867
21180
  }
19868
21181
  if (response.type === "error") {
@@ -19877,8 +21190,11 @@ var require_fetch = __commonJS({
19877
21190
  request,
19878
21191
  processResponseEndOfBody: handleFetchDone,
19879
21192
  processResponse,
19880
- dispatcher: getRequestDispatcher(requestObject)
21193
+ dispatcher: getRequestDispatcher(requestObject),
19881
21194
  // undici
21195
+ // Keep requestObject alive to prevent its AbortController from being GC'd
21196
+ // See https://github.com/nodejs/undici/issues/4627
21197
+ requestObject
19882
21198
  });
19883
21199
  return p.promise;
19884
21200
  }
@@ -19918,7 +21234,7 @@ var require_fetch = __commonJS({
19918
21234
  );
19919
21235
  }
19920
21236
  var markResourceTiming = performance.markResourceTiming;
19921
- function abortFetch(p, request, responseObject, error) {
21237
+ function abortFetch(p, request, responseObject, error, controller) {
19922
21238
  if (p) {
19923
21239
  p.reject(error);
19924
21240
  }
@@ -19935,12 +21251,7 @@ var require_fetch = __commonJS({
19935
21251
  }
19936
21252
  const response = getResponseState(responseObject);
19937
21253
  if (response.body?.stream != null && isReadable(response.body.stream)) {
19938
- response.body.stream.cancel(error).catch((err) => {
19939
- if (err.code === "ERR_INVALID_STATE") {
19940
- return;
19941
- }
19942
- throw err;
19943
- });
21254
+ controller.error(error);
19944
21255
  }
19945
21256
  }
19946
21257
  function fetching({
@@ -19951,8 +21262,10 @@ var require_fetch = __commonJS({
19951
21262
  processResponseEndOfBody,
19952
21263
  processResponseConsumeBody,
19953
21264
  useParallelQueue = false,
19954
- dispatcher = getGlobalDispatcher()
21265
+ dispatcher = getGlobalDispatcher(),
19955
21266
  // undici
21267
+ requestObject = null
21268
+ // Keep alive to prevent AbortController GC, see #4627
19956
21269
  }) {
19957
21270
  assert5(dispatcher);
19958
21271
  let taskDestination = null;
@@ -19975,7 +21288,9 @@ var require_fetch = __commonJS({
19975
21288
  processResponseConsumeBody,
19976
21289
  processResponseEndOfBody,
19977
21290
  taskDestination,
19978
- crossOriginIsolatedCapability
21291
+ crossOriginIsolatedCapability,
21292
+ // Keep requestObject alive to prevent its AbortController from being GC'd
21293
+ requestObject
19979
21294
  };
19980
21295
  assert5(!request.body || request.body.stream);
19981
21296
  if (request.window === "client") {
@@ -20424,6 +21739,17 @@ var require_fetch = __commonJS({
20424
21739
  }
20425
21740
  httpRequest.headersList.delete("host", true);
20426
21741
  if (includeCredentials) {
21742
+ if (!httpRequest.headersList.contains("authorization", true)) {
21743
+ let authorizationValue = null;
21744
+ if (hasAuthenticationEntry(httpRequest) && (httpRequest.useURLCredentials === void 0 || !includesCredentials(requestCurrentURL(httpRequest)))) {
21745
+ } else if (includesCredentials(requestCurrentURL(httpRequest)) && isAuthenticationFetch) {
21746
+ const { username, password } = requestCurrentURL(httpRequest);
21747
+ authorizationValue = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
21748
+ }
21749
+ if (authorizationValue !== null) {
21750
+ httpRequest.headersList.append("Authorization", authorizationValue, false);
21751
+ }
21752
+ }
20427
21753
  }
20428
21754
  if (httpCache == null) {
20429
21755
  httpRequest.cache = "no-store";
@@ -20452,6 +21778,22 @@ var require_fetch = __commonJS({
20452
21778
  response.rangeRequested = true;
20453
21779
  }
20454
21780
  response.requestIncludesCredentials = includeCredentials;
21781
+ if (response.status === 401 && httpRequest.responseTainting !== "cors" && includeCredentials && isTraversableNavigable(request.traversableForUserPrompts)) {
21782
+ if (request.body != null) {
21783
+ if (request.body.source == null) {
21784
+ return makeNetworkError("expected non-null body source");
21785
+ }
21786
+ request.body = safelyExtractBody(request.body.source)[0];
21787
+ }
21788
+ if (request.useURLCredentials === void 0 || isAuthenticationFetch) {
21789
+ if (isCancelled(fetchParams)) {
21790
+ return makeAppropriateNetworkError(fetchParams);
21791
+ }
21792
+ return response;
21793
+ }
21794
+ fetchParams.controller.connection.destroy();
21795
+ response = await httpNetworkOrCacheFetch(fetchParams, true);
21796
+ }
20455
21797
  if (response.status === 407) {
20456
21798
  if (request.window === "no-window") {
20457
21799
  return makeNetworkError();
@@ -20646,9 +21988,11 @@ var require_fetch = __commonJS({
20646
21988
  function dispatch({ body }) {
20647
21989
  const url = requestCurrentURL(request);
20648
21990
  const agent = fetchParams.controller.dispatcher;
21991
+ const path26 = url.pathname + url.search;
21992
+ const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === "?";
20649
21993
  return new Promise((resolve4, reject) => agent.dispatch(
20650
21994
  {
20651
- path: url.pathname + url.search,
21995
+ path: hasTrailingQuestionMark ? `${path26}?` : path26,
20652
21996
  origin: url.origin,
20653
21997
  method: request.method,
20654
21998
  body: agent.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
@@ -20761,6 +22105,32 @@ var require_fetch = __commonJS({
20761
22105
  fetchParams.controller.terminate(error);
20762
22106
  reject(error);
20763
22107
  },
22108
+ onRequestUpgrade(_controller, status, headers, socket) {
22109
+ if (socket.session != null && status !== 200 || socket.session == null && status !== 101) {
22110
+ return false;
22111
+ }
22112
+ const headersList = new HeadersList();
22113
+ for (const [name, value] of Object.entries(headers)) {
22114
+ if (value == null) {
22115
+ continue;
22116
+ }
22117
+ const headerName = name.toLowerCase();
22118
+ if (Array.isArray(value)) {
22119
+ for (const entry of value) {
22120
+ headersList.append(headerName, String(entry), true);
22121
+ }
22122
+ } else {
22123
+ headersList.append(headerName, String(value), true);
22124
+ }
22125
+ }
22126
+ resolve4({
22127
+ status,
22128
+ statusText: STATUS_CODES[status],
22129
+ headersList,
22130
+ socket
22131
+ });
22132
+ return true;
22133
+ },
20764
22134
  onUpgrade(status, rawHeaders, socket) {
20765
22135
  if (socket.session != null && status !== 200 || socket.session == null && status !== 101) {
20766
22136
  return false;
@@ -21309,8 +22679,8 @@ var require_cache3 = __commonJS({
21309
22679
  }
21310
22680
  const responseList = [];
21311
22681
  for (const response of responses) {
21312
- const responseObject = fromInnerResponse(response, "immutable");
21313
- responseList.push(responseObject.clone());
22682
+ const responseObject = fromInnerResponse(cloneResponse(response), "immutable");
22683
+ responseList.push(responseObject);
21314
22684
  if (responseList.length >= maxResponses) {
21315
22685
  break;
21316
22686
  }
@@ -22359,13 +23729,17 @@ var require_util5 = __commonJS({
22359
23729
  return extensionList;
22360
23730
  }
22361
23731
  function isValidClientWindowBits(value) {
23732
+ if (value.length === 0) {
23733
+ return false;
23734
+ }
22362
23735
  for (let i = 0; i < value.length; i++) {
22363
23736
  const byte = value.charCodeAt(i);
22364
23737
  if (byte < 48 || byte > 57) {
22365
23738
  return false;
22366
23739
  }
22367
23740
  }
22368
- return true;
23741
+ const num = Number.parseInt(value, 10);
23742
+ return num >= 8 && num <= 15;
22369
23743
  }
22370
23744
  function getURLRecord(url, baseURL) {
22371
23745
  let urlRecord;
@@ -22566,7 +23940,8 @@ var require_connection = __commonJS({
22566
23940
  mode: "websocket",
22567
23941
  credentials: "include",
22568
23942
  cache: "no-store",
22569
- redirect: "error"
23943
+ redirect: "error",
23944
+ useURLCredentials: true
22570
23945
  });
22571
23946
  if (options.headers) {
22572
23947
  const headersList = getHeadersList(new Headers(options.headers));
@@ -22701,18 +24076,31 @@ var require_permessage_deflate = __commonJS({
22701
24076
  "use strict";
22702
24077
  var { createInflateRaw, Z_DEFAULT_WINDOWBITS } = require("zlib");
22703
24078
  var { isValidClientWindowBits } = require_util5();
24079
+ var { MessageSizeExceededError } = require_errors();
22704
24080
  var tail = Buffer.from([0, 0, 255, 255]);
22705
24081
  var kBuffer = /* @__PURE__ */ Symbol("kBuffer");
22706
24082
  var kLength = /* @__PURE__ */ Symbol("kLength");
24083
+ var kDefaultMaxDecompressedSize = 4 * 1024 * 1024;
22707
24084
  var PerMessageDeflate = class {
22708
24085
  /** @type {import('node:zlib').InflateRaw} */
22709
24086
  #inflate;
22710
24087
  #options = {};
24088
+ /** @type {boolean} */
24089
+ #aborted = false;
24090
+ /** @type {Function|null} */
24091
+ #currentCallback = null;
24092
+ /**
24093
+ * @param {Map<string, string>} extensions
24094
+ */
22711
24095
  constructor(extensions) {
22712
24096
  this.#options.serverNoContextTakeover = extensions.has("server_no_context_takeover");
22713
24097
  this.#options.serverMaxWindowBits = extensions.get("server_max_window_bits");
22714
24098
  }
22715
24099
  decompress(chunk, fin, callback) {
24100
+ if (this.#aborted) {
24101
+ callback(new MessageSizeExceededError());
24102
+ return;
24103
+ }
22716
24104
  if (!this.#inflate) {
22717
24105
  let windowBits = Z_DEFAULT_WINDOWBITS;
22718
24106
  if (this.#options.serverMaxWindowBits) {
@@ -22722,26 +24110,51 @@ var require_permessage_deflate = __commonJS({
22722
24110
  }
22723
24111
  windowBits = Number.parseInt(this.#options.serverMaxWindowBits);
22724
24112
  }
22725
- this.#inflate = createInflateRaw({ windowBits });
24113
+ try {
24114
+ this.#inflate = createInflateRaw({ windowBits });
24115
+ } catch (err) {
24116
+ callback(err);
24117
+ return;
24118
+ }
22726
24119
  this.#inflate[kBuffer] = [];
22727
24120
  this.#inflate[kLength] = 0;
22728
24121
  this.#inflate.on("data", (data) => {
22729
- this.#inflate[kBuffer].push(data);
24122
+ if (this.#aborted) {
24123
+ return;
24124
+ }
22730
24125
  this.#inflate[kLength] += data.length;
24126
+ if (this.#inflate[kLength] > kDefaultMaxDecompressedSize) {
24127
+ this.#aborted = true;
24128
+ this.#inflate.removeAllListeners();
24129
+ this.#inflate.destroy();
24130
+ this.#inflate = null;
24131
+ if (this.#currentCallback) {
24132
+ const cb = this.#currentCallback;
24133
+ this.#currentCallback = null;
24134
+ cb(new MessageSizeExceededError());
24135
+ }
24136
+ return;
24137
+ }
24138
+ this.#inflate[kBuffer].push(data);
22731
24139
  });
22732
24140
  this.#inflate.on("error", (err) => {
22733
24141
  this.#inflate = null;
22734
24142
  callback(err);
22735
24143
  });
22736
24144
  }
24145
+ this.#currentCallback = callback;
22737
24146
  this.#inflate.write(chunk);
22738
24147
  if (fin) {
22739
24148
  this.#inflate.write(tail);
22740
24149
  }
22741
24150
  this.#inflate.flush(() => {
24151
+ if (this.#aborted || !this.#inflate) {
24152
+ return;
24153
+ }
22742
24154
  const full = Buffer.concat(this.#inflate[kBuffer], this.#inflate[kLength]);
22743
24155
  this.#inflate[kBuffer].length = 0;
22744
24156
  this.#inflate[kLength] = 0;
24157
+ this.#currentCallback = null;
22745
24158
  callback(null, full);
22746
24159
  });
22747
24160
  }
@@ -22769,6 +24182,7 @@ var require_receiver = __commonJS({
22769
24182
  var { failWebsocketConnection } = require_connection();
22770
24183
  var { WebsocketFrameSend } = require_frame();
22771
24184
  var { PerMessageDeflate } = require_permessage_deflate();
24185
+ var { MessageSizeExceededError } = require_errors();
22772
24186
  var ByteParser = class extends Writable {
22773
24187
  #buffers = [];
22774
24188
  #fragmentsBytes = 0;
@@ -22781,6 +24195,10 @@ var require_receiver = __commonJS({
22781
24195
  #extensions;
22782
24196
  /** @type {import('./websocket').Handler} */
22783
24197
  #handler;
24198
+ /**
24199
+ * @param {import('./websocket').Handler} handler
24200
+ * @param {Map<string, string>|null} extensions
24201
+ */
22784
24202
  constructor(handler, extensions) {
22785
24203
  super();
22786
24204
  this.#handler = handler;
@@ -22884,12 +24302,12 @@ var require_receiver = __commonJS({
22884
24302
  }
22885
24303
  const buffer = this.consume(8);
22886
24304
  const upper = buffer.readUInt32BE(0);
22887
- if (upper > 2 ** 31 - 1) {
24305
+ const lower = buffer.readUInt32BE(4);
24306
+ if (upper !== 0 || lower > 2 ** 31 - 1) {
22888
24307
  failWebsocketConnection(this.#handler, 1009, "Received payload length > 2^31 bytes.");
22889
24308
  return;
22890
24309
  }
22891
- const lower = buffer.readUInt32BE(4);
22892
- this.#info.payloadLength = (upper << 8) + lower;
24310
+ this.#info.payloadLength = lower;
22893
24311
  this.#state = parserStates.READ_DATA;
22894
24312
  } else if (this.#state === parserStates.READ_DATA) {
22895
24313
  if (this.#byteOffset < this.#info.payloadLength) {
@@ -22909,7 +24327,8 @@ var require_receiver = __commonJS({
22909
24327
  } else {
22910
24328
  this.#extensions.get("permessage-deflate").decompress(body, this.#info.fin, (error, data) => {
22911
24329
  if (error) {
22912
- failWebsocketConnection(this.#handler, 1007, error.message);
24330
+ const code = error instanceof MessageSizeExceededError ? 1009 : 1007;
24331
+ failWebsocketConnection(this.#handler, code, error.message);
22913
24332
  return;
22914
24333
  }
22915
24334
  this.writeFragments(data);
@@ -23177,6 +24596,15 @@ var require_websocket = __commonJS({
23177
24596
  var { SendQueue } = require_sender();
23178
24597
  var { WebsocketFrameSend } = require_frame();
23179
24598
  var { channels } = require_diagnostics();
24599
+ function getSocketAddress(socket) {
24600
+ if (typeof socket?.address === "function") {
24601
+ return socket.address();
24602
+ }
24603
+ if (typeof socket?.session?.socket?.address === "function") {
24604
+ return socket.session.socket.address();
24605
+ }
24606
+ return null;
24607
+ }
23180
24608
  var WebSocket = class _WebSocket extends EventTarget {
23181
24609
  #events = {
23182
24610
  open: null,
@@ -23448,7 +24876,7 @@ var require_websocket = __commonJS({
23448
24876
  if (channels.open.hasSubscribers) {
23449
24877
  const headers = response.headersList.entries;
23450
24878
  channels.open.publish({
23451
- address: response.socket.address(),
24879
+ address: getSocketAddress(response.socket),
23452
24880
  protocol: this.#protocol,
23453
24881
  extensions: this.#extensions,
23454
24882
  websocket: this,
@@ -23935,7 +25363,7 @@ var require_websocketstream = __commonJS({
23935
25363
  if (!this.#handler.wasEverConnected) {
23936
25364
  this.#openedPromise.reject(new WebSocketError("Socket never opened"));
23937
25365
  }
23938
- const result = this.#parser.closingInfo;
25366
+ const result = this.#parser?.closingInfo;
23939
25367
  let code = result?.code ?? 1005;
23940
25368
  if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
23941
25369
  code = 1006;
@@ -23952,8 +25380,8 @@ var require_websocketstream = __commonJS({
23952
25380
  });
23953
25381
  } else {
23954
25382
  const error = createUnvalidatedWebSocketError("unclean close", code, reason);
23955
- this.#readableStreamController.error(error);
23956
- this.#writableStream.abort(error);
25383
+ this.#readableStreamController?.error(error);
25384
+ this.#writableStream?.abort(error);
23957
25385
  this.#closedPromise.reject(error);
23958
25386
  }
23959
25387
  }
@@ -24596,6 +26024,7 @@ var require_undici = __commonJS({
24596
26024
  var RoundRobinPool = require_round_robin_pool();
24597
26025
  var Agent = require_agent();
24598
26026
  var ProxyAgent2 = require_proxy_agent();
26027
+ var Socks5ProxyAgent = require_socks5_proxy_agent();
24599
26028
  var EnvHttpProxyAgent = require_env_http_proxy_agent();
24600
26029
  var RetryAgent = require_retry_agent();
24601
26030
  var H2CClient = require_h2c_client();
@@ -24622,6 +26051,7 @@ var require_undici = __commonJS({
24622
26051
  module2.exports.RoundRobinPool = RoundRobinPool;
24623
26052
  module2.exports.Agent = Agent;
24624
26053
  module2.exports.ProxyAgent = ProxyAgent2;
26054
+ module2.exports.Socks5ProxyAgent = Socks5ProxyAgent;
24625
26055
  module2.exports.EnvHttpProxyAgent = EnvHttpProxyAgent;
24626
26056
  module2.exports.RetryAgent = RetryAgent;
24627
26057
  module2.exports.H2CClient = H2CClient;
@@ -24691,10 +26121,31 @@ var require_undici = __commonJS({
24691
26121
  module2.exports.setGlobalDispatcher = setGlobalDispatcher;
24692
26122
  module2.exports.getGlobalDispatcher = getGlobalDispatcher;
24693
26123
  var fetchImpl = require_fetch().fetch;
26124
+ var currentFilename = typeof __filename !== "undefined" ? __filename : void 0;
26125
+ function appendFetchStackTrace(err, filename) {
26126
+ if (!err || typeof err !== "object") {
26127
+ return;
26128
+ }
26129
+ const stack = typeof err.stack === "string" ? err.stack : "";
26130
+ const normalizedFilename = filename.replace(/\\/g, "/");
26131
+ if (stack && (stack.includes(filename) || stack.includes(normalizedFilename))) {
26132
+ return;
26133
+ }
26134
+ const capture = {};
26135
+ Error.captureStackTrace(capture, appendFetchStackTrace);
26136
+ if (!capture.stack) {
26137
+ return;
26138
+ }
26139
+ const captureLines = capture.stack.split("\n").slice(1).join("\n");
26140
+ err.stack = stack ? `${stack}
26141
+ ${captureLines}` : capture.stack;
26142
+ }
24694
26143
  module2.exports.fetch = function fetch2(init, options = void 0) {
24695
26144
  return fetchImpl(init, options).catch((err) => {
24696
- if (err && typeof err === "object") {
24697
- Error.captureStackTrace(err);
26145
+ if (currentFilename) {
26146
+ appendFetchStackTrace(err, currentFilename);
26147
+ } else if (err && typeof err === "object") {
26148
+ Error.captureStackTrace(err, module2.exports.fetch);
24698
26149
  }
24699
26150
  throw err;
24700
26151
  });
@@ -24850,42 +26301,6 @@ var init_proxy2 = __esm({
24850
26301
  }
24851
26302
  });
24852
26303
 
24853
- // src/utils/mergeSystemMessagesMiddleware.ts
24854
- var mergeSystemMessagesMiddleware;
24855
- var init_mergeSystemMessagesMiddleware = __esm({
24856
- "src/utils/mergeSystemMessagesMiddleware.ts"() {
24857
- "use strict";
24858
- mergeSystemMessagesMiddleware = {
24859
- specificationVersion: "v3",
24860
- transformParams: async ({ params }) => {
24861
- const mergedPrompt = [];
24862
- let pendingSystemContent = [];
24863
- for (const msg of params.prompt) {
24864
- if (msg.role === "system") {
24865
- pendingSystemContent.push(msg.content);
24866
- } else {
24867
- if (pendingSystemContent.length > 0) {
24868
- mergedPrompt.push({
24869
- role: "system",
24870
- content: pendingSystemContent.join("\n\n")
24871
- });
24872
- pendingSystemContent = [];
24873
- }
24874
- mergedPrompt.push(msg);
24875
- }
24876
- }
24877
- if (pendingSystemContent.length > 0) {
24878
- mergedPrompt.push({
24879
- role: "system",
24880
- content: pendingSystemContent.join("\n\n")
24881
- });
24882
- }
24883
- return { ...params, prompt: mergedPrompt };
24884
- }
24885
- };
24886
- }
24887
- });
24888
-
24889
26304
  // src/core/model/providers.ts
24890
26305
  var import_anthropic, import_cerebras, import_google, import_huggingface, import_openai, import_openai_compatible, import_xai, import_ai_sdk_provider, import_ai_sdk_provider2, import_ai, import_assert, defaultModelCreator, defaultAnthropicModelCreator, openaiModelCreator, openaiModelResponseCreator, createModelCreatorCompatible, providers;
24891
26306
  var init_providers = __esm({
@@ -24905,7 +26320,6 @@ var init_providers = __esm({
24905
26320
  init_models();
24906
26321
  init_utils();
24907
26322
  init_proxy2();
24908
- init_mergeSystemMessagesMiddleware();
24909
26323
  defaultModelCreator = (name, provider) => {
24910
26324
  if (provider.id !== "openai") {
24911
26325
  (0, import_assert.default)(provider.api, `Provider ${provider.id} must have an api`);
@@ -25012,7 +26426,8 @@ var init_providers = __esm({
25012
26426
  "gpt-5-codex": models["gpt-5-codex"],
25013
26427
  "gpt-5.2": models["gpt-5.2"],
25014
26428
  "gpt-5.2-pro": models["gpt-5.2-pro"],
25015
- "gpt-5.2-codex": models["gpt-5.2-codex"]
26429
+ "gpt-5.2-codex": models["gpt-5.2-codex"],
26430
+ "gpt-5.3-codex": models["gpt-5.3-codex"]
25016
26431
  },
25017
26432
  createModel: openaiModelCreator
25018
26433
  },
@@ -25029,6 +26444,7 @@ var init_providers = __esm({
25029
26444
  "gemini-2.5-flash-lite": models["gemini-2.5-flash-lite-preview-06-17"],
25030
26445
  "gemini-2.5-pro": models["gemini-2.5-pro"],
25031
26446
  "gemini-3-pro-preview": models["gemini-3-pro-preview"],
26447
+ "gemini-3.1-pro-preview": models["gemini-3.1-pro-preview"],
25032
26448
  "gemini-3-flash-preview": models["gemini-3-flash-preview"]
25033
26449
  },
25034
26450
  createModel(name, provider) {
@@ -25095,7 +26511,9 @@ var init_providers = __esm({
25095
26511
  "claude-3-7-sonnet-20250219-thinking": models["claude-3-7-sonnet"],
25096
26512
  "claude-3-5-sonnet-20241022": models["claude-3-5-sonnet-20241022"],
25097
26513
  "claude-haiku-4-5": models["claude-haiku-4-5"],
25098
- "claude-opus-4-5": models["claude-opus-4-5"]
26514
+ "claude-opus-4-5": models["claude-opus-4-5"],
26515
+ "claude-opus-4-6": models["claude-opus-4-6"],
26516
+ "claude-sonnet-4-6": models["claude-sonnet-4-6"]
25099
26517
  },
25100
26518
  apiFormat: "anthropic",
25101
26519
  headers: {
@@ -25165,6 +26583,8 @@ var init_providers = __esm({
25165
26583
  "anthropic/claude-opus-4": models["claude-4-opus"],
25166
26584
  "anthropic/claude-opus-4.1": models["claude-4.1-opus"],
25167
26585
  "anthropic/claude-opus-4.5": models["claude-opus-4-5"],
26586
+ "anthropic/claude-sonnet-4.6": models["claude-sonnet-4-6"],
26587
+ "anthropic/claude-opus-4.6": models["claude-opus-4-6"],
25168
26588
  "deepseek/deepseek-r1-0528": models["deepseek-r1-0528"],
25169
26589
  "deepseek/deepseek-chat-v3-0324": models["deepseek-v3-0324"],
25170
26590
  "deepseek/deepseek-chat-v3.1": models["deepseek-v3-1"],
@@ -25190,6 +26610,7 @@ var init_providers = __esm({
25190
26610
  "openai/gpt-5.2": models["gpt-5.2"],
25191
26611
  "openai/gpt-5.2-pro": models["gpt-5.2-pro"],
25192
26612
  "openai/gpt-5.2-codex": models["gpt-5.2-codex"],
26613
+ "openai/gpt-5.3-codex": models["gpt-5.3-codex"],
25193
26614
  "google/gemini-3-flash-preview": models["gemini-3-flash-preview"],
25194
26615
  "google/gemini-3-pro-preview": models["gemini-3-pro-preview"],
25195
26616
  "moonshotai/kimi-k2": models["kimi-k2"],
@@ -25207,7 +26628,9 @@ var init_providers = __esm({
25207
26628
  "z-ai/glm-4.6": models["glm-4.6"],
25208
26629
  "z-ai/glm-4.6v": models["glm-4.6v"],
25209
26630
  "z-ai/glm-4.7": models["glm-4.7"],
26631
+ "z-ai/glm-5": models["glm-5"],
25210
26632
  "minimax/minimax-m2": models["minimax-m2"],
26633
+ "minimax/minimax-m2.5": models["minimax-m2.5"],
25211
26634
  "openrouter/sherlock-dash-alpha": models["sherlock-dash-alpha"],
25212
26635
  "openrouter/sherlock-think-alpha": models["sherlock-think-alpha"],
25213
26636
  "xiaomi/mimo-v2-flash:free": models["mimo-v2-flash"]
@@ -25226,43 +26649,6 @@ var init_providers = __esm({
25226
26649
  ).chat(name);
25227
26650
  }
25228
26651
  },
25229
- iflow: {
25230
- id: "iflow",
25231
- source: "built-in",
25232
- env: ["IFLOW_API_KEY"],
25233
- name: "iFlow",
25234
- api: "https://apis.iflow.cn/v1/",
25235
- doc: "https://iflow.cn/",
25236
- models: {
25237
- "qwen3-coder-plus": models["qwen3-coder-plus"],
25238
- "kimi-k2": models["kimi-k2"],
25239
- "kimi-k2-0905": models["kimi-k2-0905"],
25240
- "deepseek-v3": models["deepseek-v3-0324"],
25241
- "deepseek-v3.2": models["deepseek-v3-2-exp"],
25242
- "deepseek-r1": models["deepseek-r1-0528"],
25243
- "glm-4.6": models["glm-4.6"],
25244
- "glm-4.7": models["glm-4.7"],
25245
- "minimax-m2.1": models["minimax-m2.1"],
25246
- "qwen3-max": models["qwen3-max"]
25247
- },
25248
- createModel: createModelCreatorCompatible({
25249
- fetch: (url, options) => {
25250
- return fetch(url, {
25251
- ...options,
25252
- headers: {
25253
- ...options.headers,
25254
- "user-agent": "iFlow-Cli"
25255
- }
25256
- });
25257
- },
25258
- middlewares: [
25259
- mergeSystemMessagesMiddleware,
25260
- (0, import_ai.extractReasoningMiddleware)({
25261
- tagName: "think"
25262
- })
25263
- ]
25264
- })
25265
- },
25266
26652
  moonshotai: {
25267
26653
  id: "moonshotai",
25268
26654
  source: "built-in",
@@ -25339,7 +26725,12 @@ var init_providers = __esm({
25339
26725
  "deepseek-ai/DeepSeek-R1": models["deepseek-r1-0528"],
25340
26726
  "deepseek-ai/DeepSeek-V3.1": models["deepseek-v3-1"],
25341
26727
  "deepseek-ai/DeepSeek-V3": models["deepseek-v3-0324"],
25342
- "zai-org/GLM-4.5": models["glm-4.5"]
26728
+ "zai-org/GLM-4.5": models["glm-4.5"],
26729
+ "Pro/moonshotai/Kimi-K2.5": models["kimi-k2-5"],
26730
+ "Pro/zai-org/GLM-5": models["glm-5"],
26731
+ "Pro/zai-org/GLM-4.7": models["glm-4.7"],
26732
+ "Pro/MiniMaxAI/MiniMax-M2.5": models["minimax-m2.5"],
26733
+ "Pro/deepseek-ai/DeepSeek-V3.2": models["deepseek-v3.2"]
25343
26734
  },
25344
26735
  createModel: defaultModelCreator
25345
26736
  },
@@ -25356,6 +26747,7 @@ var init_providers = __esm({
25356
26747
  "ZhipuAI/GLM-4.5": models["glm-4.5"],
25357
26748
  "ZhipuAI/GLM-4.5V": models["glm-4.5v"],
25358
26749
  "ZhipuAI/GLM-4.6": models["glm-4.6"],
26750
+ "ZhipuAI/GLM-5": models["glm-5"],
25359
26751
  "deepseek-ai/DeepSeek-V3.2": models["deepseek-v3.2"],
25360
26752
  "deepseek-ai/DeepSeek-V3.2-Speciale": models["deepseek-v3.2-speciale"]
25361
26753
  },
@@ -25390,7 +26782,8 @@ var init_providers = __esm({
25390
26782
  "glm-4.5v": models["glm-4.5v"],
25391
26783
  "glm-4.6": models["glm-4.6"],
25392
26784
  "glm-4.6v": models["glm-4.6v"],
25393
- "glm-4.7": models["glm-4.7"]
26785
+ "glm-4.7": models["glm-4.7"],
26786
+ "glm-5": models["glm-5"]
25394
26787
  },
25395
26788
  createModel: defaultModelCreator
25396
26789
  },
@@ -25408,10 +26801,31 @@ var init_providers = __esm({
25408
26801
  "glm-4.5": models["glm-4.5"],
25409
26802
  "glm-4.5-flash": models["glm-4.5-flash"],
25410
26803
  "glm-4.6v": models["glm-4.6v"],
25411
- "glm-4.7": models["glm-4.7"]
26804
+ "glm-4.7": models["glm-4.7"],
26805
+ "glm-5": models["glm-5"]
25412
26806
  },
25413
26807
  createModel: defaultModelCreator
25414
26808
  },
26809
+ "bailian-coding-plan": {
26810
+ id: "bailian-coding-plan",
26811
+ source: "built-in",
26812
+ env: ["BAILIAN_CODING_API_KEY"],
26813
+ name: "BaiLian Coding Plan",
26814
+ api: "https://coding.dashscope.aliyuncs.com/apps/anthropic/v1",
26815
+ doc: "https://www.aliyun.com/benefit/scene/codingplan",
26816
+ apiFormat: "anthropic",
26817
+ models: {
26818
+ "qwen3.5-plus": models["qwen3-5-plus"],
26819
+ "qwen3-max-2026-01-23": models["qwen3-max"],
26820
+ "qwen3-coder-next": models["qwen3-coder-plus"],
26821
+ "qwen3-coder-plus": models["qwen3-coder-plus"],
26822
+ "MiniMax-M2.5": models["minimax-m2.5"],
26823
+ "glm-5": models["glm-5"],
26824
+ "glm-4.7": models["glm-4.7"],
26825
+ "kimi-k2.5": models["kimi-k2-5"]
26826
+ },
26827
+ createModel: defaultAnthropicModelCreator
26828
+ },
25415
26829
  zhipuai: {
25416
26830
  id: "zhipuai",
25417
26831
  source: "built-in",
@@ -25426,7 +26840,8 @@ var init_providers = __esm({
25426
26840
  "glm-4.5": models["glm-4.5"],
25427
26841
  "glm-4.5-flash": models["glm-4.5-flash"],
25428
26842
  "glm-4.6v": models["glm-4.6v"],
25429
- "glm-4.7": models["glm-4.7"]
26843
+ "glm-4.7": models["glm-4.7"],
26844
+ "glm-5": models["glm-5"]
25430
26845
  },
25431
26846
  createModel: defaultModelCreator
25432
26847
  },
@@ -25451,15 +26866,21 @@ var init_providers = __esm({
25451
26866
  "openai/gpt-5.1-codex-mini": models["gpt-5.1-codex-mini"],
25452
26867
  "openai/gpt-5.2": models["gpt-5.2"],
25453
26868
  "openai/gpt-5.2-pro": models["gpt-5.2-pro"],
26869
+ "openai/gpt-5.2-codex": models["gpt-5.2-codex"],
26870
+ "openai/gpt-5.3-codex": models["gpt-5.3-codex"],
25454
26871
  "anthropic/claude-sonnet-4.5": models["claude-4-5-sonnet"],
25455
26872
  "anthropic/claude-opus-4.1": models["claude-4.1-opus"],
25456
26873
  "anthropic/claude-opus-4.5": models["claude-opus-4-5"],
26874
+ "anthropic/claude-opus-4.6": models["claude-opus-4-6"],
25457
26875
  "z-ai/glm-4.6": models["glm-4.6"],
25458
26876
  "z-ai/glm-4.6v": models["glm-4.6v"],
25459
26877
  "z-ai/glm-4.6v-flash": models["glm-4.6v"],
26878
+ "z-ai/glm-4.7": models["glm-4.7"],
26879
+ "z-ai/glm-5": models["glm-5"],
25460
26880
  "deepseek/deepseek-v3.2-speciale": models["deepseek-v3.2-speciale"],
25461
26881
  "deepseek/deepseek-chat": models["deepseek-v3-2-exp"],
25462
- "deepseek/deepseek-reasoner": models["deepseek-r1-0528"]
26882
+ "deepseek/deepseek-reasoner": models["deepseek-r1-0528"],
26883
+ "minimax/minimax-m2.5": models["minimax-m2.5"]
25463
26884
  },
25464
26885
  headers: {
25465
26886
  "X-Title": "OriCore",
@@ -25475,7 +26896,9 @@ var init_providers = __esm({
25475
26896
  doc: "https://platform.minimaxi.io/docs/guides/quickstart",
25476
26897
  models: {
25477
26898
  "minimax-m2": models["minimax-m2"],
25478
- "minimax-m2.1": models["minimax-m2.1"]
26899
+ "minimax-m2.1": models["minimax-m2.1"],
26900
+ "minimax-m2.5": models["minimax-m2.5"],
26901
+ "minimax-m2.7": models["minimax-m2.7"]
25479
26902
  },
25480
26903
  createModel(name, provider) {
25481
26904
  const baseURL = getProviderBaseURL(provider);
@@ -25494,7 +26917,9 @@ var init_providers = __esm({
25494
26917
  doc: "https://platform.minimaxi.com/docs/guides/quickstart",
25495
26918
  models: {
25496
26919
  "minimax-m2": models["minimax-m2"],
25497
- "minimax-m2.1": models["minimax-m2.1"]
26920
+ "minimax-m2.1": models["minimax-m2.1"],
26921
+ "minimax-m2.5": models["minimax-m2.5"],
26922
+ "minimax-m2.7": models["minimax-m2.7"]
25498
26923
  },
25499
26924
  createModel(name, provider) {
25500
26925
  const baseURL = getProviderBaseURL(provider);
@@ -25623,7 +27048,9 @@ var init_providers = __esm({
25623
27048
  "zai/glm-4.7": models["glm-4.7"],
25624
27049
  "moonshotai/kimi-k2-thinking": models["kimi-k2-thinking"],
25625
27050
  "moonshotai/kimi-k2.5": models["kimi-k2.5"],
25626
- "deepseek/deepseek-chat-v3.2": models["deepseek-v3-2-exp"]
27051
+ "deepseek/deepseek-chat-v3.2": models["deepseek-v3-2-exp"],
27052
+ "openai/gpt-oss-120b": models["gpt-oss-120b"],
27053
+ "xiaomimimo/mimo-v2-flash": models["mimo-v2-flash"]
25627
27054
  },
25628
27055
  createModel: defaultModelCreator
25629
27056
  },
@@ -25643,12 +27070,15 @@ var init_providers = __esm({
25643
27070
  "claude-4-5-sonnet": models["claude-4-5-sonnet"],
25644
27071
  "claude-haiku-4-5": models["claude-haiku-4-5"],
25645
27072
  "claude-opus-4-5": models["claude-opus-4-5"],
27073
+ "claude-sonnet-4-6": models["claude-sonnet-4-6"],
27074
+ "claude-opus-4-6": models["claude-opus-4-6"],
25646
27075
  "gpt-5.1": models["gpt-5.1"],
25647
27076
  "gpt-5.1-codex-max": models["gpt-5.1-codex-max"],
25648
27077
  "gpt-5.1-codex": models["gpt-5.1-codex"],
25649
27078
  "gpt-5.1-codex-mini": models["gpt-5.1-codex-mini"],
25650
27079
  "gpt-5.2": models["gpt-5.2"],
25651
- "gpt-5.2-codex": models["gpt-5.2-codex"]
27080
+ "gpt-5.2-codex": models["gpt-5.2-codex"],
27081
+ "gpt-5.3-codex": models["gpt-5.3-codex"]
25652
27082
  },
25653
27083
  createModel: (name, provider) => {
25654
27084
  if (name.startsWith("claude-") || name.startsWith("gemini-")) {
@@ -25659,6 +27089,38 @@ var init_providers = __esm({
25659
27089
  }
25660
27090
  return defaultModelCreator(name, provider);
25661
27091
  }
27092
+ },
27093
+ kilo: {
27094
+ id: "kilo",
27095
+ source: "built-in",
27096
+ env: ["KILO_API_KEY"],
27097
+ name: "Kilo",
27098
+ api: "https://api.kilo.ai/api/gateway",
27099
+ doc: "https://kilo.ai",
27100
+ apiFormat: "openai",
27101
+ models: {
27102
+ "z-ai/glm-5": models["glm-5"],
27103
+ "z-ai/glm-5:free": models["glm-5"],
27104
+ "z-ai/glm-4.7": models["glm-4.7"],
27105
+ "anthropic/claude-opus-4.6": models["claude-opus-4-6"],
27106
+ "anthropic/claude-sonnet-4.6": models["claude-sonnet-4-6"],
27107
+ "anthropic/claude-haiku-4.5": models["claude-haiku-4-5"],
27108
+ "anthropic/claude-sonnet-4.5": models["claude-4-5-sonnet"],
27109
+ "google/gemini-3-flash-preview": models["gemini-3-flash-preview"],
27110
+ "google/gemini-3-pro-preview": models["gemini-3-pro-preview"],
27111
+ "minimax/minimax-m2.5:free": models["minimax-m2.5"],
27112
+ "minimax/minimax-m2.5": models["minimax-m2.5"],
27113
+ "moonshotai/kimi-k2.5": models["kimi-k2-5"]
27114
+ },
27115
+ createModel: (name, provider) => {
27116
+ if (name.includes("claude-")) {
27117
+ return defaultAnthropicModelCreator(name, provider);
27118
+ }
27119
+ if (name.includes("gemini-")) {
27120
+ return defaultAnthropicModelCreator(name, provider);
27121
+ }
27122
+ return defaultModelCreator(name, provider);
27123
+ }
25662
27124
  }
25663
27125
  };
25664
27126
  }
@@ -26230,6 +27692,17 @@ function transformVariants(model, provider) {
26230
27692
  return {};
26231
27693
  }
26232
27694
  const id = (model.id || "").toLowerCase();
27695
+ if (provider.id === "bailian-coding-plan") {
27696
+ if (id.includes("kimi") || id.includes("minimax") || id.includes("glm")) {
27697
+ return {
27698
+ on: {
27699
+ thinking: {
27700
+ type: "enabled"
27701
+ }
27702
+ }
27703
+ };
27704
+ }
27705
+ }
26233
27706
  if (id.includes("deepseek") || id.includes("minimax") || id.includes("glm") || id.includes("mistral") || // id.includes("kimi") ||
26234
27707
  id.includes("grok")) {
26235
27708
  return {};
@@ -26953,6 +28426,9 @@ function stripAnsi(string) {
26953
28426
  if (typeof string !== "string") {
26954
28427
  throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
26955
28428
  }
28429
+ if (!string.includes("\x1B") && !string.includes("\x9B")) {
28430
+ return string;
28431
+ }
26956
28432
  return string.replace(regex, "");
26957
28433
  }
26958
28434
  var regex;
@@ -28952,6 +30428,18 @@ function normalizeMessagesForCompact(messages) {
28952
30428
  content: "[Tool operations completed]"
28953
30429
  };
28954
30430
  }
30431
+ if (message.role === "user") {
30432
+ if (Array.isArray(message.content)) {
30433
+ const filteredContent = message.content.filter(
30434
+ (part) => part.type === "text"
30435
+ );
30436
+ return {
30437
+ ...message,
30438
+ content: filteredContent.length > 0 ? filteredContent : message.content
30439
+ };
30440
+ }
30441
+ return message;
30442
+ }
28955
30443
  return message;
28956
30444
  }).filter((message) => {
28957
30445
  if (typeof message.content === "string") {
@@ -29889,6 +31377,7 @@ async function runLoop(opts) {
29889
31377
  request: result.request,
29890
31378
  response: result.response
29891
31379
  });
31380
+ let finishChunkReceived = false;
29892
31381
  for await (const chunk of result.stream) {
29893
31382
  if (opts.signal?.aborted) {
29894
31383
  return createCancelError();
@@ -29920,6 +31409,7 @@ async function runLoop(opts) {
29920
31409
  });
29921
31410
  break;
29922
31411
  case "finish":
31412
+ finishChunkReceived = true;
29923
31413
  lastUsage = Usage.fromEventUsage(chunk.usage);
29924
31414
  totalUsage.add(lastUsage);
29925
31415
  if (toolCalls.length === 0 && text.trim() === "") {
@@ -29958,6 +31448,13 @@ async function runLoop(opts) {
29958
31448
  break;
29959
31449
  }
29960
31450
  }
31451
+ if (!finishChunkReceived && toolCalls.length === 0 && text.trim() === "") {
31452
+ const error = new Error(
31453
+ "Empty response: stream ended without any chunks"
31454
+ );
31455
+ error.isRetryable = true;
31456
+ throw error;
31457
+ }
29961
31458
  break;
29962
31459
  } catch (error) {
29963
31460
  const nextRetryCount = retryCount + 1;
@@ -30125,6 +31622,8 @@ async function runLoop(opts) {
30125
31622
  }
30126
31623
  }
30127
31624
  };
31625
+ const approvedToolUses = [];
31626
+ let earlyReturn = null;
30128
31627
  for (const toolCall of toolCalls) {
30129
31628
  let toolUse = {
30130
31629
  name: toolCall.toolName,
@@ -30148,25 +31647,10 @@ async function runLoop(opts) {
30148
31647
  }
30149
31648
  }
30150
31649
  if (approved) {
30151
- toolCallsCount++;
30152
31650
  if (updatedParams) {
30153
31651
  toolUse.params = { ...toolUse.params, ...updatedParams };
30154
31652
  }
30155
- let toolResult = await opts.tools.invoke(
30156
- toolUse.name,
30157
- JSON.stringify(toolUse.params),
30158
- toolUse.callId
30159
- );
30160
- if (opts.onToolResult) {
30161
- toolResult = await opts.onToolResult(toolUse, toolResult, approved);
30162
- }
30163
- toolResults.push({
30164
- toolCallId: toolUse.callId,
30165
- toolName: toolUse.name,
30166
- input: toolUse.params,
30167
- result: toolResult
30168
- });
30169
- turnsCount--;
31653
+ approvedToolUses.push(toolUse);
30170
31654
  } else {
30171
31655
  let message = "Error: Tool execution was denied by user.";
30172
31656
  if (denyReason) {
@@ -30177,7 +31661,7 @@ async function runLoop(opts) {
30177
31661
  isError: true
30178
31662
  };
30179
31663
  if (opts.onToolResult) {
30180
- toolResult = await opts.onToolResult(toolUse, toolResult, approved);
31664
+ toolResult = await opts.onToolResult(toolUse, toolResult, false);
30181
31665
  }
30182
31666
  toolResults.push({
30183
31667
  toolCallId: toolUse.callId,
@@ -30185,8 +31669,8 @@ async function runLoop(opts) {
30185
31669
  input: toolUse.params,
30186
31670
  result: toolResult
30187
31671
  });
30188
- await addDeniedResultsForRemainingTools();
30189
31672
  if (!denyReason) {
31673
+ await addDeniedResultsForRemainingTools();
30190
31674
  await history.addMessage({
30191
31675
  role: "tool",
30192
31676
  content: toolResults.map(
@@ -30198,7 +31682,7 @@ async function runLoop(opts) {
30198
31682
  )
30199
31683
  )
30200
31684
  });
30201
- return {
31685
+ earlyReturn = {
30202
31686
  success: false,
30203
31687
  error: {
30204
31688
  type: "tool_denied",
@@ -30210,9 +31694,60 @@ async function runLoop(opts) {
30210
31694
  }
30211
31695
  }
30212
31696
  };
30213
- } else {
30214
31697
  break;
30215
31698
  }
31699
+ await addDeniedResultsForRemainingTools();
31700
+ break;
31701
+ }
31702
+ }
31703
+ if (earlyReturn) {
31704
+ return earlyReturn;
31705
+ }
31706
+ if (approvedToolUses.length > 0) {
31707
+ const executionResults = await Promise.allSettled(
31708
+ approvedToolUses.map(async (toolUse) => {
31709
+ let toolResult = await opts.tools.invoke(
31710
+ toolUse.name,
31711
+ JSON.stringify(toolUse.params),
31712
+ toolUse.callId
31713
+ );
31714
+ if (opts.onToolResult) {
31715
+ toolResult = await opts.onToolResult(toolUse, toolResult, true);
31716
+ }
31717
+ return {
31718
+ toolCallId: toolUse.callId,
31719
+ toolName: toolUse.name,
31720
+ input: toolUse.params,
31721
+ result: toolResult
31722
+ };
31723
+ })
31724
+ );
31725
+ toolCallsCount += approvedToolUses.length;
31726
+ turnsCount -= approvedToolUses.length;
31727
+ for (let i = 0; i < executionResults.length; i++) {
31728
+ const settledResult = executionResults[i];
31729
+ if (settledResult.status === "fulfilled") {
31730
+ toolResults.push(settledResult.value);
31731
+ } else {
31732
+ const failedToolUse = approvedToolUses[i];
31733
+ let errorResult = {
31734
+ llmContent: `Tool execution error: ${settledResult.reason instanceof Error ? settledResult.reason.message : String(settledResult.reason)}`,
31735
+ isError: true
31736
+ };
31737
+ if (opts.onToolResult) {
31738
+ errorResult = await opts.onToolResult(
31739
+ failedToolUse,
31740
+ errorResult,
31741
+ true
31742
+ );
31743
+ }
31744
+ toolResults.push({
31745
+ toolCallId: failedToolUse.callId,
31746
+ toolName: failedToolUse.name,
31747
+ input: failedToolUse.params,
31748
+ result: errorResult
31749
+ });
31750
+ }
30216
31751
  }
30217
31752
  }
30218
31753
  if (opts.signal?.aborted) {
@@ -30595,8 +32130,8 @@ var init_ripgrep = __esm({
30595
32130
  }
30596
32131
  try {
30597
32132
  const url = import_meta.url;
30598
- const __filename = url.startsWith("file://") ? new URL(url).pathname : url;
30599
- const moduleDir = import_pathe10.default.dirname(__filename);
32133
+ const __filename2 = url.startsWith("file://") ? new URL(url).pathname : url;
32134
+ const moduleDir = import_pathe10.default.dirname(__filename2);
30600
32135
  return isDev ? import_pathe10.default.resolve(moduleDir, "../../") : import_pathe10.default.resolve(moduleDir, "../");
30601
32136
  } catch {
30602
32137
  return process.cwd();
@@ -34751,8 +36286,10 @@ var MCPManager = class _MCPManager {
34751
36286
  return true;
34752
36287
  }
34753
36288
  #convertAiSdkToolToLocal(toolName, toolDef, serverName, config) {
36289
+ const safeServerName = serverName.replace(/[^a-zA-Z0-9_-]/g, "");
36290
+ const safeToolName = toolName.replace(/[^a-zA-Z0-9_-]/g, "_");
34754
36291
  return {
34755
- name: `mcp__${serverName.replace(/[^a-zA-Z0-9_-]/g, "")}__${toolName}`,
36292
+ name: `mcp__${safeServerName}__${safeToolName}`,
34756
36293
  description: toolDef.description,
34757
36294
  getDescription: ({ params }) => {
34758
36295
  return formatParamsDescription(params);
@@ -34983,6 +36520,16 @@ var import_fs23 = __toESM(require("fs"), 1);
34983
36520
  var import_os9 = __toESM(require("os"), 1);
34984
36521
  var import_pathe26 = __toESM(require("pathe"), 1);
34985
36522
  init_plugin();
36523
+ function isDirOrSymlinkToDir(parentDir, entry) {
36524
+ if (entry.isDirectory()) return true;
36525
+ if (entry.isSymbolicLink()) {
36526
+ try {
36527
+ return import_fs23.default.statSync(import_pathe26.default.join(parentDir, entry.name)).isDirectory();
36528
+ } catch {
36529
+ }
36530
+ }
36531
+ return false;
36532
+ }
34986
36533
  var SkillSource = /* @__PURE__ */ ((SkillSource2) => {
34987
36534
  SkillSource2["Plugin"] = "plugin";
34988
36535
  SkillSource2["GlobalClaude"] = "global-claude";
@@ -35073,7 +36620,7 @@ var SkillManager = class {
35073
36620
  try {
35074
36621
  const entries = import_fs23.default.readdirSync(skillsDir, { withFileTypes: true });
35075
36622
  for (const entry of entries) {
35076
- if (entry.isDirectory()) {
36623
+ if (isDirOrSymlinkToDir(skillsDir, entry)) {
35077
36624
  const skillPath = import_pathe26.default.join(skillsDir, entry.name, "SKILL.md");
35078
36625
  if (import_fs23.default.existsSync(skillPath)) {
35079
36626
  this.loadSkillFile(skillPath, source);
@@ -35283,7 +36830,7 @@ var SkillManager = class {
35283
36830
  if (import_fs23.default.existsSync(skillsDir) && import_fs23.default.statSync(skillsDir).isDirectory()) {
35284
36831
  const entries2 = import_fs23.default.readdirSync(skillsDir, { withFileTypes: true });
35285
36832
  for (const entry of entries2) {
35286
- if (entry.isDirectory()) {
36833
+ if (isDirOrSymlinkToDir(skillsDir, entry)) {
35287
36834
  const skillPath = import_pathe26.default.join(skillsDir, entry.name, "SKILL.md");
35288
36835
  if (import_fs23.default.existsSync(skillPath)) {
35289
36836
  skills.push(skillPath);
@@ -35296,7 +36843,7 @@ var SkillManager = class {
35296
36843
  }
35297
36844
  const entries = import_fs23.default.readdirSync(dir, { withFileTypes: true });
35298
36845
  for (const entry of entries) {
35299
- if (entry.isDirectory()) {
36846
+ if (isDirOrSymlinkToDir(dir, entry)) {
35300
36847
  const skillPath = import_pathe26.default.join(dir, entry.name, "SKILL.md");
35301
36848
  if (import_fs23.default.existsSync(skillPath)) {
35302
36849
  skills.push(skillPath);