@aaronsb/google-workspace-mcp 2.7.1 → 4.0.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/LICENSE +201 -21
- package/LICENSE-MIT +21 -0
- package/NOTICE +24 -0
- package/README.md +87 -57
- package/build/accounts/auth.d.ts +1 -1
- package/build/accounts/auth.js +1 -1
- package/build/accounts/oauth.js +3 -3
- package/build/accounts/oauth.js.map +1 -1
- package/build/accounts/token-service.js +1 -1
- package/build/accounts/token-service.js.map +1 -1
- package/build/coverage/analyze.d.ts +1 -1
- package/build/coverage/analyze.js +6 -4
- package/build/coverage/analyze.js.map +1 -1
- package/build/coverage/baseline.js +37 -20
- package/build/coverage/baseline.js.map +1 -1
- package/build/coverage/compare.d.ts +1 -1
- package/build/coverage/compare.js +19 -10
- package/build/coverage/compare.js.map +1 -1
- package/build/coverage/discover.d.ts +5 -5
- package/build/coverage/discover.js +71 -155
- package/build/coverage/discover.js.map +1 -1
- package/build/coverage/report.js +3 -3
- package/build/coverage/report.js.map +1 -1
- package/build/coverage/types.d.ts +19 -4
- package/build/executor/index.d.ts +0 -3
- package/build/executor/index.js +1 -2
- package/build/executor/index.js.map +1 -1
- package/build/factory/defaults.js +30 -4
- package/build/factory/defaults.js.map +1 -1
- package/build/factory/generator.d.ts +10 -4
- package/build/factory/generator.js +86 -96
- package/build/factory/generator.js.map +1 -1
- package/build/factory/manifest/README.md +4 -3
- package/build/factory/manifest/calendar.yaml +1 -11
- package/build/factory/manifest/docs.yaml +15 -6
- package/build/factory/manifest/drive.yaml +1 -5
- package/build/factory/manifest/gmail.yaml +32 -25
- package/build/factory/manifest/meet.yaml +1 -1
- package/build/factory/manifest/sheets.yaml +2 -5
- package/build/factory/manifest/tasks.yaml +40 -2
- package/build/factory/patches.js +2 -0
- package/build/factory/patches.js.map +1 -1
- package/build/factory/registry.d.ts +2 -3
- package/build/factory/registry.js +3 -9
- package/build/factory/registry.js.map +1 -1
- package/build/factory/safety.js +4 -4
- package/build/factory/safety.js.map +1 -1
- package/build/factory/types.d.ts +16 -15
- package/build/google/client.d.ts +45 -0
- package/build/google/client.js +232 -0
- package/build/google/client.js.map +1 -0
- package/build/google/descriptor.d.ts +40 -0
- package/build/google/descriptor.js +37 -0
- package/build/google/descriptor.js.map +1 -0
- package/build/google/descriptor.json +5271 -0
- package/build/google/errors.d.ts +45 -0
- package/build/google/errors.js +44 -0
- package/build/google/errors.js.map +1 -0
- package/build/google/methods.d.ts +37 -0
- package/build/google/methods.js +13 -0
- package/build/google/methods.js.map +1 -0
- package/build/index.js +30 -4
- package/build/index.js.map +1 -1
- package/build/node-floor.d.ts +16 -0
- package/build/node-floor.js +73 -0
- package/build/node-floor.js.map +1 -0
- package/build/server/formatting/markdown.d.ts +1 -1
- package/build/server/formatting/markdown.js +1 -1
- package/build/server/formatting/next-steps.js +1 -1
- package/build/server/formatting/next-steps.js.map +1 -1
- package/build/server/handlers/accounts.js +2 -2
- package/build/server/handlers/accounts.js.map +1 -1
- package/build/server/scratchpad/adapters/import-doc.js +15 -13
- package/build/server/scratchpad/adapters/import-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/import-drive.js +16 -11
- package/build/server/scratchpad/adapters/import-drive.js.map +1 -1
- package/build/server/scratchpad/adapters/import-email.js +3 -15
- package/build/server/scratchpad/adapters/import-email.js.map +1 -1
- package/build/server/scratchpad/adapters/import-meet.js +5 -17
- package/build/server/scratchpad/adapters/import-meet.js.map +1 -1
- package/build/server/scratchpad/adapters/import-sheet.js +5 -6
- package/build/server/scratchpad/adapters/import-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-calendar.js +18 -13
- package/build/server/scratchpad/adapters/send-calendar.js.map +1 -1
- package/build/server/scratchpad/adapters/send-doc.js +22 -17
- package/build/server/scratchpad/adapters/send-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.d.ts +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.js +17 -25
- package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email.d.ts +2 -2
- package/build/server/scratchpad/adapters/send-email.js +21 -25
- package/build/server/scratchpad/adapters/send-email.js.map +1 -1
- package/build/server/scratchpad/adapters/send-sheet.js +10 -10
- package/build/server/scratchpad/adapters/send-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-task.js +9 -8
- package/build/server/scratchpad/adapters/send-task.js.map +1 -1
- package/build/server/scratchpad/handler.js +22 -28
- package/build/server/scratchpad/handler.js.map +1 -1
- package/build/server/scratchpad/manager.d.ts +1 -1
- package/build/server/server.js +13 -10
- package/build/server/server.js.map +1 -1
- package/build/server/session/tracker.js +21 -25
- package/build/server/session/tracker.js.map +1 -1
- package/build/server/tools.d.ts +1 -1
- package/build/server/tools.js +3 -3
- package/build/server/tools.js.map +1 -1
- package/build/services/calendar/patch.js +178 -68
- package/build/services/calendar/patch.js.map +1 -1
- package/build/services/docs/patch.d.ts +5 -3
- package/build/services/docs/patch.js +89 -19
- package/build/services/docs/patch.js.map +1 -1
- package/build/services/drive/patch.d.ts +1 -1
- package/build/services/drive/patch.js +115 -143
- package/build/services/drive/patch.js.map +1 -1
- package/build/services/gmail/attachments.js +10 -15
- package/build/services/gmail/attachments.js.map +1 -1
- package/build/services/gmail/mail.d.ts +34 -0
- package/build/services/gmail/mail.js +245 -0
- package/build/services/gmail/mail.js.map +1 -0
- package/build/services/gmail/mime.d.ts +45 -4
- package/build/services/gmail/mime.js +138 -4
- package/build/services/gmail/mime.js.map +1 -1
- package/build/services/gmail/patch.js +103 -53
- package/build/services/gmail/patch.js.map +1 -1
- package/build/services/meet/patch.js +24 -31
- package/build/services/meet/patch.js.map +1 -1
- package/build/services/sheets/patch.js +30 -35
- package/build/services/sheets/patch.js.map +1 -1
- package/build/services/tasks/patch.d.ts +18 -0
- package/build/services/tasks/patch.js +37 -0
- package/build/services/tasks/patch.js.map +1 -0
- package/build/version.d.ts +1 -1
- package/build/version.js +2 -2
- package/build/version.js.map +1 -1
- package/package.json +23 -12
- package/build/__helpers__/testSetup.d.ts +0 -1
- package/build/__helpers__/testSetup.js +0 -6
- package/build/__helpers__/testSetup.js.map +0 -1
- package/build/__tests__/accounts/credentials.test.d.ts +0 -1
- package/build/__tests__/accounts/credentials.test.js +0 -127
- package/build/__tests__/accounts/credentials.test.js.map +0 -1
- package/build/__tests__/accounts/oauth.test.d.ts +0 -1
- package/build/__tests__/accounts/oauth.test.js +0 -71
- package/build/__tests__/accounts/oauth.test.js.map +0 -1
- package/build/__tests__/accounts/registry.test.d.ts +0 -1
- package/build/__tests__/accounts/registry.test.js +0 -74
- package/build/__tests__/accounts/registry.test.js.map +0 -1
- package/build/__tests__/accounts/token-service.test.d.ts +0 -1
- package/build/__tests__/accounts/token-service.test.js +0 -126
- package/build/__tests__/accounts/token-service.test.js.map +0 -1
- package/build/__tests__/executor/errors.test.d.ts +0 -1
- package/build/__tests__/executor/errors.test.js +0 -42
- package/build/__tests__/executor/errors.test.js.map +0 -1
- package/build/__tests__/executor/gws.test.d.ts +0 -1
- package/build/__tests__/executor/gws.test.js +0 -187
- package/build/__tests__/executor/gws.test.js.map +0 -1
- package/build/__tests__/executor/paths.test.d.ts +0 -1
- package/build/__tests__/executor/paths.test.js +0 -60
- package/build/__tests__/executor/paths.test.js.map +0 -1
- package/build/__tests__/executor/resolve-binary.test.d.ts +0 -1
- package/build/__tests__/executor/resolve-binary.test.js +0 -58
- package/build/__tests__/executor/resolve-binary.test.js.map +0 -1
- package/build/__tests__/executor/workspace.test.d.ts +0 -1
- package/build/__tests__/executor/workspace.test.js +0 -143
- package/build/__tests__/executor/workspace.test.js.map +0 -1
- package/build/__tests__/factory/calendar-patch.test.d.ts +0 -5
- package/build/__tests__/factory/calendar-patch.test.js +0 -269
- package/build/__tests__/factory/calendar-patch.test.js.map +0 -1
- package/build/__tests__/factory/drive-patch.test.d.ts +0 -5
- package/build/__tests__/factory/drive-patch.test.js +0 -344
- package/build/__tests__/factory/drive-patch.test.js.map +0 -1
- package/build/__tests__/factory/generator.test.d.ts +0 -1
- package/build/__tests__/factory/generator.test.js +0 -240
- package/build/__tests__/factory/generator.test.js.map +0 -1
- package/build/__tests__/factory/patch-coverage.test.d.ts +0 -10
- package/build/__tests__/factory/patch-coverage.test.js +0 -182
- package/build/__tests__/factory/patch-coverage.test.js.map +0 -1
- package/build/__tests__/factory/safety.test.d.ts +0 -1
- package/build/__tests__/factory/safety.test.js +0 -107
- package/build/__tests__/factory/safety.test.js.map +0 -1
- package/build/__tests__/factory/sheets-patch.test.d.ts +0 -6
- package/build/__tests__/factory/sheets-patch.test.js +0 -498
- package/build/__tests__/factory/sheets-patch.test.js.map +0 -1
- package/build/__tests__/integration/executor.test.d.ts +0 -5
- package/build/__tests__/integration/executor.test.js +0 -38
- package/build/__tests__/integration/executor.test.js.map +0 -1
- package/build/__tests__/integration/handlers.test.d.ts +0 -6
- package/build/__tests__/integration/handlers.test.js +0 -95
- package/build/__tests__/integration/handlers.test.js.map +0 -1
- package/build/__tests__/integration/setup.d.ts +0 -19
- package/build/__tests__/integration/setup.js +0 -61
- package/build/__tests__/integration/setup.js.map +0 -1
- package/build/__tests__/server/formatting/html-sanitize.test.d.ts +0 -7
- package/build/__tests__/server/formatting/html-sanitize.test.js +0 -174
- package/build/__tests__/server/formatting/html-sanitize.test.js.map +0 -1
- package/build/__tests__/server/formatting/markdown.test.d.ts +0 -1
- package/build/__tests__/server/formatting/markdown.test.js +0 -259
- package/build/__tests__/server/formatting/markdown.test.js.map +0 -1
- package/build/__tests__/server/formatting/next-steps.test.d.ts +0 -1
- package/build/__tests__/server/formatting/next-steps.test.js +0 -42
- package/build/__tests__/server/formatting/next-steps.test.js.map +0 -1
- package/build/__tests__/server/handler.test.d.ts +0 -1
- package/build/__tests__/server/handler.test.js +0 -97
- package/build/__tests__/server/handler.test.js.map +0 -1
- package/build/__tests__/server/handlers/__mocks__/executor.d.ts +0 -173
- package/build/__tests__/server/handlers/__mocks__/executor.js +0 -135
- package/build/__tests__/server/handlers/__mocks__/executor.js.map +0 -1
- package/build/__tests__/server/handlers/accounts.test.d.ts +0 -1
- package/build/__tests__/server/handlers/accounts.test.js +0 -129
- package/build/__tests__/server/handlers/accounts.test.js.map +0 -1
- package/build/__tests__/server/handlers/calendar.test.d.ts +0 -1
- package/build/__tests__/server/handlers/calendar.test.js +0 -96
- package/build/__tests__/server/handlers/calendar.test.js.map +0 -1
- package/build/__tests__/server/handlers/drive.test.d.ts +0 -1
- package/build/__tests__/server/handlers/drive.test.js +0 -68
- package/build/__tests__/server/handlers/drive.test.js.map +0 -1
- package/build/__tests__/server/handlers/email.test.d.ts +0 -1
- package/build/__tests__/server/handlers/email.test.js +0 -99
- package/build/__tests__/server/handlers/email.test.js.map +0 -1
- package/build/__tests__/server/handlers/validate.test.d.ts +0 -1
- package/build/__tests__/server/handlers/validate.test.js +0 -88
- package/build/__tests__/server/handlers/validate.test.js.map +0 -1
- package/build/__tests__/server/queue.test.d.ts +0 -1
- package/build/__tests__/server/queue.test.js +0 -199
- package/build/__tests__/server/queue.test.js.map +0 -1
- package/build/__tests__/server/server.test.d.ts +0 -7
- package/build/__tests__/server/server.test.js +0 -135
- package/build/__tests__/server/server.test.js.map +0 -1
- package/build/__tests__/server/session/context.test.d.ts +0 -1
- package/build/__tests__/server/session/context.test.js +0 -101
- package/build/__tests__/server/session/context.test.js.map +0 -1
- package/build/__tests__/server/session/tracker.test.d.ts +0 -1
- package/build/__tests__/server/session/tracker.test.js +0 -146
- package/build/__tests__/server/session/tracker.test.js.map +0 -1
- package/build/__tests__/server/tools.test.d.ts +0 -1
- package/build/__tests__/server/tools.test.js +0 -91
- package/build/__tests__/server/tools.test.js.map +0 -1
- package/build/__tests__/services/gmail/mime.test.d.ts +0 -1
- package/build/__tests__/services/gmail/mime.test.js +0 -23
- package/build/__tests__/services/gmail/mime.test.js.map +0 -1
- package/build/__tests__/services/meet/patch.test.d.ts +0 -4
- package/build/__tests__/services/meet/patch.test.js +0 -374
- package/build/__tests__/services/meet/patch.test.js.map +0 -1
- package/build/executor/errors.d.ts +0 -15
- package/build/executor/errors.js +0 -37
- package/build/executor/errors.js.map +0 -1
- package/build/executor/gws.d.ts +0 -26
- package/build/executor/gws.js +0 -197
- package/build/executor/gws.js.map +0 -1
- package/build/server/handlers/calendar.d.ts +0 -2
- package/build/server/handlers/calendar.js +0 -97
- package/build/server/handlers/calendar.js.map +0 -1
- package/build/server/handlers/drive.d.ts +0 -2
- package/build/server/handlers/drive.js +0 -58
- package/build/server/handlers/drive.js.map +0 -1
- package/build/server/handlers/email.d.ts +0 -2
- package/build/server/handlers/email.js +0 -119
- package/build/server/handlers/email.js.map +0 -1
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.d.ts +0 -11
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.js +0 -187
- package/build/server/scratchpad/__tests__/docs-sync-integration.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/docs-sync.test.d.ts +0 -16
- package/build/server/scratchpad/__tests__/docs-sync.test.js +0 -213
- package/build/server/scratchpad/__tests__/docs-sync.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/json-path.test.d.ts +0 -4
- package/build/server/scratchpad/__tests__/json-path.test.js +0 -121
- package/build/server/scratchpad/__tests__/json-path.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/manager.test.d.ts +0 -5
- package/build/server/scratchpad/__tests__/manager.test.js +0 -886
- package/build/server/scratchpad/__tests__/manager.test.js.map +0 -1
- package/build/server/scratchpad/__tests__/validate.test.d.ts +0 -4
- package/build/server/scratchpad/__tests__/validate.test.js +0 -112
- package/build/server/scratchpad/__tests__/validate.test.js.map +0 -1
package/build/executor/gws.js
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { spawn, execFileSync } from 'node:child_process';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { existsSync } from 'node:fs';
|
|
4
|
-
import { GwsExitCode, GwsError, parseGwsError } from './errors.js';
|
|
5
|
-
import { getAccessToken } from '../accounts/token-service.js';
|
|
6
|
-
const DEFAULT_TIMEOUT = 120_000; // Hard ceiling (2min) — process dies after this regardless
|
|
7
|
-
const STALL_TIMEOUT = 30_000; // Kill if no stdout/stderr activity for 30s
|
|
8
|
-
// (generous: gws may do OAuth refresh, API pagination, cold start)
|
|
9
|
-
const IS_WINDOWS = process.platform === 'win32';
|
|
10
|
-
// Prefer the native .exe (direct spawn, no shell needed).
|
|
11
|
-
// Fall back to the .cmd wrapper used by legacy npm distributions.
|
|
12
|
-
const GWS_BINARY_NAMES = IS_WINDOWS ? ['gws.exe', 'gws.cmd'] : ['gws'];
|
|
13
|
-
/**
|
|
14
|
-
* Resolve gws binary location.
|
|
15
|
-
*
|
|
16
|
-
* Priority:
|
|
17
|
-
* 1. GWS_BINARY_PATH env var (set by mcpb manifest for bundled binary)
|
|
18
|
-
* - If path is a directory, appends platform-appropriate binary name
|
|
19
|
-
* - If path is a file, uses it directly
|
|
20
|
-
* 2. node_modules/.bin/gws (npm dependency)
|
|
21
|
-
* 3. System PATH lookup (e.g. ~/.local/bin/gws installed globally)
|
|
22
|
-
*/
|
|
23
|
-
export function resolveGwsBinary() {
|
|
24
|
-
const envPath = process.env.GWS_BINARY_PATH;
|
|
25
|
-
if (envPath) {
|
|
26
|
-
// Support both direct binary path and directory path
|
|
27
|
-
if (envPath.endsWith('.exe') || envPath.endsWith('/gws') || envPath.endsWith('\\gws') || envPath.endsWith('.cmd')) {
|
|
28
|
-
return envPath;
|
|
29
|
-
}
|
|
30
|
-
// Try each candidate name under the directory
|
|
31
|
-
for (const name of GWS_BINARY_NAMES) {
|
|
32
|
-
const candidate = path.join(envPath, name);
|
|
33
|
-
if (existsSync(candidate))
|
|
34
|
-
return candidate;
|
|
35
|
-
}
|
|
36
|
-
return path.join(envPath, GWS_BINARY_NAMES[0]);
|
|
37
|
-
}
|
|
38
|
-
// Check node_modules/.bin first (npm dependency) — try each candidate
|
|
39
|
-
const binDir = resolvePackageBinDir();
|
|
40
|
-
for (const name of GWS_BINARY_NAMES) {
|
|
41
|
-
const candidate = path.join(binDir, name);
|
|
42
|
-
if (existsSync(candidate))
|
|
43
|
-
return candidate;
|
|
44
|
-
}
|
|
45
|
-
// Fall back to system PATH
|
|
46
|
-
const whichCmd = IS_WINDOWS ? 'where' : 'which';
|
|
47
|
-
for (const name of GWS_BINARY_NAMES) {
|
|
48
|
-
try {
|
|
49
|
-
const resolved = execFileSync(whichCmd, [name], {
|
|
50
|
-
encoding: 'utf8',
|
|
51
|
-
timeout: 5000,
|
|
52
|
-
}).trim().split('\n')[0]; // `where` on Windows may return multiple lines
|
|
53
|
-
if (resolved)
|
|
54
|
-
return resolved;
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
// Not found under this name — try next candidate
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
throw new GwsError(`gws binary not found — this tool cannot function without it.\n\n` +
|
|
61
|
-
`ACTION REQUIRED: The user must install the 'gws' CLI or fix the server configuration. ` +
|
|
62
|
-
`Do not retry — all operations will fail until this is resolved.\n\n` +
|
|
63
|
-
`Resolution order checked:\n` +
|
|
64
|
-
` 1. GWS_BINARY_PATH env var (set automatically by .mcpx extension) — not set\n` +
|
|
65
|
-
` 2. ./node_modules/.bin/gws (npm dependency) — not found\n` +
|
|
66
|
-
` 3. System PATH (e.g. ~/.local/bin/gws) — not found\n\n` +
|
|
67
|
-
`To fix, the user should either:\n` +
|
|
68
|
-
` • Install gws: npm install -g @googleworkspace/cli\n` +
|
|
69
|
-
` • Or set GWS_BINARY_PATH=/path/to/gws in the MCP server env config\n\n` +
|
|
70
|
-
`Note: The .mcpx extension distribution bundles gws automatically. ` +
|
|
71
|
-
`This error only occurs with the npx invocation pattern.`, GwsExitCode.InternalError, 'binary_not_found', '');
|
|
72
|
-
}
|
|
73
|
-
// Kept for backward compatibility with tests
|
|
74
|
-
export function resolvePackageBinDir() {
|
|
75
|
-
return path.join(process.cwd(), 'node_modules', '.bin');
|
|
76
|
-
}
|
|
77
|
-
// Stderr lines that are diagnostic noise, not errors
|
|
78
|
-
const STDERR_NOISE = [
|
|
79
|
-
/^Using keyring backend:/,
|
|
80
|
-
];
|
|
81
|
-
function filterStderr(stderr) {
|
|
82
|
-
return stderr
|
|
83
|
-
.split('\n')
|
|
84
|
-
.filter(line => !STDERR_NOISE.some(pattern => pattern.test(line)))
|
|
85
|
-
.join('\n')
|
|
86
|
-
.trim();
|
|
87
|
-
}
|
|
88
|
-
export async function execute(args, options = {}) {
|
|
89
|
-
const { account, timeout = DEFAULT_TIMEOUT, format = 'json', cwd } = options;
|
|
90
|
-
const env = { ...process.env };
|
|
91
|
-
if (account) {
|
|
92
|
-
const accessToken = await getAccessToken(account);
|
|
93
|
-
env.GOOGLE_WORKSPACE_CLI_TOKEN = accessToken;
|
|
94
|
-
}
|
|
95
|
-
const fullArgs = [...args, '--format', format];
|
|
96
|
-
// Resolve gws binary — bundled (mcpb) or npm dependency
|
|
97
|
-
const gwsBinary = resolveGwsBinary();
|
|
98
|
-
process.stderr.write(`[gws-mcp] exec: ${gwsBinary} ${fullArgs.join(' ')}\n`);
|
|
99
|
-
if (account) {
|
|
100
|
-
process.stderr.write(`[gws-mcp] token: [access token for ${account}]\n`);
|
|
101
|
-
}
|
|
102
|
-
// Still prepend bin dir to PATH for non-bundled case
|
|
103
|
-
env.PATH = `${resolvePackageBinDir()}:${env.PATH || ''}`;
|
|
104
|
-
// On Windows, .cmd files cannot be spawned directly — they require cmd.exe to interpret them.
|
|
105
|
-
// Using spawn with shell:true would work but joins all args into one unquoted command string,
|
|
106
|
-
// silently splitting any value that contains a space into separate tokens (breaking multi-word
|
|
107
|
-
// calendar summaries, locations, --params JSON payloads, etc.).
|
|
108
|
-
// Invoking cmd.exe directly with /c lets Node pass each argument as a discrete item so
|
|
109
|
-
// CreateProcess handles quoting correctly.
|
|
110
|
-
const isCmd = IS_WINDOWS && gwsBinary.endsWith('.cmd');
|
|
111
|
-
const spawnBin = isCmd ? 'cmd.exe' : gwsBinary;
|
|
112
|
-
const spawnArgs = isCmd ? ['/c', gwsBinary, ...fullArgs] : fullArgs;
|
|
113
|
-
return new Promise((resolve, reject) => {
|
|
114
|
-
let settled = false;
|
|
115
|
-
const settle = (fn) => { if (!settled) {
|
|
116
|
-
settled = true;
|
|
117
|
-
fn();
|
|
118
|
-
} };
|
|
119
|
-
const proc = spawn(spawnBin, spawnArgs, { env, cwd, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
120
|
-
let stdout = '';
|
|
121
|
-
let stderr = '';
|
|
122
|
-
// Activity-based stall detection: kill if process goes silent
|
|
123
|
-
let lastActivity = Date.now();
|
|
124
|
-
const resetStall = () => { lastActivity = Date.now(); };
|
|
125
|
-
proc.stdout.on('data', (chunk) => { stdout += chunk.toString(); resetStall(); });
|
|
126
|
-
proc.stderr.on('data', (chunk) => { stderr += chunk.toString(); resetStall(); });
|
|
127
|
-
const killProc = (reason) => {
|
|
128
|
-
process.stderr.write(`[gws-mcp] ${reason}\n`);
|
|
129
|
-
proc.kill('SIGTERM');
|
|
130
|
-
const killTimer = setTimeout(() => {
|
|
131
|
-
try {
|
|
132
|
-
proc.kill('SIGKILL');
|
|
133
|
-
}
|
|
134
|
-
catch { /* already dead */ }
|
|
135
|
-
}, 3000);
|
|
136
|
-
killTimer.unref();
|
|
137
|
-
};
|
|
138
|
-
// Stall detector — checks periodically if the process has gone silent
|
|
139
|
-
const stallCheck = setInterval(() => {
|
|
140
|
-
if (Date.now() - lastActivity > STALL_TIMEOUT) {
|
|
141
|
-
clearInterval(stallCheck);
|
|
142
|
-
killProc(`stall: no output for ${STALL_TIMEOUT / 1000}s, killing gws`);
|
|
143
|
-
settle(() => reject(new GwsError(`gws stalled (no output for ${STALL_TIMEOUT / 1000}s)`, GwsExitCode.InternalError, 'stall', stderr)));
|
|
144
|
-
}
|
|
145
|
-
}, 5000);
|
|
146
|
-
stallCheck.unref();
|
|
147
|
-
// Hard timeout — absolute ceiling regardless of activity
|
|
148
|
-
const timer = setTimeout(() => {
|
|
149
|
-
clearInterval(stallCheck);
|
|
150
|
-
killProc(`hard timeout: killing gws after ${timeout / 1000}s`);
|
|
151
|
-
settle(() => reject(new GwsError('gws command timed out', GwsExitCode.InternalError, 'timeout', stderr)));
|
|
152
|
-
}, timeout);
|
|
153
|
-
proc.on('error', (err) => {
|
|
154
|
-
clearTimeout(timer);
|
|
155
|
-
process.stderr.write(`[gws-mcp] spawn error: ${err.message}\n`);
|
|
156
|
-
settle(() => reject(new GwsError(`Failed to spawn gws: ${err.message}`, GwsExitCode.InternalError, 'spawn_error', stderr)));
|
|
157
|
-
});
|
|
158
|
-
// Ensure child process is cleaned up if the parent exits
|
|
159
|
-
const cleanup = () => { try {
|
|
160
|
-
proc.kill('SIGTERM');
|
|
161
|
-
}
|
|
162
|
-
catch { /* already dead */ } };
|
|
163
|
-
process.once('exit', cleanup);
|
|
164
|
-
proc.on('close', (code) => {
|
|
165
|
-
clearInterval(stallCheck);
|
|
166
|
-
process.removeListener('exit', cleanup);
|
|
167
|
-
clearTimeout(timer);
|
|
168
|
-
const exitCode = code ?? 1;
|
|
169
|
-
const filteredStderr = filterStderr(stderr);
|
|
170
|
-
if (exitCode !== GwsExitCode.Success) {
|
|
171
|
-
settle(() => reject(parseGwsError(exitCode, stdout, filteredStderr)));
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
// Parse JSON output
|
|
175
|
-
let data;
|
|
176
|
-
if (format === 'json' && stdout.trim()) {
|
|
177
|
-
try {
|
|
178
|
-
data = JSON.parse(stdout);
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
settle(() => reject(new GwsError('Failed to parse gws JSON output', GwsExitCode.InternalError, 'parse_error', stdout)));
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
data = stdout;
|
|
187
|
-
}
|
|
188
|
-
settle(() => resolve({ success: true, data, stderr: filteredStderr }));
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
export async function gwsVersion() {
|
|
193
|
-
// --version outputs plain text, not JSON
|
|
194
|
-
const result = await execute(['--version'], { format: 'table' });
|
|
195
|
-
return String(result.data).trim();
|
|
196
|
-
}
|
|
197
|
-
//# sourceMappingURL=gws.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gws.js","sourceRoot":"","sources":["../../src/executor/gws.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { execute } from '../../executor/gws.js';
|
|
2
|
-
import { formatEventList, formatEventDetail } from '../formatting/markdown.js';
|
|
3
|
-
import { nextSteps } from '../formatting/next-steps.js';
|
|
4
|
-
import { requireEmail, requireString, clamp } from './validate.js';
|
|
5
|
-
export async function handleCalendar(params) {
|
|
6
|
-
const operation = params.operation;
|
|
7
|
-
const email = requireEmail(params);
|
|
8
|
-
switch (operation) {
|
|
9
|
-
case 'list': {
|
|
10
|
-
const now = new Date();
|
|
11
|
-
const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).toISOString();
|
|
12
|
-
const calendarId = params.calendarId || 'primary';
|
|
13
|
-
const result = await execute([
|
|
14
|
-
'calendar', 'events', 'list',
|
|
15
|
-
'--params', JSON.stringify({
|
|
16
|
-
calendarId,
|
|
17
|
-
timeMin: params.timeMin || todayStart,
|
|
18
|
-
timeMax: params.timeMax || undefined,
|
|
19
|
-
maxResults: clamp(params.maxResults, 10, 50),
|
|
20
|
-
singleEvents: true,
|
|
21
|
-
orderBy: 'startTime',
|
|
22
|
-
}),
|
|
23
|
-
], { account: email });
|
|
24
|
-
const formatted = formatEventList(result.data);
|
|
25
|
-
return {
|
|
26
|
-
text: formatted.text + nextSteps('calendar', 'list', { email }),
|
|
27
|
-
refs: formatted.refs,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
case 'agenda': {
|
|
31
|
-
const result = await execute(['calendar', '+agenda'], { account: email });
|
|
32
|
-
const data = result.data;
|
|
33
|
-
const text = typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2);
|
|
34
|
-
// Curate refs — only expose fields useful for chaining
|
|
35
|
-
const events = Array.isArray(data?.events) ? data.events : [];
|
|
36
|
-
return {
|
|
37
|
-
text: text + nextSteps('calendar', 'agenda', { email }),
|
|
38
|
-
refs: {
|
|
39
|
-
count: events.length,
|
|
40
|
-
eventId: events[0]?.id,
|
|
41
|
-
events: events.map((e) => e.id),
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
case 'create': {
|
|
46
|
-
const summary = requireString(params, 'summary');
|
|
47
|
-
const start = requireString(params, 'start');
|
|
48
|
-
const end = requireString(params, 'end');
|
|
49
|
-
const calendarId = params.calendarId || 'primary';
|
|
50
|
-
const args = ['calendar', '+insert', '--calendar', calendarId, '--summary', summary, '--start', start, '--end', end];
|
|
51
|
-
if (params.description)
|
|
52
|
-
args.push('--description', String(params.description));
|
|
53
|
-
if (params.location)
|
|
54
|
-
args.push('--location', String(params.location));
|
|
55
|
-
if (params.attendees)
|
|
56
|
-
args.push('--attendee', String(params.attendees));
|
|
57
|
-
const result = await execute(args, { account: email });
|
|
58
|
-
const data = result.data;
|
|
59
|
-
return {
|
|
60
|
-
text: `Event created: **${summary}**\n\n` +
|
|
61
|
-
`**When:** ${start} – ${end}\n` +
|
|
62
|
-
(params.location ? `**Where:** ${params.location}\n` : '') +
|
|
63
|
-
`**Event ID:** ${data.id ?? 'unknown'}` +
|
|
64
|
-
nextSteps('calendar', 'create', { email }),
|
|
65
|
-
refs: { id: data.id, eventId: data.id, summary, start, end },
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
case 'get': {
|
|
69
|
-
const eventId = requireString(params, 'eventId');
|
|
70
|
-
const calendarId = params.calendarId || 'primary';
|
|
71
|
-
const result = await execute([
|
|
72
|
-
'calendar', 'events', 'get',
|
|
73
|
-
'--params', JSON.stringify({ calendarId, eventId }),
|
|
74
|
-
], { account: email });
|
|
75
|
-
const formatted = formatEventDetail(result.data);
|
|
76
|
-
return {
|
|
77
|
-
text: formatted.text + nextSteps('calendar', 'get', { email, eventId }),
|
|
78
|
-
refs: formatted.refs,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case 'delete': {
|
|
82
|
-
const eventId = requireString(params, 'eventId');
|
|
83
|
-
const calendarId = params.calendarId || 'primary';
|
|
84
|
-
await execute([
|
|
85
|
-
'calendar', 'events', 'delete',
|
|
86
|
-
'--params', JSON.stringify({ calendarId, eventId }),
|
|
87
|
-
], { account: email });
|
|
88
|
-
return {
|
|
89
|
-
text: `Event deleted: ${eventId}` + nextSteps('calendar', 'delete', { email }),
|
|
90
|
-
refs: { eventId, status: 'deleted' },
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
default:
|
|
94
|
-
throw new Error(`Unknown calendar operation: ${operation}`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=calendar.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/server/handlers/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA+B;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAmB,CAAC;IAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEnC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5F,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,SAAS,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,UAAU,EAAE,QAAQ,EAAE,MAAM;gBAC5B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;oBACzB,UAAU;oBACV,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU;oBACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;oBACpC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC5C,YAAY,EAAE,IAAI;oBAClB,OAAO,EAAE,WAAW;iBACrB,CAAC;aACH,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC/D,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2C,CAAC;YAChE,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAClG,uDAAuD;YACvD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO;gBACL,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBACvD,IAAI,EAAE;oBACJ,KAAK,EAAE,MAAM,CAAC,MAAM;oBACpB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;oBACtB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzD;aACF,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,SAAS,CAAC;YAC9D,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YACrH,IAAI,MAAM,CAAC,WAAW;gBAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/E,IAAI,MAAM,CAAC,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,OAAO;gBACL,IAAI,EAAE,oBAAoB,OAAO,QAAQ;oBACvC,aAAa,KAAK,MAAM,GAAG,IAAI;oBAC/B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,iBAAiB,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;oBACvC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC5C,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;aAC7D,CAAC;QACJ,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,SAAS,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,UAAU,EAAE,QAAQ,EAAE,KAAK;gBAC3B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;aACpD,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBACvE,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,UAAU,GAAI,MAAM,CAAC,UAAqB,IAAI,SAAS,CAAC;YAC9D,MAAM,OAAO,CAAC;gBACZ,UAAU,EAAE,QAAQ,EAAE,QAAQ;gBAC9B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;aACpD,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,kBAAkB,OAAO,EAAE,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9E,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;aACrC,CAAC;QACJ,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { execute } from '../../executor/gws.js';
|
|
2
|
-
import { formatFileList, formatFileDetail } from '../formatting/markdown.js';
|
|
3
|
-
import { nextSteps } from '../formatting/next-steps.js';
|
|
4
|
-
import { requireEmail, requireString, clamp } from './validate.js';
|
|
5
|
-
export async function handleDrive(params) {
|
|
6
|
-
const operation = params.operation;
|
|
7
|
-
const email = requireEmail(params);
|
|
8
|
-
switch (operation) {
|
|
9
|
-
case 'search': {
|
|
10
|
-
const result = await execute([
|
|
11
|
-
'drive', 'files', 'list',
|
|
12
|
-
'--params', JSON.stringify({
|
|
13
|
-
q: params.query || undefined,
|
|
14
|
-
pageSize: clamp(params.maxResults, 10, 50),
|
|
15
|
-
fields: 'files(id, name, mimeType, modifiedTime, size, webViewLink)',
|
|
16
|
-
}),
|
|
17
|
-
], { account: email });
|
|
18
|
-
const formatted = formatFileList(result.data);
|
|
19
|
-
return {
|
|
20
|
-
text: formatted.text + nextSteps('drive', 'search', { email }),
|
|
21
|
-
refs: formatted.refs,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
case 'get': {
|
|
25
|
-
const fileId = requireString(params, 'fileId');
|
|
26
|
-
const result = await execute([
|
|
27
|
-
'drive', 'files', 'get',
|
|
28
|
-
'--params', JSON.stringify({
|
|
29
|
-
fileId,
|
|
30
|
-
fields: 'id, name, mimeType, modifiedTime, size, webViewLink, owners, shared',
|
|
31
|
-
}),
|
|
32
|
-
], { account: email });
|
|
33
|
-
const formatted = formatFileDetail(result.data);
|
|
34
|
-
return {
|
|
35
|
-
text: formatted.text + nextSteps('drive', 'get', { email, fileId }),
|
|
36
|
-
refs: formatted.refs,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
case 'upload': {
|
|
40
|
-
const filePath = requireString(params, 'filePath');
|
|
41
|
-
const args = ['drive', '+upload', filePath];
|
|
42
|
-
if (params.name)
|
|
43
|
-
args.push('--name', String(params.name));
|
|
44
|
-
if (params.parentFolderId)
|
|
45
|
-
args.push('--parent', String(params.parentFolderId));
|
|
46
|
-
const result = await execute(args, { account: email });
|
|
47
|
-
const data = result.data;
|
|
48
|
-
return {
|
|
49
|
-
text: `File uploaded: **${data.name ?? filePath}**\n\n**File ID:** ${data.id ?? 'unknown'}` +
|
|
50
|
-
nextSteps('drive', 'upload', { email }),
|
|
51
|
-
refs: { id: data.id, fileId: data.id, name: data.name },
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
default:
|
|
55
|
-
throw new Error(`Unknown drive operation: ${operation}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=drive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/server/handlers/drive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { execute } from '../../executor/gws.js';
|
|
2
|
-
import { formatEmailList, formatEmailDetail } from '../formatting/markdown.js';
|
|
3
|
-
import { nextSteps } from '../formatting/next-steps.js';
|
|
4
|
-
import { requireEmail, requireString, clamp } from './validate.js';
|
|
5
|
-
/**
|
|
6
|
-
* Gmail messages.list only returns IDs. This hydrates each message
|
|
7
|
-
* with metadata (From, Subject, Date, snippet) via parallel gets.
|
|
8
|
-
*/
|
|
9
|
-
async function hydrateMessages(messageIds, account) {
|
|
10
|
-
const hydrated = await Promise.all(messageIds.map(async (msg) => {
|
|
11
|
-
try {
|
|
12
|
-
const result = await execute([
|
|
13
|
-
'gmail', 'users', 'messages', 'get',
|
|
14
|
-
'--params', JSON.stringify({
|
|
15
|
-
userId: 'me',
|
|
16
|
-
id: msg.id,
|
|
17
|
-
format: 'metadata',
|
|
18
|
-
metadataHeaders: ['From', 'Subject', 'Date'],
|
|
19
|
-
}),
|
|
20
|
-
], { account });
|
|
21
|
-
const data = result.data;
|
|
22
|
-
const headers = (data.payload?.headers ?? []);
|
|
23
|
-
const getHeader = (name) => headers.find(h => h.name.toLowerCase() === name.toLowerCase())?.value;
|
|
24
|
-
return {
|
|
25
|
-
id: data.id,
|
|
26
|
-
threadId: data.threadId,
|
|
27
|
-
from: getHeader('from'),
|
|
28
|
-
subject: getHeader('subject'),
|
|
29
|
-
date: getHeader('date'),
|
|
30
|
-
snippet: data.snippet,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// If individual hydration fails, return the bare ID
|
|
35
|
-
return { id: msg.id };
|
|
36
|
-
}
|
|
37
|
-
}));
|
|
38
|
-
return hydrated;
|
|
39
|
-
}
|
|
40
|
-
export async function handleEmail(params) {
|
|
41
|
-
const operation = params.operation;
|
|
42
|
-
const email = requireEmail(params);
|
|
43
|
-
switch (operation) {
|
|
44
|
-
case 'search': {
|
|
45
|
-
const result = await execute([
|
|
46
|
-
'gmail', 'users', 'messages', 'list',
|
|
47
|
-
'--params', JSON.stringify({
|
|
48
|
-
userId: 'me',
|
|
49
|
-
q: params.query || '',
|
|
50
|
-
maxResults: clamp(params.maxResults, 10, 50),
|
|
51
|
-
}),
|
|
52
|
-
], { account: email });
|
|
53
|
-
// messages.list only returns IDs — hydrate with metadata
|
|
54
|
-
const raw = result.data;
|
|
55
|
-
const ids = (raw?.messages ?? []);
|
|
56
|
-
const messages = ids.length > 0 ? await hydrateMessages(ids, email) : [];
|
|
57
|
-
const formatted = formatEmailList({
|
|
58
|
-
messages,
|
|
59
|
-
resultSizeEstimate: raw?.resultSizeEstimate ?? 0,
|
|
60
|
-
query: params.query ?? '',
|
|
61
|
-
});
|
|
62
|
-
return {
|
|
63
|
-
text: formatted.text + nextSteps('email', 'search', { email }),
|
|
64
|
-
refs: formatted.refs,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
case 'read': {
|
|
68
|
-
const messageId = requireString(params, 'messageId');
|
|
69
|
-
const result = await execute([
|
|
70
|
-
'gmail', 'users', 'messages', 'get',
|
|
71
|
-
'--params', JSON.stringify({ userId: 'me', id: messageId }),
|
|
72
|
-
], { account: email });
|
|
73
|
-
const formatted = formatEmailDetail(result.data);
|
|
74
|
-
return {
|
|
75
|
-
text: formatted.text + nextSteps('email', 'read', { email, messageId }),
|
|
76
|
-
refs: formatted.refs,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
case 'send': {
|
|
80
|
-
const to = requireString(params, 'to');
|
|
81
|
-
const subject = requireString(params, 'subject');
|
|
82
|
-
const body = requireString(params, 'body');
|
|
83
|
-
const result = await execute([
|
|
84
|
-
'gmail', '+send',
|
|
85
|
-
'--to', to, '--subject', subject, '--body', body,
|
|
86
|
-
], { account: email });
|
|
87
|
-
const data = result.data;
|
|
88
|
-
return {
|
|
89
|
-
text: `Email sent to ${to}.\n\n**Subject:** ${subject}\n**Message ID:** ${data.id ?? 'unknown'}` +
|
|
90
|
-
nextSteps('email', 'send', { email }),
|
|
91
|
-
refs: { id: data.id, threadId: data.threadId, to, subject },
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
case 'reply': {
|
|
95
|
-
const messageId = requireString(params, 'messageId');
|
|
96
|
-
const body = requireString(params, 'body');
|
|
97
|
-
const result = await execute([
|
|
98
|
-
'gmail', '+reply', '--message-id', messageId, '--body', body,
|
|
99
|
-
], { account: email });
|
|
100
|
-
const data = result.data;
|
|
101
|
-
return {
|
|
102
|
-
text: `Reply sent.\n\n**Message ID:** ${data.id ?? 'unknown'}` +
|
|
103
|
-
nextSteps('email', 'reply', { email }),
|
|
104
|
-
refs: { id: data.id, threadId: data.threadId, messageId },
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
case 'triage': {
|
|
108
|
-
const result = await execute(['gmail', '+triage'], { account: email, format: 'json' });
|
|
109
|
-
const formatted = formatEmailList(result.data);
|
|
110
|
-
return {
|
|
111
|
-
text: formatted.text + nextSteps('email', 'triage', { email }),
|
|
112
|
-
refs: formatted.refs,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
default:
|
|
116
|
-
throw new Error(`Unknown email operation: ${operation}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=email.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/server/handlers/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration-ish tests for the docs-bound mutation path through the
|
|
3
|
-
* scratchpad handler. Mocks `execute` from the gws executor; everything
|
|
4
|
-
* else is real (ScratchpadManager, the docs-sync translator).
|
|
5
|
-
*
|
|
6
|
-
* Covers the two test cases that the pure-translator tests can't:
|
|
7
|
-
* - API rejects → local buffer preserved, error response returned.
|
|
8
|
-
* - API succeeds → reloadDocsBuffer fires, sp.lines replaced from the
|
|
9
|
-
* fresh response, binding revisionId updated.
|
|
10
|
-
*/
|
|
11
|
-
export {};
|