gogcli-mcp-calendar 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +199 -197
- package/manifest.json +1 -1
- package/mint.yaml +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -33917,202 +33917,6 @@ var pageSchema = {
|
|
|
33917
33917
|
|
|
33918
33918
|
// ../gogcli-mcp/src/runner.ts
|
|
33919
33919
|
import { delimiter, join } from "node:path";
|
|
33920
|
-
function isGogFileArg(arg) {
|
|
33921
|
-
return typeof arg !== "string";
|
|
33922
|
-
}
|
|
33923
|
-
var TIMEOUT_MS = 3e4;
|
|
33924
|
-
function readonlyEnvEnabled() {
|
|
33925
|
-
return readEnvVar("GOG_READONLY") !== void 0 && parseBoolEnv("GOG_READONLY", { default: true });
|
|
33926
|
-
}
|
|
33927
|
-
function sanitizedEnv() {
|
|
33928
|
-
const result = {};
|
|
33929
|
-
for (const [key, value] of Object.entries(process.env)) {
|
|
33930
|
-
if (key === "GOG_ACCESS_TOKEN") continue;
|
|
33931
|
-
if (key === "GOOGLE_APPLICATION_CREDENTIALS") continue;
|
|
33932
|
-
if (/(_TOKEN|_SECRET|_KEY|_CREDENTIALS)$/.test(key)) continue;
|
|
33933
|
-
result[key] = value;
|
|
33934
|
-
}
|
|
33935
|
-
return result;
|
|
33936
|
-
}
|
|
33937
|
-
var TOKEN_LEFT_BOUNDARY = "(?<![A-Za-z0-9+/])";
|
|
33938
|
-
var GOOGLE_TOKEN_PATTERNS = [
|
|
33939
|
-
new RegExp(`${TOKEN_LEFT_BOUNDARY}ya29\\.[A-Za-z0-9._\\-]+`, "g"),
|
|
33940
|
-
// OAuth2 access tokens
|
|
33941
|
-
new RegExp(`${TOKEN_LEFT_BOUNDARY}1//[A-Za-z0-9._\\-]+`, "g")
|
|
33942
|
-
// OAuth2 refresh tokens
|
|
33943
|
-
];
|
|
33944
|
-
function redactGoogleTokens(text) {
|
|
33945
|
-
let redacted = text;
|
|
33946
|
-
for (const re of GOOGLE_TOKEN_PATTERNS) {
|
|
33947
|
-
redacted = redacted.replace(re, "[REDACTED]");
|
|
33948
|
-
}
|
|
33949
|
-
return redacted;
|
|
33950
|
-
}
|
|
33951
|
-
function redactSecrets2(text) {
|
|
33952
|
-
return redactGoogleTokens(redactSecrets(text));
|
|
33953
|
-
}
|
|
33954
|
-
var OPAQUE_FIELD_VALUE = "[A-Za-z0-9+/_-]{16,}={0,2}";
|
|
33955
|
-
var opaquePlaceholder = (i) => `\0gogOpaque${i}\0`;
|
|
33956
|
-
function redactPreservingOpaqueFields(text, fields, redact) {
|
|
33957
|
-
const lifted = [];
|
|
33958
|
-
let staged = text;
|
|
33959
|
-
for (const field of fields) {
|
|
33960
|
-
const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
33961
|
-
const re = new RegExp(`("${escaped}"\\s*:\\s*")(${OPAQUE_FIELD_VALUE})(")`, "g");
|
|
33962
|
-
staged = staged.replace(re, (_m, open2, value, close) => {
|
|
33963
|
-
lifted.push(value);
|
|
33964
|
-
return `${open2}${opaquePlaceholder(lifted.length - 1)}${close}`;
|
|
33965
|
-
});
|
|
33966
|
-
}
|
|
33967
|
-
if (lifted.length === 0) return redact(text);
|
|
33968
|
-
let redacted = redact(staged);
|
|
33969
|
-
lifted.forEach((value, i) => {
|
|
33970
|
-
redacted = redacted.split(opaquePlaceholder(i)).join(value);
|
|
33971
|
-
});
|
|
33972
|
-
return redacted;
|
|
33973
|
-
}
|
|
33974
|
-
function augmentedPath() {
|
|
33975
|
-
const home = process.env.HOME;
|
|
33976
|
-
const candidates = [
|
|
33977
|
-
process.env.PATH ?? "",
|
|
33978
|
-
"/opt/homebrew/bin",
|
|
33979
|
-
"/usr/local/bin",
|
|
33980
|
-
home ? `${home}/.local/bin` : "",
|
|
33981
|
-
home ? `${home}/go/bin` : ""
|
|
33982
|
-
];
|
|
33983
|
-
const seen = /* @__PURE__ */ new Set();
|
|
33984
|
-
const parts = [];
|
|
33985
|
-
for (const c of candidates) {
|
|
33986
|
-
if (!c) continue;
|
|
33987
|
-
for (const dir of c.split(delimiter)) {
|
|
33988
|
-
if (!dir || seen.has(dir)) continue;
|
|
33989
|
-
seen.add(dir);
|
|
33990
|
-
parts.push(dir);
|
|
33991
|
-
}
|
|
33992
|
-
}
|
|
33993
|
-
return parts.join(delimiter);
|
|
33994
|
-
}
|
|
33995
|
-
function formatTimeout(ms) {
|
|
33996
|
-
const seconds = Math.round(ms / 1e3);
|
|
33997
|
-
if (seconds >= 60) {
|
|
33998
|
-
const minutes = Math.round(seconds / 60);
|
|
33999
|
-
return `${ms}ms (${minutes} minute${minutes !== 1 ? "s" : ""})`;
|
|
34000
|
-
}
|
|
34001
|
-
return `${ms}ms`;
|
|
34002
|
-
}
|
|
34003
|
-
async function spawnWithTempFiles(args, opts) {
|
|
34004
|
-
const { mkdtemp, mkdir, writeFile, rm } = await import("node:fs/promises");
|
|
34005
|
-
const { tmpdir } = await import("node:os");
|
|
34006
|
-
const dir = await mkdtemp(join(tmpdir(), "gogcli-mcp-"));
|
|
34007
|
-
try {
|
|
34008
|
-
const argv = [];
|
|
34009
|
-
let seq = 0;
|
|
34010
|
-
for (const arg of args) {
|
|
34011
|
-
if (!isGogFileArg(arg)) {
|
|
34012
|
-
argv.push(arg);
|
|
34013
|
-
continue;
|
|
34014
|
-
}
|
|
34015
|
-
const sub = join(dir, String(seq));
|
|
34016
|
-
seq += 1;
|
|
34017
|
-
await mkdir(sub, { recursive: true, mode: 448 });
|
|
34018
|
-
const path = join(sub, arg.filename ?? `${arg.flag}.${arg.ext ?? "txt"}`);
|
|
34019
|
-
const data = arg.encoding === "base64" ? Buffer.from(arg.contents, "base64") : Buffer.from(arg.contents, "utf8");
|
|
34020
|
-
await writeFile(path, data, { mode: 384 });
|
|
34021
|
-
argv.push(arg.positional ? path : `--${arg.flag}=${path}`);
|
|
34022
|
-
}
|
|
34023
|
-
return await spawnGog(argv, opts);
|
|
34024
|
-
} finally {
|
|
34025
|
-
await rm(dir, { recursive: true, force: true }).catch(() => {
|
|
34026
|
-
});
|
|
34027
|
-
}
|
|
34028
|
-
}
|
|
34029
|
-
function spawnExecutor(args, opts) {
|
|
34030
|
-
if (args.some(isGogFileArg)) {
|
|
34031
|
-
return spawnWithTempFiles(args, opts);
|
|
34032
|
-
}
|
|
34033
|
-
return spawnGog(args, opts);
|
|
34034
|
-
}
|
|
34035
|
-
async function spawnGog(fullArgs, opts) {
|
|
34036
|
-
const { timeout, interactive = false, spawner, binary = false } = opts;
|
|
34037
|
-
const spawn = spawner ?? (await import("node:child_process")).spawn;
|
|
34038
|
-
const effectiveTimeout = timeout ?? TIMEOUT_MS;
|
|
34039
|
-
return new Promise((resolve, reject) => {
|
|
34040
|
-
const childEnv = { ...sanitizedEnv(), PATH: augmentedPath() };
|
|
34041
|
-
const child = spawn(readEnvVar("GOG_PATH") ?? "gog", fullArgs, { env: childEnv });
|
|
34042
|
-
const stdoutChunks = [];
|
|
34043
|
-
const stderrChunks = [];
|
|
34044
|
-
let settled = false;
|
|
34045
|
-
const timer = setTimeout(() => {
|
|
34046
|
-
settled = true;
|
|
34047
|
-
child.kill();
|
|
34048
|
-
reject(new Error(`gog timed out after ${formatTimeout(effectiveTimeout)}`));
|
|
34049
|
-
}, effectiveTimeout);
|
|
34050
|
-
child.stdout.on("data", (chunk) => {
|
|
34051
|
-
stdoutChunks.push(chunk);
|
|
34052
|
-
});
|
|
34053
|
-
child.stderr.on("data", (chunk) => {
|
|
34054
|
-
stderrChunks.push(chunk);
|
|
34055
|
-
});
|
|
34056
|
-
child.on("close", (code) => {
|
|
34057
|
-
clearTimeout(timer);
|
|
34058
|
-
if (settled) return;
|
|
34059
|
-
settled = true;
|
|
34060
|
-
const stderr = Buffer.concat(stderrChunks).toString().trim();
|
|
34061
|
-
if (code === 0) {
|
|
34062
|
-
if (binary) {
|
|
34063
|
-
resolve(Buffer.concat(stdoutChunks).toString("base64"));
|
|
34064
|
-
return;
|
|
34065
|
-
}
|
|
34066
|
-
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
34067
|
-
if (interactive && stderr) {
|
|
34068
|
-
resolve(stdout + "\n" + stderr);
|
|
34069
|
-
} else {
|
|
34070
|
-
resolve(stdout);
|
|
34071
|
-
}
|
|
34072
|
-
} else {
|
|
34073
|
-
reject(new Error(stderr || `gog exited with code ${code}`));
|
|
34074
|
-
}
|
|
34075
|
-
});
|
|
34076
|
-
child.on("error", (err) => {
|
|
34077
|
-
clearTimeout(timer);
|
|
34078
|
-
if (settled) return;
|
|
34079
|
-
settled = true;
|
|
34080
|
-
if (err.code === "ENOENT") {
|
|
34081
|
-
reject(new Error(
|
|
34082
|
-
"gog executable not found. Install gogcli (https://github.com/openclaw/gogcli) or set GOG_PATH in your MCP client config to the absolute binary path (run `which gog` in a terminal to find it)."
|
|
34083
|
-
));
|
|
34084
|
-
return;
|
|
34085
|
-
}
|
|
34086
|
-
reject(err);
|
|
34087
|
-
});
|
|
34088
|
-
});
|
|
34089
|
-
}
|
|
34090
|
-
function assembleArgs(args, opts) {
|
|
34091
|
-
const effectiveAccount = opts.account ?? readEnvVar("GOG_ACCOUNT");
|
|
34092
|
-
const fullArgs = ["--json", "--color=never"];
|
|
34093
|
-
if (!opts.interactive) {
|
|
34094
|
-
fullArgs.push("--no-input");
|
|
34095
|
-
}
|
|
34096
|
-
if (opts.readonly || readonlyEnvEnabled()) {
|
|
34097
|
-
fullArgs.push("--readonly");
|
|
34098
|
-
}
|
|
34099
|
-
if (effectiveAccount) {
|
|
34100
|
-
fullArgs.push("--account", effectiveAccount);
|
|
34101
|
-
}
|
|
34102
|
-
fullArgs.push(...args);
|
|
34103
|
-
return fullArgs;
|
|
34104
|
-
}
|
|
34105
|
-
async function run(args, options = {}) {
|
|
34106
|
-
const { account, spawner, interactive = false, timeout, readonly: readonly2 = false, redactMode = "full", opaqueFields } = options;
|
|
34107
|
-
const base = redactMode === "tokens" ? redactGoogleTokens : redactSecrets2;
|
|
34108
|
-
const redact = opaqueFields?.length ? (text) => redactPreservingOpaqueFields(text, opaqueFields, base) : base;
|
|
34109
|
-
const fullArgs = assembleArgs(args, { account, interactive, readonly: readonly2 });
|
|
34110
|
-
try {
|
|
34111
|
-
return redact(await spawnExecutor(fullArgs, { timeout, interactive, spawner }));
|
|
34112
|
-
} catch (err) {
|
|
34113
|
-
throw new Error(base(err instanceof Error ? err.message : String(err)));
|
|
34114
|
-
}
|
|
34115
|
-
}
|
|
34116
33920
|
|
|
34117
33921
|
// ../gogcli-mcp/src/timestamps.ts
|
|
34118
33922
|
var DEFAULT_DISPLAY_TZ = "America/New_York";
|
|
@@ -34313,6 +34117,204 @@ function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSource
|
|
|
34313
34117
|
return JSON.stringify(parsed, null, detectIndent(text));
|
|
34314
34118
|
}
|
|
34315
34119
|
|
|
34120
|
+
// ../gogcli-mcp/src/runner.ts
|
|
34121
|
+
function isGogFileArg(arg) {
|
|
34122
|
+
return typeof arg !== "string";
|
|
34123
|
+
}
|
|
34124
|
+
var TIMEOUT_MS = 3e4;
|
|
34125
|
+
function readonlyEnvEnabled() {
|
|
34126
|
+
return readEnvVar("GOG_READONLY") !== void 0 && parseBoolEnv("GOG_READONLY", { default: true });
|
|
34127
|
+
}
|
|
34128
|
+
function sanitizedEnv() {
|
|
34129
|
+
const result = {};
|
|
34130
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
34131
|
+
if (key === "GOG_ACCESS_TOKEN") continue;
|
|
34132
|
+
if (key === "GOOGLE_APPLICATION_CREDENTIALS") continue;
|
|
34133
|
+
if (/(_TOKEN|_SECRET|_KEY|_CREDENTIALS)$/.test(key)) continue;
|
|
34134
|
+
result[key] = value;
|
|
34135
|
+
}
|
|
34136
|
+
return result;
|
|
34137
|
+
}
|
|
34138
|
+
var TOKEN_LEFT_BOUNDARY = "(?<![A-Za-z0-9+/])";
|
|
34139
|
+
var GOOGLE_TOKEN_PATTERNS = [
|
|
34140
|
+
new RegExp(`${TOKEN_LEFT_BOUNDARY}ya29\\.[A-Za-z0-9._\\-]+`, "g"),
|
|
34141
|
+
// OAuth2 access tokens
|
|
34142
|
+
new RegExp(`${TOKEN_LEFT_BOUNDARY}1//[A-Za-z0-9._\\-]+`, "g")
|
|
34143
|
+
// OAuth2 refresh tokens
|
|
34144
|
+
];
|
|
34145
|
+
function redactGoogleTokens(text) {
|
|
34146
|
+
let redacted = text;
|
|
34147
|
+
for (const re of GOOGLE_TOKEN_PATTERNS) {
|
|
34148
|
+
redacted = redacted.replace(re, "[REDACTED]");
|
|
34149
|
+
}
|
|
34150
|
+
return redacted;
|
|
34151
|
+
}
|
|
34152
|
+
function redactSecrets2(text) {
|
|
34153
|
+
return redactGoogleTokens(redactSecrets(text));
|
|
34154
|
+
}
|
|
34155
|
+
var OPAQUE_FIELD_VALUE = "[A-Za-z0-9+/_-]{16,}={0,2}";
|
|
34156
|
+
var opaquePlaceholder = (i) => `\0gogOpaque${i}\0`;
|
|
34157
|
+
function redactPreservingOpaqueFields(text, fields, redact) {
|
|
34158
|
+
const lifted = [];
|
|
34159
|
+
let staged = text;
|
|
34160
|
+
for (const field of fields) {
|
|
34161
|
+
const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
34162
|
+
const re = new RegExp(`("${escaped}"\\s*:\\s*")(${OPAQUE_FIELD_VALUE})(")`, "g");
|
|
34163
|
+
staged = staged.replace(re, (_m, open2, value, close) => {
|
|
34164
|
+
lifted.push(value);
|
|
34165
|
+
return `${open2}${opaquePlaceholder(lifted.length - 1)}${close}`;
|
|
34166
|
+
});
|
|
34167
|
+
}
|
|
34168
|
+
if (lifted.length === 0) return redact(text);
|
|
34169
|
+
let redacted = redact(staged);
|
|
34170
|
+
lifted.forEach((value, i) => {
|
|
34171
|
+
redacted = redacted.split(opaquePlaceholder(i)).join(value);
|
|
34172
|
+
});
|
|
34173
|
+
return redacted;
|
|
34174
|
+
}
|
|
34175
|
+
function augmentedPath() {
|
|
34176
|
+
const home = process.env.HOME;
|
|
34177
|
+
const candidates = [
|
|
34178
|
+
process.env.PATH ?? "",
|
|
34179
|
+
"/opt/homebrew/bin",
|
|
34180
|
+
"/usr/local/bin",
|
|
34181
|
+
home ? `${home}/.local/bin` : "",
|
|
34182
|
+
home ? `${home}/go/bin` : ""
|
|
34183
|
+
];
|
|
34184
|
+
const seen = /* @__PURE__ */ new Set();
|
|
34185
|
+
const parts = [];
|
|
34186
|
+
for (const c of candidates) {
|
|
34187
|
+
if (!c) continue;
|
|
34188
|
+
for (const dir of c.split(delimiter)) {
|
|
34189
|
+
if (!dir || seen.has(dir)) continue;
|
|
34190
|
+
seen.add(dir);
|
|
34191
|
+
parts.push(dir);
|
|
34192
|
+
}
|
|
34193
|
+
}
|
|
34194
|
+
return parts.join(delimiter);
|
|
34195
|
+
}
|
|
34196
|
+
function formatTimeout(ms) {
|
|
34197
|
+
const seconds = Math.round(ms / 1e3);
|
|
34198
|
+
if (seconds >= 60) {
|
|
34199
|
+
const minutes = Math.round(seconds / 60);
|
|
34200
|
+
return `${ms}ms (${minutes} minute${minutes !== 1 ? "s" : ""})`;
|
|
34201
|
+
}
|
|
34202
|
+
return `${ms}ms`;
|
|
34203
|
+
}
|
|
34204
|
+
async function spawnWithTempFiles(args, opts) {
|
|
34205
|
+
const { mkdtemp, mkdir, writeFile, rm } = await import("node:fs/promises");
|
|
34206
|
+
const { tmpdir } = await import("node:os");
|
|
34207
|
+
const dir = await mkdtemp(join(tmpdir(), "gogcli-mcp-"));
|
|
34208
|
+
try {
|
|
34209
|
+
const argv = [];
|
|
34210
|
+
let seq = 0;
|
|
34211
|
+
for (const arg of args) {
|
|
34212
|
+
if (!isGogFileArg(arg)) {
|
|
34213
|
+
argv.push(arg);
|
|
34214
|
+
continue;
|
|
34215
|
+
}
|
|
34216
|
+
const sub = join(dir, String(seq));
|
|
34217
|
+
seq += 1;
|
|
34218
|
+
await mkdir(sub, { recursive: true, mode: 448 });
|
|
34219
|
+
const path = join(sub, arg.filename ?? `${arg.flag}.${arg.ext ?? "txt"}`);
|
|
34220
|
+
const data = arg.encoding === "base64" ? Buffer.from(arg.contents, "base64") : Buffer.from(arg.contents, "utf8");
|
|
34221
|
+
await writeFile(path, data, { mode: 384 });
|
|
34222
|
+
argv.push(arg.positional ? path : `--${arg.flag}=${path}`);
|
|
34223
|
+
}
|
|
34224
|
+
return await spawnGog(argv, opts);
|
|
34225
|
+
} finally {
|
|
34226
|
+
await rm(dir, { recursive: true, force: true }).catch(() => {
|
|
34227
|
+
});
|
|
34228
|
+
}
|
|
34229
|
+
}
|
|
34230
|
+
function spawnExecutor(args, opts) {
|
|
34231
|
+
if (args.some(isGogFileArg)) {
|
|
34232
|
+
return spawnWithTempFiles(args, opts);
|
|
34233
|
+
}
|
|
34234
|
+
return spawnGog(args, opts);
|
|
34235
|
+
}
|
|
34236
|
+
async function spawnGog(fullArgs, opts) {
|
|
34237
|
+
const { timeout, interactive = false, spawner, binary = false } = opts;
|
|
34238
|
+
const spawn = spawner ?? (await import("node:child_process")).spawn;
|
|
34239
|
+
const effectiveTimeout = timeout ?? TIMEOUT_MS;
|
|
34240
|
+
return new Promise((resolve, reject) => {
|
|
34241
|
+
const childEnv = { ...sanitizedEnv(), GOG_TIMEZONE: naiveSourceTimeZone(), PATH: augmentedPath() };
|
|
34242
|
+
const child = spawn(readEnvVar("GOG_PATH") ?? "gog", fullArgs, { env: childEnv });
|
|
34243
|
+
const stdoutChunks = [];
|
|
34244
|
+
const stderrChunks = [];
|
|
34245
|
+
let settled = false;
|
|
34246
|
+
const timer = setTimeout(() => {
|
|
34247
|
+
settled = true;
|
|
34248
|
+
child.kill();
|
|
34249
|
+
reject(new Error(`gog timed out after ${formatTimeout(effectiveTimeout)}`));
|
|
34250
|
+
}, effectiveTimeout);
|
|
34251
|
+
child.stdout.on("data", (chunk) => {
|
|
34252
|
+
stdoutChunks.push(chunk);
|
|
34253
|
+
});
|
|
34254
|
+
child.stderr.on("data", (chunk) => {
|
|
34255
|
+
stderrChunks.push(chunk);
|
|
34256
|
+
});
|
|
34257
|
+
child.on("close", (code) => {
|
|
34258
|
+
clearTimeout(timer);
|
|
34259
|
+
if (settled) return;
|
|
34260
|
+
settled = true;
|
|
34261
|
+
const stderr = Buffer.concat(stderrChunks).toString().trim();
|
|
34262
|
+
if (code === 0) {
|
|
34263
|
+
if (binary) {
|
|
34264
|
+
resolve(Buffer.concat(stdoutChunks).toString("base64"));
|
|
34265
|
+
return;
|
|
34266
|
+
}
|
|
34267
|
+
const stdout = Buffer.concat(stdoutChunks).toString();
|
|
34268
|
+
if (interactive && stderr) {
|
|
34269
|
+
resolve(stdout + "\n" + stderr);
|
|
34270
|
+
} else {
|
|
34271
|
+
resolve(stdout);
|
|
34272
|
+
}
|
|
34273
|
+
} else {
|
|
34274
|
+
reject(new Error(stderr || `gog exited with code ${code}`));
|
|
34275
|
+
}
|
|
34276
|
+
});
|
|
34277
|
+
child.on("error", (err) => {
|
|
34278
|
+
clearTimeout(timer);
|
|
34279
|
+
if (settled) return;
|
|
34280
|
+
settled = true;
|
|
34281
|
+
if (err.code === "ENOENT") {
|
|
34282
|
+
reject(new Error(
|
|
34283
|
+
"gog executable not found. Install gogcli (https://github.com/openclaw/gogcli) or set GOG_PATH in your MCP client config to the absolute binary path (run `which gog` in a terminal to find it)."
|
|
34284
|
+
));
|
|
34285
|
+
return;
|
|
34286
|
+
}
|
|
34287
|
+
reject(err);
|
|
34288
|
+
});
|
|
34289
|
+
});
|
|
34290
|
+
}
|
|
34291
|
+
function assembleArgs(args, opts) {
|
|
34292
|
+
const effectiveAccount = opts.account ?? readEnvVar("GOG_ACCOUNT");
|
|
34293
|
+
const fullArgs = ["--json", "--color=never"];
|
|
34294
|
+
if (!opts.interactive) {
|
|
34295
|
+
fullArgs.push("--no-input");
|
|
34296
|
+
}
|
|
34297
|
+
if (opts.readonly || readonlyEnvEnabled()) {
|
|
34298
|
+
fullArgs.push("--readonly");
|
|
34299
|
+
}
|
|
34300
|
+
if (effectiveAccount) {
|
|
34301
|
+
fullArgs.push("--account", effectiveAccount);
|
|
34302
|
+
}
|
|
34303
|
+
fullArgs.push(...args);
|
|
34304
|
+
return fullArgs;
|
|
34305
|
+
}
|
|
34306
|
+
async function run(args, options = {}) {
|
|
34307
|
+
const { account, spawner, interactive = false, timeout, readonly: readonly2 = false, redactMode = "full", opaqueFields } = options;
|
|
34308
|
+
const base = redactMode === "tokens" ? redactGoogleTokens : redactSecrets2;
|
|
34309
|
+
const redact = opaqueFields?.length ? (text) => redactPreservingOpaqueFields(text, opaqueFields, base) : base;
|
|
34310
|
+
const fullArgs = assembleArgs(args, { account, interactive, readonly: readonly2 });
|
|
34311
|
+
try {
|
|
34312
|
+
return redact(await spawnExecutor(fullArgs, { timeout, interactive, spawner }));
|
|
34313
|
+
} catch (err) {
|
|
34314
|
+
throw new Error(base(err instanceof Error ? err.message : String(err)));
|
|
34315
|
+
}
|
|
34316
|
+
}
|
|
34317
|
+
|
|
34316
34318
|
// ../gogcli-mcp/src/pagination.ts
|
|
34317
34319
|
function detectIndent2(text) {
|
|
34318
34320
|
const match = /\n(\s+)\S/.exec(text);
|
|
@@ -34909,7 +34911,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
34909
34911
|
);
|
|
34910
34912
|
|
|
34911
34913
|
// ../gogcli-mcp/src/server.ts
|
|
34912
|
-
var VERSION = true ? "4.0.
|
|
34914
|
+
var VERSION = true ? "4.0.1" : "0.0.0";
|
|
34913
34915
|
|
|
34914
34916
|
// ../gogcli-mcp/src/bootstrap-auth.ts
|
|
34915
34917
|
import { join as join2 } from "node:path";
|
package/manifest.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"manifest_version": "0.3",
|
|
4
4
|
"name": "gogcli-mcp-calendar",
|
|
5
5
|
"display_name": "gogcli (Calendar)",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.1",
|
|
7
7
|
"description": "Extended Google Calendar for Claude via gogcli — auth + Calendar events + Meet space management",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Chris Hall",
|
package/mint.yaml
CHANGED
|
@@ -73,10 +73,10 @@ env:
|
|
|
73
73
|
- name: GOG_TIMEZONE
|
|
74
74
|
required: false
|
|
75
75
|
help: >-
|
|
76
|
-
The IANA zone gog
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
America/New_York.
|
|
76
|
+
The IANA zone gog formats its naive timestamps in. The wrapper passes
|
|
77
|
+
it to every spawned gog and reads it back (naiveSourceTimeZone) to
|
|
78
|
+
re-attach the offset, so the two always agree. Unset or invalid, both
|
|
79
|
+
use DISPLAY_TZ, then America/New_York — never the host's local zone.
|
|
80
80
|
- name: DISPLAY_TZ
|
|
81
81
|
required: false
|
|
82
82
|
help: >-
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-calendar",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"mcpName": "io.github.chrischall/gogcli-mcp-calendar",
|
|
5
5
|
"description": "Extended Google Calendar + Meet MCP server via gogcli — auth + Calendar events + Meet space management",
|
|
6
6
|
"author": "Claude Code (AI) <https://www.anthropic.com/claude>",
|