specrails-desktop 2.63.2 → 2.64.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/client/dist/assets/{ActivityFeedPage-B1bpTy7O.js → ActivityFeedPage-Dtp7EyHc.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-BussBbN3.js → AgentBrowserCapture-CLqlEFw8.js} +1 -1
  3. package/client/dist/assets/{AgentModeAnalyticsPane-BiT1n3BU.js → AgentModeAnalyticsPane-B8_hM3Tw.js} +2 -2
  4. package/client/dist/assets/{AgentModeCodePane-CUjNfeKa.js → AgentModeCodePane-CNF8ZNjE.js} +2 -2
  5. package/client/dist/assets/{AgentModeJobsPane-RVEwyS59.js → AgentModeJobsPane-CJpJbO9m.js} +1 -1
  6. package/client/dist/assets/AgentsPage-BC8XSR79.js +120 -0
  7. package/client/dist/assets/{AnalyticsPage-Bser2Ly3.js → AnalyticsPage-Cdv4jLtW.js} +1 -1
  8. package/client/dist/assets/{CodePage-BK0grm6e.js → CodePage-DI1kegAr.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-DEBidZbs.js → DesktopAnalyticsPage-Bdp8E8U6.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-Dhyo57n9.js → DocsDialog-Bm4RS7FX.js} +1 -1
  11. package/client/dist/assets/{DocsPage-BcEkPXd6.js → DocsPage-DihYcU8r.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-mRmqdkjr.js → ExportDropdown-Bb1lHx3r.js} +1 -1
  13. package/client/dist/assets/{InteractiveJobComposer-BlCe3vrU.js → InteractiveJobComposer-BO6ASN-2.js} +1 -1
  14. package/client/dist/assets/{JobDetailModal-CkAejD1F.js → JobDetailModal-CuPYq7tP.js} +1 -1
  15. package/client/dist/assets/{JobDetailPage-P-FS_lKz.js → JobDetailPage-BusMjJi9.js} +1 -1
  16. package/client/dist/assets/{JobsPage-CoUXgYse.js → JobsPage-C0QbsF2d.js} +1 -1
  17. package/client/dist/assets/{LoopBuilderPage-iFylNk68.js → LoopBuilderPage-B7TlU4iS.js} +1 -1
  18. package/client/dist/assets/{LoopPreviewModal-4obS_Ptg.js → LoopPreviewModal-BRWtXOD2.js} +1 -1
  19. package/client/dist/assets/{LoopWindowSurface-CLr5OPqj.js → LoopWindowSurface-DE0v2K1p.js} +1 -1
  20. package/client/dist/assets/{LoopsPage-eKpWFtCp.js → LoopsPage-C4q1DmCE.js} +1 -1
  21. package/client/dist/assets/{MinimizedChatsContext-BHIUPVmC.js → MinimizedChatsContext-DHfigjHS.js} +1 -1
  22. package/client/dist/assets/{PluginsPage-BgTC2CQx.js → PluginsPage-Z1JHSMdR.js} +1 -1
  23. package/client/dist/assets/{ProjectSettingsDialog-B4chTfU8.js → ProjectSettingsDialog-BUNj0tvN.js} +1 -1
  24. package/client/dist/assets/{RepositoryDeliveries-DAIxIYsl.js → RepositoryDeliveries-B4ybHOyB.js} +1 -1
  25. package/client/dist/assets/{RepositoryScopeSelector-DeCoUsRN.js → RepositoryScopeSelector-2eSqR9WK.js} +1 -1
  26. package/client/dist/assets/{ReviewPacketPage-Cktv0-9b.js → ReviewPacketPage-hwfPNjyy.js} +1 -1
  27. package/client/dist/assets/{TemplatePreviewModal-BZTV1TM1.js → TemplatePreviewModal-V7FpMWuw.js} +1 -1
  28. package/client/dist/assets/{TicketDetailModalContext-DiPngt2g.js → TicketDetailModalContext-Dkwo2cDs.js} +1 -1
  29. package/client/dist/assets/{Trans-ZiXIfj50.js → Trans-BbFxRFtR.js} +1 -1
  30. package/client/dist/assets/{formatDistanceToNow-CdN5lTyD.js → formatDistanceToNow-NjPHBLfB.js} +1 -1
  31. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-62h40I4t.js → getTimezoneOffsetInMilliseconds-vJ7qUoqN.js} +1 -1
  32. package/client/dist/assets/{index-CECj3joE.js → index-Ce4yZtKf.js} +36 -36
  33. package/client/dist/assets/{jira-api-C_D_RDhl.js → jira-api-Cabj-H0J.js} +1 -1
  34. package/client/dist/assets/{project-repositories-Be0CWklo.js → project-repositories-Cnnuj9Ia.js} +1 -1
  35. package/client/dist/assets/{settings-Hw7av-B1.js → settings-B1NV8Ow9.js} +1 -1
  36. package/client/dist/assets/settings-BQ8XFZeE.js +1 -0
  37. package/client/dist/assets/settings-BRkxfBbO.js +1 -0
  38. package/client/dist/assets/settings-C_CcU1dP.js +1 -0
  39. package/client/dist/assets/settings-Cto9n0eL.js +1 -0
  40. package/client/dist/assets/{settings-nryN6wuS.js → settings-Pyw8uYtL.js} +1 -1
  41. package/client/dist/assets/settings-b3HVCNNd.js +1 -0
  42. package/client/dist/assets/settings-hdive4u6.js +1 -0
  43. package/client/dist/assets/{spending-eWiZGhC_.js → spending-CQnrWiR3.js} +1 -1
  44. package/client/dist/assets/{useDesktop-C0mRIlHT.js → useDesktop-BjLT0_EE.js} +1 -1
  45. package/client/dist/assets/{useRuntimeRuns-B1a6GChu.js → useRuntimeRuns-C97qEqMg.js} +1 -1
  46. package/client/dist/assets/{useSharedWebSocket-CcsE5986.js → useSharedWebSocket-Bj4LMp7b.js} +2 -2
  47. package/client/dist/index.html +15 -15
  48. package/docs/internals/api-reference.md +26 -0
  49. package/docs/internals/core-runtime-updates.md +3 -3
  50. package/docs/internals/source-map.md +9 -2
  51. package/local-runner/dist/specrails-local-runner.js +487 -148
  52. package/mcp-bridge/dist/specrails-mcp.js +330 -42
  53. package/package.json +6 -3
  54. package/server/dist/index.js +14 -1
  55. package/server/dist/mobile/mobile-admin-router.js +16 -0
  56. package/server/dist/mobile/mobile-gateway.js +18 -0
  57. package/server/dist/mobile/mobile-missions.js +6 -4
  58. package/server/dist/mobile/mobile-preview-channel.js +179 -0
  59. package/server/dist/mobile/mobile-preview.js +366 -0
  60. package/server/dist/mobile/mobile-router.js +9 -1
  61. package/server/dist/mobile/mobile-webrtc-peer.js +54 -4
  62. package/server/dist/mobile/mobile-ws.js +4 -2
  63. package/server/dist/modules/browser/domain/preview-origins.js +117 -0
  64. package/server/dist/modules/browser/runtime/browser-capture-manager.js +141 -18
  65. package/server/dist/modules/browser/runtime/browser-capture-types.js +10 -1
  66. package/server/dist/modules/browser/runtime/browser-playwright.js +19 -0
  67. package/server/dist/modules/browser/runtime/preview-targets.js +80 -0
  68. package/server/dist/modules/terminals/runtime/background-process-service.js +24 -1
  69. package/server/dist/project-registry.js +10 -0
  70. package/client/dist/assets/AgentsPage-DKE-eMC5.js +0 -118
  71. package/client/dist/assets/settings-BO2N-oPf.js +0 -1
  72. package/client/dist/assets/settings-BQChAs_w.js +0 -1
  73. package/client/dist/assets/settings-BzmYlcQB.js +0 -1
  74. package/client/dist/assets/settings-CGjXb6TX.js +0 -1
  75. package/client/dist/assets/settings-CMxEWY46.js +0 -1
  76. package/client/dist/assets/settings-C_dRSgI2.js +0 -1
