@chrischall/pickuppatrol-mcp 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -3109,9 +3109,28 @@ var require_utils = __commonJS({
3109
3109
  "use strict";
3110
3110
  var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
3111
3111
  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);
3112
+ var isPort = RegExp.prototype.test.bind(/^\d*$/u);
3112
3113
  var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
3113
3114
  var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
3114
- var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
3115
+ var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
3116
+ var isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u);
3117
+ var isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u);
3118
+ var BYTE_HEX = new Array(256);
3119
+ {
3120
+ const HEX_DIGITS = "0123456789ABCDEF";
3121
+ for (let i = 0; i < 256; i++) {
3122
+ BYTE_HEX[i] = "%" + HEX_DIGITS[i >> 4] + HEX_DIGITS[i & 15];
3123
+ }
3124
+ }
3125
+ function percentEncodeNonAscii(cp) {
3126
+ if (cp < 2048) {
3127
+ return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63];
3128
+ }
3129
+ if (cp < 65536) {
3130
+ return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3131
+ }
3132
+ return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
3133
+ }
3115
3134
  function stringArrayToHexStripped(input) {
3116
3135
  let acc = "";
3117
3136
  let code = 0;
@@ -3136,91 +3155,105 @@ var require_utils = __commonJS({
3136
3155
  }
3137
3156
  return acc;
3138
3157
  }
3158
+ var isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/);
3159
+ var isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/);
3160
+ var isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/);
3139
3161
  var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
