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.
- package/client/dist/assets/{ActivityFeedPage-B1bpTy7O.js → ActivityFeedPage-Dtp7EyHc.js} +1 -1
- package/client/dist/assets/{AgentBrowserCapture-BussBbN3.js → AgentBrowserCapture-CLqlEFw8.js} +1 -1
- package/client/dist/assets/{AgentModeAnalyticsPane-BiT1n3BU.js → AgentModeAnalyticsPane-B8_hM3Tw.js} +2 -2
- package/client/dist/assets/{AgentModeCodePane-CUjNfeKa.js → AgentModeCodePane-CNF8ZNjE.js} +2 -2
- package/client/dist/assets/{AgentModeJobsPane-RVEwyS59.js → AgentModeJobsPane-CJpJbO9m.js} +1 -1
- package/client/dist/assets/AgentsPage-BC8XSR79.js +120 -0
- package/client/dist/assets/{AnalyticsPage-Bser2Ly3.js → AnalyticsPage-Cdv4jLtW.js} +1 -1
- package/client/dist/assets/{CodePage-BK0grm6e.js → CodePage-DI1kegAr.js} +1 -1
- package/client/dist/assets/{DesktopAnalyticsPage-DEBidZbs.js → DesktopAnalyticsPage-Bdp8E8U6.js} +1 -1
- package/client/dist/assets/{DocsDialog-Dhyo57n9.js → DocsDialog-Bm4RS7FX.js} +1 -1
- package/client/dist/assets/{DocsPage-BcEkPXd6.js → DocsPage-DihYcU8r.js} +1 -1
- package/client/dist/assets/{ExportDropdown-mRmqdkjr.js → ExportDropdown-Bb1lHx3r.js} +1 -1
- package/client/dist/assets/{InteractiveJobComposer-BlCe3vrU.js → InteractiveJobComposer-BO6ASN-2.js} +1 -1
- package/client/dist/assets/{JobDetailModal-CkAejD1F.js → JobDetailModal-CuPYq7tP.js} +1 -1
- package/client/dist/assets/{JobDetailPage-P-FS_lKz.js → JobDetailPage-BusMjJi9.js} +1 -1
- package/client/dist/assets/{JobsPage-CoUXgYse.js → JobsPage-C0QbsF2d.js} +1 -1
- package/client/dist/assets/{LoopBuilderPage-iFylNk68.js → LoopBuilderPage-B7TlU4iS.js} +1 -1
- package/client/dist/assets/{LoopPreviewModal-4obS_Ptg.js → LoopPreviewModal-BRWtXOD2.js} +1 -1
- package/client/dist/assets/{LoopWindowSurface-CLr5OPqj.js → LoopWindowSurface-DE0v2K1p.js} +1 -1
- package/client/dist/assets/{LoopsPage-eKpWFtCp.js → LoopsPage-C4q1DmCE.js} +1 -1
- package/client/dist/assets/{MinimizedChatsContext-BHIUPVmC.js → MinimizedChatsContext-DHfigjHS.js} +1 -1
- package/client/dist/assets/{PluginsPage-BgTC2CQx.js → PluginsPage-Z1JHSMdR.js} +1 -1
- package/client/dist/assets/{ProjectSettingsDialog-B4chTfU8.js → ProjectSettingsDialog-BUNj0tvN.js} +1 -1
- package/client/dist/assets/{RepositoryDeliveries-DAIxIYsl.js → RepositoryDeliveries-B4ybHOyB.js} +1 -1
- package/client/dist/assets/{RepositoryScopeSelector-DeCoUsRN.js → RepositoryScopeSelector-2eSqR9WK.js} +1 -1
- package/client/dist/assets/{ReviewPacketPage-Cktv0-9b.js → ReviewPacketPage-hwfPNjyy.js} +1 -1
- package/client/dist/assets/{TemplatePreviewModal-BZTV1TM1.js → TemplatePreviewModal-V7FpMWuw.js} +1 -1
- package/client/dist/assets/{TicketDetailModalContext-DiPngt2g.js → TicketDetailModalContext-Dkwo2cDs.js} +1 -1
- package/client/dist/assets/{Trans-ZiXIfj50.js → Trans-BbFxRFtR.js} +1 -1
- package/client/dist/assets/{formatDistanceToNow-CdN5lTyD.js → formatDistanceToNow-NjPHBLfB.js} +1 -1
- package/client/dist/assets/{getTimezoneOffsetInMilliseconds-62h40I4t.js → getTimezoneOffsetInMilliseconds-vJ7qUoqN.js} +1 -1
- package/client/dist/assets/{index-CECj3joE.js → index-Ce4yZtKf.js} +36 -36
- package/client/dist/assets/{jira-api-C_D_RDhl.js → jira-api-Cabj-H0J.js} +1 -1
- package/client/dist/assets/{project-repositories-Be0CWklo.js → project-repositories-Cnnuj9Ia.js} +1 -1
- package/client/dist/assets/{settings-Hw7av-B1.js → settings-B1NV8Ow9.js} +1 -1
- package/client/dist/assets/settings-BQ8XFZeE.js +1 -0
- package/client/dist/assets/settings-BRkxfBbO.js +1 -0
- package/client/dist/assets/settings-C_CcU1dP.js +1 -0
- package/client/dist/assets/settings-Cto9n0eL.js +1 -0
- package/client/dist/assets/{settings-nryN6wuS.js → settings-Pyw8uYtL.js} +1 -1
- package/client/dist/assets/settings-b3HVCNNd.js +1 -0
- package/client/dist/assets/settings-hdive4u6.js +1 -0
- package/client/dist/assets/{spending-eWiZGhC_.js → spending-CQnrWiR3.js} +1 -1
- package/client/dist/assets/{useDesktop-C0mRIlHT.js → useDesktop-BjLT0_EE.js} +1 -1
- package/client/dist/assets/{useRuntimeRuns-B1a6GChu.js → useRuntimeRuns-C97qEqMg.js} +1 -1
- package/client/dist/assets/{useSharedWebSocket-CcsE5986.js → useSharedWebSocket-Bj4LMp7b.js} +2 -2
- package/client/dist/index.html +15 -15
- package/docs/internals/api-reference.md +26 -0
- package/docs/internals/core-runtime-updates.md +3 -3
- package/docs/internals/source-map.md +9 -2
- package/local-runner/dist/specrails-local-runner.js +487 -148
- package/mcp-bridge/dist/specrails-mcp.js +330 -42
- package/package.json +6 -3
- package/server/dist/index.js +14 -1
- package/server/dist/mobile/mobile-admin-router.js +16 -0
- package/server/dist/mobile/mobile-gateway.js +18 -0
- package/server/dist/mobile/mobile-missions.js +6 -4
- package/server/dist/mobile/mobile-preview-channel.js +179 -0
- package/server/dist/mobile/mobile-preview.js +366 -0
- package/server/dist/mobile/mobile-router.js +9 -1
- package/server/dist/mobile/mobile-webrtc-peer.js +54 -4
- package/server/dist/mobile/mobile-ws.js +4 -2
- package/server/dist/modules/browser/domain/preview-origins.js +117 -0
- package/server/dist/modules/browser/runtime/browser-capture-manager.js +141 -18
- package/server/dist/modules/browser/runtime/browser-capture-types.js +10 -1
- package/server/dist/modules/browser/runtime/browser-playwright.js +19 -0
- package/server/dist/modules/browser/runtime/preview-targets.js +80 -0
- package/server/dist/modules/terminals/runtime/background-process-service.js +24 -1
- package/server/dist/project-registry.js +10 -0
- package/client/dist/assets/AgentsPage-DKE-eMC5.js +0 -118
- package/client/dist/assets/settings-BO2N-oPf.js +0 -1
- package/client/dist/assets/settings-BQChAs_w.js +0 -1
- package/client/dist/assets/settings-BzmYlcQB.js +0 -1
- package/client/dist/assets/settings-CGjXb6TX.js +0 -1
- package/client/dist/assets/settings-CMxEWY46.js +0 -1
- 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(/^[
|
|
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
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
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
|
-
|
|
3171
|
+
return false;
|
|
3155
3172
|
}
|
|
3156
3173
|
return true;
|
|
3157
3174
|
}
|
|
3158
|
-
function
|
|
3159
|
-
let
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
let
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
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
|
-
|
|
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 (
|
|
3198
|
-
if (
|
|
3199
|
-
|
|
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
|
-
|
|
3207
|
-
|
|
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
|
-
|
|
3211
|
-
|
|
3212
|
-
}
|
|
3213
|
-
|
|
3214
|
-
if (
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
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
|
-
|
|
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(
|
|
3358
|
-
output +=
|
|
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
|
-
|
|
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 =
|
|
3563
|
+
let host = component.host;
|
|
3388
3564
|
if (!isIPv4(host)) {
|
|
3389
|
-
|
|
3390
|
-
if (ipV6res.isIPV6
|
|
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(
|
|
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 =
|
|
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
|
|
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 =
|
|
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,
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
3824
|
-
|
|
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 (!
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
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
|
-
|
|
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
|
|
3894
|
-
|
|
3895
|
-
return malformedAuthorityOrPort ? void 0 : normalized;
|
|
4199
|
+
if (typeof uri !== "string" && typeof uri !== "object") {
|
|
4200
|
+
return void 0;
|
|
3896
4201
|
}
|
|
3897
|
-
|
|
3898
|
-
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
|
|
15338
|
-
|
|
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);
|