@@ -3110,9 +3110,28 @@ var require_utils = __commonJS({
3110
3110
  "use strict";
3111
3111
  var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
3112
3112
  var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
3113
+ var isPort = RegExp.prototype.test.bind(/^\d*$/u);
3113
3114
  var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
3114
3115
  var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
3115
- var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
3116
+ var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
3117
+ var isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u);
3118
+ var isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u);
3119
+ var BYTE_HEX = new Array(256);
3120
+ {
3121
+ const HEX_DIGITS = "0123456789ABCDEF";
3122
+ for (let i = 0; i < 256; i++) {
3123
+ BYTE_HEX[i] = "%" + HEX_DIGITS[i >> 4] + HEX_DIGITS[i & 15];
3124
+ }
3125
+ }
3126
+ function percentEncodeNonAscii(cp) {
3127
+ if (cp < 2048) {
3128
+ return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63];
3129
+ }
3130
+ if (cp < 65536) {
3131
+ return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3132
+ }
3133
+ return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3134
+ }
3116
3135
  function stringArrayToHexStripped(input) {
3117
3136
  let acc = "";
3118
3137
  let code = 0;
@@ -3137,91 +3156,105 @@ var require_utils = __commonJS({
3137
3156
  }
3138
3157
  return acc;
3139
3158
  }
3159
+ var isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/);
3160
+ var isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/);
3161
+ var isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/);
3140
3162
  var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
