infinitecampus-mcp 3.1.2 → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/bundle.js +245 -138
- package/dist/client.js +168 -31
- package/dist/config.js +16 -0
- package/dist/index.js +1 -1
- package/dist/tools/documents.js +2 -2
- package/dist/tools/schedule.js +6 -3
- package/mint.yaml +7 -2
- package/package.json +1 -1
- package/server.json +8 -2
- package/skills/ic/SKILL.md +5 -5
- package/skills/infinitecampus-api/references/endpoints.md +2 -2
package/dist/bundle.js
CHANGED
|
@@ -4858,7 +4858,7 @@ var require_memoizer = __commonJS({
|
|
|
4858
4858
|
var NONE2 = 0;
|
|
4859
4859
|
var ASSUMED2 = 1;
|
|
4860
4860
|
var PROVEN2 = 2;
|
|
4861
|
-
function isRecursive2(inst, stack,
|
|
4861
|
+
function isRecursive2(inst, stack, resolve3) {
|
|
4862
4862
|
const cached2 = recursive2.get(inst);
|
|
4863
4863
|
if (cached2 !== void 0)
|
|
4864
4864
|
return cached2 ? PROVEN2 : NONE2;
|
|
@@ -4868,7 +4868,7 @@ var require_memoizer = __commonJS({
|
|
|
4868
4868
|
let result = NONE2;
|
|
4869
4869
|
const check2 = (child) => {
|
|
4870
4870
|
if (result !== PROVEN2 && child?._zod) {
|
|
4871
|
-
const answer = isRecursive2(child, stack,
|
|
4871
|
+
const answer = isRecursive2(child, stack, resolve3);
|
|
4872
4872
|
if (answer > result)
|
|
4873
4873
|
result = answer;
|
|
4874
4874
|
}
|
|
@@ -4879,7 +4879,7 @@ var require_memoizer = __commonJS({
|
|
|
4879
4879
|
const desc = Object.getOwnPropertyDescriptor(sh, key);
|
|
4880
4880
|
if (spread && !desc.enumerable)
|
|
4881
4881
|
continue;
|
|
4882
|
-
const child = desc.get ? ASSUMED2 : desc.value?._zod ? isRecursive2(desc.value, stack,
|
|
4882
|
+
const child = desc.get ? ASSUMED2 : desc.value?._zod ? isRecursive2(desc.value, stack, resolve3) : NONE2;
|
|
4883
4883
|
if (child > answer)
|
|
4884
4884
|
answer = child;
|
|
4885
4885
|
}
|
|
@@ -4943,7 +4943,7 @@ var require_memoizer = __commonJS({
|
|
|
4943
4943
|
break;
|
|
4944
4944
|
// `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
|
|
4945
4945
|
case "lazy": {
|
|
4946
|
-
const inner = def._cachedInner ?? (
|
|
4946
|
+
const inner = def._cachedInner ?? (resolve3 ? inst._zod.innerType : void 0);
|
|
4947
4947
|
merge2(inner ? isRecursive2(inner, stack, false) : ASSUMED2);
|
|
4948
4948
|
break;
|
|
4949
4949
|
}
|
|
@@ -5007,7 +5007,7 @@ var require_memoizer = __commonJS({
|
|
|
5007
5007
|
return bucket;
|
|
5008
5008
|
}
|
|
5009
5009
|
var handoff2;
|
|
5010
|
-
var
|
|
5010
|
+
var open3 = [];
|
|
5011
5011
|
var memo3 = {
|
|
5012
5012
|
alloc(_inst, payload, empty) {
|
|
5013
5013
|
const bucket = handoff2;
|
|
@@ -5016,7 +5016,7 @@ var require_memoizer = __commonJS({
|
|
|
5016
5016
|
handoff2 = void 0;
|
|
5017
5017
|
const entry = { value: empty, issues: null };
|
|
5018
5018
|
bucket.set(payload.value, entry);
|
|
5019
|
-
|
|
5019
|
+
open3.push(entry);
|
|
5020
5020
|
return empty;
|
|
5021
5021
|
},
|
|
5022
5022
|
guard(inst) {
|
|
@@ -5087,10 +5087,10 @@ var require_memoizer = __commonJS({
|
|
|
5087
5087
|
return payload;
|
|
5088
5088
|
}
|
|
5089
5089
|
handoff2 = bucket;
|
|
5090
|
-
const depth =
|
|
5090
|
+
const depth = open3.length;
|
|
5091
5091
|
const result = base(payload, ctx);
|
|
5092
5092
|
handoff2 = void 0;
|
|
5093
|
-
const entry =
|
|
5093
|
+
const entry = open3.length > depth ? open3.pop() : void 0;
|
|
5094
5094
|
if (result instanceof Promise) {
|
|
5095
5095
|
return result.then((r) => {
|
|
5096
5096
|
if (entry)
|
|
@@ -26497,7 +26497,7 @@ var require_stream = __commonJS({
|
|
|
26497
26497
|
};
|
|
26498
26498
|
duplex._final = function(callback) {
|
|
26499
26499
|
if (ws.readyState === ws.CONNECTING) {
|
|
26500
|
-
ws.once("open", function
|
|
26500
|
+
ws.once("open", function open3() {
|
|
26501
26501
|
duplex._final(callback);
|
|
26502
26502
|
});
|
|
26503
26503
|
return;
|
|
@@ -26518,7 +26518,7 @@ var require_stream = __commonJS({
|
|
|
26518
26518
|
};
|
|
26519
26519
|
duplex._write = function(chunk2, encoding, callback) {
|
|
26520
26520
|
if (ws.readyState === ws.CONNECTING) {
|
|
26521
|
-
ws.once("open", function
|
|
26521
|
+
ws.once("open", function open3() {
|
|
26522
26522
|
duplex._write(chunk2, encoding, callback);
|
|
26523
26523
|
});
|
|
26524
26524
|
return;
|
|
@@ -26980,7 +26980,7 @@ var require_websocket_server = __commonJS({
|
|
|
26980
26980
|
});
|
|
26981
26981
|
|
|
26982
26982
|
// src/index.ts
|
|
26983
|
-
import { dirname as dirname3, join as
|
|
26983
|
+
import { dirname as dirname3, join as join6 } from "path";
|
|
26984
26984
|
import { fileURLToPath } from "url";
|
|
26985
26985
|
|
|
26986
26986
|
// node_modules/@chrischall/mcp-utils/dist/cancel/index.js
|
|
@@ -31399,14 +31399,14 @@ function inputRequiredRoundsExceededMessage(method, maxRounds) {
|
|
|
31399
31399
|
return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
|
|
31400
31400
|
}
|
|
31401
31401
|
function sleep(ms, signal) {
|
|
31402
|
-
return new Promise((
|
|
31402
|
+
return new Promise((resolve3, reject) => {
|
|
31403
31403
|
if (signal?.aborted) {
|
|
31404
31404
|
reject(signal.reason instanceof SdkError ? signal.reason : new SdkError(SdkErrorCode.RequestTimeout, String(signal.reason)));
|
|
31405
31405
|
return;
|
|
31406
31406
|
}
|
|
31407
31407
|
const timer = setTimeout(() => {
|
|
31408
31408
|
signal?.removeEventListener("abort", onAbort);
|
|
31409
|
-
|
|
31409
|
+
resolve3();
|
|
31410
31410
|
}, ms);
|
|
31411
31411
|
const onAbort = () => {
|
|
31412
31412
|
clearTimeout(timer);
|
|
@@ -32200,7 +32200,7 @@ var Protocol = class {
|
|
|
32200
32200
|
const flowStartedAt = Date.now();
|
|
32201
32201
|
let onAbort;
|
|
32202
32202
|
let cleanupMessageId;
|
|
32203
|
-
return new Promise((
|
|
32203
|
+
return new Promise((resolve3, reject) => {
|
|
32204
32204
|
const earlyReject = (error62) => {
|
|
32205
32205
|
reject(error62);
|
|
32206
32206
|
};
|
|
@@ -32268,7 +32268,7 @@ var Protocol = class {
|
|
|
32268
32268
|
}
|
|
32269
32269
|
if (decoded.kind === "invalid") return reject(decoded.error);
|
|
32270
32270
|
if (decoded.kind === "input_required") {
|
|
32271
|
-
if (options?.allowInputRequired === true) return
|
|
32271
|
+
if (options?.allowInputRequired === true) return resolve3(manualInputRequiredValue(decoded));
|
|
32272
32272
|
const flow = {
|
|
32273
32273
|
codec: codec2,
|
|
32274
32274
|
request,
|
|
@@ -32280,11 +32280,11 @@ var Protocol = class {
|
|
|
32280
32280
|
params
|
|
32281
32281
|
}, resultSchema, legOptions)
|
|
32282
32282
|
};
|
|
32283
|
-
return
|
|
32283
|
+
return resolve3(this._resolveNonCompleteResult(decoded, flow));
|
|
32284
32284
|
}
|
|
32285
32285
|
const result = decoded.result;
|
|
32286
32286
|
validateStandardSchema(resultSchema, result).then((parseResult) => {
|
|
32287
|
-
if (parseResult.success)
|
|
32287
|
+
if (parseResult.success) resolve3(parseResult.data);
|
|
32288
32288
|
else reject(new SdkError(SdkErrorCode.InvalidResult, `Invalid result for ${request.method}: ${parseResult.error}`));
|
|
32289
32289
|
}, reject);
|
|
32290
32290
|
});
|
|
@@ -35196,7 +35196,7 @@ var require_compile2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
35196
35196
|
ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
|
|
35197
35197
|
const schOrFunc = root.refs[ref];
|
|
35198
35198
|
if (schOrFunc) return schOrFunc;
|
|
35199
|
-
let _sch =
|
|
35199
|
+
let _sch = resolve3.call(this, root, ref);
|
|
35200
35200
|
if (_sch === void 0) {
|
|
35201
35201
|
const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
|
|
35202
35202
|
const { schemaId } = this.opts;
|
|
@@ -35222,7 +35222,7 @@ var require_compile2 = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
35222
35222
|
function sameSchemaEnv(s1, s2) {
|
|
35223
35223
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
35224
35224
|
}
|
|
35225
|
-
function
|
|
35225
|
+
function resolve3(root, ref) {
|
|
35226
35226
|
let sch;
|
|
35227
35227
|
while (typeof (sch = this.refs[ref]) == "string") ref = sch;
|
|
35228
35228
|
return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
|
|
@@ -35672,47 +35672,47 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35672
35672
|
else if (typeof uri === "object") uri = parse3(serialize(uri, options), options);
|
|
35673
35673
|
return uri;
|
|
35674
35674
|
}
|
|
35675
|
-
function
|
|
35675
|
+
function resolve3(baseURI, relativeURI, options) {
|
|
35676
35676
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
35677
35677
|
const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
35678
35678
|
schemelessOptions.skipEscape = true;
|
|
35679
35679
|
return serialize(resolved, schemelessOptions);
|
|
35680
35680
|
}
|
|
35681
|
-
function resolveComponent(base,
|
|
35681
|
+
function resolveComponent(base, relative2, options, skipNormalization) {
|
|
35682
35682
|
const target = {};
|
|
35683
35683
|
if (!skipNormalization) {
|
|
35684
35684
|
base = parse3(serialize(base, options), options);
|
|
35685
|
-
|
|
35685
|
+
relative2 = parse3(serialize(relative2, options), options);
|
|
35686
35686
|
}
|
|
35687
35687
|
options = options || {};
|
|
35688
|
-
if (!options.tolerant &&
|
|
35689
|
-
target.scheme =
|
|
35690
|
-
target.userinfo =
|
|
35691
|
-
target.host =
|
|
35692
|
-
target.port =
|
|
35693
|
-
target.path = removeDotSegments(
|
|
35694
|
-
target.query =
|
|
35688
|
+
if (!options.tolerant && relative2.scheme) {
|
|
35689
|
+
target.scheme = relative2.scheme;
|
|
35690
|
+
target.userinfo = relative2.userinfo;
|
|
35691
|
+
target.host = relative2.host;
|
|
35692
|
+
target.port = relative2.port;
|
|
35693
|
+
target.path = removeDotSegments(relative2.path || "");
|
|
35694
|
+
target.query = relative2.query;
|
|
35695
35695
|
} else {
|
|
35696
|
-
if (
|
|
35697
|
-
target.userinfo =
|
|
35698
|
-
target.host =
|
|
35699
|
-
target.port =
|
|
35700
|
-
target.path = removeDotSegments(
|
|
35701
|
-
target.query =
|
|
35696
|
+
if (relative2.userinfo !== void 0 || relative2.host !== void 0 || relative2.port !== void 0) {
|
|
35697
|
+
target.userinfo = relative2.userinfo;
|
|
35698
|
+
target.host = relative2.host;
|
|
35699
|
+
target.port = relative2.port;
|
|
35700
|
+
target.path = removeDotSegments(relative2.path || "");
|
|
35701
|
+
target.query = relative2.query;
|
|
35702
35702
|
} else {
|
|
35703
|
-
if (!
|
|
35703
|
+
if (!relative2.path) {
|
|
35704
35704
|
target.path = base.path;
|
|
35705
|
-
if (
|
|
35705
|
+
if (relative2.query !== void 0) target.query = relative2.query;
|
|
35706
35706
|
else target.query = base.query;
|
|
35707
35707
|
} else {
|
|
35708
|
-
if (
|
|
35708
|
+
if (relative2.path[0] === "/") target.path = removeDotSegments(relative2.path);
|
|
35709
35709
|
else {
|
|
35710
|
-
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) target.path = "/" +
|
|
35711
|
-
else if (!base.path) target.path =
|
|
35712
|
-
else target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
35710
|
+
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) target.path = "/" + relative2.path;
|
|
35711
|
+
else if (!base.path) target.path = relative2.path;
|
|
35712
|
+
else target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative2.path;
|
|
35713
35713
|
target.path = removeDotSegments(target.path);
|
|
35714
35714
|
}
|
|
35715
|
-
target.query =
|
|
35715
|
+
target.query = relative2.query;
|
|
35716
35716
|
}
|
|
35717
35717
|
target.userinfo = base.userinfo;
|
|
35718
35718
|
target.host = base.host;
|
|
@@ -35720,7 +35720,7 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35720
35720
|
}
|
|
35721
35721
|
target.scheme = base.scheme;
|
|
35722
35722
|
}
|
|
35723
|
-
target.fragment =
|
|
35723
|
+
target.fragment = relative2.fragment;
|
|
35724
35724
|
return target;
|
|
35725
35725
|
}
|
|
35726
35726
|
function equal(uriA, uriB, options) {
|
|
@@ -35846,7 +35846,7 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
35846
35846
|
const fastUri = {
|
|
35847
35847
|
SCHEMES,
|
|
35848
35848
|
normalize,
|
|
35849
|
-
resolve:
|
|
35849
|
+
resolve: resolve3,
|
|
35850
35850
|
resolveComponent,
|
|
35851
35851
|
equal,
|
|
35852
35852
|
serialize,
|
|
@@ -41219,7 +41219,7 @@ var StdioServerTransport = class {
|
|
|
41219
41219
|
}
|
|
41220
41220
|
send(message) {
|
|
41221
41221
|
if (this._closed) return Promise.reject(/* @__PURE__ */ new Error("StdioServerTransport is closed"));
|
|
41222
|
-
return new Promise((
|
|
41222
|
+
return new Promise((resolve3, reject) => {
|
|
41223
41223
|
const json2 = serializeMessage(message);
|
|
41224
41224
|
let settled = false;
|
|
41225
41225
|
const onError = (error62) => {
|
|
@@ -41234,14 +41234,14 @@ var StdioServerTransport = class {
|
|
|
41234
41234
|
settled = true;
|
|
41235
41235
|
this._stdout.off("error", onError);
|
|
41236
41236
|
this._stdout.off("drain", onDrain);
|
|
41237
|
-
|
|
41237
|
+
resolve3();
|
|
41238
41238
|
};
|
|
41239
41239
|
this._stdout.once("error", onError);
|
|
41240
41240
|
if (this._stdout.write(json2)) {
|
|
41241
41241
|
if (settled) return;
|
|
41242
41242
|
settled = true;
|
|
41243
41243
|
this._stdout.off("error", onError);
|
|
41244
|
-
|
|
41244
|
+
resolve3();
|
|
41245
41245
|
} else if (!settled) this._stdout.once("drain", onDrain);
|
|
41246
41246
|
});
|
|
41247
41247
|
}
|
|
@@ -41295,14 +41295,14 @@ var StdioConnectionChannel = class {
|
|
|
41295
41295
|
*/
|
|
41296
41296
|
async whenRequestsAnswered(timeoutMs) {
|
|
41297
41297
|
if (this._closed || this._pendingRequests.size === 0) return true;
|
|
41298
|
-
return await new Promise((
|
|
41298
|
+
return await new Promise((resolve3) => {
|
|
41299
41299
|
const waiter = () => {
|
|
41300
41300
|
clearTimeout(timer);
|
|
41301
|
-
|
|
41301
|
+
resolve3(true);
|
|
41302
41302
|
};
|
|
41303
41303
|
const timer = setTimeout(() => {
|
|
41304
41304
|
this._drainWaiters = this._drainWaiters.filter((pending) => pending !== waiter);
|
|
41305
|
-
|
|
41305
|
+
resolve3(false);
|
|
41306
41306
|
}, timeoutMs);
|
|
41307
41307
|
this._drainWaiters.push(waiter);
|
|
41308
41308
|
});
|
|
@@ -46735,7 +46735,7 @@ var recursive = /* @__PURE__ */ new WeakMap();
|
|
|
46735
46735
|
var NONE = 0;
|
|
46736
46736
|
var ASSUMED = 1;
|
|
46737
46737
|
var PROVEN = 2;
|
|
46738
|
-
function isRecursive(inst, stack,
|
|
46738
|
+
function isRecursive(inst, stack, resolve3) {
|
|
46739
46739
|
const cached2 = recursive.get(inst);
|
|
46740
46740
|
if (cached2 !== void 0)
|
|
46741
46741
|
return cached2 ? PROVEN : NONE;
|
|
@@ -46745,7 +46745,7 @@ function isRecursive(inst, stack, resolve2) {
|
|
|
46745
46745
|
let result = NONE;
|
|
46746
46746
|
const check2 = (child) => {
|
|
46747
46747
|
if (result !== PROVEN && child?._zod) {
|
|
46748
|
-
const answer = isRecursive(child, stack,
|
|
46748
|
+
const answer = isRecursive(child, stack, resolve3);
|
|
46749
46749
|
if (answer > result)
|
|
46750
46750
|
result = answer;
|
|
46751
46751
|
}
|
|
@@ -46756,7 +46756,7 @@ function isRecursive(inst, stack, resolve2) {
|
|
|
46756
46756
|
const desc = Object.getOwnPropertyDescriptor(sh, key);
|
|
46757
46757
|
if (spread && !desc.enumerable)
|
|
46758
46758
|
continue;
|
|
46759
|
-
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack,
|
|
46759
|
+
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve3) : NONE;
|
|
46760
46760
|
if (child > answer)
|
|
46761
46761
|
answer = child;
|
|
46762
46762
|
}
|
|
@@ -46820,7 +46820,7 @@ function isRecursive(inst, stack, resolve2) {
|
|
|
46820
46820
|
break;
|
|
46821
46821
|
// `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
|
|
46822
46822
|
case "lazy": {
|
|
46823
|
-
const inner = def._cachedInner ?? (
|
|
46823
|
+
const inner = def._cachedInner ?? (resolve3 ? inst._zod.innerType : void 0);
|
|
46824
46824
|
merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
|
|
46825
46825
|
break;
|
|
46826
46826
|
}
|
|
@@ -63317,7 +63317,7 @@ var DEFAULT_BIND_TIMEOUT_MS = 5e3;
|
|
|
63317
63317
|
async function electRole(opts) {
|
|
63318
63318
|
const server = createServer();
|
|
63319
63319
|
const bindTimeoutMs = opts.bindTimeoutMs ?? DEFAULT_BIND_TIMEOUT_MS;
|
|
63320
|
-
return new Promise((
|
|
63320
|
+
return new Promise((resolve3, reject) => {
|
|
63321
63321
|
let timer;
|
|
63322
63322
|
const clearBindTimer = () => {
|
|
63323
63323
|
if (timer) {
|
|
@@ -63333,7 +63333,7 @@ async function electRole(opts) {
|
|
|
63333
63333
|
server.close();
|
|
63334
63334
|
} catch {
|
|
63335
63335
|
}
|
|
63336
|
-
|
|
63336
|
+
resolve3({ role: "peer" });
|
|
63337
63337
|
} else {
|
|
63338
63338
|
reject(e);
|
|
63339
63339
|
}
|
|
@@ -63341,7 +63341,7 @@ async function electRole(opts) {
|
|
|
63341
63341
|
const onListening = () => {
|
|
63342
63342
|
clearBindTimer();
|
|
63343
63343
|
server.removeListener("error", onError);
|
|
63344
|
-
|
|
63344
|
+
resolve3({ role: "host", server });
|
|
63345
63345
|
};
|
|
63346
63346
|
server.once("error", onError);
|
|
63347
63347
|
server.once("listening", onListening);
|
|
@@ -63990,8 +63990,8 @@ async function startHost(opts) {
|
|
|
63990
63990
|
let rejectOwnSession;
|
|
63991
63991
|
let ownSessionReady;
|
|
63992
63992
|
function resetSessionPromise() {
|
|
63993
|
-
ownSessionReady = new Promise((
|
|
63994
|
-
resolveOwnSession =
|
|
63993
|
+
ownSessionReady = new Promise((resolve3, reject) => {
|
|
63994
|
+
resolveOwnSession = resolve3;
|
|
63995
63995
|
rejectOwnSession = reject;
|
|
63996
63996
|
});
|
|
63997
63997
|
ownSessionReady.catch(() => {
|
|
@@ -64393,7 +64393,7 @@ async function startHost(opts) {
|
|
|
64393
64393
|
});
|
|
64394
64394
|
});
|
|
64395
64395
|
return {
|
|
64396
|
-
close: () => new Promise((
|
|
64396
|
+
close: () => new Promise((resolve3) => {
|
|
64397
64397
|
for (const client of wss.clients) {
|
|
64398
64398
|
try {
|
|
64399
64399
|
client.terminate();
|
|
@@ -64401,7 +64401,7 @@ async function startHost(opts) {
|
|
|
64401
64401
|
}
|
|
64402
64402
|
}
|
|
64403
64403
|
wss.close(() => {
|
|
64404
|
-
opts.httpServer.close(() =>
|
|
64404
|
+
opts.httpServer.close(() => resolve3());
|
|
64405
64405
|
});
|
|
64406
64406
|
}),
|
|
64407
64407
|
sendOwnInner: async (inner) => {
|
|
@@ -64441,11 +64441,11 @@ async function startPeer(opts) {
|
|
|
64441
64441
|
maxPayload: opts.maxPayloadBytes ?? MAX_PAYLOAD_BYTES
|
|
64442
64442
|
});
|
|
64443
64443
|
const dialTimeoutMs = opts.dialTimeoutMs ?? PEER_DIAL_TIMEOUT_MS;
|
|
64444
|
-
await new Promise((
|
|
64444
|
+
await new Promise((resolve3, reject) => {
|
|
64445
64445
|
let timer;
|
|
64446
64446
|
const onOpen = () => {
|
|
64447
64447
|
cleanup();
|
|
64448
|
-
|
|
64448
|
+
resolve3();
|
|
64449
64449
|
};
|
|
64450
64450
|
const onError = (e) => {
|
|
64451
64451
|
cleanup();
|
|
@@ -64533,10 +64533,10 @@ async function startPeer(opts) {
|
|
|
64533
64533
|
let sessionPromiseSettled = false;
|
|
64534
64534
|
function resetSessionPromise() {
|
|
64535
64535
|
sessionPromiseSettled = false;
|
|
64536
|
-
sessionPromise = new Promise((
|
|
64536
|
+
sessionPromise = new Promise((resolve3, reject) => {
|
|
64537
64537
|
resolveFirstReady = (st) => {
|
|
64538
64538
|
sessionPromiseSettled = true;
|
|
64539
|
-
|
|
64539
|
+
resolve3(st);
|
|
64540
64540
|
};
|
|
64541
64541
|
rejectFirstReady = (e) => {
|
|
64542
64542
|
sessionPromiseSettled = true;
|
|
@@ -65686,8 +65686,8 @@ var FetchproxyServer = class {
|
|
|
65686
65686
|
async _fetchOnceWithTimeout(init, fetchOpts = {}) {
|
|
65687
65687
|
const id = this.nextRequestId++;
|
|
65688
65688
|
const inner = { type: "request", id, op: "fetch", init };
|
|
65689
|
-
const pending = this.guardPending(new Promise((
|
|
65690
|
-
this.pending.set(id,
|
|
65689
|
+
const pending = this.guardPending(new Promise((resolve3) => {
|
|
65690
|
+
this.pending.set(id, resolve3);
|
|
65691
65691
|
}));
|
|
65692
65692
|
try {
|
|
65693
65693
|
await this.sendInnerFrame(inner, {
|
|
@@ -65710,12 +65710,12 @@ var FetchproxyServer = class {
|
|
|
65710
65710
|
try {
|
|
65711
65711
|
return await Promise.race([
|
|
65712
65712
|
pending,
|
|
65713
|
-
new Promise((
|
|
65713
|
+
new Promise((resolve3) => {
|
|
65714
65714
|
timer = setTimeout(() => {
|
|
65715
65715
|
this.pending.delete(id);
|
|
65716
65716
|
const elapsedMs = Date.now() - start;
|
|
65717
65717
|
const error62 = `fetchproxy: ${init.url} did not respond within ${timeoutMs}ms`;
|
|
65718
|
-
|
|
65718
|
+
resolve3({
|
|
65719
65719
|
ok: false,
|
|
65720
65720
|
error: error62,
|
|
65721
65721
|
kind: "timeout",
|
|
@@ -65859,9 +65859,9 @@ var FetchproxyServer = class {
|
|
|
65859
65859
|
if (opts.subdomain !== void 0)
|
|
65860
65860
|
assertSubdomainLabel(opts.subdomain);
|
|
65861
65861
|
const baseDomain = this.resolveBaseDomain(opts.domain);
|
|
65862
|
-
const
|
|
65862
|
+
const isAbsolute5 = path.startsWith("http://") || path.startsWith("https://");
|
|
65863
65863
|
let host;
|
|
65864
|
-
if (
|
|
65864
|
+
if (isAbsolute5) {
|
|
65865
65865
|
try {
|
|
65866
65866
|
host = new URL(path).host;
|
|
65867
65867
|
} catch {
|
|
@@ -65870,7 +65870,7 @@ var FetchproxyServer = class {
|
|
|
65870
65870
|
} else {
|
|
65871
65871
|
host = opts.subdomain ? `${opts.subdomain}.${baseDomain}` : baseDomain;
|
|
65872
65872
|
}
|
|
65873
|
-
const url4 =
|
|
65873
|
+
const url4 = isAbsolute5 ? path : `https://${host}${path}`;
|
|
65874
65874
|
assertUrlInDomains("request url", url4, this.opts.domains);
|
|
65875
65875
|
let tabUrl = `https://${host}/`;
|
|
65876
65876
|
if (opts.viaTab !== void 0) {
|
|
@@ -66135,8 +66135,8 @@ var FetchproxyServer = class {
|
|
|
66135
66135
|
const tabUrl = `https://${host}/`;
|
|
66136
66136
|
inner = { type: "request", id, op: "read_cookies", init: { tabUrl } };
|
|
66137
66137
|
}
|
|
66138
|
-
const pending = this.guardPending(new Promise((
|
|
66139
|
-
this.pendingReadCookies.set(id,
|
|
66138
|
+
const pending = this.guardPending(new Promise((resolve3) => {
|
|
66139
|
+
this.pendingReadCookies.set(id, resolve3);
|
|
66140
66140
|
}));
|
|
66141
66141
|
await this.sendInnerFrame(inner);
|
|
66142
66142
|
const result = await this._withVerbTimeout(pending, this.pendingReadCookies, id, `https://${host}`);
|
|
@@ -66194,8 +66194,8 @@ var FetchproxyServer = class {
|
|
|
66194
66194
|
...cookiePath !== void 0 ? { path: cookiePath } : {}
|
|
66195
66195
|
}
|
|
66196
66196
|
};
|
|
66197
|
-
const pending = this.guardPending(new Promise((
|
|
66198
|
-
this.pendingWriteCookies.set(id, { resolve:
|
|
66197
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66198
|
+
this.pendingWriteCookies.set(id, { resolve: resolve3, reject });
|
|
66199
66199
|
}));
|
|
66200
66200
|
await this.sendInnerFrame(inner);
|
|
66201
66201
|
return this._withVerbTimeout(
|
|
@@ -66265,8 +66265,8 @@ var FetchproxyServer = class {
|
|
|
66265
66265
|
...opts.pointers ? { pointers: { ...opts.pointers } } : {}
|
|
66266
66266
|
}
|
|
66267
66267
|
};
|
|
66268
|
-
const pending = this.guardPending(new Promise((
|
|
66269
|
-
this.pendingStorage.set(id, { resolve:
|
|
66268
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66269
|
+
this.pendingStorage.set(id, { resolve: resolve3, reject });
|
|
66270
66270
|
}));
|
|
66271
66271
|
await this.sendInnerFrame(inner);
|
|
66272
66272
|
return this._withVerbTimeout(pending, this.pendingStorage, id, `https://${host}`);
|
|
@@ -66324,8 +66324,8 @@ var FetchproxyServer = class {
|
|
|
66324
66324
|
...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
|
|
66325
66325
|
}
|
|
66326
66326
|
};
|
|
66327
|
-
const pending = this.guardPending(new Promise((
|
|
66328
|
-
this.pendingCapture.set(id, { resolve:
|
|
66327
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66328
|
+
this.pendingCapture.set(id, { resolve: resolve3, reject });
|
|
66329
66329
|
}));
|
|
66330
66330
|
await this.sendInnerFrame(inner);
|
|
66331
66331
|
return this._withVerbTimeout(
|
|
@@ -66372,8 +66372,8 @@ var FetchproxyServer = class {
|
|
|
66372
66372
|
...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
|
|
66373
66373
|
}
|
|
66374
66374
|
};
|
|
66375
|
-
const pending = this.guardPending(new Promise((
|
|
66376
|
-
this.pendingRedirect.set(id, { resolve:
|
|
66375
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66376
|
+
this.pendingRedirect.set(id, { resolve: resolve3, reject });
|
|
66377
66377
|
}));
|
|
66378
66378
|
await this.sendInnerFrame(inner);
|
|
66379
66379
|
return this._withVerbTimeout(
|
|
@@ -66468,8 +66468,8 @@ var FetchproxyServer = class {
|
|
|
66468
66468
|
...opts.timeoutMs !== void 0 ? { timeoutMs: opts.timeoutMs } : {}
|
|
66469
66469
|
}
|
|
66470
66470
|
};
|
|
66471
|
-
const pending = this.guardPending(new Promise((
|
|
66472
|
-
this.pendingDownload.set(id, { resolve:
|
|
66471
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66472
|
+
this.pendingDownload.set(id, { resolve: resolve3, reject });
|
|
66473
66473
|
}));
|
|
66474
66474
|
await this.sendInnerFrame(inner);
|
|
66475
66475
|
return this._withVerbTimeout(
|
|
@@ -66529,8 +66529,8 @@ var FetchproxyServer = class {
|
|
|
66529
66529
|
keys: [...opts.keys]
|
|
66530
66530
|
}
|
|
66531
66531
|
};
|
|
66532
|
-
const pending = this.guardPending(new Promise((
|
|
66533
|
-
this.pendingIdb.set(id, { resolve:
|
|
66532
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66533
|
+
this.pendingIdb.set(id, { resolve: resolve3, reject });
|
|
66534
66534
|
}));
|
|
66535
66535
|
await this.sendInnerFrame(inner);
|
|
66536
66536
|
return this._withVerbTimeout(pending, this.pendingIdb, id, origin);
|
|
@@ -66569,8 +66569,8 @@ var FetchproxyServer = class {
|
|
|
66569
66569
|
op: "read_dom",
|
|
66570
66570
|
init: { origin, names: [...opts.names] }
|
|
66571
66571
|
};
|
|
66572
|
-
const pending = this.guardPending(new Promise((
|
|
66573
|
-
this.pendingStorage.set(id, { resolve:
|
|
66572
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66573
|
+
this.pendingStorage.set(id, { resolve: resolve3, reject });
|
|
66574
66574
|
}));
|
|
66575
66575
|
await this.sendInnerFrame(inner);
|
|
66576
66576
|
return this._withVerbTimeout(pending, this.pendingStorage, id, origin);
|
|
@@ -66615,8 +66615,8 @@ var FetchproxyServer = class {
|
|
|
66615
66615
|
op: "read_dom_list",
|
|
66616
66616
|
init: { origin, name: opts.name }
|
|
66617
66617
|
};
|
|
66618
|
-
const pending = this.guardPending(new Promise((
|
|
66619
|
-
this.pendingDomList.set(id, { resolve:
|
|
66618
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66619
|
+
this.pendingDomList.set(id, { resolve: resolve3, reject });
|
|
66620
66620
|
}));
|
|
66621
66621
|
await this.sendInnerFrame(inner);
|
|
66622
66622
|
return this._withVerbTimeout(pending, this.pendingDomList, id, origin);
|
|
@@ -66661,8 +66661,8 @@ var FetchproxyServer = class {
|
|
|
66661
66661
|
...opts.tabUrl !== void 0 ? { tabUrl: opts.tabUrl } : {}
|
|
66662
66662
|
}
|
|
66663
66663
|
};
|
|
66664
|
-
const pending = this.guardPending(new Promise((
|
|
66665
|
-
this.pendingGraphql.set(id, { resolve:
|
|
66664
|
+
const pending = this.guardPending(new Promise((resolve3, reject) => {
|
|
66665
|
+
this.pendingGraphql.set(id, { resolve: resolve3, reject });
|
|
66666
66666
|
}));
|
|
66667
66667
|
const retrySafe = opts.retryOnTimeout === true;
|
|
66668
66668
|
await this.sendInnerFrame(inner, { resendable: retrySafe });
|
|
@@ -67422,6 +67422,8 @@ function registerCredentialHealthcheckTool(args) {
|
|
|
67422
67422
|
}
|
|
67423
67423
|
|
|
67424
67424
|
// src/config.ts
|
|
67425
|
+
import { homedir as homedir2 } from "node:os";
|
|
67426
|
+
import { isAbsolute as isAbsolute3, join as join3 } from "node:path";
|
|
67425
67427
|
function readVar(env, key) {
|
|
67426
67428
|
return readEnvVar(key, { env });
|
|
67427
67429
|
}
|
|
@@ -67458,11 +67460,18 @@ function loadAccount(env = process.env) {
|
|
|
67458
67460
|
password: password ?? ""
|
|
67459
67461
|
};
|
|
67460
67462
|
}
|
|
67463
|
+
function resolveDownloadDir(env = process.env) {
|
|
67464
|
+
const dir = readVar(env, "IC_DOWNLOAD_DIR") ?? join3(homedir2(), "Downloads");
|
|
67465
|
+
if (!isAbsolute3(dir)) {
|
|
67466
|
+
throw new Error(`IC_DOWNLOAD_DIR must be an absolute path, got: '${dir}'`);
|
|
67467
|
+
}
|
|
67468
|
+
return dir;
|
|
67469
|
+
}
|
|
67461
67470
|
|
|
67462
67471
|
// package.json
|
|
67463
67472
|
var package_default = {
|
|
67464
67473
|
name: "infinitecampus-mcp",
|
|
67465
|
-
version: "3.1.
|
|
67474
|
+
version: "3.1.3",
|
|
67466
67475
|
mcpName: "io.github.chrischall/infinitecampus-mcp",
|
|
67467
67476
|
description: "Infinite Campus (Campus Parent) MCP server \u2014 multi-district read + message/document write",
|
|
67468
67477
|
author: "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
@@ -67618,13 +67627,14 @@ async function liftBrowserSession(account2) {
|
|
|
67618
67627
|
}
|
|
67619
67628
|
|
|
67620
67629
|
// src/client.ts
|
|
67621
|
-
import {
|
|
67622
|
-
import {
|
|
67630
|
+
import { open as open2, lstat as lstat2, realpath } from "fs/promises";
|
|
67631
|
+
import { constants as fsConstants } from "fs";
|
|
67632
|
+
import { basename, dirname as dirname2, isAbsolute as isAbsolute4, join as join5, relative, resolve as resolve2, sep } from "path";
|
|
67623
67633
|
|
|
67624
67634
|
// node_modules/@chrischall/mcp-utils/dist/session/index.js
|
|
67625
67635
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, renameSync, unlinkSync } from "node:fs";
|
|
67626
|
-
import { dirname, join as
|
|
67627
|
-
import { homedir as
|
|
67636
|
+
import { dirname, join as join4, resolve } from "node:path";
|
|
67637
|
+
import { homedir as homedir3 } from "node:os";
|
|
67628
67638
|
import { randomBytes as randomBytes3, createHmac } from "node:crypto";
|
|
67629
67639
|
function bindingDigest(secret, salt) {
|
|
67630
67640
|
return createHmac("sha256", salt).update(secret).digest("hex").slice(0, 32);
|
|
@@ -67712,11 +67722,11 @@ function createFileStatePersistence(opts) {
|
|
|
67712
67722
|
};
|
|
67713
67723
|
}
|
|
67714
67724
|
function homeOf(env) {
|
|
67715
|
-
return readEnvVar("HOME", { env }) ??
|
|
67725
|
+
return readEnvVar("HOME", { env }) ?? homedir3();
|
|
67716
67726
|
}
|
|
67717
67727
|
function resolveStateDir(opts = {}) {
|
|
67718
67728
|
const env = opts.env;
|
|
67719
|
-
return
|
|
67729
|
+
return join4(readEnvVar("MCP_DATA_DIR", { env }) ?? homeOf(env), opts.subdir ?? "");
|
|
67720
67730
|
}
|
|
67721
67731
|
function resolveStateFile(opts) {
|
|
67722
67732
|
const override = opts.envVar !== void 0 ? readEnvVar(opts.envVar, { env: opts.env }) : void 0;
|
|
@@ -67724,13 +67734,13 @@ function resolveStateFile(opts) {
|
|
|
67724
67734
|
if (override === "~")
|
|
67725
67735
|
return homeOf(opts.env);
|
|
67726
67736
|
if (override.startsWith("~/"))
|
|
67727
|
-
return
|
|
67737
|
+
return join4(homeOf(opts.env), override.slice(2));
|
|
67728
67738
|
return resolve(override);
|
|
67729
67739
|
}
|
|
67730
67740
|
const dirOpts = { env: opts.env };
|
|
67731
67741
|
if (opts.subdir !== void 0)
|
|
67732
67742
|
dirOpts.subdir = opts.subdir;
|
|
67733
|
-
return
|
|
67743
|
+
return join4(resolveStateDir(dirOpts), opts.fileName);
|
|
67734
67744
|
}
|
|
67735
67745
|
var TOKEN_REFRESH_SKEW_MS = 5 * 60 * 1e3;
|
|
67736
67746
|
function isPersistedCookieSession(raw) {
|
|
@@ -68194,14 +68204,28 @@ var ICClient = class {
|
|
|
68194
68204
|
return data;
|
|
68195
68205
|
}
|
|
68196
68206
|
async request(district, path, opts = {}) {
|
|
68207
|
+
const account2 = await this.resolveAccount(district);
|
|
68208
|
+
await this.managers.get(account2.name).ensure();
|
|
68209
|
+
return this.doRequest(account2, path, opts);
|
|
68210
|
+
}
|
|
68211
|
+
/**
|
|
68212
|
+
* The account for `district`, running CUPS discovery once on a miss.
|
|
68213
|
+
*
|
|
68214
|
+
* Cold-start: linked districts are only added to the accounts map after
|
|
68215
|
+
* primary login + CUPS discovery. If the caller asks for a linked district
|
|
68216
|
+
* before any other request triggered login, we'd otherwise throw
|
|
68217
|
+
* UnknownDistrictError despite the district being valid. Shared by request()
|
|
68218
|
+
* and download() — download() once looked the map up directly, so a linked
|
|
68219
|
+
* district's document failed on a cold start (fleet-audit#142).
|
|
68220
|
+
*/
|
|
68221
|
+
async resolveAccount(district) {
|
|
68197
68222
|
let account2 = this.accounts.get(district);
|
|
68198
68223
|
if (!account2) {
|
|
68199
68224
|
await this.ensureDiscovery();
|
|
68200
68225
|
account2 = this.accounts.get(district);
|
|
68201
68226
|
if (!account2) throw new UnknownDistrictError(district, [...this.accounts.keys()]);
|
|
68202
68227
|
}
|
|
68203
|
-
|
|
68204
|
-
return this.doRequest(account2, path, opts);
|
|
68228
|
+
return account2;
|
|
68205
68229
|
}
|
|
68206
68230
|
async login(account2) {
|
|
68207
68231
|
const primaryName = this.linkedTo.get(account2.name);
|
|
@@ -68374,34 +68398,31 @@ var ICClient = class {
|
|
|
68374
68398
|
}
|
|
68375
68399
|
}
|
|
68376
68400
|
async download(district, path, destinationPath, opts = {}) {
|
|
68401
|
+
const target = await confinedDestination(destinationPath);
|
|
68377
68402
|
let destStat = null;
|
|
68378
68403
|
try {
|
|
68379
|
-
destStat = await
|
|
68404
|
+
destStat = await lstat2(target.real);
|
|
68380
68405
|
} catch {
|
|
68381
68406
|
}
|
|
68407
|
+
if (destStat?.isSymbolicLink()) throw new InvalidPathError(destinationPath, "is a symlink");
|
|
68382
68408
|
if (destStat?.isDirectory()) throw new InvalidPathError(destinationPath);
|
|
68383
68409
|
if (destStat && !opts.overwrite) throw new FileExistsError(destinationPath);
|
|
68384
|
-
const
|
|
68385
|
-
|
|
68386
|
-
|
|
68387
|
-
|
|
68388
|
-
|
|
68389
|
-
|
|
68390
|
-
|
|
68391
|
-
|
|
68392
|
-
|
|
68393
|
-
|
|
68394
|
-
|
|
68395
|
-
headers: {
|
|
68396
|
-
Cookie: session.cookieHeader,
|
|
68397
|
-
...session.xsrfToken ? { "X-XSRF-TOKEN": session.xsrfToken } : {}
|
|
68398
|
-
}
|
|
68399
|
-
});
|
|
68410
|
+
const account2 = await this.resolveAccount(district);
|
|
68411
|
+
const url4 = documentUrl(account2, path);
|
|
68412
|
+
const res = await this.managers.get(account2.name).withSession(
|
|
68413
|
+
async (session) => fetch(url4, {
|
|
68414
|
+
headers: {
|
|
68415
|
+
Cookie: session.cookieHeader,
|
|
68416
|
+
...session.xsrfToken ? { "X-XSRF-TOKEN": session.xsrfToken } : {}
|
|
68417
|
+
}
|
|
68418
|
+
})
|
|
68419
|
+
);
|
|
68420
|
+
if (res.status === 401) throw new SessionExpiredError(account2.name);
|
|
68400
68421
|
if (!res.ok) throw new Error(`IC download ${res.status} for ${path}`);
|
|
68401
68422
|
const buf = new Uint8Array(await res.arrayBuffer());
|
|
68402
|
-
await
|
|
68423
|
+
await writeConfined(target.real, destinationPath, buf, !!opts.overwrite);
|
|
68403
68424
|
return {
|
|
68404
|
-
path:
|
|
68425
|
+
path: target.requested,
|
|
68405
68426
|
bytes: buf.byteLength,
|
|
68406
68427
|
contentType: res.headers.get("content-type") ?? "application/octet-stream"
|
|
68407
68428
|
};
|
|
@@ -68433,6 +68454,60 @@ var ICClient = class {
|
|
|
68433
68454
|
return text ? JSON.parse(text) : null;
|
|
68434
68455
|
}
|
|
68435
68456
|
};
|
|
68457
|
+
async function writeConfined(real, requested, buf, overwrite) {
|
|
68458
|
+
const { O_WRONLY, O_CREAT, O_TRUNC, O_EXCL, O_NOFOLLOW } = fsConstants;
|
|
68459
|
+
const flags = O_WRONLY | O_CREAT | O_NOFOLLOW | (overwrite ? O_TRUNC : O_EXCL);
|
|
68460
|
+
let handle;
|
|
68461
|
+
try {
|
|
68462
|
+
handle = await open2(real, flags, 438);
|
|
68463
|
+
} catch (e) {
|
|
68464
|
+
const code = e.code;
|
|
68465
|
+
if (code === "ELOOP") throw new InvalidPathError(requested, "is a symlink");
|
|
68466
|
+
if (code === "EEXIST") throw new FileExistsError(requested);
|
|
68467
|
+
throw e;
|
|
68468
|
+
}
|
|
68469
|
+
try {
|
|
68470
|
+
await handle.writeFile(buf);
|
|
68471
|
+
} finally {
|
|
68472
|
+
await handle.close();
|
|
68473
|
+
}
|
|
68474
|
+
}
|
|
68475
|
+
async function confinedDestination(destinationPath) {
|
|
68476
|
+
const root = resolveDownloadDir();
|
|
68477
|
+
let rootReal;
|
|
68478
|
+
try {
|
|
68479
|
+
rootReal = await realpath(root);
|
|
68480
|
+
} catch {
|
|
68481
|
+
throw new DownloadDirMissingError(root);
|
|
68482
|
+
}
|
|
68483
|
+
const requested = resolve2(root, destinationPath);
|
|
68484
|
+
const parent = dirname2(requested);
|
|
68485
|
+
let parentReal;
|
|
68486
|
+
try {
|
|
68487
|
+
parentReal = await realpath(parent);
|
|
68488
|
+
} catch {
|
|
68489
|
+
throw new ParentDirectoryMissingError(parent);
|
|
68490
|
+
}
|
|
68491
|
+
const real = join5(parentReal, basename(requested));
|
|
68492
|
+
const rel = relative(rootReal, real);
|
|
68493
|
+
if (isAbsolute4(rel) || rel.split(sep)[0] === "..") {
|
|
68494
|
+
throw new PathOutsideDownloadDirError(destinationPath, root);
|
|
68495
|
+
}
|
|
68496
|
+
return { requested, real };
|
|
68497
|
+
}
|
|
68498
|
+
function documentUrl(account2, path) {
|
|
68499
|
+
const raw = /^[a-z][a-z0-9+.-]*:/i.test(path) ? path : `${account2.baseUrl}${path}`;
|
|
68500
|
+
let parsed = null;
|
|
68501
|
+
try {
|
|
68502
|
+
parsed = new URL(raw);
|
|
68503
|
+
} catch {
|
|
68504
|
+
}
|
|
68505
|
+
const allowed = new URL(account2.baseUrl).origin;
|
|
68506
|
+
if (!parsed || parsed.protocol !== "https:" || parsed.origin !== allowed) {
|
|
68507
|
+
throw new DocumentOriginNotAllowedError(path, allowed);
|
|
68508
|
+
}
|
|
68509
|
+
return parsed.href;
|
|
68510
|
+
}
|
|
68436
68511
|
function parseSetCookies(headers) {
|
|
68437
68512
|
const raw = headers.getSetCookie?.() ?? [];
|
|
68438
68513
|
const { cookies, cookieHeader } = parseCookieJar(
|
|
@@ -68495,14 +68570,46 @@ var SessionExpiredError = class extends Error {
|
|
|
68495
68570
|
}
|
|
68496
68571
|
district;
|
|
68497
68572
|
};
|
|
68573
|
+
var DocumentOriginNotAllowedError = class extends Error {
|
|
68574
|
+
constructor(documentId, allowedOrigin) {
|
|
68575
|
+
super(
|
|
68576
|
+
`DocumentOriginNotAllowed: refusing to send the IC session to '${documentId}'. Documents are only downloaded over https from ${allowedOrigin} \u2014 pass the url field from ic_list_documents for this district.`
|
|
68577
|
+
);
|
|
68578
|
+
this.documentId = documentId;
|
|
68579
|
+
this.allowedOrigin = allowedOrigin;
|
|
68580
|
+
this.name = "DocumentOriginNotAllowedError";
|
|
68581
|
+
}
|
|
68582
|
+
documentId;
|
|
68583
|
+
allowedOrigin;
|
|
68584
|
+
};
|
|
68498
68585
|
var InvalidPathError = class extends Error {
|
|
68499
|
-
constructor(path) {
|
|
68500
|
-
super(`InvalidPath: destinationPath must be a filename,
|
|
68586
|
+
constructor(path, reason = "is a directory") {
|
|
68587
|
+
super(`InvalidPath: destinationPath must be a regular filename, but ${path} ${reason}`);
|
|
68501
68588
|
this.path = path;
|
|
68502
68589
|
this.name = "InvalidPathError";
|
|
68503
68590
|
}
|
|
68504
68591
|
path;
|
|
68505
68592
|
};
|
|
68593
|
+
var PathOutsideDownloadDirError = class extends Error {
|
|
68594
|
+
constructor(path, downloadDir) {
|
|
68595
|
+
super(
|
|
68596
|
+
`PathOutsideDownloadDir: ${path} is outside the download directory ${downloadDir}. Documents are only written inside it \u2014 pass a path under it (or a relative one), or set IC_DOWNLOAD_DIR to change it.`
|
|
68597
|
+
);
|
|
68598
|
+
this.path = path;
|
|
68599
|
+
this.downloadDir = downloadDir;
|
|
68600
|
+
this.name = "PathOutsideDownloadDirError";
|
|
68601
|
+
}
|
|
68602
|
+
path;
|
|
68603
|
+
downloadDir;
|
|
68604
|
+
};
|
|
68605
|
+
var DownloadDirMissingError = class extends Error {
|
|
68606
|
+
constructor(path) {
|
|
68607
|
+
super(`DownloadDirMissing: the download directory ${path} does not exist. Create it or set IC_DOWNLOAD_DIR.`);
|
|
68608
|
+
this.path = path;
|
|
68609
|
+
this.name = "DownloadDirMissingError";
|
|
68610
|
+
}
|
|
68611
|
+
path;
|
|
68612
|
+
};
|
|
68506
68613
|
var ParentDirectoryMissingError = class extends Error {
|
|
68507
68614
|
constructor(path) {
|
|
68508
68615
|
super(`ParentDirectoryMissing: ${path}`);
|
|
@@ -68607,13 +68714,11 @@ function registerStudentTools(server, client) {
|
|
|
68607
68714
|
// src/tools/schedule.ts
|
|
68608
68715
|
var argsSchema2 = external_exports.object({
|
|
68609
68716
|
district: external_exports.string().describe("District name from ic_list_districts"),
|
|
68610
|
-
studentId: external_exports.string().describe("Student personID from ic_list_students")
|
|
68611
|
-
date: external_exports.string().describe("YYYY-MM-DD; defaults to today").optional(),
|
|
68612
|
-
termFilter: external_exports.string().describe("Term name or ID; optional").optional()
|
|
68717
|
+
studentId: external_exports.string().describe("Student personID from ic_list_students")
|
|
68613
68718
|
});
|
|
68614
68719
|
function registerScheduleTools(server, client) {
|
|
68615
68720
|
server.registerTool("ic_get_schedule", {
|
|
68616
|
-
description: "Get a student's class
|
|
68721
|
+
description: "Get a student's class roster: every course with its section placements, across every term of the current enrollment. Not filtered by date or term \u2014 each placement carries its own term, so narrow the result yourself.",
|
|
68617
68722
|
annotations: { readOnlyHint: true },
|
|
68618
68723
|
inputSchema: external_exports.object({ ...argsSchema2.shape, view: viewArg() })
|
|
68619
68724
|
}, async (rawArgs) => {
|
|
@@ -68880,24 +68985,24 @@ function extractPlainTextFromHtml(html) {
|
|
|
68880
68985
|
}
|
|
68881
68986
|
function stripElementContent(html, tag) {
|
|
68882
68987
|
const lower = asciiLower(html);
|
|
68883
|
-
const
|
|
68988
|
+
const open3 = `<${tag}`;
|
|
68884
68989
|
const close = `</${tag}>`;
|
|
68885
68990
|
let out = "";
|
|
68886
68991
|
let i = 0;
|
|
68887
68992
|
for (; ; ) {
|
|
68888
|
-
const start = lower.indexOf(
|
|
68993
|
+
const start = lower.indexOf(open3, i);
|
|
68889
68994
|
if (start < 0) {
|
|
68890
68995
|
out += html.slice(i);
|
|
68891
68996
|
return out;
|
|
68892
68997
|
}
|
|
68893
|
-
const after = lower[start +
|
|
68998
|
+
const after = lower[start + open3.length];
|
|
68894
68999
|
if (after !== void 0 && after !== ">" && after !== " " && after !== " " && after !== "\n" && after !== "\r" && after !== "\f" && after !== "/") {
|
|
68895
|
-
out += html.slice(i, start +
|
|
68896
|
-
i = start +
|
|
69000
|
+
out += html.slice(i, start + open3.length);
|
|
69001
|
+
i = start + open3.length;
|
|
68897
69002
|
continue;
|
|
68898
69003
|
}
|
|
68899
69004
|
out += html.slice(i, start) + " ";
|
|
68900
|
-
const closeAt = lower.indexOf(close, start +
|
|
69005
|
+
const closeAt = lower.indexOf(close, start + open3.length);
|
|
68901
69006
|
if (closeAt < 0)
|
|
68902
69007
|
return out;
|
|
68903
69008
|
i = closeAt + close.length;
|
|
@@ -69029,7 +69134,9 @@ var listArgs2 = external_exports.object({
|
|
|
69029
69134
|
var downloadArgs = external_exports.object({
|
|
69030
69135
|
district: external_exports.string(),
|
|
69031
69136
|
documentId: external_exports.string().describe("The url field returned by ic_list_documents"),
|
|
69032
|
-
destinationPath: external_exports.string().describe(
|
|
69137
|
+
destinationPath: external_exports.string().describe(
|
|
69138
|
+
"Where to write the PDF. Must be inside the download directory (IC_DOWNLOAD_DIR, default ~/Downloads); a relative path resolves against it."
|
|
69139
|
+
),
|
|
69033
69140
|
overwrite: external_exports.boolean().optional()
|
|
69034
69141
|
});
|
|
69035
69142
|
function registerDocumentTools(server, client) {
|
|
@@ -69064,7 +69171,7 @@ function registerDocumentTools(server, client) {
|
|
|
69064
69171
|
}
|
|
69065
69172
|
});
|
|
69066
69173
|
server.registerTool("ic_download_document", {
|
|
69067
|
-
description: "Download a student's document (PDF) to disk. documentId is the url field returned by ic_list_documents. Returns FeatureDisabled if the district has the module turned off.",
|
|
69174
|
+
description: "Download a student's document (PDF) to disk, inside the download directory (IC_DOWNLOAD_DIR, default ~/Downloads). documentId is the url field returned by ic_list_documents. Will not overwrite an existing file unless overwrite is true. Returns FeatureDisabled if the district has the module turned off.",
|
|
69068
69175
|
annotations: { destructiveHint: true },
|
|
69069
69176
|
inputSchema: downloadArgs
|
|
69070
69177
|
}, async (rawArgs) => {
|
|
@@ -69463,7 +69570,7 @@ function registerFeaturesTools(server, client) {
|
|
|
69463
69570
|
|
|
69464
69571
|
// src/index.ts
|
|
69465
69572
|
await loadDotenvSafely({
|
|
69466
|
-
path:
|
|
69573
|
+
path: join6(dirname3(fileURLToPath(import.meta.url)), "..", ".env"),
|
|
69467
69574
|
override: false
|
|
69468
69575
|
});
|
|
69469
69576
|
var AI_NOTICE = "[infinitecampus-mcp] Developed and maintained by AI (Claude). Use at your own discretion.";
|
|
@@ -69481,7 +69588,7 @@ try {
|
|
|
69481
69588
|
}
|
|
69482
69589
|
var COMMON = {
|
|
69483
69590
|
name: "infinitecampus",
|
|
69484
|
-
version: "3.1.
|
|
69591
|
+
version: "3.1.3"
|
|
69485
69592
|
// x-release-please-version
|
|
69486
69593
|
};
|
|
69487
69594
|
var healthState = { account, source, configError, client: null };
|