3140
- function consumeIsZone(buffer) {
3141
- buffer.length = 0;
3142
- return true;
3143
- }
3144
- function consumeHextets(buffer, address, output) {
3145
- if (buffer.length) {
3146
- const hex3 = stringArrayToHexStripped(buffer);
3147
- if (hex3 !== "") {
3148
- address.push(hex3);
3149
- } else {
3150
- output.error = true;
3151
- return false;
3162
+ function isZoneIdentifier(zone) {
3163
+ if (zone.length === 0) return false;
3164
+ for (let i = 0; i < zone.length; i++) {
3165
+ if (isZoneCharacter(zone[i])) continue;
3166
+ if (zone[i] === "%" && i + 2 < zone.length && isHexPair(zone.slice(i + 1, i + 3))) {
3167
+ i += 2;
3168
+ continue;
3152
3169
  }
3153
- buffer.length = 0;
3170
+ return false;
3154
3171
  }
3155
3172
  return true;
3156
3173
  }
3157
- function getIPV6(input) {
3158
- let tokenCount = 0;
3159
- const output = { error: false, address: "", zone: "" };
3160
- const address = [];
3161
- const buffer = [];
3162
- let endipv6Encountered = false;
3163
- let endIpv6 = false;
3164
- let consume = consumeHextets;
3165
- for (let i = 0; i < input.length; i++) {
3166
- const cursor = input[i];
3167
- if (cursor === "[" || cursor === "]") {
3168
- continue;
3169
- }
3170
- if (cursor === ":") {
3171
- if (endipv6Encountered === true) {
3172
- endIpv6 = true;
3173
- }
3174
- if (!consume(buffer, address, output)) {
3175
- break;
3174
+ function compressIPv6ZeroRun(hextets) {
3175
+ let bestStart = -1;
3176
+ let bestLength = 0;
3177
+ let runStart = -1;
3178
+ let runLength = 0;
3179
+ for (let i = 0; i < hextets.length; i++) {
3180
+ if (hextets[i] === "0") {
3181
+ if (runStart === -1) runStart = i;
3182
+ runLength++;
3183
+ if (runLength > bestLength) {
3184
+ bestLength = runLength;
3185
+ bestStart = runStart;
3176
3186
  }
3177
- if (++tokenCount > 7) {
3178
- output.error = true;
3179
- break;
3180
- }
3181
- if (i > 0 && input[i - 1] === ":") {
3182
- endipv6Encountered = true;
3183
- }
3184
- address.push(":");
3185
- continue;
3186
- } else if (cursor === "%") {
3187
- if (!consume(buffer, address, output)) {
3188
- break;
3189
- }
3190
- consume = consumeIsZone;
3191
3187
  } else {
3192
- buffer.push(cursor);
3188
+ runStart = -1;
3189
+ runLength = 0;
3190
+ }
3191
+ }
3192
+ if (bestLength < 2) return hextets.join(":");
3193
+ const head = hextets.slice(0, bestStart).join(":");
3194
+ const tail = hextets.slice(bestStart + bestLength).join(":");
3195
+ return head + "::" + tail;
3196
+ }
3197
+ function normalizeIPv6Address(input) {
3198
+ const compression = input.indexOf("::");
3199
+ if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0;
3200
+ const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":");
3201
+ const right = compression === -1 ? [] : input.slice(compression + 2).split(":");
3202
+ if (compression !== -1) {
3203
+ if (left.length === 1 && left[0] === "") left.length = 0;
3204
+ if (right.length === 1 && right[0] === "") right.length = 0;
3205
+ }
3206
+ const parts = left.concat(right);
3207
+ let hextetCount = 0;
3208
+ for (let i = 0; i < parts.length; i++) {
3209
+ const part = parts[i];
3210
+ if (part === "") return void 0;
3211
+ if (part.indexOf(".") !== -1) {
3212
+ if (i !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv4(part)) return void 0;
3213
+ hextetCount += 2;
3193
3214
  continue;
3194
3215
  }
3216
+ if (!isHextet(part)) return void 0;
3217
+ parts[i] = parseInt(part, 16).toString(16);
3218
+ hextetCount++;
3195
3219
  }
3196
- if (buffer.length) {
3197
- if (consume === consumeIsZone) {
3198
- output.zone = buffer.join("");
3199
- } else if (endIpv6) {
3200
- address.push(buffer.join(""));
3201
- } else {
3202
- address.push(stringArrayToHexStripped(buffer));
3203
- }
3220
+ if (compression === -1) {
3221
+ if (hextetCount !== 8) return void 0;
3222
+ return compressIPv6ZeroRun(parts);
3204
3223
  }
3205
- output.address = address.join("");
3206
- return output;
3224
+ if (hextetCount >= 8) return void 0;
3225
+ const expanded = parts.slice(0, left.length);
3226
+ for (let i = hextetCount; i < 8; i++) expanded.push("0");
3227
+ for (let i = left.length; i < parts.length; i++) expanded.push(parts[i]);
3228
+ return compressIPv6ZeroRun(expanded);
3207
3229
  }
3208
3230
  function normalizeIPv6(host) {
3209
- if (findToken(host, ":") < 2) {
3210
- return { host, isIPV6: false };
3211
- }
3212
- const ipv63 = getIPV6(host);
3213
- if (!ipv63.error) {
3214
- let newHost = ipv63.address;
3215
- let escapedHost = ipv63.address;
3216
- if (ipv63.zone) {
3217
- newHost += "%" + ipv63.zone;
3218
- escapedHost += "%25" + ipv63.zone;
3219
- }
3220
- return { host: newHost, isIPV6: true, escapedHost };
3221
- } else {
3222
- return { host, isIPV6: false };
3223
- }
3231
+ const bracketed = host[0] === "[" && host[host.length - 1] === "]";
3232
+ const hasBracket = host[0] === "[" || host[host.length - 1] === "]";
3233
+ if (hasBracket && !bracketed) return { host, isIPV6: false, error: true };
3234
+ let input = bracketed ? host.slice(1, -1) : host;
3235
+ if (bracketed && isIPvFuture(input)) {
3236
+ input = input.toLowerCase();
3237
+ return { host: `[${input}]`, escapedHost: input, isIPV6: false, isIPVFuture: true };
3238
+ }
3239
+ if (findToken(input, ":") < 2) {
3240
+ return { host, isIPV6: false, error: bracketed };
3241
+ }
3242
+ let zoneIdentifier = "";
3243
+ const zoneSeparator = input.indexOf("%");
3244
+ if (zoneSeparator !== -1) {
3245
+ const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1;
3246
+ zoneIdentifier = input.slice(zoneSeparator + separatorLength);
3247
+ if (!isZoneIdentifier(zoneIdentifier)) return { host, isIPV6: false, error: true };
3248
+ input = input.slice(0, zoneSeparator);
3249
+ }
3250
+ const address = normalizeIPv6Address(input);
3251
+ if (address === void 0) return { host, isIPV6: false, error: true };
3252
+ return {
3253
+ host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""),
3254
+ escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""),
3255
+ isIPV6: true
3256
+ };
3224
3257
  }
3225
3258
  function findToken(str, token) {
3226
3259
  let ind = 0;
@@ -3339,7 +3372,8 @@ var require_utils = __commonJS({
3339
3372
  function normalizePathEncoding(input) {
3340
3373
  let output = "";
3341
3374
  for (let i = 0; i < input.length; i++) {
3342
- if (input[i] === "%" && i + 2 < input.length) {
3375
+ const ch = input[i];
3376
+ if (ch === "%" && i + 2 < input.length) {
3343
3377
  const hex3 = input.slice(i + 1, i + 3);
3344
3378
  if (isHexPair(hex3)) {
3345
3379
  const normalizedHex = hex3.toUpperCase();
@@ -3353,10 +3387,152 @@ var require_utils = __commonJS({
3353
3387
  continue;
3354
3388
  }
3355
3389
  }
3356
- if (isPathCharacter(input[i])) {
3357
- output += input[i];
3390
+ if (isPathCharacter(ch)) {
3391
+ output += ch;
3358
3392
  } else {
3359
- output += escape(input[i]);
3393
+ const code = input.charCodeAt(i);
3394
+ if (code < 128) {
3395
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
3396
+ } else if (code < 55296 || code > 57343) {
3397
+ output += percentEncodeNonAscii(code);
3398
+ } else if (code <= 56319 && i + 1 < input.length) {
3399
+ const low = input.charCodeAt(i + 1);
3400
+ if (low >= 56320 && low <= 57343) {
3401
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3402
+ i++;
3403
+ } else {
3404
+ output += percentEncodeNonAscii(65533);
3405
+ }
3406
+ } else {
3407
+ output += percentEncodeNonAscii(65533);
3408
+ }
3409
+ }
3410
+ }
3411
+ return output;
3412
+ }
3413
+ function serializePathEncoding(input, pathNoScheme = false) {
3414
+ let output = "";
3415
+ let firstSegment = pathNoScheme && input[0] !== "/";
3416
+ for (let i = 0; i < input.length; i++) {
3417
+ const ch = input[i];
3418
+ if (ch === "%" && i + 2 < input.length) {
3419
+ const hex3 = input.slice(i + 1, i + 3);
3420
+ if (isHexPair(hex3)) {
3421
+ output += "%" + hex3.toUpperCase();
3422
+ i += 2;
3423
+ continue;
3424
+ }
3425
+ }
3426
+ if (ch === "/") {
3427
+ firstSegment = false;
3428
+ }
3429
+ if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) {
3430
+ output += ch;
3431
+ } else {
3432
+ const code = input.charCodeAt(i);
3433
+ if (code < 128) {
3434
+ output += BYTE_HEX[code];
3435
+ } else if (code < 55296 || code > 57343) {
3436
+ output += percentEncodeNonAscii(code);
3437
+ } else if (code <= 56319 && i + 1 < input.length) {
3438
+ const low = input.charCodeAt(i + 1);
3439
+ if (low >= 56320 && low <= 57343) {
3440
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3441
+ i++;
3442
+ } else {
3443
+ output += percentEncodeNonAscii(65533);
3444
+ }
3445
+ } else {
3446
+ output += percentEncodeNonAscii(65533);
3447
+ }
3448
+ }
3449
+ }
3450
+ return output;
3451
+ }
3452
+ function encodeComponent(input, isAllowed) {
3453
+ let output = "";
3454
+ for (let i = 0; i < input.length; i++) {
3455
+ const ch = input[i];
3456
+ if (ch === "%" && i + 2 < input.length) {
3457
+ const hex3 = input.slice(i + 1, i + 3);
3458
+ if (isHexPair(hex3)) {
3459
+ output += "%" + hex3.toUpperCase();
3460
+ i += 2;
3461
+ continue;
3462
+ }
3463
+ }
3464
+ if (isAllowed(ch)) {
3465
+ output += ch;
3466
+ } else {
3467
+ const code = input.charCodeAt(i);
3468
+ if (code < 128) {
3469
+ output += BYTE_HEX[code];
3470
+ } else if (code < 55296 || code > 57343) {
3471
+ output += percentEncodeNonAscii(code);
3472
+ } else if (code <= 56319 && i + 1 < input.length) {
3473
+ const low = input.charCodeAt(i + 1);
3474
+ if (low >= 56320 && low <= 57343) {
3475
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3476
+ i++;
3477
+ } else {
3478
+ output += percentEncodeNonAscii(65533);
3479
+ }
3480
+ } else {
3481
+ output += percentEncodeNonAscii(65533);
3482
+ }
3483
+ }
3484
+ }
3485
+ return output;
3486
+ }
3487
+ function encodeUserinfo(input) {
3488
+ return encodeComponent(input, isUserinfoCharacter);
3489
+ }
3490
+ function encodeQuery(input) {
3491
+ return encodeComponent(input, isQueryFragmentCharacter);
3492
+ }
3493
+ function encodeFragment(input) {
3494
+ return encodeComponent(input, isQueryFragmentCharacter);
3495
+ }
3496
+ function isEscapeSafe(cp) {
3497
+ 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;
3498
+ }
3499
+ function normalizeQueryFragmentEncoding(input) {
3500
+ let output = "";
3501
+ for (let i = 0; i < input.length; i++) {
3502
+ const ch = input[i];
3503
+ if (ch === "%" && i + 2 < input.length) {
3504
+ const hex3 = input.slice(i + 1, i + 3);
3505
+ if (isHexPair(hex3)) {
3506
+ const normalizedHex = hex3.toUpperCase();
3507
+ const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
3508
+ if (isUnreserved(decoded)) {
3509
+ output += decoded;
3510
+ } else {
3511
+ output += "%" + normalizedHex;
3512
+ }
3513
+ i += 2;
3514
+ continue;
3515
+ }
3516
+ }
3517
+ if (isQueryFragmentCharacter(ch)) {
3518
+ output += ch;
3519
+ } else {
3520
+ const code = input.charCodeAt(i);
3521
+ if (code < 128) {
3522
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
3523
+ } else if (code < 55296 || code > 57343) {
3524
+ output += percentEncodeNonAscii(code);
3525
+ } else if (code <= 56319 && i + 1 < input.length) {
3526
+ const low = input.charCodeAt(i + 1);
3527
+ if (low >= 56320 && low <= 57343) {
3528
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
3529
+ i++;
3530
+ } else {
3531
+ output += percentEncodeNonAscii(65533);
3532
+ }
3533
+ } else {
3534
+ output += percentEncodeNonAscii(65533);
3535
+ }
3360
3536
  }
3361
3537
  }
3362
3538
  return output;
@@ -3379,14 +3555,18 @@ var require_utils = __commonJS({
3379
3555
  function recomposeAuthority(component) {
3380
3556
  const uriTokens = [];
3381
3557
  if (component.userinfo !== void 0) {
3382
- uriTokens.push(component.userinfo);
3558
+ uriTokens.push(encodeUserinfo(component.userinfo));
3383
3559
  uriTokens.push("@");
3384
3560
  }
3385
3561
  if (component.host !== void 0) {
3386
- let host = unescape(component.host);
3562
+ let host = component.host;
3387
3563
  if (!isIPv4(host)) {
3388
- const ipV6res = normalizeIPv6(host);
3389
- if (ipV6res.isIPV6 === true) {
3564
+ let ipV6res = normalizeIPv6(host);
3565
+ if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) {
3566
+ host = normalizePercentEncoding(host, true);
3567
+ ipV6res = normalizeIPv6(host);
3568
+ }
3569
+ if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) {
3390
3570
  host = `[${ipV6res.escapedHost}]`;
3391
3571
  } else {
3392
3572
  host = reescapeHostDelimiters(host, false);
@@ -3395,8 +3575,12 @@ var require_utils = __commonJS({
3395
3575
  uriTokens.push(host);
3396
3576
  }
3397
3577
  if (typeof component.port === "number" || typeof component.port === "string") {
3578
+ const port = String(component.port);
3579
+ if (!isPort(port)) {
3580
+ throw new TypeError("URI port is malformed.");
3581
+ }
3398
3582
  uriTokens.push(":");
3399
- uriTokens.push(String(component.port));
3583
+ uriTokens.push(port);
3400
3584
  }
3401
3585
  return uriTokens.length ? uriTokens.join("") : void 0;
3402
3586
  }
@@ -3406,6 +3590,11 @@ var require_utils = __commonJS({
3406
3590
  reescapeHostDelimiters,
3407
3591
  normalizePercentEncoding,
3408
3592
  normalizePathEncoding,
3593
+ serializePathEncoding,
3594
+ normalizeQueryFragmentEncoding,
3595
+ encodeUserinfo,
3596
+ encodeQuery,
3597
+ encodeFragment,
3409
3598
  escapePreservingEscapes,
3410
3599
  removeDotSegments,
3411
3600
  isIPv4,
@@ -3421,7 +3610,7 @@ var require_schemes = __commonJS({
3421
3610
  "node_modules/fast-uri/lib/schemes.js"(exports, module) {
3422
3611
  "use strict";
3423
3612
  var { isUUID } = require_utils();
3424
- var URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;
3613
+ var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
3425
3614
  var supportedSchemeNames = (
3426
3615
  /** @type {const} */
3427
3616
  [
@@ -3482,9 +3671,10 @@ var require_schemes = __commonJS({
3482
3671
  wsComponent.secure = void 0;
3483
3672
  }
3484
3673
  if (wsComponent.resourceName) {
3485
- const [path, query] = wsComponent.resourceName.split("?");
3674
+ const queryIndex = wsComponent.resourceName.indexOf("?");
3675
+ const path = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex);
3486
3676
  wsComponent.path = path && path !== "/" ? path : void 0;
3487
- wsComponent.query = query;
3677
+ wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1);
3488
3678
  wsComponent.resourceName = void 0;
3489
3679
  }
3490
3680
  wsComponent.fragment = void 0;
@@ -3496,7 +3686,7 @@ var require_schemes = __commonJS({
3496
3686
  return urnComponent;
3497
3687
  }
3498
3688
  const matches = urnComponent.path.match(URN_REG);
3499
- if (matches) {
3689
+ if (matches && matches[0] === urnComponent.path) {
3500
3690
  const scheme = options.scheme || urnComponent.scheme || "urn";
3501
3691
  urnComponent.nid = matches[1].toLowerCase();
3502
3692
  urnComponent.nss = matches[2];
@@ -3630,8 +3820,17 @@ var require_schemes = __commonJS({
3630
3820
  var require_fast_uri = __commonJS({
3631
3821
  "node_modules/fast-uri/index.js"(exports, module) {
3632
3822
  "use strict";
3633
- var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3823
+ var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3634
3824
  var { SCHEMES, getSchemeHandler } = require_schemes();
3825
+ var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
3826
+ var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
3827
+ function decodeValidScheme(scheme) {
3828
+ const decodedScheme = unescape(String(scheme));
3829
+ if (!VALID_SCHEME.test(decodedScheme)) {
3830
+ throw new TypeError(MALFORMED_SCHEME_ERROR);
3831
+ }
3832
+ return decodedScheme;
3833
+ }
3635
3834
  function normalize(uri, options) {
3636
3835
  if (typeof uri === "string") {
3637
3836
  uri = /** @type {T} */
@@ -3644,12 +3843,34 @@ var require_fast_uri = __commonJS({
3644
3843
  }
3645
3844
  function resolve(baseURI, relativeURI, options) {
3646
3845
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
3647
- const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
3648
- const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
3649
- if (baseMalformed || relativeMalformed) {
3846
+ const {
3847
+ parsed: baseParsed,
3848
+ malformedAuthorityOrPort: baseMalformed,
3849
+ malformedPercentEncoding: baseMalformedPercentEncoding,
3850
+ malformedSchemeSpecific: baseMalformedSchemeSpecific,
3851
+ malformedHost: baseMalformedHost,
3852
+ malformedScheme: baseMalformedScheme
3853
+ } = parseWithStatus(baseURI, schemelessOptions);
3854
+ const {
3855
+ parsed: relativeParsed,
3856
+ malformedAuthorityOrPort: relativeMalformed,
3857
+ malformedPercentEncoding: relativeMalformedPercentEncoding,
3858
+ malformedSchemeSpecific: relativeMalformedSchemeSpecific,
3859
+ malformedHost: relativeMalformedHost,
3860
+ malformedScheme: relativeMalformedScheme
3861
+ } = parseWithStatus(relativeURI, schemelessOptions);
3862
+ if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) {
3650
3863
  throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
3651
3864
  }
3652
3865
  const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
3866
+ const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
3867
+ const resolvedHost = resolved.host;
3868
+ const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
3869
+ canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
3870
+ const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !/\P{ASCII}/u.test(resolvedHost);
3871
+ if (resolved.error && !encodedASCIIHost) {
3872
+ throw new Error(resolved.error);
3873
+ }
3653
3874
  schemelessOptions.skipEscape = true;
3654
3875
  return serialize(resolved, schemelessOptions);
3655
3876
  }
@@ -3709,7 +3930,7 @@ var require_fast_uri = __commonJS({
3709
3930
  function equal(uriA, uriB, options) {
3710
3931
  const normalizedA = normalizeComparableURI(uriA, options);
3711
3932
  const normalizedB = normalizeComparableURI(uriB, options);
3712
- return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
3933
+ return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB;
3713
3934
  }
3714
3935
  function serialize(cmpts, opts) {
3715
3936
  const component = {
@@ -3730,19 +3951,22 @@ var require_fast_uri = __commonJS({
3730
3951
  };
3731
3952
  const options = Object.assign({}, opts);
3732
3953
  const uriTokens = [];
3954
+ if (component.scheme) {
3955
+ component.scheme = decodeValidScheme(component.scheme);
3956
+ }
3733
3957
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
3734
3958
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
3959
+ const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
3960
+ const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
3735
3961
  if (component.path !== void 0) {
3736
3962
  if (!options.skipEscape) {
3737
- component.path = escapePreservingEscapes(component.path);
3738
- if (component.scheme !== void 0) {
3739
- component.path = component.path.split("%3A").join(":");
3740
- }
3963
+ component.path = serializePathEncoding(component.path, pathNoScheme);
3741
3964
  } else {
3742
3965
  component.path = normalizePercentEncoding(component.path);
3743
3966
  }
3744
3967
  }
3745
3968
  if (options.reference !== "suffix" && component.scheme) {
3969
+ component.scheme = decodeValidScheme(component.scheme);
3746
3970
  uriTokens.push(component.scheme, ":");
3747
3971
  }
3748
3972
  const authority = recomposeAuthority(component);
@@ -3760,16 +3984,19 @@ var require_fast_uri = __commonJS({
3760
3984
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
3761
3985
  s = removeDotSegments(s);
3762
3986
  }
3987
+ if (pathNoScheme) {
3988
+ s = serializePathEncoding(s, true);
3989
+ }
3763
3990
  if (authority === void 0 && s[0] === "/" && s[1] === "/") {
3764
3991
  s = "/%2F" + s.slice(2);
3765
3992
  }
3766
3993
  uriTokens.push(s);
3767
3994
  }
3768
3995
  if (component.query !== void 0) {
3769
- uriTokens.push("?", component.query);
3996
+ uriTokens.push("?", encodeQuery(component.query));
3770
3997
  }
3771
3998
  if (component.fragment !== void 0) {
3772
- uriTokens.push("#", component.fragment);
3999
+ uriTokens.push("#", encodeFragment(component.fragment));
3773
4000
  }
3774
4001
  return uriTokens.join("");
3775
4002
  }
@@ -3785,6 +4012,35 @@ var require_fast_uri = __commonJS({
3785
4012
  }
3786
4013
  return void 0;
3787
4014
  }
4015
+ function hasMalformedPercentEncoding(component) {
4016
+ if (component === void 0) return false;
4017
+ let percent = component.indexOf("%");
4018
+ while (percent !== -1) {
4019
+ if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) {
4020
+ return true;
4021
+ }
4022
+ percent = component.indexOf("%", percent + 3);
4023
+ }
4024
+ return false;
4025
+ }
4026
+ function isIPLiteral(host) {
4027
+ return host[0] === "[" && host[host.length - 1] === "]";
4028
+ }
4029
+ function hasMalformedComponentPercentEncoding(matches) {
4030
+ const host = matches[4];
4031
+ return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4032
+ }
4033
+ function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4034
+ if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4035
+ try {
4036
+ parsed.host = new URL("http://" + parsed.host).hostname;
4037
+ } catch (e) {
4038
+ parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4039
+ return true;
4040
+ }
4041
+ }
4042
+ return false;
4043
+ }
3788
4044
  function parseWithStatus(uri, opts) {
3789
4045
  const options = Object.assign({}, opts);
3790
4046
  const parsed = {
@@ -3797,6 +4053,11 @@ var require_fast_uri = __commonJS({
3797
4053
  fragment: void 0
3798
4054
  };
3799
4055
  let malformedAuthorityOrPort = false;
4056
+ let malformedPercentEncoding = false;
4057
+ let malformedSchemeSpecific = false;
4058
+ let malformedHost = false;
4059
+ let malformedIPLiteral = false;
4060
+ let malformedScheme = false;
3800
4061
  let isIP = false;
3801
4062
  if (options.reference === "suffix") {
3802
4063
  if (options.scheme) {
@@ -3833,6 +4094,19 @@ var require_fast_uri = __commonJS({
3833
4094
  parsed.path = matches[6] || "";
3834
4095
  parsed.query = matches[7];
3835
4096
  parsed.fragment = matches[8];
4097
+ if (parsed.scheme !== void 0) {
4098
+ const decodedScheme = unescape(parsed.scheme);
4099
+ if (VALID_SCHEME.test(decodedScheme)) {
4100
+ parsed.scheme = decodedScheme.toLowerCase();
4101
+ } else {
4102
+ parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
4103
+ malformedScheme = true;
4104
+ }
4105
+ }
4106
+ malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches);
4107
+ if (malformedPercentEncoding) {
4108
+ parsed.error = parsed.error || "URI contains malformed percent-encoding.";
4109
+ }
3836
4110
  if (isNaN(parsed.port)) {
3837
4111
  parsed.port = matches[5];
3838
4112
  }
@@ -3844,9 +4118,16 @@ var require_fast_uri = __commonJS({
3844
4118
  if (parsed.host) {
3845
4119
  const ipv4result = isIPv4(parsed.host);
3846
4120
  if (ipv4result === false) {
4121
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
4122
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
3847
4123
  const ipv6result = normalizeIPv6(parsed.host);
3848
- parsed.host = ipv6result.host.toLowerCase();
3849
- isIP = ipv6result.isIPV6;
4124
+ isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
4125
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
4126
+ parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
4127
+ if (malformedIPLiteral) {
4128
+ parsed.error = parsed.error || "URI host is malformed.";
4129
+ malformedAuthorityOrPort = true;
4130
+ }
3850
4131
  } else {
3851
4132
  isIP = true;
3852
4133
  }
@@ -3864,42 +4145,36 @@ var require_fast_uri = __commonJS({
3864
4145
  parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
3865
4146
  }
3866
4147
  const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
3867
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
3868
- if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
3869
- try {
3870
- parsed.host = new URL("http://" + parsed.host).hostname;
3871
- } catch (e) {
3872
- parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
3873
- }
3874
- }
4148
+ if (!malformedIPLiteral) {
4149
+ malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
3875
4150
  }
3876
4151
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
3877
4152
  if (uri.indexOf("%") !== -1) {
3878
- if (parsed.scheme !== void 0) {
3879
- parsed.scheme = unescape(parsed.scheme);
3880
- }
3881
- if (parsed.host !== void 0) {
3882
- parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP);
4153
+ if (parsed.host !== void 0 && !malformedIPLiteral) {
4154
+ const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
4155
+ parsed.host = reescapeHostDelimiters(host, isIP);
3883
4156
  }
3884
4157
  }
3885
4158
  if (parsed.path) {
3886
4159
  parsed.path = normalizePathEncoding(parsed.path);
3887
4160
  }
4161
+ if (parsed.query) {
4162
+ parsed.query = normalizeQueryFragmentEncoding(parsed.query);
4163
+ }
3888
4164
  if (parsed.fragment) {
3889
- try {
3890
- parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
3891
- } catch {
3892
- parsed.error = parsed.error || "URI malformed";
3893
- }
4165
+ parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment);
3894
4166
  }
3895
4167
  }
3896
4168
  if (schemeHandler && schemeHandler.parse) {
3897
4169
  schemeHandler.parse(parsed, options);
4170
+ if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) {
4171
+ malformedSchemeSpecific = true;
4172
+ }
3898
4173
  }
3899
4174
  } else {
3900
4175
  parsed.error = parsed.error || "URI can not be parsed.";
3901
4176
  }
3902
- return { parsed, malformedAuthorityOrPort };
4177
+ return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme };
3903
4178
  }
3904
4179
  function parse3(uri, opts) {
3905
4180
  return parseWithStatus(uri, opts).parsed;
@@ -3908,20 +4183,28 @@ var require_fast_uri = __commonJS({
3908
4183
  return normalizeStringWithStatus(uri, opts).normalized;
3909
4184
  }
3910
4185
  function normalizeStringWithStatus(uri, opts) {
3911
- const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
4186
+ const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts);
3912
4187
  return {
3913
- normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
3914
- malformedAuthorityOrPort
4188
+ normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts),
4189
+ malformedAuthorityOrPort,
4190
+ malformedPercentEncoding,
4191
+ malformedSchemeSpecific,
4192
+ malformedHost,
4193
+ malformedScheme
3915
4194
  };
3916
4195
  }
3917
4196
  function normalizeComparableURI(uri, opts) {
3918
- if (typeof uri === "string") {
3919
- const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
3920
- return malformedAuthorityOrPort ? void 0 : normalized;
4197
+ if (typeof uri !== "string" && typeof uri !== "object") {
4198
+ return void 0;
3921
4199
  }
3922
- if (typeof uri === "object") {
3923
- return serialize(uri, opts);
4200
+ let value;
4201
+ try {
4202
+ value = typeof uri === "string" ? uri : serialize(uri, opts);
4203
+ } catch {
4204
+ return void 0;
3924
4205
  }
4206
+ const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts);
4207
+ return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized;
3925
4208
  }
3926
4209
  var fastUri = {
3927
4210
  SCHEMES,
@@ -31000,53 +31283,6 @@ var StdioServerTransport = class {
31000
31283
  }
31001
31284
  };
31002
31285
 
31003
- // node_modules/@chrischall/mcp-utils/dist/server/index.js
31004
- async function createMcpServer(opts) {
31005
- const server = new McpServer({ name: opts.name, version: opts.version });
31006
- if (opts.banner !== void 0) {
31007
- console.error(opts.banner);
31008
- }
31009
- const deps = opts.deps;
31010
- for (const register of opts.tools) {
31011
- await register(server, deps);
31012
- }
31013
- return server;
31014
- }
31015
- function withGracefulShutdown(server, opts = {}) {
31016
- const shouldExit = opts.exit ?? true;
31017
- let shuttingDown = false;
31018
- const handler = (signal) => {
31019
- if (shuttingDown)
31020
- return;
31021
- shuttingDown = true;
31022
- void (async () => {
31023
- try {
31024
- if (opts.onSignal)
31025
- await opts.onSignal(signal);
31026
- await server.close();
31027
- } catch (err) {
31028
- console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
31029
- } finally {
31030
- if (shouldExit)
31031
- process.exit(0);
31032
- }
31033
- })();
31034
- };
31035
- process.on("SIGINT", () => handler("SIGINT"));
31036
- process.on("SIGTERM", () => handler("SIGTERM"));
31037
- }
31038
- async function runMcp(opts) {
31039
- const server = await createMcpServer(opts);
31040
- const shutdown = opts.shutdown ?? true;
31041
- if (shutdown !== false) {
31042
- withGracefulShutdown(server, shutdown === true ? {} : shutdown);
31043
- }
31044
- const spec = opts.transport ?? "stdio";
31045
- const transport = spec === "stdio" ? new StdioServerTransport() : spec;
31046
- await server.connect(transport);
31047
- return server;
31048
- }
31049
-
31050
31286
  // node_modules/@chrischall/mcp-utils/dist/errors/index.js
31051
31287
  var McpToolError = class extends Error {
31052
31288
  /** Actionable remediation text, when one applies. */
@@ -31092,12 +31328,16 @@ function messageOf(err) {
31092
31328
  return String(err);
31093
31329
  }
31094
31330
 
31095
- // node_modules/@chrischall/mcp-utils/dist/response/index.js
31096
- function textResult(data) {
31097
- return {
31098
- content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
31099
- };
31331
+ // node_modules/@chrischall/mcp-utils/dist/response/view.js
31332
+ function minifiedResult(data) {
31333
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
31100
31334
  }
31335
+
31336
+ // node_modules/@chrischall/mcp-utils/dist/response/media.js
31337
+ var MEDIA_NOUN = "(?:avatar|tall_avatar|cover_photo|cover_image|picture|photo|thumbnail|thumb|image|icon|banner|profile_pic(?:ture)?|logo)";
31338
+ var MEDIA_KEY = new RegExp(`^${MEDIA_NOUN}s?(?:(?:link|uri|url)s?)?$`, "i");
31339
+
31340
+ // node_modules/@chrischall/mcp-utils/dist/response/index.js
31101
31341
  function errorResult(message) {
31102
31342
  return {
31103
31343
  content: [{ type: "text", text: redactSecrets(message) }],
@@ -31105,6 +31345,75 @@ function errorResult(message) {
31105
31345
  };
31106
31346
  }
31107
31347
 
31348
+ // node_modules/@chrischall/mcp-utils/dist/server/index.js
31349
+ function hintResultOrRethrow(err) {
31350
+ if (err instanceof McpToolError && err.hint) {
31351
+ return errorResult(`${err.message}
31352
+
31353
+ Hint: ${err.hint}`);
31354
+ }
31355
+ throw err;
31356
+ }
31357
+ function surfaceToolHints(server) {
31358
+ const register = server.registerTool.bind(server);
31359
+ server.registerTool = (name, config2, cb) => register(name, config2, (...args) => {
31360
+ let result;
31361
+ try {
31362
+ result = cb(...args);
31363
+ } catch (err) {
31364
+ return hintResultOrRethrow(err);
31365
+ }
31366
+ return result instanceof Promise ? result.catch(hintResultOrRethrow) : result;
31367
+ });
31368
+ }
31369
+ async function createMcpServer(opts) {
31370
+ const server = new McpServer({ name: opts.name, version: opts.version });
31371
+ if (opts.surfaceHints !== false)
31372
+ surfaceToolHints(server);
31373
+ if (opts.banner !== void 0) {
31374
+ console.error(opts.banner);
31375
+ }
31376
+ const deps = opts.deps;
31377
+ for (const register of opts.tools) {
31378
+ await register(server, deps);
31379
+ }
31380
+ return server;
31381
+ }
31382
+ function withGracefulShutdown(server, opts = {}) {
31383
+ const shouldExit = opts.exit ?? true;
31384
+ let shuttingDown = false;
31385
+ const handler = (signal) => {
31386
+ if (shuttingDown)
31387
+ return;
31388
+ shuttingDown = true;
31389
+ void (async () => {
31390
+ try {
31391
+ if (opts.onSignal)
31392
+ await opts.onSignal(signal);
31393
+ await server.close();
31394
+ } catch (err) {
31395
+ console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
31396
+ } finally {
31397
+ if (shouldExit)
31398
+ process.exit(0);
31399
+ }
31400
+ })();
31401
+ };
31402
+ process.on("SIGINT", () => handler("SIGINT"));
31403
+ process.on("SIGTERM", () => handler("SIGTERM"));
31404
+ }
31405
+ async function runMcp(opts) {
31406
+ const server = await createMcpServer(opts);
31407
+ const shutdown = opts.shutdown ?? true;
31408
+ if (shutdown !== false) {
31409
+ withGracefulShutdown(server, shutdown === true ? {} : shutdown);
31410
+ }
31411
+ const spec = opts.transport ?? "stdio";
31412
+ const transport = spec === "stdio" ? new StdioServerTransport() : spec;
31413
+ await server.connect(transport);
31414
+ return server;
31415
+ }
31416
+
31108
31417
  // node_modules/@chrischall/mcp-utils/dist/config/index.js
31109
31418
  var PLACEHOLDER_RE = /^\$\{[^}]*\}$/;
31110
31419
  function readEnvVar(key, opts = {}) {
@@ -31503,7 +31812,7 @@ var PickUpPatrolClient = class {
31503
31812
  var client = new PickUpPatrolClient();
31504
31813
 
31505
31814
  // src/version.ts
31506
- var VERSION = "0.1.1";
31815
+ var VERSION = "0.2.0";
31507
31816
 
31508
31817
  // src/dates.ts
31509
31818
  var WEEKDAY_NAMES = [
@@ -31568,7 +31877,7 @@ function registerAccountTools(server, client2) {
31568
31877
  },
31569
31878
  async () => {
31570
31879
  const session = await client2.getSession();
31571
- return textResult({
31880
+ return minifiedResult({
31572
31881
  userId: session.UserId ?? null,
31573
31882
  name: session.DisplayName ?? [session.FirstName, session.LastName].filter(Boolean).join(" "),
31574
31883
  email: session.Email ?? session.PrimaryEmail ?? null,
@@ -31591,7 +31900,7 @@ function registerAccountTools(server, client2) {
31591
31900
  client2.getDefaultPlansReviewNeeded()
31592
31901
  ]);
31593
31902
  const needsReview = new Map(review.map((r) => [r.StudentId, r.NeedsReview]));
31594
- return textResult(
31903
+ return minifiedResult(
31595
31904
  students.map((student) => ({
31596
31905
  ...summarizeStudent(student),
31597
31906
  needsDefaultsReview: needsReview.get(student.StudentId) ?? false
@@ -31611,7 +31920,7 @@ function registerAccountTools(server, client2) {
31611
31920
  },
31612
31921
  async ({ student_id, raw }) => {
31613
31922
  const student = await client2.getStudent(student_id);
31614
- return textResult(raw === true ? student : summarizeStudent(student));
31923
+ return minifiedResult(raw === true ? student : summarizeStudent(student));
31615
31924
  }
31616
31925
  );
31617
31926
  server.registerTool(
@@ -31623,14 +31932,14 @@ function registerAccountTools(server, client2) {
31623
31932
  async () => {
31624
31933
  try {
31625
31934
  const session = await client2.getSession();
31626
- return textResult({
31935
+ return minifiedResult({
31627
31936
  ok: true,
31628
31937
  version: VERSION,
31629
31938
  signedInAs: session.Email ?? session.PrimaryEmail ?? session.DisplayName ?? null,
31630
31939
  studentCount: session.Children?.length ?? 0
31631
31940
  });
31632
31941
  } catch (err) {
31633
- return textResult({ ok: false, version: VERSION, error: messageOf(err) });
31942
+ return minifiedResult({ ok: false, version: VERSION, error: messageOf(err) });
31634
31943
  }
31635
31944
  }
31636
31945
  );
@@ -31664,7 +31973,7 @@ function registerSchoolTools(server, client2) {
31664
31973
  async ({ school_id, include_inactive }) => {
31665
31974
  const options = await client2.getTransportations(school_id);
31666
31975
  const visible = include_inactive === true ? options : options.filter((o) => o.IsActive !== false);
31667
- return textResult(visible.map(summarizeTransportation));
31976
+ return minifiedResult(visible.map(summarizeTransportation));
31668
31977
  }
31669
31978
  );
31670
31979
  server.registerTool(
@@ -31682,7 +31991,7 @@ function registerSchoolTools(server, client2) {
31682
31991
  client2.getSchoolNotifyTimes(school_id),
31683
31992
  client2.getSchoolSettings(school_id)
31684
31993
  ]);
31685
- return textResult({ school, notifyTimes, settings });
31994
+ return minifiedResult({ school, notifyTimes, settings });
31686
31995
  }
31687
31996
  );
31688
31997
  server.registerTool(
@@ -31699,10 +32008,10 @@ function registerSchoolTools(server, client2) {
31699
32008
  async ({ school_id, start_date, end_date }) => {
31700
32009
  const invalidDates = await client2.getInvalidPlanDates(school_id);
31701
32010
  if (start_date === void 0 || end_date === void 0) {
31702
- return textResult({ invalidDates });
32011
+ return minifiedResult({ invalidDates });
31703
32012
  }
31704
32013
  const changedDates = await client2.getBoldedDates(start_date, end_date);
31705
- return textResult({ invalidDates, changedDates });
32014
+ return minifiedResult({ invalidDates, changedDates });
31706
32015
  }
31707
32016
  );
31708
32017
  server.registerTool(
@@ -31714,7 +32023,7 @@ function registerSchoolTools(server, client2) {
31714
32023
  school_id: external_exports.number().int().describe("School id, from pup_list_students")
31715
32024
  }
31716
32025
  },
31717
- async ({ school_id }) => textResult(await client2.getCarNumbers(school_id))
32026
+ async ({ school_id }) => minifiedResult(await client2.getCarNumbers(school_id))
31718
32027
  );
31719
32028
  }
31720
32029
 
@@ -31851,7 +32160,7 @@ function clearDefaultPlans(student) {
31851
32160
  // src/tools/_confirm.ts
31852
32161
  function previewUnlessConfirmed(confirm, action, method, dto, body) {
31853
32162
  if (confirm === true) return null;
31854
- return textResult({
32163
+ return minifiedResult({
31855
32164
  dryRun: true,
31856
32165
  action,
31857
32166
  method,
@@ -31861,22 +32170,6 @@ function previewUnlessConfirmed(confirm, action, method, dto, body) {
31861
32170
  });
31862
32171
  }
31863
32172
 
31864
- // src/tools/_errors.ts
31865
- function withHints(handler) {
31866
- return async (args) => {
31867
- try {
31868
- return await handler(args);
31869
- } catch (err) {
31870
- if (err instanceof McpToolError && err.hint) {
31871
- return errorResult(`${err.message}
31872
-
31873
- Hint: ${err.hint}`);
31874
- }
31875
- throw err;
31876
- }
31877
- };
31878
- }
31879
-
31880
32173
  // src/tools/plans.ts
31881
32174
  function proofsMatch(a, b) {
31882
32175
  return a.transportationId === b.transportationId && (a.note ?? "").trim() === (b.note ?? "").trim();
@@ -31905,7 +32198,7 @@ function registerPlanTools(server, client2) {
31905
32198
  end_date: external_exports.string().describe("YYYY-MM-DD")
31906
32199
  }
31907
32200
  },
31908
- async ({ start_date, end_date }) => textResult(await client2.getParentPlans(start_date, end_date))
32201
+ async ({ start_date, end_date }) => minifiedResult(await client2.getParentPlans(start_date, end_date))
31909
32202
  );
31910
32203
  server.registerTool(
31911
32204
  "pup_get_plan",
@@ -31917,7 +32210,7 @@ function registerPlanTools(server, client2) {
31917
32210
  date: external_exports.string().describe("YYYY-MM-DD")
31918
32211
  }
31919
32212
  },
31920
- async ({ student_id, date: date5 }) => textResult(await client2.getPlanEdit(date5, student_id))
32213
+ async ({ student_id, date: date5 }) => minifiedResult(await client2.getPlanEdit(date5, student_id))
31921
32214
  );
31922
32215
  server.registerTool(
31923
32216
  "pup_set_plan",
@@ -31935,7 +32228,7 @@ function registerPlanTools(server, client2) {
31935
32228
  confirm: schemaConfirm
31936
32229
  }
31937
32230
  },
31938
- withHints(async ({ student_id, dates, transportation_id, note, early_dismissal_time, car_number, confirm }) => {
32231
+ (async ({ student_id, dates, transportation_id, note, early_dismissal_time, car_number, confirm }) => {
31939
32232
  const student = await client2.getStudent(student_id);
31940
32233
  const transportation = transportation_id === null ? null : await resolveTransportation(client2, student.SchoolId, transportation_id);
31941
32234
  const plans = buildPlanUpdates({
@@ -31974,7 +32267,7 @@ function registerPlanTools(server, client2) {
31974
32267
  })
31975
32268
  );
31976
32269
  const failed = verification.filter((v) => !v.verified);
31977
- return textResult({
32270
+ return minifiedResult({
31978
32271
  action,
31979
32272
  applied: verification,
31980
32273
  verified: failed.length === 0,
@@ -32022,7 +32315,7 @@ function registerDefaultPlanTools(server, client2) {
32022
32315
  client2.getStudent(student_id),
32023
32316
  client2.getDefaultPlansReviewNeeded()
32024
32317
  ]);
32025
- return textResult({
32318
+ return minifiedResult({
32026
32319
  studentId: student.StudentId,
32027
32320
  name: [student.FirstName, student.LastName].filter(Boolean).join(" "),
32028
32321
  schoolId: student.SchoolId,
@@ -32048,7 +32341,7 @@ function registerDefaultPlanTools(server, client2) {
32048
32341
  confirm: schemaConfirm
32049
32342
  }
32050
32343
  },
32051
- withHints(async ({ student_id, days, transportation_id, note, early_dismissal_time, clear_all, confirm }) => {
32344
+ (async ({ student_id, days, transportation_id, note, early_dismissal_time, clear_all, confirm }) => {
32052
32345
  const student = await client2.getStudent(student_id);
32053
32346
  if (clear_all === true) {
32054
32347
  const payload2 = clearDefaultPlans(student);
@@ -32063,7 +32356,7 @@ function registerDefaultPlanTools(server, client2) {
32063
32356
  await client2.updateStudent(payload2);
32064
32357
  const after2 = await client2.getStudent(student_id);
32065
32358
  const remaining = after2.DefaultPlans ?? [];
32066
- return textResult({
32359
+ return minifiedResult({
32067
32360
  action: "Cleared every weekday default",
32068
32361
  defaultPlans: summarizeDefaultPlans(remaining),
32069
32362
  verified: remaining.length === 0,
@@ -32107,7 +32400,7 @@ function registerDefaultPlanTools(server, client2) {
32107
32400
  { transportationId: transportation.TransportationId, note: sentNote }
32108
32401
  );
32109
32402
  });
32110
- return textResult({
32403
+ return minifiedResult({
32111
32404
  action,
32112
32405
  defaultPlans: summarizeDefaultPlans(after.DefaultPlans),
32113
32406
  verified: unchanged.length === 0,
@@ -32141,7 +32434,7 @@ function registerDefaultPlanTools(server, client2) {
32141
32434
  await client2.setDefaultsReviewed(student_id, value);
32142
32435
  const review = await client2.getDefaultPlansReviewNeeded();
32143
32436
  const needsReview = review.find((r) => r.StudentId === student_id)?.NeedsReview ?? false;
32144
- return textResult({
32437
+ return minifiedResult({
32145
32438
  studentId: student_id,
32146
32439
  needsDefaultsReview: needsReview,
32147
32440
  verified: needsReview === !value