3141
- function consumeIsZone(buffer) {
3142
- buffer.length = 0;
3143
- return true;
3144
- }
3145
- function consumeHextets(buffer, address, output) {
3146
- if (buffer.length) {
3147
- const hex = stringArrayToHexStripped(buffer);
3148
- if (hex !== "") {
3149
- address.push(hex);
3150
- } else {
3151
- output.error = true;
3152
- return false;
3163
+ function isZoneIdentifier(zone) {
3164
+ if (zone.length === 0) return false;
3165
+ for (let i = 0; i < zone.length; i++) {
3166
+ if (isZoneCharacter(zone[i])) continue;
3167
+ if (zone[i] === "%" && i + 2 < zone.length && isHexPair(zone.slice(i + 1, i + 3))) {
3168
+ i += 2;
3169
+ continue;
3153
3170
  }
3154
- buffer.length = 0;
3171
+ return false;
3155
3172
  }
3156
3173
  return true;
3157
3174
  }
3158
- function getIPV6(input) {
3159
- let tokenCount = 0;
3160
- const output = { error: false, address: "", zone: "" };
3161
- const address = [];
3162
- const buffer = [];
3163
- let endipv6Encountered = false;
3164
- let endIpv6 = false;
3165
- let consume = consumeHextets;
3166
- for (let i = 0; i < input.length; i++) {
3167
- const cursor = input[i];
3168
- if (cursor === "[" || cursor === "]") {
3169
- continue;
3170
- }
3171
- if (cursor === ":") {
3172
- if (endipv6Encountered === true) {
3173
- endIpv6 = true;
3174
- }
3175
- if (!consume(buffer, address, output)) {
3176
- break;
3177
- }
3178
- if (++tokenCount > 7) {
3179
- output.error = true;
3180
- break;
3181
- }
3182
- if (i > 0 && input[i - 1] === ":") {
3183
- endipv6Encountered = true;
3184
- }
3185
- address.push(":");
3186
- continue;
3187
- } else if (cursor === "%") {
3188
- if (!consume(buffer, address, output)) {
3189
- break;
3175
+ function compressIPv6ZeroRun(hextets) {
3176
+ let bestStart = -1;
3177
+ let bestLength = 0;
3178
+ let runStart = -1;
3179
+ let runLength = 0;
3180
+ for (let i = 0; i < hextets.length; i++) {
3181
+ if (hextets[i] === "0") {
3182
+ if (runStart === -1) runStart = i;
3183
+ runLength++;
3184
+ if (runLength > bestLength) {
3185
+ bestLength = runLength;
3186
+ bestStart = runStart;
3190
3187
  }
3191
- consume = consumeIsZone;
3192
3188
  } else {
3193
- buffer.push(cursor);
3189
+ runStart = -1;
3190
+ runLength = 0;
3191
+ }
3192
+ }
3193
+ if (bestLength < 2) return hextets.join(":");
3194
+ const head = hextets.slice(0, bestStart).join(":");
3195
+ const tail = hextets.slice(bestStart + bestLength).join(":");
3196
+ return head + "::" + tail;
3197
+ }
3198
+ function normalizeIPv6Address(input) {
3199
+ const compression = input.indexOf("::");
3200
+ if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0;
3201
+ const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":");
3202
+ const right = compression === -1 ? [] : input.slice(compression + 2).split(":");
3203
+ if (compression !== -1) {
3204
+ if (left.length === 1 && left[0] === "") left.length = 0;
3205
+ if (right.length === 1 && right[0] === "") right.length = 0;
3206
+ }
3207
+ const parts = left.concat(right);
3208
+ let hextetCount = 0;
3209
+ for (let i = 0; i < parts.length; i++) {
3210
+ const part = parts[i];
3211
+ if (part === "") return void 0;
3212
+ if (part.indexOf(".") !== -1) {
3213
+ if (i !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv4(part)) return void 0;
3214
+ hextetCount += 2;
3194
3215
  continue;
3195
3216
  }
3217
+ if (!isHextet(part)) return void 0;
3218
+ parts[i] = parseInt(part, 16).toString(16);
3219
+ hextetCount++;
3196
3220
  }
3197
- if (buffer.length) {
3198
- if (consume === consumeIsZone) {
3199
- output.zone = buffer.join("");
3200
- } else if (endIpv6) {
3201
- address.push(buffer.join(""));
3202
- } else {
3203
- address.push(stringArrayToHexStripped(buffer));
3204
- }
3221
+ if (compression === -1) {
3222
+ if (hextetCount !== 8) return void 0;
3223
+ return compressIPv6ZeroRun(parts);
3205
3224
  }
3206
- output.address = address.join("");
3207
- return output;
3225
+ if (hextetCount >= 8) return void 0;
3226
+ const expanded = parts.slice(0, left.length);
3227
+ for (let i = hextetCount; i < 8; i++) expanded.push("0");
3228
+ for (let i = left.length; i < parts.length; i++) expanded.push(parts[i]);
3229
+ return compressIPv6ZeroRun(expanded);
3208
3230
  }
3209
3231
  function normalizeIPv6(host) {
3210
- if (findToken(host, ":") < 2) {
3211
- return { host, isIPV6: false };
3212
- }
3213
- const ipv62 = getIPV6(host);
3214
- if (!ipv62.error) {
3215
- let newHost = ipv62.address;
3216
- let escapedHost = ipv62.address;
3217
- if (ipv62.zone) {
3218
- newHost += "%" + ipv62.zone;
3219
- escapedHost += "%25" + ipv62.zone;
3220
- }
3221
- return { host: newHost, isIPV6: true, escapedHost };
3222
- } else {
3223
- return { host, isIPV6: false };
3224
- }
3232
+ const bracketed = host[0] === "[" && host[host.length - 1] === "]";
3233
+ const hasBracket = host[0] === "[" || host[host.length - 1] === "]";
3234
+ if (hasBracket && !bracketed) return { host, isIPV6: false, error: true };
3235
+ let input = bracketed ? host.slice(1, -1) : host;
3236
+ if (bracketed && isIPvFuture(input)) {
3237
+ input = input.toLowerCase();
3238
+ return { host: `[${input}]`, escapedHost: input, isIPV6: false, isIPVFuture: true };
3239
+ }
3240
+ if (findToken(input, ":") < 2) {
3241
+ return { host, isIPV6: false, error: bracketed };
3242
+ }
3243
+ let zoneIdentifier = "";
3244
+ const zoneSeparator = input.indexOf("%");
3245
+ if (zoneSeparator !== -1) {
3246
+ const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1;
3247
+ zoneIdentifier = input.slice(zoneSeparator + separatorLength);
3248
+ if (!isZoneIdentifier(zoneIdentifier)) return { host, isIPV6: false, error: true };
3249
+ input = input.slice(0, zoneSeparator);
3250
+ }
3251
+ const address = normalizeIPv6Address(input);
3252
+ if (address === void 0) return { host, isIPV6: false, error: true };
3253
+ return {
3254
+ host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""),
3255
+ escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""),
3256
+ isIPV6: true
3257
+ };
3225
3258
  }
3226
3259
  function findToken(str2, token) {
3227
3260
  let ind = 0;
@@ -3340,7 +3373,8 @@ var require_utils = __commonJS({
3340
3373
  function normalizePathEncoding(input) {
3341
3374
  let output = "";
3342
3375
  for (let i = 0; i < input.length; i++) {
3343
- if (input[i] === "%" && i + 2 < input.length) {
3376
+ const ch = input[i];
3377
+ if (ch === "%" && i + 2 < input.length) {
3344
3378
  const hex = input.slice(i + 1, i + 3);
3345
3379
  if (isHexPair(hex)) {
3346
3380
  const normalizedHex = hex.toUpperCase();
@@ -3354,10 +3388,152 @@ var require_utils = __commonJS({
3354
3388
  continue;
3355
3389
  }
3356
3390
  }
3357
- if (isPathCharacter(input[i])) {
3358
- output += input[i];
3391
+ if (isPathCharacter(ch)) {
3392
+ output += ch;
3393
+ } else {
3394
+ const code = input.charCodeAt(i);
3395
+ if (code < 128) {
3396
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
3397
+ } else if (code < 55296 || code > 57343) {
3398
+ output += percentEncodeNonAscii(code);
3399
+ } else if (code <= 56319 && i + 1 < input.length) {
3400
+ const low = input.charCodeAt(i + 1);
3401
+ if (low >= 56320 && low <= 57343) {
3402
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3403
+ i++;
3404
+ } else {
3405
+ output += percentEncodeNonAscii(65533);
3406
+ }
3407
+ } else {
3408
+ output += percentEncodeNonAscii(65533);
3409
+ }
3410
+ }
3411
+ }
3412
+ return output;
3413
+ }
3414
+ function serializePathEncoding(input, pathNoScheme = false) {
3415
+ let output = "";
3416
+ let firstSegment = pathNoScheme && input[0] !== "/";
3417
+ for (let i = 0; i < input.length; i++) {
3418
+ const ch = input[i];
3419
+ if (ch === "%" && i + 2 < input.length) {
3420
+ const hex = input.slice(i + 1, i + 3);
3421
+ if (isHexPair(hex)) {
3422
+ output += "%" + hex.toUpperCase();
3423
+ i += 2;
3424
+ continue;
3425
+ }
3426
+ }
3427
+ if (ch === "/") {
3428
+ firstSegment = false;
3429
+ }
3430
+ if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) {
3431
+ output += ch;
3432
+ } else {
3433
+ const code = input.charCodeAt(i);
3434
+ if (code < 128) {
3435
+ output += BYTE_HEX[code];
3436
+ } else if (code < 55296 || code > 57343) {
3437
+ output += percentEncodeNonAscii(code);
3438
+ } else if (code <= 56319 && i + 1 < input.length) {
3439
+ const low = input.charCodeAt(i + 1);
3440
+ if (low >= 56320 && low <= 57343) {
3441
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3442
+ i++;
3443
+ } else {
3444
+ output += percentEncodeNonAscii(65533);
3445
+ }
3446
+ } else {
3447
+ output += percentEncodeNonAscii(65533);
3448
+ }
3449
+ }
3450
+ }
3451
+ return output;
3452
+ }
3453
+ function encodeComponent(input, isAllowed) {
3454
+ let output = "";
3455
+ for (let i = 0; i < input.length; i++) {
3456
+ const ch = input[i];
3457
+ if (ch === "%" && i + 2 < input.length) {
3458
+ const hex = input.slice(i + 1, i + 3);
3459
+ if (isHexPair(hex)) {
3460
+ output += "%" + hex.toUpperCase();
3461
+ i += 2;
3462
+ continue;
3463
+ }
3464
+ }
3465
+ if (isAllowed(ch)) {
3466
+ output += ch;
3467
+ } else {
3468
+ const code = input.charCodeAt(i);
3469
+ if (code < 128) {
3470
+ output += BYTE_HEX[code];
3471
+ } else if (code < 55296 || code > 57343) {
3472
+ output += percentEncodeNonAscii(code);
3473
+ } else if (code <= 56319 && i + 1 < input.length) {
3474
+ const low = input.charCodeAt(i + 1);
3475
+ if (low >= 56320 && low <= 57343) {
3476
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3477
+ i++;
3478
+ } else {
3479
+ output += percentEncodeNonAscii(65533);
3480
+ }
3481
+ } else {
3482
+ output += percentEncodeNonAscii(65533);
3483
+ }
3484
+ }
3485
+ }
3486
+ return output;
3487
+ }
3488
+ function encodeUserinfo(input) {
3489
+ return encodeComponent(input, isUserinfoCharacter);
3490
+ }
3491
+ function encodeQuery(input) {
3492
+ return encodeComponent(input, isQueryFragmentCharacter);
3493
+ }
3494
+ function encodeFragment(input) {
3495
+ return encodeComponent(input, isQueryFragmentCharacter);
3496
+ }
3497
+ function isEscapeSafe(cp) {
3498
+ return cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 42 || cp === 43 || cp === 45 || cp === 46 || cp === 47 || cp === 64 || cp === 95;
3499
+ }
3500
+ function normalizeQueryFragmentEncoding(input) {
3501
+ let output = "";
3502
+ for (let i = 0; i < input.length; i++) {
3503
+ const ch = input[i];
3504
+ if (ch === "%" && i + 2 < input.length) {
3505
+ const hex = input.slice(i + 1, i + 3);
3506
+ if (isHexPair(hex)) {
3507
+ const normalizedHex = hex.toUpperCase();
3508
+ const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
3509
+ if (isUnreserved(decoded)) {
3510
+ output += decoded;
3511
+ } else {
3512
+ output += "%" + normalizedHex;
3513
+ }
3514
+ i += 2;
3515
+ continue;
3516
+ }
3517
+ }
3518
+ if (isQueryFragmentCharacter(ch)) {
3519
+ output += ch;
3359
3520
  } else {
3360
- output += escape(input[i]);
3521
+ const code = input.charCodeAt(i);
3522
+ if (code < 128) {
3523
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
3524
+ } else if (code < 55296 || code > 57343) {
3525
+ output += percentEncodeNonAscii(code);
3526
+ } else if (code <= 56319 && i + 1 < input.length) {
3527
+ const low = input.charCodeAt(i + 1);
3528
+ if (low >= 56320 && low <= 57343) {
3529
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3530
+ i++;
3531
+ } else {
3532
+ output += percentEncodeNonAscii(65533);
3533
+ }
3534
+ } else {
3535
+ output += percentEncodeNonAscii(65533);
3536
+ }
3361
3537
  }
3362
3538
  }
3363
3539
  return output;
@@ -3380,14 +3556,18 @@ var require_utils = __commonJS({
3380
3556
  function recomposeAuthority(component) {
3381
3557
  const uriTokens = [];
3382
3558
  if (component.userinfo !== void 0) {
3383
- uriTokens.push(component.userinfo);
3559
+ uriTokens.push(encodeUserinfo(component.userinfo));
3384
3560
  uriTokens.push("@");
3385
3561
  }
3386
3562
  if (component.host !== void 0) {
3387
- let host = unescape(component.host);
3563
+ let host = component.host;
3388
3564
  if (!isIPv4(host)) {
3389
- const ipV6res = normalizeIPv6(host);
3390
- if (ipV6res.isIPV6 === true) {
3565
+ let ipV6res = normalizeIPv6(host);
3566
+ if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) {
3567
+ host = normalizePercentEncoding(host, true);
3568
+ ipV6res = normalizeIPv6(host);
3569
+ }
3570
+ if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) {
3391
3571
  host = `[${ipV6res.escapedHost}]`;
3392
3572
  } else {
3393
3573
  host = reescapeHostDelimiters(host, false);
@@ -3396,8 +3576,12 @@ var require_utils = __commonJS({
3396
3576
  uriTokens.push(host);
3397
3577
  }
3398
3578
  if (typeof component.port === "number" || typeof component.port === "string") {
3579
+ const port = String(component.port);
3580
+ if (!isPort(port)) {
3581
+ throw new TypeError("URI port is malformed.");
3582
+ }
3399
3583
  uriTokens.push(":");
3400
- uriTokens.push(String(component.port));
3584
+ uriTokens.push(port);
3401
3585
  }
3402
3586
  return uriTokens.length ? uriTokens.join("") : void 0;
3403
3587
  }
@@ -3407,6 +3591,11 @@ var require_utils = __commonJS({
3407
3591
  reescapeHostDelimiters,
3408
3592
  normalizePercentEncoding,
3409
3593
  normalizePathEncoding,
3594
+ serializePathEncoding,
3595
+ normalizeQueryFragmentEncoding,
3596
+ encodeUserinfo,
3597
+ encodeQuery,
3598
+ encodeFragment,
3410
3599
  escapePreservingEscapes,
3411
3600
  removeDotSegments,
3412
3601
  isIPv4,
@@ -3422,7 +3611,7 @@ var require_schemes = __commonJS({
3422
3611
  "node_modules/fast-uri/lib/schemes.js"(exports2, module2) {
3423
3612
  "use strict";
3424
3613
  var { isUUID } = require_utils();
3425
- var URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;
3614
+ var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
3426
3615
  var supportedSchemeNames = (
3427
3616
  /** @type {const} */
3428
3617
  [
@@ -3483,9 +3672,10 @@ var require_schemes = __commonJS({
3483
3672
  wsComponent.secure = void 0;
3484
3673
  }
3485
3674
  if (wsComponent.resourceName) {
3486
- const [path4, query] = wsComponent.resourceName.split("?");
3675
+ const queryIndex = wsComponent.resourceName.indexOf("?");
3676
+ const path4 = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex);
3487
3677
  wsComponent.path = path4 && path4 !== "/" ? path4 : void 0;
3488
- wsComponent.query = query;
3678
+ wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1);
3489
3679
  wsComponent.resourceName = void 0;
3490
3680
  }
3491
3681
  wsComponent.fragment = void 0;
@@ -3497,7 +3687,7 @@ var require_schemes = __commonJS({
3497
3687
  return urnComponent;
3498
3688
  }
3499
3689
  const matches = urnComponent.path.match(URN_REG);
3500
- if (matches) {
3690
+ if (matches && matches[0] === urnComponent.path) {
3501
3691
  const scheme = options.scheme || urnComponent.scheme || "urn";
3502
3692
  urnComponent.nid = matches[1].toLowerCase();
3503
3693
  urnComponent.nss = matches[2];
@@ -3631,8 +3821,17 @@ var require_schemes = __commonJS({
3631
3821
  var require_fast_uri = __commonJS({
3632
3822
  "node_modules/fast-uri/index.js"(exports2, module2) {
3633
3823
  "use strict";
3634
- var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3824
+ var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3635
3825
  var { SCHEMES, getSchemeHandler } = require_schemes();
3826
+ var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
3827
+ var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
3828
+ function decodeValidScheme(scheme) {
3829
+ const decodedScheme = unescape(String(scheme));
3830
+ if (!VALID_SCHEME.test(decodedScheme)) {
3831
+ throw new TypeError(MALFORMED_SCHEME_ERROR);
3832
+ }
3833
+ return decodedScheme;
3834
+ }
3636
3835
  function normalize(uri, options) {
3637
3836
  if (typeof uri === "string") {
3638
3837
  uri = /** @type {T} */
@@ -3645,7 +3844,34 @@ var require_fast_uri = __commonJS({
3645
3844
  }
3646
3845
  function resolve(baseURI, relativeURI, options) {
3647
3846
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
3648
- const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
3847
+ const {
3848
+ parsed: baseParsed,
3849
+ malformedAuthorityOrPort: baseMalformed,
3850
+ malformedPercentEncoding: baseMalformedPercentEncoding,
3851
+ malformedSchemeSpecific: baseMalformedSchemeSpecific,
3852
+ malformedHost: baseMalformedHost,
3853
+ malformedScheme: baseMalformedScheme
3854
+ } = parseWithStatus(baseURI, schemelessOptions);
3855
+ const {
3856
+ parsed: relativeParsed,
3857
+ malformedAuthorityOrPort: relativeMalformed,
3858
+ malformedPercentEncoding: relativeMalformedPercentEncoding,
3859
+ malformedSchemeSpecific: relativeMalformedSchemeSpecific,
3860
+ malformedHost: relativeMalformedHost,
3861
+ malformedScheme: relativeMalformedScheme
3862
+ } = parseWithStatus(relativeURI, schemelessOptions);
3863
+ if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) {
3864
+ throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
3865
+ }
3866
+ const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
3867
+ const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
3868
+ const resolvedHost = resolved.host;
3869
+ const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
3870
+ canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
3871
+ const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost);
3872
+ if (resolved.error && !encodedASCIIHost) {
3873
+ throw new Error(resolved.error);
3874
+ }
3649
3875
  schemelessOptions.skipEscape = true;
3650
3876
  return serialize(resolved, schemelessOptions);
3651
3877
  }
@@ -3705,7 +3931,7 @@ var require_fast_uri = __commonJS({
3705
3931
  function equal(uriA, uriB, options) {
3706
3932
  const normalizedA = normalizeComparableURI(uriA, options);
3707
3933
  const normalizedB = normalizeComparableURI(uriB, options);
3708
- return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
3934
+ return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB;
3709
3935
  }
3710
3936
  function serialize(cmpts, opts) {
3711
3937
  const component = {
@@ -3726,19 +3952,22 @@ var require_fast_uri = __commonJS({
3726
3952
  };
3727
3953
  const options = Object.assign({}, opts);
3728
3954
  const uriTokens = [];
3955
+ if (component.scheme) {
3956
+ component.scheme = decodeValidScheme(component.scheme);
3957
+ }
3729
3958
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
3730
3959
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
3960
+ const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
3961
+ const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
3731
3962
  if (component.path !== void 0) {
3732
3963
  if (!options.skipEscape) {
3733
- component.path = escapePreservingEscapes(component.path);
3734
- if (component.scheme !== void 0) {
3735
- component.path = component.path.split("%3A").join(":");
3736
- }
3964
+ component.path = serializePathEncoding(component.path, pathNoScheme);
3737
3965
  } else {
3738
3966
  component.path = normalizePercentEncoding(component.path);
3739
3967
  }
3740
3968
  }
3741
3969
  if (options.reference !== "suffix" && component.scheme) {
3970
+ component.scheme = decodeValidScheme(component.scheme);
3742
3971
  uriTokens.push(component.scheme, ":");
3743
3972
  }
3744
3973
  const authority = recomposeAuthority(component);
@@ -3756,20 +3985,25 @@ var require_fast_uri = __commonJS({
3756
3985
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
3757
3986
  s = removeDotSegments(s);
3758
3987
  }
3988
+ if (pathNoScheme) {
3989
+ s = serializePathEncoding(s, true);
3990
+ }
3759
3991
  if (authority === void 0 && s[0] === "/" && s[1] === "/") {
3760
3992
  s = "/%2F" + s.slice(2);
3761
3993
  }
3762
3994
  uriTokens.push(s);
3763
3995
  }
3764
3996
  if (component.query !== void 0) {
3765
- uriTokens.push("?", component.query);
3997
+ uriTokens.push("?", encodeQuery(component.query));
3766
3998
  }
3767
3999
  if (component.fragment !== void 0) {
3768
- uriTokens.push("#", component.fragment);
4000
+ uriTokens.push("#", encodeFragment(component.fragment));
3769
4001
  }
3770
4002
  return uriTokens.join("");
3771
4003
  }
3772
4004
  var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
4005
+ var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
4006
+ var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
3773
4007
  function getParseError(parsed, matches) {
3774
4008
  if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
3775
4009
  return 'URI path must start with "/" when authority is present.';
@@ -3779,6 +4013,35 @@ var require_fast_uri = __commonJS({
3779
4013
  }
3780
4014
  return void 0;
3781
4015
  }
4016
+ function hasMalformedPercentEncoding(component) {
4017
+ if (component === void 0) return false;
4018
+ let percent = component.indexOf("%");
4019
+ while (percent !== -1) {
4020
+ if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) {
4021
+ return true;
4022
+ }
4023
+ percent = component.indexOf("%", percent + 3);
4024
+ }
4025
+ return false;
4026
+ }
4027
+ function isIPLiteral(host) {
4028
+ return host[0] === "[" && host[host.length - 1] === "]";
4029
+ }
4030
+ function hasMalformedComponentPercentEncoding(matches) {
4031
+ const host = matches[4];
4032
+ return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4033
+ }
4034
+ function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4035
+ if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4036
+ try {
4037
+ parsed.host = new URL("http://" + parsed.host).hostname;
4038
+ } catch (e) {
4039
+ parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4040
+ return true;
4041
+ }
4042
+ }
4043
+ return false;
4044
+ }
3782
4045
  function parseWithStatus(uri, opts) {
3783
4046
  const options = Object.assign({}, opts);
3784
4047
  const parsed = {
@@ -3791,6 +4054,11 @@ var require_fast_uri = __commonJS({
3791
4054
  fragment: void 0
3792
4055
  };
3793
4056
  let malformedAuthorityOrPort = false;
4057
+ let malformedPercentEncoding = false;
4058
+ let malformedSchemeSpecific = false;
4059
+ let malformedHost = false;
4060
+ let malformedIPLiteral = false;
4061
+ let malformedScheme = false;
3794
4062
  let isIP = false;
3795
4063
  if (options.reference === "suffix") {
3796
4064
  if (options.scheme) {
@@ -3799,6 +4067,25 @@ var require_fast_uri = __commonJS({
3799
4067
  uri = "//" + uri;
3800
4068
  }
3801
4069
  }
4070
+ const authorityMatch = uri.match(AUTHORITY_PREFIX);
4071
+ if (authorityMatch !== null && authorityMatch[1].indexOf("\\") !== -1) {
4072
+ parsed.error = "URI authority must not contain a literal backslash.";
4073
+ malformedAuthorityOrPort = true;
4074
+ }
4075
+ const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
4076
+ if (introducerMatch !== null) {
4077
+ const region = introducerMatch[1];
4078
+ const normalizedRegion = region.replace(/[\t\n\r]/g, "");
4079
+ if (normalizedRegion.length >= 2) {
4080
+ if (normalizedRegion.slice(0, 2) !== "//") {
4081
+ parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
4082
+ malformedAuthorityOrPort = true;
4083
+ } else if (region.length !== normalizedRegion.length) {
4084
+ parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
4085
+ malformedAuthorityOrPort = true;
4086
+ }
4087
+ }
4088
+ }
3802
4089
  const matches = uri.match(URI_PARSE);
3803
4090
  if (matches) {
3804
4091
  parsed.scheme = matches[1];
@@ -3808,6 +4095,19 @@ var require_fast_uri = __commonJS({
3808
4095
  parsed.path = matches[6] || "";
3809
4096
  parsed.query = matches[7];
3810
4097
  parsed.fragment = matches[8];
4098
+ if (parsed.scheme !== void 0) {
4099
+ const decodedScheme = unescape(parsed.scheme);
4100
+ if (VALID_SCHEME.test(decodedScheme)) {
4101
+ parsed.scheme = decodedScheme.toLowerCase();
4102
+ } else {
4103
+ parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
4104
+ malformedScheme = true;
4105
+ }
4106
+ }
4107
+ malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches);
4108
+ if (malformedPercentEncoding) {
4109
+ parsed.error = parsed.error || "URI contains malformed percent-encoding.";
4110
+ }
3811
4111
  if (isNaN(parsed.port)) {
3812
4112
  parsed.port = matches[5];
3813
4113
  }
@@ -3819,9 +4119,16 @@ var require_fast_uri = __commonJS({
3819
4119
  if (parsed.host) {
3820
4120
  const ipv4result = isIPv4(parsed.host);
3821
4121
  if (ipv4result === false) {
4122
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
4123
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
3822
4124
  const ipv6result = normalizeIPv6(parsed.host);
3823
- parsed.host = ipv6result.host.toLowerCase();
3824
- isIP = ipv6result.isIPV6;
4125
+ isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
4126
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
4127
+ parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
4128
+ if (malformedIPLiteral) {
4129
+ parsed.error = parsed.error || "URI host is malformed.";
4130
+ malformedAuthorityOrPort = true;
4131
+ }
3825
4132
  } else {
3826
4133
  isIP = true;
3827
4134
  }
@@ -3839,42 +4146,37 @@ var require_fast_uri = __commonJS({
3839
4146
  parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
3840
4147
  }
3841
4148
  const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
3842
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
3843
- if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
3844
- try {
3845
- parsed.host = new URL("http://" + parsed.host).hostname;
3846
- } catch (e) {
3847
- parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
3848
- }
4149
+ if (!malformedIPLiteral) {
4150
+ malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
4151
+ }
4152
+ if (uri.indexOf("%") !== -1 && parsed.host !== void 0 && !malformedIPLiteral) {
4153
+ let host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
4154
+ if (!isIP) {
4155
+ host = normalizePercentEncoding(host.toLowerCase());
3849
4156
  }
4157
+ parsed.host = reescapeHostDelimiters(host, isIP);
3850
4158
  }
3851
4159
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
3852
- if (uri.indexOf("%") !== -1) {
3853
- if (parsed.scheme !== void 0) {
3854
- parsed.scheme = unescape(parsed.scheme);
3855
- }
3856
- if (parsed.host !== void 0) {
3857
- parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP);
3858
- }
3859
- }
3860
4160
  if (parsed.path) {
3861
4161
  parsed.path = normalizePathEncoding(parsed.path);
3862
4162
  }
4163
+ if (parsed.query) {
4164
+ parsed.query = normalizeQueryFragmentEncoding(parsed.query);
4165
+ }
3863
4166
  if (parsed.fragment) {
3864
- try {
3865
- parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
3866
- } catch {
3867
- parsed.error = parsed.error || "URI malformed";
3868
- }
4167
+ parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment);
3869
4168
  }
3870
4169
  }
3871
4170
  if (schemeHandler && schemeHandler.parse) {
3872
4171
  schemeHandler.parse(parsed, options);
4172
+ if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) {
4173
+ malformedSchemeSpecific = true;
4174
+ }
3873
4175
  }
3874
4176
  } else {
3875
4177
  parsed.error = parsed.error || "URI can not be parsed.";
3876
4178
  }
3877
- return { parsed, malformedAuthorityOrPort };
4179
+ return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme };
3878
4180
  }
3879
4181
  function parse3(uri, opts) {
3880
4182
  return parseWithStatus(uri, opts).parsed;
@@ -3883,20 +4185,28 @@ var require_fast_uri = __commonJS({
3883
4185
  return normalizeStringWithStatus(uri, opts).normalized;
3884
4186
  }
3885
4187
  function normalizeStringWithStatus(uri, opts) {
3886
- const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
4188
+ const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts);
3887
4189
  return {
3888
- normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
3889
- malformedAuthorityOrPort
4190
+ normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts),
4191
+ malformedAuthorityOrPort,
4192
+ malformedPercentEncoding,
4193
+ malformedSchemeSpecific,
4194
+ malformedHost,
4195
+ malformedScheme
3890
4196
  };
3891
4197
  }
3892
4198
  function normalizeComparableURI(uri, opts) {
3893
- if (typeof uri === "string") {
3894
- const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
3895
- return malformedAuthorityOrPort ? void 0 : normalized;
4199
+ if (typeof uri !== "string" && typeof uri !== "object") {
4200
+ return void 0;
3896
4201
  }
3897
- if (typeof uri === "object") {
3898
- return serialize(uri, opts);
4202
+ let value;
4203
+ try {
4204
+ value = typeof uri === "string" ? uri : serialize(uri, opts);
4205
+ } catch {
4206
+ return void 0;
3899
4207
  }
4208
+ const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts);
4209
+ return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized;
3900
4210
  }
3901
4211
  var fastUri = {
3902
4212
  SCHEMES,
@@ -13536,6 +13846,9 @@ var Protocol = class {
13536
13846
  this.setRequestHandler(GetTaskPayloadRequestSchema, async (request, extra) => {
13537
13847
  const handleTaskResult = async () => {
13538
13848
  const taskId = request.params.taskId;
13849
+ if (!await this._taskStore.getTask(taskId, extra.sessionId)) {
13850
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
13851
+ }
13539
13852
  if (this._taskMessageQueue) {
13540
13853
  let queuedMessage;
13541
13854
  while (queuedMessage = await this._taskMessageQueue.dequeue(taskId, extra.sessionId)) {
@@ -13566,12 +13879,12 @@ var Protocol = class {
13566
13879
  throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
13567
13880
  }
13568
13881
  if (!isTerminal(task.status)) {
13569
- await this._waitForTaskUpdate(taskId, extra.signal);
13882
+ await this._waitForTaskUpdate(taskId, extra.signal, extra.sessionId);
13570
13883
  return await handleTaskResult();
13571
13884
  }
13572
13885
  if (isTerminal(task.status)) {
13573
13886
  const result = await this._taskStore.getTaskResult(taskId, extra.sessionId);
13574
- this._clearTaskQueue(taskId);
13887
+ this._clearTaskQueue(taskId, extra.sessionId);
13575
13888
  return {
13576
13889
  ...result,
13577
13890
  _meta: {
@@ -13608,7 +13921,7 @@ var Protocol = class {
13608
13921
  throw new McpError(ErrorCode.InvalidParams, `Cannot cancel task in terminal status: ${task.status}`);
13609
13922
  }
13610
13923
  await this._taskStore.updateTaskStatus(request.params.taskId, "cancelled", "Client cancelled task execution.", extra.sessionId);
13611
- this._clearTaskQueue(request.params.taskId);
13924
+ this._clearTaskQueue(request.params.taskId, extra.sessionId);
13612
13925
  const cancelledTask = await this._taskStore.getTask(request.params.taskId, extra.sessionId);
13613
13926
  if (!cancelledTask) {
13614
13927
  throw new McpError(ErrorCode.InvalidParams, `Task not found after cancellation: ${request.params.taskId}`);
@@ -13736,6 +14049,19 @@ var Protocol = class {
13736
14049
  const handler = this._requestHandlers.get(request.method) ?? this.fallbackRequestHandler;
13737
14050
  const capturedTransport = this._transport;
13738
14051
  const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId;
14052
+ const sessionId = capturedTransport?.sessionId;
14053
+ const store = this._taskStore;
14054
+ let relatedTaskFound = true;
14055
+ let relatedTaskLookup;
14056
+ if (relatedTaskId && store && this._taskMessageQueue && sessionId !== void 0) {
14057
+ relatedTaskFound = false;
14058
+ relatedTaskLookup = (async () => {
14059
+ if (!await store.getTask(relatedTaskId, sessionId)) {
14060
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${relatedTaskId}`);
14061
+ }
14062
+ relatedTaskFound = true;
14063
+ })();
14064
+ }
13739
14065
  if (handler === void 0) {
13740
14066
  const errorResponse = {
13741
14067
  jsonrpc: "2.0",
@@ -13745,7 +14071,10 @@ var Protocol = class {
13745
14071
  message: "Method not found"
13746
14072
  }
13747
14073
  };
13748
- if (relatedTaskId && this._taskMessageQueue) {
14074
+ if (relatedTaskId && relatedTaskLookup) {
14075
+ const queuedError = { type: "error", message: errorResponse, timestamp: Date.now() };
14076
+ relatedTaskLookup.then(() => this._enqueueTaskMessage(relatedTaskId, queuedError, sessionId), () => capturedTransport?.send(errorResponse)).catch((error2) => this._onerror(new Error(`Failed to send an error response: ${error2}`)));
14077
+ } else if (relatedTaskId && this._taskMessageQueue) {
13749
14078
  this._enqueueTaskMessage(relatedTaskId, {
13750
14079
  type: "error",
13751
14080
  message: errorResponse,
@@ -13796,7 +14125,10 @@ var Protocol = class {
13796
14125
  closeSSEStream: extra?.closeSSEStream,
13797
14126
  closeStandaloneSSEStream: extra?.closeStandaloneSSEStream
13798
14127
  };
13799
- Promise.resolve().then(() => {
14128
+ (relatedTaskLookup ?? Promise.resolve()).then(() => {
14129
+ if (relatedTaskLookup && abortController.signal.aborted) {
14130
+ throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled");
14131
+ }
13800
14132
  if (taskCreationParams) {
13801
14133
  this.assertTaskHandlerCapability(request.method);
13802
14134
  }
@@ -13831,7 +14163,7 @@ var Protocol = class {
13831
14163
  ...error2["data"] !== void 0 && { data: error2["data"] }
13832
14164
  }
13833
14165
  };
13834
- if (relatedTaskId && this._taskMessageQueue) {
14166
+ if (relatedTaskId && this._taskMessageQueue && relatedTaskFound) {
13835
14167
  await this._enqueueTaskMessage(relatedTaskId, {
13836
14168
  type: "error",
13837
14169
  message: errorResponse,
@@ -14311,7 +14643,7 @@ var Protocol = class {
14311
14643
  throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");
14312
14644
  }
14313
14645
  const maxQueueSize = this._options?.maxTaskQueueSize;
14314
- await this._taskMessageQueue.enqueue(taskId, message, sessionId, maxQueueSize);
14646
+ await this._taskMessageQueue.enqueue(taskId, message, sessionId ?? this._transport?.sessionId, maxQueueSize);
14315
14647
  }
14316
14648
  /**
14317
14649
  * Clears the message queue for a task and rejects any pending request resolvers.
@@ -14340,12 +14672,13 @@ var Protocol = class {
14340
14672
  * Uses polling to check for updates at the task's configured poll interval.
14341
14673
  * @param taskId The task ID to wait for
14342
14674
  * @param signal Abort signal to cancel the wait
14675
+ * @param sessionId Session of the request that waits, passed to the task store
14343
14676
  * @returns Promise that resolves when an update occurs or rejects if aborted
14344
14677
  */
14345
- async _waitForTaskUpdate(taskId, signal) {
14678
+ async _waitForTaskUpdate(taskId, signal, sessionId) {
14346
14679
  let interval = this._options?.defaultTaskPollInterval ?? 1e3;
14347
14680
  try {
14348
- const task = await this._taskStore?.getTask(taskId);
14681
+ const task = await this._taskStore?.getTask(taskId, sessionId);
14349
14682
  if (task?.pollInterval) {
14350
14683
  interval = task.pollInterval;
14351
14684
  }
@@ -14826,16 +15159,7 @@ var Client = class extends Protocol {
14826
15159
  if (!methodSchema) {
14827
15160
  throw new Error("Schema is missing a method literal");
14828
15161
  }
14829
- let methodValue;
14830
- if (isZ4Schema(methodSchema)) {
14831
- const v4Schema = methodSchema;
14832
- const v4Def = v4Schema._zod?.def;
14833
- methodValue = v4Def?.value ?? v4Schema.value;
14834
- } else {
14835
- const v3Schema = methodSchema;
14836
- const legacyDef = v3Schema._def;
14837
- methodValue = legacyDef?.value ?? v3Schema.value;
14838
- }
15162
+ const methodValue = getLiteralValue(methodSchema);
14839
15163
  if (typeof methodValue !== "string") {
14840
15164
  throw new Error("Schema method literal must be a string");
14841
15165
  }
@@ -15232,8 +15556,17 @@ var import_node_process = __toESM(require("node:process"), 1);
15232
15556
  var import_node_stream = require("node:stream");
15233
15557
 
15234
15558
  // node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
15559
+ var STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;
15235
15560
  var ReadBuffer = class {
15561
+ constructor(options) {
15562
+ this._maxBufferSize = options?.maxBufferSize ?? STDIO_DEFAULT_MAX_BUFFER_SIZE;
15563
+ }
15236
15564
  append(chunk) {
15565
+ const newSize = (this._buffer?.length ?? 0) + chunk.length;
15566
+ if (newSize > this._maxBufferSize) {
15567
+ this.clear();
15568
+ throw new Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`);
15569
+ }
15237
15570
  this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
15238
15571
  }
15239
15572
  readMessage() {
@@ -15293,9 +15626,9 @@ function getDefaultEnvironment() {
15293
15626
  }
15294
15627
  var StdioClientTransport = class {
15295
15628
  constructor(server) {
15296
- this._readBuffer = new ReadBuffer();
15297
15629
  this._stderrStream = null;
15298
15630
  this._serverParams = server;
15631
+ this._readBuffer = new ReadBuffer({ maxBufferSize: server.maxBufferSize });
15299
15632
  if (server.stderr === "pipe" || server.stderr === "overlapped") {
15300
15633
  this._stderrStream = new import_node_stream.PassThrough();
15301
15634
  }
@@ -15334,8 +15667,14 @@ var StdioClientTransport = class {
15334
15667
  this.onerror?.(error2);
15335
15668
  });
15336
15669
  this._process.stdout?.on("data", (chunk) => {
15337
- this._readBuffer.append(chunk);
15338
- this.processReadBuffer();
15670
+ try {
15671
+ this._readBuffer.append(chunk);
15672
+ this.processReadBuffer();
15673
+ } catch (error2) {
15674
+ this.onerror?.(error2);
15675
+ this.close().catch(() => {
15676
+ });
15677
+ }
15339
15678
  });
15340
15679
  this._process.stdout?.on("error", (error2) => {
15341
15680
  this.onerror?.(error2);