gogcli-mcp-slides 4.2.5 → 4.4.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/index.js +454 -136
- package/manifest.json +9 -2
- package/package.json +2 -2
- package/server.json +2 -2
- package/src/tools/slides-extra.ts +54 -44
- package/tests/tools/slides-extra.test.ts +129 -85
- package/vitest.config.ts +5 -0
package/dist/index.js
CHANGED
|
@@ -2092,8 +2092,8 @@ function emoji() {
|
|
|
2092
2092
|
}
|
|
2093
2093
|
var ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
|
|
2094
2094
|
var ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;
|
|
2095
|
-
var mac = (
|
|
2096
|
-
const escapedDelim = escapeRegex(
|
|
2095
|
+
var mac = (delimiter3) => {
|
|
2096
|
+
const escapedDelim = escapeRegex(delimiter3 ?? ":");
|
|
2097
2097
|
return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);
|
|
2098
2098
|
};
|
|
2099
2099
|
var cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;
|
|
@@ -5121,7 +5121,7 @@ var recursive = /* @__PURE__ */ new WeakMap();
|
|
|
5121
5121
|
var NONE = 0;
|
|
5122
5122
|
var ASSUMED = 1;
|
|
5123
5123
|
var PROVEN = 2;
|
|
5124
|
-
function isRecursive(inst, stack,
|
|
5124
|
+
function isRecursive(inst, stack, resolve4) {
|
|
5125
5125
|
const cached2 = recursive.get(inst);
|
|
5126
5126
|
if (cached2 !== void 0)
|
|
5127
5127
|
return cached2 ? PROVEN : NONE;
|
|
@@ -5131,7 +5131,7 @@ function isRecursive(inst, stack, resolve) {
|
|
|
5131
5131
|
let result = NONE;
|
|
5132
5132
|
const check2 = (child) => {
|
|
5133
5133
|
if (result !== PROVEN && child?._zod) {
|
|
5134
|
-
const answer = isRecursive(child, stack,
|
|
5134
|
+
const answer = isRecursive(child, stack, resolve4);
|
|
5135
5135
|
if (answer > result)
|
|
5136
5136
|
result = answer;
|
|
5137
5137
|
}
|
|
@@ -5142,7 +5142,7 @@ function isRecursive(inst, stack, resolve) {
|
|
|
5142
5142
|
const desc = Object.getOwnPropertyDescriptor(sh, key);
|
|
5143
5143
|
if (spread && !desc.enumerable)
|
|
5144
5144
|
continue;
|
|
5145
|
-
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack,
|
|
5145
|
+
const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve4) : NONE;
|
|
5146
5146
|
if (child > answer)
|
|
5147
5147
|
answer = child;
|
|
5148
5148
|
}
|
|
@@ -5206,7 +5206,7 @@ function isRecursive(inst, stack, resolve) {
|
|
|
5206
5206
|
break;
|
|
5207
5207
|
// `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
|
|
5208
5208
|
case "lazy": {
|
|
5209
|
-
const inner = def._cachedInner ?? (
|
|
5209
|
+
const inner = def._cachedInner ?? (resolve4 ? inst._zod.innerType : void 0);
|
|
5210
5210
|
merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
|
|
5211
5211
|
break;
|
|
5212
5212
|
}
|
|
@@ -24106,14 +24106,14 @@ function inputRequiredRoundsExceededMessage(method, maxRounds) {
|
|
|
24106
24106
|
return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
|
|
24107
24107
|
}
|
|
24108
24108
|
function sleep(ms, signal) {
|
|
24109
|
-
return new Promise((
|
|
24109
|
+
return new Promise((resolve4, reject) => {
|
|
24110
24110
|
if (signal?.aborted) {
|
|
24111
24111
|
reject(signal.reason instanceof SdkError ? signal.reason : new SdkError(SdkErrorCode.RequestTimeout, String(signal.reason)));
|
|
24112
24112
|
return;
|
|
24113
24113
|
}
|
|
24114
24114
|
const timer = setTimeout(() => {
|
|
24115
24115
|
signal?.removeEventListener("abort", onAbort);
|
|
24116
|
-
|
|
24116
|
+
resolve4();
|
|
24117
24117
|
}, ms);
|
|
24118
24118
|
const onAbort = () => {
|
|
24119
24119
|
clearTimeout(timer);
|
|
@@ -24907,7 +24907,7 @@ var Protocol = class {
|
|
|
24907
24907
|
const flowStartedAt = Date.now();
|
|
24908
24908
|
let onAbort;
|
|
24909
24909
|
let cleanupMessageId;
|
|
24910
|
-
return new Promise((
|
|
24910
|
+
return new Promise((resolve4, reject) => {
|
|
24911
24911
|
const earlyReject = (error62) => {
|
|
24912
24912
|
reject(error62);
|
|
24913
24913
|
};
|
|
@@ -24975,7 +24975,7 @@ var Protocol = class {
|
|
|
24975
24975
|
}
|
|
24976
24976
|
if (decoded.kind === "invalid") return reject(decoded.error);
|
|
24977
24977
|
if (decoded.kind === "input_required") {
|
|
24978
|
-
if (options?.allowInputRequired === true) return
|
|
24978
|
+
if (options?.allowInputRequired === true) return resolve4(manualInputRequiredValue(decoded));
|
|
24979
24979
|
const flow = {
|
|
24980
24980
|
codec: codec2,
|
|
24981
24981
|
request,
|
|
@@ -24987,11 +24987,11 @@ var Protocol = class {
|
|
|
24987
24987
|
params
|
|
24988
24988
|
}, resultSchema, legOptions)
|
|
24989
24989
|
};
|
|
24990
|
-
return
|
|
24990
|
+
return resolve4(this._resolveNonCompleteResult(decoded, flow));
|
|
24991
24991
|
}
|
|
24992
24992
|
const result = decoded.result;
|
|
24993
24993
|
validateStandardSchema(resultSchema, result).then((parseResult) => {
|
|
24994
|
-
if (parseResult.success)
|
|
24994
|
+
if (parseResult.success) resolve4(parseResult.data);
|
|
24995
24995
|
else reject(new SdkError(SdkErrorCode.InvalidResult, `Invalid result for ${request.method}: ${parseResult.error}`));
|
|
24996
24996
|
}, reject);
|
|
24997
24997
|
});
|
|
@@ -27903,7 +27903,7 @@ var require_compile = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
27903
27903
|
ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
|
|
27904
27904
|
const schOrFunc = root.refs[ref];
|
|
27905
27905
|
if (schOrFunc) return schOrFunc;
|
|
27906
|
-
let _sch =
|
|
27906
|
+
let _sch = resolve4.call(this, root, ref);
|
|
27907
27907
|
if (_sch === void 0) {
|
|
27908
27908
|
const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
|
|
27909
27909
|
const { schemaId } = this.opts;
|
|
@@ -27929,7 +27929,7 @@ var require_compile = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
27929
27929
|
function sameSchemaEnv(s1, s2) {
|
|
27930
27930
|
return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
|
|
27931
27931
|
}
|
|
27932
|
-
function
|
|
27932
|
+
function resolve4(root, ref) {
|
|
27933
27933
|
let sch;
|
|
27934
27934
|
while (typeof (sch = this.refs[ref]) == "string") ref = sch;
|
|
27935
27935
|
return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
|
|
@@ -28379,47 +28379,47 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28379
28379
|
else if (typeof uri === "object") uri = parse3(serialize(uri, options), options);
|
|
28380
28380
|
return uri;
|
|
28381
28381
|
}
|
|
28382
|
-
function
|
|
28382
|
+
function resolve4(baseURI, relativeURI, options) {
|
|
28383
28383
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
28384
28384
|
const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
28385
28385
|
schemelessOptions.skipEscape = true;
|
|
28386
28386
|
return serialize(resolved, schemelessOptions);
|
|
28387
28387
|
}
|
|
28388
|
-
function resolveComponent(base,
|
|
28388
|
+
function resolveComponent(base, relative3, options, skipNormalization) {
|
|
28389
28389
|
const target = {};
|
|
28390
28390
|
if (!skipNormalization) {
|
|
28391
28391
|
base = parse3(serialize(base, options), options);
|
|
28392
|
-
|
|
28392
|
+
relative3 = parse3(serialize(relative3, options), options);
|
|
28393
28393
|
}
|
|
28394
28394
|
options = options || {};
|
|
28395
|
-
if (!options.tolerant &&
|
|
28396
|
-
target.scheme =
|
|
28397
|
-
target.userinfo =
|
|
28398
|
-
target.host =
|
|
28399
|
-
target.port =
|
|
28400
|
-
target.path = removeDotSegments(
|
|
28401
|
-
target.query =
|
|
28395
|
+
if (!options.tolerant && relative3.scheme) {
|
|
28396
|
+
target.scheme = relative3.scheme;
|
|
28397
|
+
target.userinfo = relative3.userinfo;
|
|
28398
|
+
target.host = relative3.host;
|
|
28399
|
+
target.port = relative3.port;
|
|
28400
|
+
target.path = removeDotSegments(relative3.path || "");
|
|
28401
|
+
target.query = relative3.query;
|
|
28402
28402
|
} else {
|
|
28403
|
-
if (
|
|
28404
|
-
target.userinfo =
|
|
28405
|
-
target.host =
|
|
28406
|
-
target.port =
|
|
28407
|
-
target.path = removeDotSegments(
|
|
28408
|
-
target.query =
|
|
28403
|
+
if (relative3.userinfo !== void 0 || relative3.host !== void 0 || relative3.port !== void 0) {
|
|
28404
|
+
target.userinfo = relative3.userinfo;
|
|
28405
|
+
target.host = relative3.host;
|
|
28406
|
+
target.port = relative3.port;
|
|
28407
|
+
target.path = removeDotSegments(relative3.path || "");
|
|
28408
|
+
target.query = relative3.query;
|
|
28409
28409
|
} else {
|
|
28410
|
-
if (!
|
|
28410
|
+
if (!relative3.path) {
|
|
28411
28411
|
target.path = base.path;
|
|
28412
|
-
if (
|
|
28412
|
+
if (relative3.query !== void 0) target.query = relative3.query;
|
|
28413
28413
|
else target.query = base.query;
|
|
28414
28414
|
} else {
|
|
28415
|
-
if (
|
|
28415
|
+
if (relative3.path[0] === "/") target.path = removeDotSegments(relative3.path);
|
|
28416
28416
|
else {
|
|
28417
|
-
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) target.path = "/" +
|
|
28418
|
-
else if (!base.path) target.path =
|
|
28419
|
-
else target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) +
|
|
28417
|
+
if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) target.path = "/" + relative3.path;
|
|
28418
|
+
else if (!base.path) target.path = relative3.path;
|
|
28419
|
+
else target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative3.path;
|
|
28420
28420
|
target.path = removeDotSegments(target.path);
|
|
28421
28421
|
}
|
|
28422
|
-
target.query =
|
|
28422
|
+
target.query = relative3.query;
|
|
28423
28423
|
}
|
|
28424
28424
|
target.userinfo = base.userinfo;
|
|
28425
28425
|
target.host = base.host;
|
|
@@ -28427,7 +28427,7 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28427
28427
|
}
|
|
28428
28428
|
target.scheme = base.scheme;
|
|
28429
28429
|
}
|
|
28430
|
-
target.fragment =
|
|
28430
|
+
target.fragment = relative3.fragment;
|
|
28431
28431
|
return target;
|
|
28432
28432
|
}
|
|
28433
28433
|
function equal(uriA, uriB, options) {
|
|
@@ -28553,7 +28553,7 @@ var require_fast_uri = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
28553
28553
|
const fastUri = {
|
|
28554
28554
|
SCHEMES,
|
|
28555
28555
|
normalize,
|
|
28556
|
-
resolve,
|
|
28556
|
+
resolve: resolve4,
|
|
28557
28557
|
resolveComponent,
|
|
28558
28558
|
equal,
|
|
28559
28559
|
serialize,
|
|
@@ -29335,14 +29335,14 @@ var require_ucs2length = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
29335
29335
|
function ucs2length(str) {
|
|
29336
29336
|
const len = str.length;
|
|
29337
29337
|
let length = 0;
|
|
29338
|
-
let
|
|
29338
|
+
let pos2 = 0;
|
|
29339
29339
|
let value;
|
|
29340
|
-
while (
|
|
29340
|
+
while (pos2 < len) {
|
|
29341
29341
|
length++;
|
|
29342
|
-
value = str.charCodeAt(
|
|
29343
|
-
if (value >= 55296 && value <= 56319 &&
|
|
29344
|
-
value = str.charCodeAt(
|
|
29345
|
-
if ((value & 64512) === 56320)
|
|
29342
|
+
value = str.charCodeAt(pos2++);
|
|
29343
|
+
if (value >= 55296 && value <= 56319 && pos2 < len) {
|
|
29344
|
+
value = str.charCodeAt(pos2);
|
|
29345
|
+
if ((value & 64512) === 56320) pos2++;
|
|
29346
29346
|
}
|
|
29347
29347
|
}
|
|
29348
29348
|
return length;
|
|
@@ -33926,7 +33926,7 @@ var StdioServerTransport = class {
|
|
|
33926
33926
|
}
|
|
33927
33927
|
send(message) {
|
|
33928
33928
|
if (this._closed) return Promise.reject(/* @__PURE__ */ new Error("StdioServerTransport is closed"));
|
|
33929
|
-
return new Promise((
|
|
33929
|
+
return new Promise((resolve4, reject) => {
|
|
33930
33930
|
const json2 = serializeMessage(message);
|
|
33931
33931
|
let settled = false;
|
|
33932
33932
|
const onError = (error62) => {
|
|
@@ -33941,14 +33941,14 @@ var StdioServerTransport = class {
|
|
|
33941
33941
|
settled = true;
|
|
33942
33942
|
this._stdout.off("error", onError);
|
|
33943
33943
|
this._stdout.off("drain", onDrain);
|
|
33944
|
-
|
|
33944
|
+
resolve4();
|
|
33945
33945
|
};
|
|
33946
33946
|
this._stdout.once("error", onError);
|
|
33947
33947
|
if (this._stdout.write(json2)) {
|
|
33948
33948
|
if (settled) return;
|
|
33949
33949
|
settled = true;
|
|
33950
33950
|
this._stdout.off("error", onError);
|
|
33951
|
-
|
|
33951
|
+
resolve4();
|
|
33952
33952
|
} else if (!settled) this._stdout.once("drain", onDrain);
|
|
33953
33953
|
});
|
|
33954
33954
|
}
|
|
@@ -34002,14 +34002,14 @@ var StdioConnectionChannel = class {
|
|
|
34002
34002
|
*/
|
|
34003
34003
|
async whenRequestsAnswered(timeoutMs) {
|
|
34004
34004
|
if (this._closed || this._pendingRequests.size === 0) return true;
|
|
34005
|
-
return await new Promise((
|
|
34005
|
+
return await new Promise((resolve4) => {
|
|
34006
34006
|
const waiter = () => {
|
|
34007
34007
|
clearTimeout(timer);
|
|
34008
|
-
|
|
34008
|
+
resolve4(true);
|
|
34009
34009
|
};
|
|
34010
34010
|
const timer = setTimeout(() => {
|
|
34011
34011
|
this._drainWaiters = this._drainWaiters.filter((pending) => pending !== waiter);
|
|
34012
|
-
|
|
34012
|
+
resolve4(false);
|
|
34013
34013
|
}, timeoutMs);
|
|
34014
34014
|
this._drainWaiters.push(waiter);
|
|
34015
34015
|
});
|
|
@@ -34379,13 +34379,28 @@ var API_KEY_RE = new RegExp([
|
|
|
34379
34379
|
"whsec_[A-Za-z0-9]{16,}\\b"
|
|
34380
34380
|
// webhook signing secret (Stripe-style)
|
|
34381
34381
|
].map((p) => `\\b${p}`).join("|"), "g");
|
|
34382
|
-
var QUERY_SECRET_RE = /([?&](?:
|
|
34382
|
+
var QUERY_SECRET_RE = /([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig)=)[^&#\s"'<>`]+/gi;
|
|
34383
|
+
var OAUTH_CODE_RE = /([?&]code=)(?=[^&#\s"'<>`]{16,})[^&#\s"'<>`]+/gi;
|
|
34384
|
+
var FORM_PASSWORD_RE = /((?:^|[\s,;:"'(\[{])(?:password|passwd)=)[^&#\s"'<>`]+/gim;
|
|
34385
|
+
var HEADER_SECRET_RE = /(\b(?:x[-_][a-z0-9_-]*?(?:api[-_]?key|token|secret|auth)[a-z0-9_-]*|api[-_]?key)\s*:\s*)[^\s,;"'<>`]+/gi;
|
|
34383
34386
|
var AWS_SIGV4_RE = /([?&]X-Amz-(?:Signature|Security-Token|Credential)=)[^&#\s"'<>`]+/gi;
|
|
34384
|
-
var JSON_SECRET_KEYS =
|
|
34385
|
-
|
|
34386
|
-
|
|
34387
|
+
var JSON_SECRET_KEYS = [
|
|
34388
|
+
"(?:access|refresh|id|auth|session|bearer|csrf|xsrf)[_-]?token",
|
|
34389
|
+
"client[_-]?secret",
|
|
34390
|
+
"api[_-]?secret",
|
|
34391
|
+
"(?:x[_-])?api[_-]?key",
|
|
34392
|
+
"private[_-]?key",
|
|
34393
|
+
"x[_-][a-z0-9_-]*?(?:api[_-]?key|token|secret|auth)[a-z0-9_-]*",
|
|
34394
|
+
"(?:proxy-)?authorization",
|
|
34395
|
+
"password",
|
|
34396
|
+
"passwd",
|
|
34397
|
+
"secret",
|
|
34398
|
+
"token"
|
|
34399
|
+
].join("|");
|
|
34400
|
+
var JSON_SECRET_DQ_RE = new RegExp(`("(?:${JSON_SECRET_KEYS})"\\s*:\\s*")(?:[^"\\\\]|\\\\.)*(")`, "gi");
|
|
34401
|
+
var JSON_SECRET_SQ_RE = new RegExp(`('(?:${JSON_SECRET_KEYS})'\\s*:\\s*')(?:[^'\\\\]|\\\\.)*(')`, "gi");
|
|
34387
34402
|
function redactSecrets(text) {
|
|
34388
|
-
return text.replace(BEARER_RE, "$1[REDACTED]").replace(BASIC_AUTH_RE, "$1[REDACTED]").replace(SET_COOKIE_RE, "$1$2=[REDACTED]").replace(COOKIE_HEADER_RE, (_m, prefix, pairs) => `${prefix}${pairs.replace(/=[^;,\s]*/g, "=[REDACTED]")}`).replace(API_KEY_RE, "[REDACTED]").replace(QUERY_SECRET_RE, "$1[REDACTED]").replace(AWS_SIGV4_RE, "$1[REDACTED]").replace(JSON_SECRET_DQ_RE, "$1[REDACTED]$2").replace(JSON_SECRET_SQ_RE, "$1[REDACTED]$2").replace(JWT_RE, "[REDACTED]");
|
|
34403
|
+
return text.replace(BEARER_RE, "$1[REDACTED]").replace(BASIC_AUTH_RE, "$1[REDACTED]").replace(SET_COOKIE_RE, "$1$2=[REDACTED]").replace(COOKIE_HEADER_RE, (_m, prefix, pairs) => `${prefix}${pairs.replace(/=[^;,\s]*/g, "=[REDACTED]")}`).replace(API_KEY_RE, "[REDACTED]").replace(HEADER_SECRET_RE, "$1[REDACTED]").replace(QUERY_SECRET_RE, "$1[REDACTED]").replace(OAUTH_CODE_RE, "$1[REDACTED]").replace(FORM_PASSWORD_RE, "$1[REDACTED]").replace(AWS_SIGV4_RE, "$1[REDACTED]").replace(JSON_SECRET_DQ_RE, "$1[REDACTED]$2").replace(JSON_SECRET_SQ_RE, "$1[REDACTED]$2").replace(JWT_RE, "[REDACTED]");
|
|
34389
34404
|
}
|
|
34390
34405
|
|
|
34391
34406
|
// ../../node_modules/@chrischall/mcp-utils/dist/response/view.js
|
|
@@ -34547,13 +34562,47 @@ async function createMcpServer(opts) {
|
|
|
34547
34562
|
}
|
|
34548
34563
|
return server;
|
|
34549
34564
|
}
|
|
34565
|
+
var DEFAULT_SHUTDOWN_TIMEOUT_MS = 5e3;
|
|
34566
|
+
var DEFAULT_REPEAT_SIGNAL_GRACE_MS = 500;
|
|
34550
34567
|
function withGracefulShutdown(target, opts = {}) {
|
|
34551
34568
|
const shouldExit = opts.exit ?? true;
|
|
34569
|
+
if (opts.timeoutMs !== void 0 && !(Number.isFinite(opts.timeoutMs) && opts.timeoutMs > 0)) {
|
|
34570
|
+
throw new RangeError("withGracefulShutdown: timeoutMs must be a finite number greater than 0.");
|
|
34571
|
+
}
|
|
34572
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
34573
|
+
if (opts.repeatSignalGraceMs !== void 0 && !(Number.isFinite(opts.repeatSignalGraceMs) && opts.repeatSignalGraceMs >= 0)) {
|
|
34574
|
+
throw new RangeError("withGracefulShutdown: repeatSignalGraceMs must be a finite number >= 0.");
|
|
34575
|
+
}
|
|
34576
|
+
const repeatGraceMs = opts.repeatSignalGraceMs ?? DEFAULT_REPEAT_SIGNAL_GRACE_MS;
|
|
34552
34577
|
let shuttingDown = false;
|
|
34578
|
+
let firstSignalAt = 0;
|
|
34579
|
+
let exited = false;
|
|
34580
|
+
const exitOnce = () => {
|
|
34581
|
+
if (exited)
|
|
34582
|
+
return;
|
|
34583
|
+
exited = true;
|
|
34584
|
+
process.exit(0);
|
|
34585
|
+
};
|
|
34553
34586
|
const handler = (signal) => {
|
|
34554
|
-
if (shuttingDown)
|
|
34587
|
+
if (shuttingDown) {
|
|
34588
|
+
if (Date.now() - firstSignalAt < repeatGraceMs)
|
|
34589
|
+
return;
|
|
34590
|
+
if (shouldExit) {
|
|
34591
|
+
console.error(`[mcp-utils] second ${signal} during shutdown \u2014 exiting now`);
|
|
34592
|
+
exitOnce();
|
|
34593
|
+
}
|
|
34555
34594
|
return;
|
|
34595
|
+
}
|
|
34556
34596
|
shuttingDown = true;
|
|
34597
|
+
firstSignalAt = Date.now();
|
|
34598
|
+
let timer;
|
|
34599
|
+
if (shouldExit) {
|
|
34600
|
+
timer = setTimeout(() => {
|
|
34601
|
+
console.error(`[mcp-utils] graceful shutdown on ${signal} did not finish in ${timeoutMs}ms \u2014 exiting`);
|
|
34602
|
+
exitOnce();
|
|
34603
|
+
}, timeoutMs);
|
|
34604
|
+
timer.unref?.();
|
|
34605
|
+
}
|
|
34557
34606
|
void (async () => {
|
|
34558
34607
|
try {
|
|
34559
34608
|
if (opts.onSignal)
|
|
@@ -34562,8 +34611,10 @@ function withGracefulShutdown(target, opts = {}) {
|
|
|
34562
34611
|
} catch (err) {
|
|
34563
34612
|
console.error(`[mcp-utils] error during graceful shutdown on ${signal}: ${err instanceof Error ? err.message : String(err)}`);
|
|
34564
34613
|
} finally {
|
|
34614
|
+
if (timer !== void 0)
|
|
34615
|
+
clearTimeout(timer);
|
|
34565
34616
|
if (shouldExit)
|
|
34566
|
-
|
|
34617
|
+
exitOnce();
|
|
34567
34618
|
}
|
|
34568
34619
|
})();
|
|
34569
34620
|
};
|
|
@@ -34593,6 +34644,8 @@ function runMcp(opts) {
|
|
|
34593
34644
|
}
|
|
34594
34645
|
|
|
34595
34646
|
// ../../node_modules/@chrischall/mcp-utils/dist/config/index.js
|
|
34647
|
+
import { homedir } from "node:os";
|
|
34648
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
34596
34649
|
var PLACEHOLDER_RE = /^\$\{[^}]*\}$/;
|
|
34597
34650
|
function readEnvVar(key, opts = {}) {
|
|
34598
34651
|
const env = opts.env ?? process.env;
|
|
@@ -34619,6 +34672,50 @@ function parseBoolEnv(key, opts = {}) {
|
|
|
34619
34672
|
return false;
|
|
34620
34673
|
return fallback;
|
|
34621
34674
|
}
|
|
34675
|
+
function expandPath(p) {
|
|
34676
|
+
let expanded = p;
|
|
34677
|
+
if (p === "~") {
|
|
34678
|
+
expanded = homedir();
|
|
34679
|
+
} else if (p.startsWith("~/")) {
|
|
34680
|
+
expanded = join(homedir(), p.slice(2));
|
|
34681
|
+
}
|
|
34682
|
+
return isAbsolute(expanded) ? expanded : resolve(expanded);
|
|
34683
|
+
}
|
|
34684
|
+
|
|
34685
|
+
// ../../node_modules/@chrischall/mcp-utils/dist/fs/confine.js
|
|
34686
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
34687
|
+
import { dirname, isAbsolute as isAbsolute2, relative, resolve as resolve2, sep } from "node:path";
|
|
34688
|
+
function isInside(root, target) {
|
|
34689
|
+
const rel = relative(root, target);
|
|
34690
|
+
return rel === "" || !rel.startsWith(`..${sep}`) && rel !== ".." && !isAbsolute2(rel);
|
|
34691
|
+
}
|
|
34692
|
+
function realPathAllowingMissing(p) {
|
|
34693
|
+
const abs = resolve2(p);
|
|
34694
|
+
let existing = abs;
|
|
34695
|
+
const tail = [];
|
|
34696
|
+
while (!existsSync(existing)) {
|
|
34697
|
+
const parent = dirname(existing);
|
|
34698
|
+
if (parent === existing)
|
|
34699
|
+
break;
|
|
34700
|
+
tail.unshift(existing.slice(parent.length).replace(/^[/\\]+/, ""));
|
|
34701
|
+
existing = parent;
|
|
34702
|
+
}
|
|
34703
|
+
let real;
|
|
34704
|
+
try {
|
|
34705
|
+
real = realpathSync(existing);
|
|
34706
|
+
} catch {
|
|
34707
|
+
real = existing;
|
|
34708
|
+
}
|
|
34709
|
+
return tail.length > 0 ? resolve2(real, ...tail) : real;
|
|
34710
|
+
}
|
|
34711
|
+
function assertPathWithinRoots(path, roots) {
|
|
34712
|
+
const target = realPathAllowingMissing(expandPath(path));
|
|
34713
|
+
for (const root of roots) {
|
|
34714
|
+
if (isInside(realPathAllowingMissing(expandPath(root)), target))
|
|
34715
|
+
return target;
|
|
34716
|
+
}
|
|
34717
|
+
throw new Error(`Path is outside the allowed directories: ${path}`);
|
|
34718
|
+
}
|
|
34622
34719
|
|
|
34623
34720
|
// ../../node_modules/@chrischall/mcp-utils/dist/zod/index.js
|
|
34624
34721
|
var PositiveInt = external_exports.number().int().positive();
|
|
@@ -34640,7 +34737,7 @@ var pageSchema = {
|
|
|
34640
34737
|
};
|
|
34641
34738
|
|
|
34642
34739
|
// ../gogcli-mcp/src/runner.ts
|
|
34643
|
-
import { delimiter, join } from "node:path";
|
|
34740
|
+
import { delimiter, join as join2 } from "node:path";
|
|
34644
34741
|
|
|
34645
34742
|
// ../gogcli-mcp/src/timestamps.ts
|
|
34646
34743
|
var DEFAULT_DISPLAY_TZ = "America/New_York";
|
|
@@ -34841,9 +34938,48 @@ function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSource
|
|
|
34841
34938
|
return JSON.stringify(parsed, null, detectIndent(text));
|
|
34842
34939
|
}
|
|
34843
34940
|
|
|
34941
|
+
// ../gogcli-mcp/src/arg-guard.ts
|
|
34942
|
+
var FORBIDDEN_LONG_FLAG = /^--(readonly|enable-commands|enable-commands-exact|disable-commands|access-token|home|account|acct|client|gmail-no-send|no-input|non-interactive|noninteractive)(=|$)/i;
|
|
34943
|
+
var SHORT_ACCOUNT_CLUSTER = /^-(?!-)[A-Za-z]*a/;
|
|
34944
|
+
function forbiddenArgReason(arg) {
|
|
34945
|
+
if (arg === "--") {
|
|
34946
|
+
return 'The argument "--" is not allowed: it ends flag parsing and would disable safety flags appended after it.';
|
|
34947
|
+
}
|
|
34948
|
+
const match = FORBIDDEN_LONG_FLAG.exec(arg);
|
|
34949
|
+
if (match) {
|
|
34950
|
+
return `The flag ${arg} is not allowed here: --${match[1].toLowerCase()} is a safety/credential control set by the server operator, not a per-call option.`;
|
|
34951
|
+
}
|
|
34952
|
+
if (SHORT_ACCOUNT_CLUSTER.test(arg)) {
|
|
34953
|
+
return `The flag ${arg} is not allowed here: -a selects the account. Use the tool's account parameter instead.`;
|
|
34954
|
+
}
|
|
34955
|
+
return void 0;
|
|
34956
|
+
}
|
|
34957
|
+
function assertSafeForwardedArgs(args) {
|
|
34958
|
+
for (const arg of args) {
|
|
34959
|
+
const reason = forbiddenArgReason(arg);
|
|
34960
|
+
if (reason) throw new Error(reason);
|
|
34961
|
+
}
|
|
34962
|
+
}
|
|
34963
|
+
var SUBCOMMAND_SHAPE = /^[a-z][a-z0-9-]*$/;
|
|
34964
|
+
function assertSafeSubcommand(subcommand) {
|
|
34965
|
+
if (!SUBCOMMAND_SHAPE.test(subcommand)) {
|
|
34966
|
+
throw new Error(
|
|
34967
|
+
`Invalid subcommand ${JSON.stringify(subcommand)}: pass a single gog subcommand name such as "list" or "mark-read", and put its arguments in args.`
|
|
34968
|
+
);
|
|
34969
|
+
}
|
|
34970
|
+
}
|
|
34971
|
+
|
|
34972
|
+
// ../gogcli-mcp/src/argv.ts
|
|
34973
|
+
function pos(value) {
|
|
34974
|
+
return { kind: "positional", value };
|
|
34975
|
+
}
|
|
34976
|
+
function isGogPositional(arg) {
|
|
34977
|
+
return typeof arg === "object" && arg !== null && arg.kind === "positional";
|
|
34978
|
+
}
|
|
34979
|
+
|
|
34844
34980
|
// ../gogcli-mcp/src/runner.ts
|
|
34845
34981
|
function isGogFileArg(arg) {
|
|
34846
|
-
return typeof arg !== "string";
|
|
34982
|
+
return typeof arg !== "string" && arg.kind === "file";
|
|
34847
34983
|
}
|
|
34848
34984
|
var TIMEOUT_MS = 3e4;
|
|
34849
34985
|
function readonlyEnvEnabled() {
|
|
@@ -34927,8 +35063,8 @@ function formatTimeout(ms) {
|
|
|
34927
35063
|
}
|
|
34928
35064
|
async function spawnWithTempFiles(args, opts) {
|
|
34929
35065
|
const { mkdtemp, mkdir, writeFile, rm } = await import("node:fs/promises");
|
|
34930
|
-
const { tmpdir } = await import("node:os");
|
|
34931
|
-
const dir = await mkdtemp(
|
|
35066
|
+
const { tmpdir: tmpdir2 } = await import("node:os");
|
|
35067
|
+
const dir = await mkdtemp(join2(tmpdir2(), "gogcli-mcp-"));
|
|
34932
35068
|
try {
|
|
34933
35069
|
const argv = [];
|
|
34934
35070
|
let seq = 0;
|
|
@@ -34937,10 +35073,10 @@ async function spawnWithTempFiles(args, opts) {
|
|
|
34937
35073
|
argv.push(arg);
|
|
34938
35074
|
continue;
|
|
34939
35075
|
}
|
|
34940
|
-
const sub =
|
|
35076
|
+
const sub = join2(dir, String(seq));
|
|
34941
35077
|
seq += 1;
|
|
34942
35078
|
await mkdir(sub, { recursive: true, mode: 448 });
|
|
34943
|
-
const path =
|
|
35079
|
+
const path = join2(sub, arg.filename ?? `${arg.flag}.${arg.ext ?? "txt"}`);
|
|
34944
35080
|
const data = arg.encoding === "base64" ? Buffer.from(arg.contents, "base64") : Buffer.from(arg.contents, "utf8");
|
|
34945
35081
|
await writeFile(path, data, { mode: 384 });
|
|
34946
35082
|
argv.push(arg.positional ? path : `--${arg.flag}=${path}`);
|
|
@@ -34958,10 +35094,10 @@ function spawnExecutor(args, opts) {
|
|
|
34958
35094
|
return spawnGog(args, opts);
|
|
34959
35095
|
}
|
|
34960
35096
|
async function spawnGog(fullArgs, opts) {
|
|
34961
|
-
const { timeout, interactive = false, spawner, binary = false } = opts;
|
|
35097
|
+
const { timeout, interactive = false, spawner, binary = false, maxOutputBytes } = opts;
|
|
34962
35098
|
const spawn = spawner ?? (await import("node:child_process")).spawn;
|
|
34963
35099
|
const effectiveTimeout = timeout ?? TIMEOUT_MS;
|
|
34964
|
-
return new Promise((
|
|
35100
|
+
return new Promise((resolve4, reject) => {
|
|
34965
35101
|
const childEnv = { ...sanitizedEnv(), GOG_TIMEZONE: naiveSourceTimeZone(), PATH: augmentedPath() };
|
|
34966
35102
|
const child = spawn(readEnvVar("GOG_PATH") ?? "gog", fullArgs, { env: childEnv });
|
|
34967
35103
|
const stdoutChunks = [];
|
|
@@ -34979,7 +35115,17 @@ async function spawnGog(fullArgs, opts) {
|
|
|
34979
35115
|
child.kill();
|
|
34980
35116
|
reject(new Error(`gog timed out after ${formatTimeout(effectiveTimeout)}`));
|
|
34981
35117
|
}, effectiveTimeout);
|
|
35118
|
+
let stdoutBytes = 0;
|
|
34982
35119
|
child.stdout.on("data", (chunk) => {
|
|
35120
|
+
if (settled) return;
|
|
35121
|
+
stdoutBytes += chunk.length;
|
|
35122
|
+
if (maxOutputBytes !== void 0 && stdoutBytes > maxOutputBytes) {
|
|
35123
|
+
settled = true;
|
|
35124
|
+
stopWatching();
|
|
35125
|
+
child.kill();
|
|
35126
|
+
reject(new Error(`gog output exceeded the limit: more than ${maxOutputBytes} bytes`));
|
|
35127
|
+
return;
|
|
35128
|
+
}
|
|
34983
35129
|
stdoutChunks.push(chunk);
|
|
34984
35130
|
});
|
|
34985
35131
|
child.stderr.on("data", (chunk) => {
|
|
@@ -34996,14 +35142,14 @@ async function spawnGog(fullArgs, opts) {
|
|
|
34996
35142
|
const stderr = Buffer.concat(stderrChunks).toString().trim();
|
|
34997
35143
|
if (code === 0) {
|
|
34998
35144
|
if (binary) {
|
|
34999
|
-
|
|
35145
|
+
resolve4(Buffer.concat(stdoutChunks).toString("base64"));
|
|
35000
35146
|
return;
|
|
35001
35147
|
}
|
|
35002
35148
|
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
35003
35149
|
if (interactive && stderr) {
|
|
35004
|
-
|
|
35150
|
+
resolve4(stdout + "\n" + stderr);
|
|
35005
35151
|
} else {
|
|
35006
|
-
|
|
35152
|
+
resolve4(stdout);
|
|
35007
35153
|
}
|
|
35008
35154
|
} else {
|
|
35009
35155
|
reject(new Error(stderr || `gog exited with code ${code}`));
|
|
@@ -35023,7 +35169,33 @@ async function spawnGog(fullArgs, opts) {
|
|
|
35023
35169
|
});
|
|
35024
35170
|
});
|
|
35025
35171
|
}
|
|
35172
|
+
function placePositionals(args) {
|
|
35173
|
+
const flags = [];
|
|
35174
|
+
const positionals = [];
|
|
35175
|
+
let afterSeparator = false;
|
|
35176
|
+
for (const arg of args) {
|
|
35177
|
+
if (arg === "--") {
|
|
35178
|
+
afterSeparator = true;
|
|
35179
|
+
} else if (isGogPositional(arg)) {
|
|
35180
|
+
positionals.push(arg.value);
|
|
35181
|
+
} else if (afterSeparator || isGogFileArg(arg) && arg.positional) {
|
|
35182
|
+
positionals.push(arg);
|
|
35183
|
+
} else {
|
|
35184
|
+
flags.push(arg);
|
|
35185
|
+
}
|
|
35186
|
+
}
|
|
35187
|
+
return { flags, positionals };
|
|
35188
|
+
}
|
|
35189
|
+
function assertNoSafetyOverrides(flags) {
|
|
35190
|
+
for (const arg of flags) {
|
|
35191
|
+
if (typeof arg !== "string") continue;
|
|
35192
|
+
const reason = forbiddenArgReason(arg);
|
|
35193
|
+
if (reason) throw new Error(reason);
|
|
35194
|
+
}
|
|
35195
|
+
}
|
|
35026
35196
|
function assembleArgs(args, opts) {
|
|
35197
|
+
const { flags, positionals } = placePositionals(args);
|
|
35198
|
+
assertNoSafetyOverrides(flags);
|
|
35027
35199
|
const effectiveAccount = opts.account ?? readEnvVar("GOG_ACCOUNT");
|
|
35028
35200
|
const fullArgs = ["--json", "--color=never"];
|
|
35029
35201
|
if (!opts.interactive) {
|
|
@@ -35032,17 +35204,21 @@ function assembleArgs(args, opts) {
|
|
|
35032
35204
|
if (opts.readonly || readonlyEnvEnabled()) {
|
|
35033
35205
|
fullArgs.push("--readonly");
|
|
35034
35206
|
}
|
|
35207
|
+
if (opts.gmailNoSend) {
|
|
35208
|
+
fullArgs.push("--gmail-no-send");
|
|
35209
|
+
}
|
|
35035
35210
|
if (effectiveAccount) {
|
|
35036
35211
|
fullArgs.push("--account", effectiveAccount);
|
|
35037
35212
|
}
|
|
35038
|
-
fullArgs.push(...
|
|
35213
|
+
fullArgs.push(...flags);
|
|
35214
|
+
if (positionals.length > 0) fullArgs.push("--", ...positionals);
|
|
35039
35215
|
return fullArgs;
|
|
35040
35216
|
}
|
|
35041
35217
|
async function run(args, options = {}) {
|
|
35042
|
-
const { account, spawner, interactive = false, timeout, readonly: readonly2 = false, redactMode = "full", opaqueFields } = options;
|
|
35218
|
+
const { account, spawner, interactive = false, timeout, readonly: readonly2 = false, redactMode = "full", opaqueFields, gmailNoSend = false } = options;
|
|
35043
35219
|
const base = redactMode === "tokens" ? redactGoogleTokens : redactSecrets2;
|
|
35044
35220
|
const redact = opaqueFields?.length ? (text) => redactPreservingOpaqueFields(text, opaqueFields, base) : base;
|
|
35045
|
-
const fullArgs = assembleArgs(args, { account, interactive, readonly: readonly2 });
|
|
35221
|
+
const fullArgs = assembleArgs(args, { account, interactive, readonly: readonly2, gmailNoSend });
|
|
35046
35222
|
try {
|
|
35047
35223
|
return redact(await spawnExecutor(fullArgs, { timeout, interactive, spawner }));
|
|
35048
35224
|
} catch (err) {
|
|
@@ -35070,6 +35246,107 @@ function stripConsumedPageToken(text) {
|
|
|
35070
35246
|
return JSON.stringify(obj, null, detectIndent2(text));
|
|
35071
35247
|
}
|
|
35072
35248
|
|
|
35249
|
+
// ../gogcli-mcp/src/file-roots.ts
|
|
35250
|
+
import { homedir as homedir2 } from "node:os";
|
|
35251
|
+
import { delimiter as delimiter2, join as join4 } from "node:path";
|
|
35252
|
+
|
|
35253
|
+
// ../gogcli-mcp/src/attachment-root.ts
|
|
35254
|
+
import { tmpdir, userInfo } from "node:os";
|
|
35255
|
+
import { dirname as dirname2, join as join3, relative as relative2, resolve as resolve3, isAbsolute as isAbsolute3, sep as sep2 } from "node:path";
|
|
35256
|
+
var ATTACHMENT_DOWNLOAD_ROOT = join3(tmpdir(), `gogcli-mcp-attachments-${userInfo().uid}`);
|
|
35257
|
+
var ATTACHMENT_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
35258
|
+
|
|
35259
|
+
// ../gogcli-mcp/src/file-roots.ts
|
|
35260
|
+
var FILE_ROOTS_ENV = "GOG_FILE_ROOTS";
|
|
35261
|
+
function defaultFileRoot() {
|
|
35262
|
+
return join4(homedir2(), "gogcli-mcp-files");
|
|
35263
|
+
}
|
|
35264
|
+
function fileRoots() {
|
|
35265
|
+
const raw = readEnvVar(FILE_ROOTS_ENV);
|
|
35266
|
+
const roots = (raw ?? "").split(delimiter2).map((r) => r.trim()).filter(Boolean);
|
|
35267
|
+
return roots.length > 0 ? roots : [defaultFileRoot()];
|
|
35268
|
+
}
|
|
35269
|
+
function confinePath(path, param, opts = {}) {
|
|
35270
|
+
if (opts.allowDash && path === "-") return path;
|
|
35271
|
+
const roots = [...fileRoots(), ATTACHMENT_DOWNLOAD_ROOT];
|
|
35272
|
+
try {
|
|
35273
|
+
assertPathWithinRoots(path, roots);
|
|
35274
|
+
} catch {
|
|
35275
|
+
throw new Error(
|
|
35276
|
+
`${param} ${JSON.stringify(path)} is outside the directories this server may read or write (${roots.join(", ")}). Put the file in one of them, or ask the server operator to widen ${FILE_ROOTS_ENV}.`
|
|
35277
|
+
);
|
|
35278
|
+
}
|
|
35279
|
+
return path;
|
|
35280
|
+
}
|
|
35281
|
+
|
|
35282
|
+
// ../gogcli-mcp/src/run-path-guard.ts
|
|
35283
|
+
var POSITIONAL_PATH_SUBCOMMANDS = {
|
|
35284
|
+
appscript: { pull: "gog_appscript_pull" },
|
|
35285
|
+
drive: { upload: "gog_drive_upload", sync: "gog_drive_sync_push" },
|
|
35286
|
+
gmail: { import: "gog_gmail_import" },
|
|
35287
|
+
slides: {
|
|
35288
|
+
"add-slide": "gog_slides_add_slide",
|
|
35289
|
+
"insert-image": "gog_slides_insert_image",
|
|
35290
|
+
"replace-slide": "gog_slides_replace_slide"
|
|
35291
|
+
}
|
|
35292
|
+
};
|
|
35293
|
+
var PATH_FLAGS = /* @__PURE__ */ new Set(["out", "output", "out-dir", "output-dir", "dir", "worker-dir", "attach", "file", "key", "cert", "replacements"]);
|
|
35294
|
+
var ID_FLAGS = {
|
|
35295
|
+
drive: /* @__PURE__ */ new Set(["file", "filter-file"])
|
|
35296
|
+
};
|
|
35297
|
+
var EXEC_FLAGS = /* @__PURE__ */ new Set(["on-change", "on-new", "mmdc"]);
|
|
35298
|
+
var SHORT_PATH_CLUSTER = /^-(?!-)[A-Za-z]*[of]/;
|
|
35299
|
+
var LONG_FLAG = /^--([A-Za-z0-9][A-Za-z0-9-]*)(?:=([\s\S]*))?$/;
|
|
35300
|
+
function isPathFlag(service, name) {
|
|
35301
|
+
if (ID_FLAGS[service]?.has(name)) return false;
|
|
35302
|
+
return PATH_FLAGS.has(name) || name.endsWith("-file");
|
|
35303
|
+
}
|
|
35304
|
+
function confineFlagValue(flag, value) {
|
|
35305
|
+
if (value === "-") return;
|
|
35306
|
+
confinePath(value, flag);
|
|
35307
|
+
for (const part of value.split(",")) {
|
|
35308
|
+
if (part !== "" && part !== "-") confinePath(part, flag);
|
|
35309
|
+
}
|
|
35310
|
+
}
|
|
35311
|
+
function positionalPathTool(service, subcommand) {
|
|
35312
|
+
return POSITIONAL_PATH_SUBCOMMANDS[service]?.[subcommand];
|
|
35313
|
+
}
|
|
35314
|
+
function assertRunPathsConfined(service, subcommand, args) {
|
|
35315
|
+
const dedicated = positionalPathTool(service, subcommand);
|
|
35316
|
+
if (dedicated) {
|
|
35317
|
+
throw new Error(
|
|
35318
|
+
`gog ${service} ${subcommand} reads or writes a local path given as a positional argument, so it is not available through gog_${service}_run. Use ${dedicated}, which confines the path to GOG_FILE_ROOTS.`
|
|
35319
|
+
);
|
|
35320
|
+
}
|
|
35321
|
+
for (let i = 0; i < args.length; i++) {
|
|
35322
|
+
const arg = args[i];
|
|
35323
|
+
if (SHORT_PATH_CLUSTER.test(arg)) {
|
|
35324
|
+
throw new Error(
|
|
35325
|
+
`The flag ${arg} is not allowed here: spell a path flag out as --out or --file (e.g. --out=<path>) so its path can be checked against GOG_FILE_ROOTS.`
|
|
35326
|
+
);
|
|
35327
|
+
}
|
|
35328
|
+
const match = LONG_FLAG.exec(arg);
|
|
35329
|
+
if (!match) continue;
|
|
35330
|
+
const name = match[1].toLowerCase();
|
|
35331
|
+
if (EXEC_FLAGS.has(name)) {
|
|
35332
|
+
throw new Error(`The flag --${name} is not allowed here: it runs a local program chosen by the caller.`);
|
|
35333
|
+
}
|
|
35334
|
+
const isJson = name.endsWith("-json");
|
|
35335
|
+
if (!isJson && !isPathFlag(service, name)) continue;
|
|
35336
|
+
let value = match[2];
|
|
35337
|
+
if (value === void 0) {
|
|
35338
|
+
value = args[i + 1];
|
|
35339
|
+
if (value === void 0) continue;
|
|
35340
|
+
i++;
|
|
35341
|
+
}
|
|
35342
|
+
if (isJson) {
|
|
35343
|
+
if (value.startsWith("@")) confineFlagValue(`--${name}`, value.slice(1));
|
|
35344
|
+
continue;
|
|
35345
|
+
}
|
|
35346
|
+
confineFlagValue(`--${name}`, value);
|
|
35347
|
+
}
|
|
35348
|
+
}
|
|
35349
|
+
|
|
35073
35350
|
// ../gogcli-mcp/src/tools/utils.ts
|
|
35074
35351
|
var PAYLOAD_INLINE_MAX = 4096;
|
|
35075
35352
|
function payloadArg(inlineFlag, fileFlag, value, ext) {
|
|
@@ -35118,9 +35395,17 @@ var paginationParams = {
|
|
|
35118
35395
|
all: external_exports.boolean().optional().describe("Fetch all pages")
|
|
35119
35396
|
};
|
|
35120
35397
|
function registerRunTool(server, options) {
|
|
35121
|
-
const { service, examples, omitAccount = false, note } = options;
|
|
35398
|
+
const { service, examples, omitAccount = false, note, allowedSubcommands, vet, gmailNoSend = false } = options;
|
|
35399
|
+
for (const [, example] of examples.matchAll(/"([^"]+)"/g)) {
|
|
35400
|
+
const refused = allowedSubcommands && !allowedSubcommands.includes(example) || vet?.(example, []) || positionalPathTool(service, example);
|
|
35401
|
+
if (refused) {
|
|
35402
|
+
throw new Error(`gog_${service}_run example "${example}" is refused by the tool itself; list a subcommand it runs.`);
|
|
35403
|
+
}
|
|
35404
|
+
}
|
|
35122
35405
|
const baseDescription = `Run any gog ${service} subcommand not covered by the other tools. Run \`gog ${service} --help\` for the full list of subcommands, or \`gog ${service} <subcommand> --help\` for flags on a specific subcommand.`;
|
|
35123
|
-
const
|
|
35406
|
+
const restriction = allowedSubcommands ? ` Only these subcommands are available: ${allowedSubcommands.join(", ")}.` : "";
|
|
35407
|
+
const safety = ' Flags that override server safety controls (--readonly, --enable-commands, --disable-commands, --account, --access-token, --home, --client, --gmail-no-send, --no-input) and a bare "--" are refused. Local file paths (--out, --out-dir, --attach, --file, --*-file, @file JSON) must be inside GOG_FILE_ROOTS; subcommands that take a local path positionally (e.g. drive upload) are refused in favour of their dedicated tools.';
|
|
35408
|
+
const description = `${baseDescription}${restriction}${safety}${note ? ` ${note}` : ""}`;
|
|
35124
35409
|
const inputSchema = {
|
|
35125
35410
|
subcommand: external_exports.string().describe(`The gog ${service} subcommand to run, e.g. ${examples}`),
|
|
35126
35411
|
args: external_exports.array(external_exports.string()).describe("Additional positional args and flags")
|
|
@@ -35134,7 +35419,21 @@ function registerRunTool(server, options) {
|
|
|
35134
35419
|
inputSchema: external_exports.object(inputSchema)
|
|
35135
35420
|
}, async (rawArgs) => {
|
|
35136
35421
|
const { subcommand, args, account } = rawArgs;
|
|
35137
|
-
|
|
35422
|
+
try {
|
|
35423
|
+
assertSafeSubcommand(subcommand);
|
|
35424
|
+
assertSafeForwardedArgs(args);
|
|
35425
|
+
if (allowedSubcommands && !allowedSubcommands.includes(subcommand)) {
|
|
35426
|
+
throw new Error(
|
|
35427
|
+
`gog ${service} ${subcommand} is not available through gog_${service}_run. Allowed: ${allowedSubcommands.join(", ")}.`
|
|
35428
|
+
);
|
|
35429
|
+
}
|
|
35430
|
+
const refusal = vet?.(subcommand, args);
|
|
35431
|
+
if (refusal) throw new Error(refusal);
|
|
35432
|
+
assertRunPathsConfined(service, subcommand, args);
|
|
35433
|
+
} catch (err) {
|
|
35434
|
+
return errorResult(errorText(err));
|
|
35435
|
+
}
|
|
35436
|
+
return runOrDiagnose([service, subcommand, ...args], gmailNoSend ? { account, gmailNoSend } : { account });
|
|
35138
35437
|
});
|
|
35139
35438
|
}
|
|
35140
35439
|
function errorText(err) {
|
|
@@ -35255,7 +35554,13 @@ function formatAuthHealth(raw, now) {
|
|
|
35255
35554
|
return accounts.map((a) => formatOneAccountHealth(a, now)).join("\n\n");
|
|
35256
35555
|
}
|
|
35257
35556
|
|
|
35557
|
+
// ../gogcli-mcp/src/dispatch-confirmation.ts
|
|
35558
|
+
var confirmTokenParam = external_exports.string().optional().describe(
|
|
35559
|
+
`ONLY for the two-step fallback (client without MCP elicitation, server with GOG_SEND_CONFIRM_FALLBACK=token). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat \u2014 never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.`
|
|
35560
|
+
);
|
|
35561
|
+
|
|
35258
35562
|
// ../gogcli-mcp/src/tools/auth.ts
|
|
35563
|
+
var AUTH_RUN_SUBCOMMANDS = ["list", "status", "services", "remove", "alias"];
|
|
35259
35564
|
function registerAuthToolsWith(server, defaultServices) {
|
|
35260
35565
|
const servicesDescribe = `Services to authorize: "all" or comma-separated list (e.g. "sheets,gmail,calendar"). Default: "${defaultServices}". Prefer the narrowest set you need \u2014 requesting a service whose Google API is not enabled on the OAuth client's project makes Google reject the WHOLE request with invalid_scope.`;
|
|
35261
35566
|
const extraScopesDescribe = "Additional raw OAuth scope URIs to request, comma-separated, on top of the ones `services` implies. Use for scopes no service covers \u2014 e.g. https://www.googleapis.com/auth/bigquery.readonly, required before gog_sheets_datasource_* can read BigQuery-backed Connected Sheets. Leave unset otherwise: an extra scope whose API is not enabled on the OAuth client project makes Google reject the WHOLE authorization with invalid_scope.";
|
|
@@ -35313,7 +35618,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
35313
35618
|
})
|
|
35314
35619
|
}, async ({ email: email3, services = defaultServices, extraScopes }) => {
|
|
35315
35620
|
try {
|
|
35316
|
-
const args = ["auth", "add", email3, "--services", services];
|
|
35621
|
+
const args = ["auth", "add", pos(email3), "--services", services];
|
|
35317
35622
|
if (extraScopes) args.push(`--extra-scopes=${extraScopes}`, "--force-consent");
|
|
35318
35623
|
return rawTextResult(await run(args, {
|
|
35319
35624
|
interactive: true,
|
|
@@ -35333,7 +35638,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
35333
35638
|
})
|
|
35334
35639
|
}, async ({ email: email3, services = defaultServices, extraScopes }) => {
|
|
35335
35640
|
try {
|
|
35336
|
-
const args = ["auth", "add", email3, "--remote", "--step", "1", "--services", services, "--force-consent"];
|
|
35641
|
+
const args = ["auth", "add", pos(email3), "--remote", "--step", "1", "--services", services, "--force-consent"];
|
|
35337
35642
|
if (extraScopes) args.push(`--extra-scopes=${extraScopes}`);
|
|
35338
35643
|
return rawTextResult(await run(args, { redactMode: "tokens" }));
|
|
35339
35644
|
} catch (err) {
|
|
@@ -35360,7 +35665,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
35360
35665
|
const args = [
|
|
35361
35666
|
"auth",
|
|
35362
35667
|
"add",
|
|
35363
|
-
email3,
|
|
35668
|
+
pos(email3),
|
|
35364
35669
|
"--remote",
|
|
35365
35670
|
"--step",
|
|
35366
35671
|
"2",
|
|
@@ -35380,6 +35685,7 @@ function registerAuthToolsWith(server, defaultServices) {
|
|
|
35380
35685
|
service: "auth",
|
|
35381
35686
|
examples: '"remove", "alias", "list"',
|
|
35382
35687
|
omitAccount: true,
|
|
35688
|
+
allowedSubcommands: AUTH_RUN_SUBCOMMANDS,
|
|
35383
35689
|
note: "For browser-based authorization, use gog_auth_add instead."
|
|
35384
35690
|
});
|
|
35385
35691
|
}
|
|
@@ -35429,7 +35735,7 @@ var replySchema = {
|
|
|
35429
35735
|
remove: external_exports.array(external_exports.string()).optional().describe("Remove these recipients from all fields (repeatable) \u2014 e.g. to drop someone from a reply-all."),
|
|
35430
35736
|
subject: external_exports.string().optional().describe('Override reply subject (default: "Re: <original>"). A changed subject starts a NEW Gmail thread.'),
|
|
35431
35737
|
noQuote: external_exports.boolean().optional().describe("Do not include the original message quoted below the reply (default: the original is quoted)"),
|
|
35432
|
-
attach: external_exports.array(external_exports.string()).optional().describe(`File paths to attach (repeatable), resolved ON THE GOG SERVER's filesystem \u2014 NOT this client's. Only usable when gog runs on the same machine you do (local stdio); on a hosted deployment (e.g. mcp-host) these paths do not exist and the call fails with "no such file or directory" \u2014 use attachInline there. Read on the server, base64-encoded with a MIME type inferred from the extension.`),
|
|
35738
|
+
attach: external_exports.array(external_exports.string()).optional().describe(`File paths to attach (repeatable), resolved ON THE GOG SERVER's filesystem \u2014 NOT this client's. Only usable when gog runs on the same machine you do (local stdio); on a hosted deployment (e.g. mcp-host) these paths do not exist and the call fails with "no such file or directory" \u2014 use attachInline there. Read on the server, base64-encoded with a MIME type inferred from the extension. Must be inside the server's GOG_FILE_ROOTS directories (default ~/gogcli-mcp-files).`),
|
|
35433
35739
|
attachInline: attachInlineParam,
|
|
35434
35740
|
from: external_exports.string().optional().describe("Send from this email address (must be a verified send-as alias)"),
|
|
35435
35741
|
autoFromAddressedAlias: external_exports.boolean().optional().describe("When from is omitted, send from the verified send-as alias the original message was addressed TO, instead of the account's primary address \u2014 so a reply to mail sent to an alias goes back out from that alias. Ignored when from is set."),
|
|
@@ -35438,7 +35744,7 @@ var replySchema = {
|
|
|
35438
35744
|
signatureFile: external_exports.string().optional().describe("Append a local signature file (plain text or HTML), read on the gog server"),
|
|
35439
35745
|
account: accountParam
|
|
35440
35746
|
};
|
|
35441
|
-
var sendReplySchema = external_exports.object(replySchema);
|
|
35747
|
+
var sendReplySchema = external_exports.object({ ...replySchema, confirmToken: confirmTokenParam });
|
|
35442
35748
|
|
|
35443
35749
|
// ../gogcli-mcp/src/tools/sheets.ts
|
|
35444
35750
|
var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
|
|
@@ -35452,8 +35758,9 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
35452
35758
|
// ../gogcli-mcp/src/tools/slides.ts
|
|
35453
35759
|
function registerSlidesTools(server) {
|
|
35454
35760
|
server.registerTool("gog_slides_export", {
|
|
35455
|
-
description: "Export a Google Slides presentation to a local file (pdf or pptx).",
|
|
35456
|
-
|
|
35761
|
+
description: "Export a Google Slides presentation to a local file (pdf or pptx). The out path must be inside the server's GOG_FILE_ROOTS directories.",
|
|
35762
|
+
// Writes a file on the gog host and can overwrite one: not read-only.
|
|
35763
|
+
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
35457
35764
|
inputSchema: external_exports.object({
|
|
35458
35765
|
presentationId: external_exports.string().describe("Presentation ID"),
|
|
35459
35766
|
out: external_exports.string().optional().describe("Output file path"),
|
|
@@ -35462,7 +35769,8 @@ function registerSlidesTools(server) {
|
|
|
35462
35769
|
account: accountParam
|
|
35463
35770
|
})
|
|
35464
35771
|
}, async ({ presentationId, out, format, overwrite, account }) => {
|
|
35465
|
-
|
|
35772
|
+
if (out) confinePath(out, "out");
|
|
35773
|
+
const args = ["slides", "export", pos(presentationId)];
|
|
35466
35774
|
if (out) args.push(`--out=${out}`);
|
|
35467
35775
|
if (format) args.push(`--format=${format}`);
|
|
35468
35776
|
if (overwrite) args.push("--overwrite");
|
|
@@ -35476,7 +35784,7 @@ function registerSlidesTools(server) {
|
|
|
35476
35784
|
account: accountParam
|
|
35477
35785
|
})
|
|
35478
35786
|
}, async ({ presentationId, account }) => {
|
|
35479
|
-
return runOrDiagnose(["slides", "info", presentationId], { account });
|
|
35787
|
+
return runOrDiagnose(["slides", "info", pos(presentationId)], { account });
|
|
35480
35788
|
});
|
|
35481
35789
|
server.registerTool("gog_slides_create", {
|
|
35482
35790
|
description: "Create a new Google Slides presentation, optionally in a folder or copying from a template.",
|
|
@@ -35488,7 +35796,7 @@ function registerSlidesTools(server) {
|
|
|
35488
35796
|
account: accountParam
|
|
35489
35797
|
})
|
|
35490
35798
|
}, async ({ title, parent, template, account }) => {
|
|
35491
|
-
const args = ["slides", "create", title];
|
|
35799
|
+
const args = ["slides", "create", pos(title)];
|
|
35492
35800
|
if (parent) args.push(`--parent=${parent}`);
|
|
35493
35801
|
if (template) args.push(`--template=${template}`);
|
|
35494
35802
|
return runOrDiagnose(args, { account });
|
|
@@ -35503,7 +35811,7 @@ function registerSlidesTools(server) {
|
|
|
35503
35811
|
account: accountParam
|
|
35504
35812
|
})
|
|
35505
35813
|
}, async ({ presentationId, title, parent, account }) => {
|
|
35506
|
-
const args = ["slides", "copy", presentationId, title];
|
|
35814
|
+
const args = ["slides", "copy", pos(presentationId), pos(title)];
|
|
35507
35815
|
if (parent) args.push(`--parent=${parent}`);
|
|
35508
35816
|
return runOrDiagnose(args, { account });
|
|
35509
35817
|
});
|
|
@@ -35515,7 +35823,7 @@ function registerSlidesTools(server) {
|
|
|
35515
35823
|
account: accountParam
|
|
35516
35824
|
})
|
|
35517
35825
|
}, async ({ presentationId, account }) => {
|
|
35518
|
-
return runOrDiagnose(["slides", "list-slides", presentationId], { account });
|
|
35826
|
+
return runOrDiagnose(["slides", "list-slides", pos(presentationId)], { account });
|
|
35519
35827
|
});
|
|
35520
35828
|
server.registerTool("gog_slides_read_slide", {
|
|
35521
35829
|
description: "Read the content of a slide (text, shapes, speaker notes). Set detail=true to also include normalized element geometry, styled text runs, paragraphs, table-cell content, and image source URLs.",
|
|
@@ -35527,18 +35835,18 @@ function registerSlidesTools(server) {
|
|
|
35527
35835
|
account: accountParam
|
|
35528
35836
|
})
|
|
35529
35837
|
}, async ({ presentationId, slideId, detail, account }) => {
|
|
35530
|
-
const args = ["slides", "read-slide", presentationId, slideId];
|
|
35838
|
+
const args = ["slides", "read-slide", pos(presentationId), pos(slideId)];
|
|
35531
35839
|
if (detail) args.push("--detail");
|
|
35532
35840
|
return runOrDiagnose(args, { account });
|
|
35533
35841
|
});
|
|
35534
|
-
registerRunTool(server, { service: "slides", examples: '"
|
|
35842
|
+
registerRunTool(server, { service: "slides", examples: '"delete-slide", "update-notes"' });
|
|
35535
35843
|
}
|
|
35536
35844
|
|
|
35537
35845
|
// ../gogcli-mcp/src/server.ts
|
|
35538
|
-
var VERSION = true ? "4.
|
|
35846
|
+
var VERSION = true ? "4.4.0" : "0.0.0";
|
|
35539
35847
|
|
|
35540
35848
|
// ../gogcli-mcp/src/bootstrap-auth.ts
|
|
35541
|
-
import { join as
|
|
35849
|
+
import { join as join5 } from "node:path";
|
|
35542
35850
|
var AUTH_BOOTSTRAP_MARKER = "auth-bootstrap.sha256";
|
|
35543
35851
|
var VARS = ["GOG_CLIENT_ID", "GOG_CLIENT_SECRET", "GOG_REFRESH_TOKEN", "GOG_ACCOUNT"];
|
|
35544
35852
|
var log = (line) => {
|
|
@@ -35575,8 +35883,8 @@ async function bootstrapGogAuth(env = process.env, options = {}) {
|
|
|
35575
35883
|
const { createHash } = await import("node:crypto");
|
|
35576
35884
|
const { mkdir, readFile, writeFile, chmod } = await import("node:fs/promises");
|
|
35577
35885
|
const home = options.home ?? (await import("node:os")).homedir();
|
|
35578
|
-
const dir =
|
|
35579
|
-
const marker =
|
|
35886
|
+
const dir = join5(home, ".gogcli-mcp");
|
|
35887
|
+
const marker = join5(dir, AUTH_BOOTSTRAP_MARKER);
|
|
35580
35888
|
const fingerprint = createHash("sha256").update(values.join("\0")).digest("hex");
|
|
35581
35889
|
const previous = await readFile(marker, "utf8").catch(() => void 0);
|
|
35582
35890
|
if (previous === fingerprint && await accountListed(account, spawner)) return "present";
|
|
@@ -35623,7 +35931,8 @@ function registerExtraSlidesTools(server) {
|
|
|
35623
35931
|
account: accountParam
|
|
35624
35932
|
})
|
|
35625
35933
|
}, async ({ title, content, contentFile, parent, debug, account }) => {
|
|
35626
|
-
|
|
35934
|
+
if (contentFile) confinePath(contentFile, "contentFile");
|
|
35935
|
+
const args = ["slides", "create-from-markdown", pos(title)];
|
|
35627
35936
|
if (content) args.push(payloadArg("content", "content-file", content, "md"));
|
|
35628
35937
|
if (contentFile) args.push(`--content-file=${contentFile}`);
|
|
35629
35938
|
if (parent) args.push(`--parent=${parent}`);
|
|
@@ -35643,7 +35952,8 @@ function registerExtraSlidesTools(server) {
|
|
|
35643
35952
|
account: accountParam
|
|
35644
35953
|
})
|
|
35645
35954
|
}, async ({ templateId, title, replacements, replacementsFile, parent, exact, account }) => {
|
|
35646
|
-
|
|
35955
|
+
if (replacementsFile) confinePath(replacementsFile, "replacementsFile");
|
|
35956
|
+
const args = ["slides", "create-from-template", pos(templateId), pos(title)];
|
|
35647
35957
|
if (replacements) {
|
|
35648
35958
|
for (const [k, v] of Object.entries(replacements)) {
|
|
35649
35959
|
args.push(`--replace=${k}=${v}`);
|
|
@@ -35666,7 +35976,9 @@ function registerExtraSlidesTools(server) {
|
|
|
35666
35976
|
account: accountParam
|
|
35667
35977
|
})
|
|
35668
35978
|
}, async ({ presentationId, image, notes, notesFile, before, account }) => {
|
|
35669
|
-
|
|
35979
|
+
confinePath(image, "image");
|
|
35980
|
+
if (notesFile) confinePath(notesFile, "notesFile");
|
|
35981
|
+
const args = ["slides", "add-slide", pos(presentationId), pos(image)];
|
|
35670
35982
|
if (notes) args.push(payloadArg("notes", "notes-file", notes));
|
|
35671
35983
|
if (notesFile) args.push(`--notes-file=${notesFile}`);
|
|
35672
35984
|
if (before) args.push(`--before=${before}`);
|
|
@@ -35688,8 +36000,9 @@ function registerExtraSlidesTools(server) {
|
|
|
35688
36000
|
account: accountParam
|
|
35689
36001
|
})
|
|
35690
36002
|
}, async ({ presentationId, slideId, image, url: url2, width, height, x, y, unit, account }) => {
|
|
35691
|
-
|
|
35692
|
-
|
|
36003
|
+
if (image) confinePath(image, "image");
|
|
36004
|
+
const args = ["slides", "insert-image", pos(presentationId), pos(slideId)];
|
|
36005
|
+
if (image) args.push(pos(image));
|
|
35693
36006
|
args.push(`--width=${width}`);
|
|
35694
36007
|
if (url2) args.push(`--url=${url2}`);
|
|
35695
36008
|
if (height !== void 0) args.push(`--height=${height}`);
|
|
@@ -35707,7 +36020,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35707
36020
|
account: accountParam
|
|
35708
36021
|
})
|
|
35709
36022
|
}, async ({ presentationId, slideId, account }) => {
|
|
35710
|
-
return runOrDiagnose(["slides", "delete-slide", presentationId, slideId, "--force"], { account });
|
|
36023
|
+
return runOrDiagnose(["slides", "delete-slide", pos(presentationId), pos(slideId), "--force"], { account });
|
|
35711
36024
|
});
|
|
35712
36025
|
server.registerTool("gog_slides_skip_slide", {
|
|
35713
36026
|
description: "Skip a slide during presentation \u2014 it stays in the deck at its current position but is not shown when presenting (and is left out of a PDF export). Use this instead of gog_slides_delete_slide when a slide should be omitted from a talk without losing it. Reverse with gog_slides_unskip_slide; gog_slides_list_slides reports which slides are skipped.",
|
|
@@ -35718,7 +36031,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35718
36031
|
account: accountParam
|
|
35719
36032
|
})
|
|
35720
36033
|
}, async ({ presentationId, slideId, account }) => {
|
|
35721
|
-
return runOrDiagnose(["slides", "skip-slide", presentationId, slideId], { account });
|
|
36034
|
+
return runOrDiagnose(["slides", "skip-slide", pos(presentationId), pos(slideId)], { account });
|
|
35722
36035
|
});
|
|
35723
36036
|
server.registerTool("gog_slides_unskip_slide", {
|
|
35724
36037
|
description: "Include a previously skipped slide again when the deck is presented. Safe to call on a slide that was never skipped.",
|
|
@@ -35729,7 +36042,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35729
36042
|
account: accountParam
|
|
35730
36043
|
})
|
|
35731
36044
|
}, async ({ presentationId, slideId, account }) => {
|
|
35732
|
-
return runOrDiagnose(["slides", "unskip-slide", presentationId, slideId], { account });
|
|
36045
|
+
return runOrDiagnose(["slides", "unskip-slide", pos(presentationId), pos(slideId)], { account });
|
|
35733
36046
|
});
|
|
35734
36047
|
server.registerTool("gog_slides_update_notes", {
|
|
35735
36048
|
description: "Update the speaker notes on a slide (inline text or from a file).",
|
|
@@ -35742,7 +36055,8 @@ function registerExtraSlidesTools(server) {
|
|
|
35742
36055
|
account: accountParam
|
|
35743
36056
|
})
|
|
35744
36057
|
}, async ({ presentationId, slideId, notes, notesFile, account }) => {
|
|
35745
|
-
|
|
36058
|
+
if (notesFile) confinePath(notesFile, "notesFile");
|
|
36059
|
+
const args = ["slides", "update-notes", pos(presentationId), pos(slideId)];
|
|
35746
36060
|
if (notes) args.push(payloadArg("notes", "notes-file", notes));
|
|
35747
36061
|
if (notesFile) args.push(`--notes-file=${notesFile}`);
|
|
35748
36062
|
return runOrDiagnose(args, { account });
|
|
@@ -35760,8 +36074,10 @@ function registerExtraSlidesTools(server) {
|
|
|
35760
36074
|
account: accountParam
|
|
35761
36075
|
})
|
|
35762
36076
|
}, async ({ presentationId, slideId, image, url: url2, notes, notesFile, account }) => {
|
|
35763
|
-
|
|
35764
|
-
if (
|
|
36077
|
+
if (image) confinePath(image, "image");
|
|
36078
|
+
if (notesFile) confinePath(notesFile, "notesFile");
|
|
36079
|
+
const args = ["slides", "replace-slide", pos(presentationId), pos(slideId)];
|
|
36080
|
+
if (image) args.push(pos(image));
|
|
35765
36081
|
if (url2) args.push(`--url=${url2}`);
|
|
35766
36082
|
if (notes) args.push(payloadArg("notes", "notes-file", notes));
|
|
35767
36083
|
if (notesFile) args.push(`--notes-file=${notesFile}`);
|
|
@@ -35776,7 +36092,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35776
36092
|
account: accountParam
|
|
35777
36093
|
})
|
|
35778
36094
|
}, async ({ presentationId, pretty, account }) => {
|
|
35779
|
-
const args = ["slides", "raw", presentationId];
|
|
36095
|
+
const args = ["slides", "raw", pos(presentationId)];
|
|
35780
36096
|
if (pretty) args.push("--pretty");
|
|
35781
36097
|
return runOrDiagnose(args, { account, lossless: true });
|
|
35782
36098
|
});
|
|
@@ -35794,7 +36110,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35794
36110
|
account: accountParam
|
|
35795
36111
|
})
|
|
35796
36112
|
}, async ({ presentationId, text, page, occurrence, all, matchCase, failEmpty, account }) => {
|
|
35797
|
-
const args = ["slides", "locate", presentationId, text];
|
|
36113
|
+
const args = ["slides", "locate", pos(presentationId), pos(text)];
|
|
35798
36114
|
if (page) args.push(`--page=${page}`);
|
|
35799
36115
|
if (occurrence !== void 0) args.push(`--occurrence=${occurrence}`);
|
|
35800
36116
|
if (all) args.push("--all");
|
|
@@ -35804,7 +36120,8 @@ function registerExtraSlidesTools(server) {
|
|
|
35804
36120
|
});
|
|
35805
36121
|
server.registerTool("gog_slides_thumbnail", {
|
|
35806
36122
|
description: "Get or download a rendered thumbnail image for a single slide.",
|
|
35807
|
-
|
|
36123
|
+
// Writes a file on the gog host and can overwrite one: not read-only (audit SEC-4).
|
|
36124
|
+
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
35808
36125
|
inputSchema: external_exports.object({
|
|
35809
36126
|
presentationId: external_exports.string().describe("Presentation ID"),
|
|
35810
36127
|
slideId: external_exports.string().describe("Slide object ID"),
|
|
@@ -35815,7 +36132,8 @@ function registerExtraSlidesTools(server) {
|
|
|
35815
36132
|
account: accountParam
|
|
35816
36133
|
})
|
|
35817
36134
|
}, async ({ presentationId, slideId, format, size, out, overwrite, account }) => {
|
|
35818
|
-
|
|
36135
|
+
if (out) confinePath(out, "out");
|
|
36136
|
+
const args = ["slides", "thumbnail", pos(presentationId), pos(slideId)];
|
|
35819
36137
|
if (format) args.push(`--format=${format}`);
|
|
35820
36138
|
if (size) args.push(`--size=${size}`);
|
|
35821
36139
|
if (out) args.push(`--out=${out}`);
|
|
@@ -35833,7 +36151,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35833
36151
|
account: accountParam
|
|
35834
36152
|
})
|
|
35835
36153
|
}, async ({ presentationId, layout, layoutId, index, account }) => {
|
|
35836
|
-
const args = ["slides", "new-slide", presentationId];
|
|
36154
|
+
const args = ["slides", "new-slide", pos(presentationId)];
|
|
35837
36155
|
if (layout) args.push(`--layout=${layout}`);
|
|
35838
36156
|
if (layoutId) args.push(`--layout-id=${layoutId}`);
|
|
35839
36157
|
if (index !== void 0) args.push(`--index=${index}`);
|
|
@@ -35849,7 +36167,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35849
36167
|
account: accountParam
|
|
35850
36168
|
})
|
|
35851
36169
|
}, async ({ presentationId, slideId, toIndex, account }) => {
|
|
35852
|
-
const args = ["slides", "duplicate-slide", presentationId, slideId];
|
|
36170
|
+
const args = ["slides", "duplicate-slide", pos(presentationId), pos(slideId)];
|
|
35853
36171
|
if (toIndex !== void 0) args.push(`--to-index=${toIndex}`);
|
|
35854
36172
|
return runOrDiagnose(args, { account });
|
|
35855
36173
|
});
|
|
@@ -35863,7 +36181,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35863
36181
|
account: accountParam
|
|
35864
36182
|
})
|
|
35865
36183
|
}, async ({ presentationId, slideId, toIndex, account }) => {
|
|
35866
|
-
return runOrDiagnose(["slides", "move-slide", presentationId, slideId, `--to-index=${toIndex}`], { account });
|
|
36184
|
+
return runOrDiagnose(["slides", "move-slide", pos(presentationId), pos(slideId), `--to-index=${toIndex}`], { account });
|
|
35867
36185
|
});
|
|
35868
36186
|
server.registerTool("gog_slides_insert_text", {
|
|
35869
36187
|
description: "Insert text into an existing page element (shape or table cell) by object ID. Target a table cell with zero-based row + col. Use replace=true to clear the element's existing text first.",
|
|
@@ -35879,7 +36197,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35879
36197
|
account: accountParam
|
|
35880
36198
|
})
|
|
35881
36199
|
}, async ({ presentationId, objectId, text, row, col, insertionIndex, replace, account }) => {
|
|
35882
|
-
const args = ["slides", "insert-text", presentationId, objectId, text];
|
|
36200
|
+
const args = ["slides", "insert-text", pos(presentationId), pos(objectId), pos(text)];
|
|
35883
36201
|
if (row !== void 0) args.push(`--row=${row}`);
|
|
35884
36202
|
if (col !== void 0) args.push(`--col=${col}`);
|
|
35885
36203
|
if (insertionIndex !== void 0) args.push(`--insertion-index=${insertionIndex}`);
|
|
@@ -35905,7 +36223,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35905
36223
|
account: accountParam
|
|
35906
36224
|
})
|
|
35907
36225
|
}, async ({ presentationId, objectId, range, font, size, textColor, bold, noBold, italic, noItalic, underline, noUnderline, account }) => {
|
|
35908
|
-
const args = ["slides", "style-text", presentationId, objectId, `--range=${range}`];
|
|
36226
|
+
const args = ["slides", "style-text", pos(presentationId), pos(objectId), `--range=${range}`];
|
|
35909
36227
|
if (font) args.push(`--font=${font}`);
|
|
35910
36228
|
if (size !== void 0) args.push(`--size=${size}`);
|
|
35911
36229
|
if (textColor) args.push(`--text-color=${textColor}`);
|
|
@@ -35929,7 +36247,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35929
36247
|
account: accountParam
|
|
35930
36248
|
})
|
|
35931
36249
|
}, async ({ presentationId, objectId, range, url: url2, clear, account }) => {
|
|
35932
|
-
const args = ["slides", "link", presentationId, objectId, `--range=${range}`];
|
|
36250
|
+
const args = ["slides", "link", pos(presentationId), pos(objectId), `--range=${range}`];
|
|
35933
36251
|
if (url2) args.push(`--url=${url2}`);
|
|
35934
36252
|
if (clear) args.push("--clear");
|
|
35935
36253
|
return runOrDiagnose(args, { account });
|
|
@@ -35947,7 +36265,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35947
36265
|
account: accountParam
|
|
35948
36266
|
})
|
|
35949
36267
|
}, async ({ presentationId, objectId, range, on, off, preset, account }) => {
|
|
35950
|
-
const args = ["slides", "bullets", presentationId, objectId, `--range=${range}`];
|
|
36268
|
+
const args = ["slides", "bullets", pos(presentationId), pos(objectId), `--range=${range}`];
|
|
35951
36269
|
if (on) args.push("--on");
|
|
35952
36270
|
if (off) args.push("--off");
|
|
35953
36271
|
if (preset) args.push(`--preset=${preset}`);
|
|
@@ -35967,7 +36285,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35967
36285
|
account: accountParam
|
|
35968
36286
|
})
|
|
35969
36287
|
}, async ({ presentationId, find, replacement, object: object2, pages, all, matchCase, account }) => {
|
|
35970
|
-
const args = ["slides", "replace-text", presentationId, find, replacement];
|
|
36288
|
+
const args = ["slides", "replace-text", pos(presentationId), pos(find), pos(replacement)];
|
|
35971
36289
|
if (object2) args.push(`--object=${object2}`);
|
|
35972
36290
|
if (pages) for (const p of pages) args.push(`--page=${p}`);
|
|
35973
36291
|
if (all) args.push("--all");
|
|
@@ -35990,7 +36308,7 @@ function registerExtraSlidesTools(server) {
|
|
|
35990
36308
|
account: accountParam
|
|
35991
36309
|
})
|
|
35992
36310
|
}, async ({ presentationId, slideId, type, x, y, width, height, unit, objectId, account }) => {
|
|
35993
|
-
const args = ["slides", "element", "create-shape", presentationId, slideId];
|
|
36311
|
+
const args = ["slides", "element", "create-shape", pos(presentationId), pos(slideId)];
|
|
35994
36312
|
if (type) args.push(`--type=${type}`);
|
|
35995
36313
|
if (x !== void 0) args.push(`--x=${x}`);
|
|
35996
36314
|
if (y !== void 0) args.push(`--y=${y}`);
|
|
@@ -36016,7 +36334,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36016
36334
|
account: accountParam
|
|
36017
36335
|
})
|
|
36018
36336
|
}, async ({ presentationId, slideId, category, x, y, width, height, unit, objectId, account }) => {
|
|
36019
|
-
const args = ["slides", "element", "create-line", presentationId, slideId];
|
|
36337
|
+
const args = ["slides", "element", "create-line", pos(presentationId), pos(slideId)];
|
|
36020
36338
|
if (category) args.push(`--category=${category}`);
|
|
36021
36339
|
if (x !== void 0) args.push(`--x=${x}`);
|
|
36022
36340
|
if (y !== void 0) args.push(`--y=${y}`);
|
|
@@ -36042,7 +36360,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36042
36360
|
account: accountParam
|
|
36043
36361
|
})
|
|
36044
36362
|
}, async ({ presentationId, objectId, kind, fillColor, fillTransparent, outlineColor, outlineWeight, outlineDash, outlineTransparent, account }) => {
|
|
36045
|
-
const args = ["slides", "element", "style", presentationId, objectId];
|
|
36363
|
+
const args = ["slides", "element", "style", pos(presentationId), pos(objectId)];
|
|
36046
36364
|
if (kind) args.push(`--kind=${kind}`);
|
|
36047
36365
|
if (fillColor) args.push(`--fill-color=${fillColor}`);
|
|
36048
36366
|
if (fillTransparent) args.push("--fill-transparent");
|
|
@@ -36070,7 +36388,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36070
36388
|
account: accountParam
|
|
36071
36389
|
})
|
|
36072
36390
|
}, async ({ presentationId, objectId, translateX, translateY, scaleX, scaleY, shearX, shearY, rotate, applyMode, unit, account }) => {
|
|
36073
|
-
const args = ["slides", "element", "transform", presentationId, objectId];
|
|
36391
|
+
const args = ["slides", "element", "transform", pos(presentationId), pos(objectId)];
|
|
36074
36392
|
if (translateX !== void 0) args.push(`--translate-x=${translateX}`);
|
|
36075
36393
|
if (translateY !== void 0) args.push(`--translate-y=${translateY}`);
|
|
36076
36394
|
if (scaleX !== void 0) args.push(`--scale-x=${scaleX}`);
|
|
@@ -36092,7 +36410,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36092
36410
|
account: accountParam
|
|
36093
36411
|
})
|
|
36094
36412
|
}, async ({ presentationId, objectId, operation, account }) => {
|
|
36095
|
-
return runOrDiagnose(["slides", "element", "z-order", presentationId, objectId, `--operation=${operation}`], { account });
|
|
36413
|
+
return runOrDiagnose(["slides", "element", "z-order", pos(presentationId), pos(objectId), `--operation=${operation}`], { account });
|
|
36096
36414
|
});
|
|
36097
36415
|
server.registerTool("gog_slides_element_group", {
|
|
36098
36416
|
description: "Group two or more page elements into a single group.",
|
|
@@ -36104,7 +36422,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36104
36422
|
account: accountParam
|
|
36105
36423
|
})
|
|
36106
36424
|
}, async ({ presentationId, objectIds, groupId, account }) => {
|
|
36107
|
-
const args = ["slides", "element", "group", presentationId, ...objectIds];
|
|
36425
|
+
const args = ["slides", "element", "group", pos(presentationId), ...objectIds.map(pos)];
|
|
36108
36426
|
if (groupId) args.push(`--group-id=${groupId}`);
|
|
36109
36427
|
return runOrDiagnose(args, { account });
|
|
36110
36428
|
});
|
|
@@ -36117,7 +36435,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36117
36435
|
account: accountParam
|
|
36118
36436
|
})
|
|
36119
36437
|
}, async ({ presentationId, groupIds, account }) => {
|
|
36120
|
-
return runOrDiagnose(["slides", "element", "ungroup", presentationId, ...groupIds], { account });
|
|
36438
|
+
return runOrDiagnose(["slides", "element", "ungroup", pos(presentationId), ...groupIds.map(pos)], { account });
|
|
36121
36439
|
});
|
|
36122
36440
|
server.registerTool("gog_slides_element_alt_text", {
|
|
36123
36441
|
description: "Set or clear a page element's accessibility title and/or description. Pass an empty string to clear a field.",
|
|
@@ -36130,7 +36448,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36130
36448
|
account: accountParam
|
|
36131
36449
|
})
|
|
36132
36450
|
}, async ({ presentationId, objectId, title, description, account }) => {
|
|
36133
|
-
const args = ["slides", "element", "alt-text", presentationId, objectId];
|
|
36451
|
+
const args = ["slides", "element", "alt-text", pos(presentationId), pos(objectId)];
|
|
36134
36452
|
if (title !== void 0) args.push(`--title=${title}`);
|
|
36135
36453
|
if (description !== void 0) args.push(`--description=${description}`);
|
|
36136
36454
|
return runOrDiagnose(args, { account });
|
|
@@ -36144,7 +36462,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36144
36462
|
account: accountParam
|
|
36145
36463
|
})
|
|
36146
36464
|
}, async ({ presentationId, objectId, account }) => {
|
|
36147
|
-
return runOrDiagnose(["slides", "element", "delete", presentationId, objectId, "--force"], { account });
|
|
36465
|
+
return runOrDiagnose(["slides", "element", "delete", pos(presentationId), pos(objectId), "--force"], { account });
|
|
36148
36466
|
});
|
|
36149
36467
|
server.registerTool("gog_slides_table_create", {
|
|
36150
36468
|
description: "Create an auto-sized native table on a slide with the given row and column counts.",
|
|
@@ -36158,7 +36476,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36158
36476
|
account: accountParam
|
|
36159
36477
|
})
|
|
36160
36478
|
}, async ({ presentationId, slideId, rows, cols, objectId, account }) => {
|
|
36161
|
-
const args = ["slides", "table", "create", presentationId, slideId, `--rows=${rows}`, `--cols=${cols}`];
|
|
36479
|
+
const args = ["slides", "table", "create", pos(presentationId), pos(slideId), `--rows=${rows}`, `--cols=${cols}`];
|
|
36162
36480
|
if (objectId) args.push(`--object-id=${objectId}`);
|
|
36163
36481
|
return runOrDiagnose(args, { account });
|
|
36164
36482
|
});
|
|
@@ -36186,7 +36504,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36186
36504
|
account: accountParam
|
|
36187
36505
|
})
|
|
36188
36506
|
}, async ({ presentationId, tableObjectId, row, col, range, fillColor, fillTransparent, contentAlign, font, size, textColor, bold, noBold, italic, noItalic, underline, noUnderline, account }) => {
|
|
36189
|
-
const args = ["slides", "table", "cell", "style", presentationId, tableObjectId, `--row=${row}`, `--col=${col}`];
|
|
36507
|
+
const args = ["slides", "table", "cell", "style", pos(presentationId), pos(tableObjectId), `--row=${row}`, `--col=${col}`];
|
|
36190
36508
|
if (range) args.push(`--range=${range}`);
|
|
36191
36509
|
if (fillColor) args.push(`--fill-color=${fillColor}`);
|
|
36192
36510
|
if (fillTransparent) args.push("--fill-transparent");
|
|
@@ -36220,7 +36538,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36220
36538
|
account: accountParam
|
|
36221
36539
|
})
|
|
36222
36540
|
}, async ({ presentationId, tableObjectId, row, col, rowSpan, colSpan, position, borderColor, weight, dash, transparent, account }) => {
|
|
36223
|
-
const args = ["slides", "table", "border", "style", presentationId, tableObjectId, `--row=${row}`, `--col=${col}`];
|
|
36541
|
+
const args = ["slides", "table", "border", "style", pos(presentationId), pos(tableObjectId), `--row=${row}`, `--col=${col}`];
|
|
36224
36542
|
if (rowSpan !== void 0) args.push(`--row-span=${rowSpan}`);
|
|
36225
36543
|
if (colSpan !== void 0) args.push(`--col-span=${colSpan}`);
|
|
36226
36544
|
if (position) args.push(`--position=${position}`);
|
|
@@ -36242,7 +36560,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36242
36560
|
account: accountParam
|
|
36243
36561
|
})
|
|
36244
36562
|
}, async ({ presentationId, tableObjectId, col, count, right, account }) => {
|
|
36245
|
-
const args = ["slides", "table", "column", "insert", presentationId, tableObjectId, `--col=${col}`];
|
|
36563
|
+
const args = ["slides", "table", "column", "insert", pos(presentationId), pos(tableObjectId), `--col=${col}`];
|
|
36246
36564
|
if (count !== void 0) args.push(`--count=${count}`);
|
|
36247
36565
|
if (right) args.push("--right");
|
|
36248
36566
|
return runOrDiagnose(args, { account });
|
|
@@ -36257,7 +36575,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36257
36575
|
account: accountParam
|
|
36258
36576
|
})
|
|
36259
36577
|
}, async ({ presentationId, tableObjectId, col, account }) => {
|
|
36260
|
-
return runOrDiagnose(["slides", "table", "column", "delete", presentationId, tableObjectId, `--col=${col}`, "--force"], { account });
|
|
36578
|
+
return runOrDiagnose(["slides", "table", "column", "delete", pos(presentationId), pos(tableObjectId), `--col=${col}`, "--force"], { account });
|
|
36261
36579
|
});
|
|
36262
36580
|
server.registerTool("gog_slides_table_column_size", {
|
|
36263
36581
|
description: "Set the width of a zero-based table column.",
|
|
@@ -36270,7 +36588,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36270
36588
|
account: accountParam
|
|
36271
36589
|
})
|
|
36272
36590
|
}, async ({ presentationId, tableObjectId, col, width, account }) => {
|
|
36273
|
-
return runOrDiagnose(["slides", "table", "column", "size", presentationId, tableObjectId, `--col=${col}`, `--width=${width}`], { account });
|
|
36591
|
+
return runOrDiagnose(["slides", "table", "column", "size", pos(presentationId), pos(tableObjectId), `--col=${col}`, `--width=${width}`], { account });
|
|
36274
36592
|
});
|
|
36275
36593
|
server.registerTool("gog_slides_table_row_insert", {
|
|
36276
36594
|
description: "Insert one or more rows relative to a zero-based table row. Inserts above by default, or below with below=true.",
|
|
@@ -36284,7 +36602,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36284
36602
|
account: accountParam
|
|
36285
36603
|
})
|
|
36286
36604
|
}, async ({ presentationId, tableObjectId, row, count, below, account }) => {
|
|
36287
|
-
const args = ["slides", "table", "row", "insert", presentationId, tableObjectId, `--row=${row}`];
|
|
36605
|
+
const args = ["slides", "table", "row", "insert", pos(presentationId), pos(tableObjectId), `--row=${row}`];
|
|
36288
36606
|
if (count !== void 0) args.push(`--count=${count}`);
|
|
36289
36607
|
if (below) args.push("--below");
|
|
36290
36608
|
return runOrDiagnose(args, { account });
|
|
@@ -36299,7 +36617,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36299
36617
|
account: accountParam
|
|
36300
36618
|
})
|
|
36301
36619
|
}, async ({ presentationId, tableObjectId, row, account }) => {
|
|
36302
|
-
return runOrDiagnose(["slides", "table", "row", "delete", presentationId, tableObjectId, `--row=${row}`, "--force"], { account });
|
|
36620
|
+
return runOrDiagnose(["slides", "table", "row", "delete", pos(presentationId), pos(tableObjectId), `--row=${row}`, "--force"], { account });
|
|
36303
36621
|
});
|
|
36304
36622
|
server.registerTool("gog_slides_table_row_size", {
|
|
36305
36623
|
description: "Set the minimum height of a zero-based table row.",
|
|
@@ -36312,7 +36630,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36312
36630
|
account: accountParam
|
|
36313
36631
|
})
|
|
36314
36632
|
}, async ({ presentationId, tableObjectId, row, height, account }) => {
|
|
36315
|
-
return runOrDiagnose(["slides", "table", "row", "size", presentationId, tableObjectId, `--row=${row}`, `--height=${height}`], { account });
|
|
36633
|
+
return runOrDiagnose(["slides", "table", "row", "size", pos(presentationId), pos(tableObjectId), `--row=${row}`, `--height=${height}`], { account });
|
|
36316
36634
|
});
|
|
36317
36635
|
server.registerTool("gog_slides_table_merge", {
|
|
36318
36636
|
description: "Merge a rectangular table cell range starting at a zero-based cell. Content of non-anchor cells is absorbed by the merge; use gog_slides_table_unmerge to split back.",
|
|
@@ -36327,7 +36645,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36327
36645
|
account: accountParam
|
|
36328
36646
|
})
|
|
36329
36647
|
}, async ({ presentationId, tableObjectId, row, col, rowSpan, colSpan, account }) => {
|
|
36330
|
-
const args = ["slides", "table", "merge", presentationId, tableObjectId, `--row=${row}`, `--col=${col}`];
|
|
36648
|
+
const args = ["slides", "table", "merge", pos(presentationId), pos(tableObjectId), `--row=${row}`, `--col=${col}`];
|
|
36331
36649
|
if (rowSpan !== void 0) args.push(`--row-span=${rowSpan}`);
|
|
36332
36650
|
if (colSpan !== void 0) args.push(`--col-span=${colSpan}`);
|
|
36333
36651
|
return runOrDiagnose(args, { account });
|
|
@@ -36345,7 +36663,7 @@ function registerExtraSlidesTools(server) {
|
|
|
36345
36663
|
account: accountParam
|
|
36346
36664
|
})
|
|
36347
36665
|
}, async ({ presentationId, tableObjectId, row, col, rowSpan, colSpan, account }) => {
|
|
36348
|
-
const args = ["slides", "table", "unmerge", presentationId, tableObjectId, `--row=${row}`, `--col=${col}`];
|
|
36666
|
+
const args = ["slides", "table", "unmerge", pos(presentationId), pos(tableObjectId), `--row=${row}`, `--col=${col}`];
|
|
36349
36667
|
if (rowSpan !== void 0) args.push(`--row-span=${rowSpan}`);
|
|
36350
36668
|
if (colSpan !== void 0) args.push(`--col-span=${colSpan}`);
|
|
36351
36669
|
return runOrDiagnose(args, { account });
|