@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.
Files changed (273) hide show
  1. package/LICENSE +201 -21
  2. package/LICENSE-MIT +21 -0
  3. package/NOTICE +24 -0
  4. package/README.md +87 -57
  5. package/build/accounts/auth.d.ts +1 -1
  6. package/build/accounts/auth.js +1 -1
  7. package/build/accounts/oauth.js +3 -3
  8. package/build/accounts/oauth.js.map +1 -1
  9. package/build/accounts/token-service.js +1 -1
  10. package/build/accounts/token-service.js.map +1 -1
  11. package/build/coverage/analyze.d.ts +1 -1
  12. package/build/coverage/analyze.js +6 -4
  13. package/build/coverage/analyze.js.map +1 -1
  14. package/build/coverage/baseline.js +37 -20
  15. package/build/coverage/baseline.js.map +1 -1
  16. package/build/coverage/compare.d.ts +1 -1
  17. package/build/coverage/compare.js +19 -10
  18. package/build/coverage/compare.js.map +1 -1
  19. package/build/coverage/discover.d.ts +5 -5
  20. package/build/coverage/discover.js +71 -155
  21. package/build/coverage/discover.js.map +1 -1
  22. package/build/coverage/report.js +3 -3
  23. package/build/coverage/report.js.map +1 -1
  24. package/build/coverage/types.d.ts +19 -4
  25. package/build/executor/index.d.ts +0 -3
  26. package/build/executor/index.js +1 -2
  27. package/build/executor/index.js.map +1 -1
  28. package/build/factory/defaults.js +30 -4
  29. package/build/factory/defaults.js.map +1 -1
  30. package/build/factory/generator.d.ts +10 -4
  31. package/build/factory/generator.js +86 -96
  32. package/build/factory/generator.js.map +1 -1
  33. package/build/factory/manifest/README.md +4 -3
  34. package/build/factory/manifest/calendar.yaml +1 -11
  35. package/build/factory/manifest/docs.yaml +15 -6
  36. package/build/factory/manifest/drive.yaml +1 -5
  37. package/build/factory/manifest/gmail.yaml +32 -25
  38. package/build/factory/manifest/meet.yaml +1 -1
  39. package/build/factory/manifest/sheets.yaml +2 -5
  40. package/build/factory/manifest/tasks.yaml +40 -2
  41. package/build/factory/patches.js +2 -0
  42. package/build/factory/patches.js.map +1 -1
  43. package/build/factory/registry.d.ts +2 -3
  44. package/build/factory/registry.js +3 -9
  45. package/build/factory/registry.js.map +1 -1
  46. package/build/factory/safety.js +4 -4
  47. package/build/factory/safety.js.map +1 -1
  48. package/build/factory/types.d.ts +16 -15
  49. package/build/google/client.d.ts +45 -0
  50. package/build/google/client.js +232 -0
  51. package/build/google/client.js.map +1 -0
  52. package/build/google/descriptor.d.ts +40 -0
  53. package/build/google/descriptor.js +37 -0
  54. package/build/google/descriptor.js.map +1 -0
  55. package/build/google/descriptor.json +5271 -0
  56. package/build/google/errors.d.ts +45 -0
  57. package/build/google/errors.js +44 -0
  58. package/build/google/errors.js.map +1 -0
  59. package/build/google/methods.d.ts +37 -0
  60. package/build/google/methods.js +13 -0
  61. package/build/google/methods.js.map +1 -0
  62. package/build/index.js +30 -4
  63. package/build/index.js.map +1 -1
  64. package/build/node-floor.d.ts +16 -0
  65. package/build/node-floor.js +73 -0
  66. package/build/node-floor.js.map +1 -0
  67. package/build/server/formatting/markdown.d.ts +1 -1
  68. package/build/server/formatting/markdown.js +1 -1
  69. package/build/server/formatting/next-steps.js +1 -1
  70. package/build/server/formatting/next-steps.js.map +1 -1
  71. package/build/server/handlers/accounts.js +2 -2
  72. package/build/server/handlers/accounts.js.map +1 -1
  73. package/build/server/scratchpad/adapters/import-doc.js +15 -13
  74. package/build/server/scratchpad/adapters/import-doc.js.map +1 -1
  75. package/build/server/scratchpad/adapters/import-drive.js +16 -11
  76. package/build/server/scratchpad/adapters/import-drive.js.map +1 -1
  77. package/build/server/scratchpad/adapters/import-email.js +3 -15
  78. package/build/server/scratchpad/adapters/import-email.js.map +1 -1
  79. package/build/server/scratchpad/adapters/import-meet.js +5 -17
  80. package/build/server/scratchpad/adapters/import-meet.js.map +1 -1
  81. package/build/server/scratchpad/adapters/import-sheet.js +5 -6
  82. package/build/server/scratchpad/adapters/import-sheet.js.map +1 -1
  83. package/build/server/scratchpad/adapters/send-calendar.js +18 -13
  84. package/build/server/scratchpad/adapters/send-calendar.js.map +1 -1
  85. package/build/server/scratchpad/adapters/send-doc.js +22 -17
  86. package/build/server/scratchpad/adapters/send-doc.js.map +1 -1
  87. package/build/server/scratchpad/adapters/send-email-draft.d.ts +1 -1
  88. package/build/server/scratchpad/adapters/send-email-draft.js +17 -25
  89. package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
  90. package/build/server/scratchpad/adapters/send-email.d.ts +2 -2
  91. package/build/server/scratchpad/adapters/send-email.js +21 -25
  92. package/build/server/scratchpad/adapters/send-email.js.map +1 -1
  93. package/build/server/scratchpad/adapters/send-sheet.js +10 -10
  94. package/build/server/scratchpad/adapters/send-sheet.js.map +1 -1
  95. package/build/server/scratchpad/adapters/send-task.js +9 -8
  96. package/build/server/scratchpad/adapters/send-task.js.map +1 -1
  97. package/build/server/scratchpad/handler.js +22 -28
  98. package/build/server/scratchpad/handler.js.map +1 -1
  99. package/build/server/scratchpad/manager.d.ts +1 -1
  100. package/build/server/server.js +13 -10
  101. package/build/server/server.js.map +1 -1
  102. package/build/server/session/tracker.js +21 -25
  103. package/build/server/session/tracker.js.map +1 -1
  104. package/build/server/tools.d.ts +1 -1
  105. package/build/server/tools.js +3 -3
  106. package/build/server/tools.js.map +1 -1
  107. package/build/services/calendar/patch.js +178 -68
  108. package/build/services/calendar/patch.js.map +1 -1
  109. package/build/services/docs/patch.d.ts +5 -3
  110. package/build/services/docs/patch.js +89 -19
  111. package/build/services/docs/patch.js.map +1 -1
  112. package/build/services/drive/patch.d.ts +1 -1
  113. package/build/services/drive/patch.js +115 -143
  114. package/build/services/drive/patch.js.map +1 -1
  115. package/build/services/gmail/attachments.js +10 -15
  116. package/build/services/gmail/attachments.js.map +1 -1
  117. package/build/services/gmail/mail.d.ts +34 -0
  118. package/build/services/gmail/mail.js +245 -0
  119. package/build/services/gmail/mail.js.map +1 -0
  120. package/build/services/gmail/mime.d.ts +45 -4
  121. package/build/services/gmail/mime.js +138 -4
  122. package/build/services/gmail/mime.js.map +1 -1
  123. package/build/services/gmail/patch.js +103 -53
  124. package/build/services/gmail/patch.js.map +1 -1
  125. package/build/services/meet/patch.js +24 -31
  126. package/build/services/meet/patch.js.map +1 -1
  127. package/build/services/sheets/patch.js +30 -35
  128. package/build/services/sheets/patch.js.map +1 -1
  129. package/build/services/tasks/patch.d.ts +18 -0
  130. package/build/services/tasks/patch.js +37 -0
  131. package/build/services/tasks/patch.js.map +1 -0
  132. package/build/version.d.ts +1 -1
  133. package/build/version.js +2 -2
  134. package/build/version.js.map +1 -1
  135. package/package.json +23 -12
  136. package/build/__helpers__/testSetup.d.ts +0 -1
  137. package/build/__helpers__/testSetup.js +0 -6
  138. package/build/__helpers__/testSetup.js.map +0 -1
  139. package/build/__tests__/accounts/credentials.test.d.ts +0 -1
  140. package/build/__tests__/accounts/credentials.test.js +0 -127
  141. package/build/__tests__/accounts/credentials.test.js.map +0 -1
  142. package/build/__tests__/accounts/oauth.test.d.ts +0 -1
  143. package/build/__tests__/accounts/oauth.test.js +0 -71
  144. package/build/__tests__/accounts/oauth.test.js.map +0 -1
  145. package/build/__tests__/accounts/registry.test.d.ts +0 -1
  146. package/build/__tests__/accounts/registry.test.js +0 -74
  147. package/build/__tests__/accounts/registry.test.js.map +0 -1
  148. package/build/__tests__/accounts/token-service.test.d.ts +0 -1
  149. package/build/__tests__/accounts/token-service.test.js +0 -126
  150. package/build/__tests__/accounts/token-service.test.js.map +0 -1
  151. package/build/__tests__/executor/errors.test.d.ts +0 -1
  152. package/build/__tests__/executor/errors.test.js +0 -42
  153. package/build/__tests__/executor/errors.test.js.map +0 -1
  154. package/build/__tests__/executor/gws.test.d.ts +0 -1
  155. package/build/__tests__/executor/gws.test.js +0 -187
  156. package/build/__tests__/executor/gws.test.js.map +0 -1
  157. package/build/__tests__/executor/paths.test.d.ts +0 -1
  158. package/build/__tests__/executor/paths.test.js +0 -60
  159. package/build/__tests__/executor/paths.test.js.map +0 -1
  160. package/build/__tests__/executor/resolve-binary.test.d.ts +0 -1
  161. package/build/__tests__/executor/resolve-binary.test.js +0 -58
  162. package/build/__tests__/executor/resolve-binary.test.js.map +0 -1
  163. package/build/__tests__/executor/workspace.test.d.ts +0 -1
  164. package/build/__tests__/executor/workspace.test.js +0 -143
  165. package/build/__tests__/executor/workspace.test.js.map +0 -1
  166. package/build/__tests__/factory/calendar-patch.test.d.ts +0 -5
  167. package/build/__tests__/factory/calendar-patch.test.js +0 -269
  168. package/build/__tests__/factory/calendar-patch.test.js.map +0 -1
  169. package/build/__tests__/factory/drive-patch.test.d.ts +0 -5
  170. package/build/__tests__/factory/drive-patch.test.js +0 -344
  171. package/build/__tests__/factory/drive-patch.test.js.map +0 -1
  172. package/build/__tests__/factory/generator.test.d.ts +0 -1
  173. package/build/__tests__/factory/generator.test.js +0 -240
  174. package/build/__tests__/factory/generator.test.js.map +0 -1
  175. package/build/__tests__/factory/patch-coverage.test.d.ts +0 -10
  176. package/build/__tests__/factory/patch-coverage.test.js +0 -182
  177. package/build/__tests__/factory/patch-coverage.test.js.map +0 -1
  178. package/build/__tests__/factory/safety.test.d.ts +0 -1
  179. package/build/__tests__/factory/safety.test.js +0 -107
  180. package/build/__tests__/factory/safety.test.js.map +0 -1
  181. package/build/__tests__/factory/sheets-patch.test.d.ts +0 -6
  182. package/build/__tests__/factory/sheets-patch.test.js +0 -498
  183. package/build/__tests__/factory/sheets-patch.test.js.map +0 -1
  184. package/build/__tests__/integration/executor.test.d.ts +0 -5
  185. package/build/__tests__/integration/executor.test.js +0 -38
  186. package/build/__tests__/integration/executor.test.js.map +0 -1
  187. package/build/__tests__/integration/handlers.test.d.ts +0 -6
  188. package/build/__tests__/integration/handlers.test.js +0 -95
  189. package/build/__tests__/integration/handlers.test.js.map +0 -1
  190. package/build/__tests__/integration/setup.d.ts +0 -19
  191. package/build/__tests__/integration/setup.js +0 -61
  192. package/build/__tests__/integration/setup.js.map +0 -1
  193. package/build/__tests__/server/formatting/html-sanitize.test.d.ts +0 -7
  194. package/build/__tests__/server/formatting/html-sanitize.test.js +0 -174
  195. package/build/__tests__/server/formatting/html-sanitize.test.js.map +0 -1
  196. package/build/__tests__/server/formatting/markdown.test.d.ts +0 -1
  197. package/build/__tests__/server/formatting/markdown.test.js +0 -259
  198. package/build/__tests__/server/formatting/markdown.test.js.map +0 -1
  199. package/build/__tests__/server/formatting/next-steps.test.d.ts +0 -1
  200. package/build/__tests__/server/formatting/next-steps.test.js +0 -42
  201. package/build/__tests__/server/formatting/next-steps.test.js.map +0 -1
  202. package/build/__tests__/server/handler.test.d.ts +0 -1
  203. package/build/__tests__/server/handler.test.js +0 -97
  204. package/build/__tests__/server/handler.test.js.map +0 -1
  205. package/build/__tests__/server/handlers/__mocks__/executor.d.ts +0 -173
  206. package/build/__tests__/server/handlers/__mocks__/executor.js +0 -135
  207. package/build/__tests__/server/handlers/__mocks__/executor.js.map +0 -1
  208. package/build/__tests__/server/handlers/accounts.test.d.ts +0 -1
  209. package/build/__tests__/server/handlers/accounts.test.js +0 -129
  210. package/build/__tests__/server/handlers/accounts.test.js.map +0 -1
  211. package/build/__tests__/server/handlers/calendar.test.d.ts +0 -1
  212. package/build/__tests__/server/handlers/calendar.test.js +0 -96
  213. package/build/__tests__/server/handlers/calendar.test.js.map +0 -1
  214. package/build/__tests__/server/handlers/drive.test.d.ts +0 -1
  215. package/build/__tests__/server/handlers/drive.test.js +0 -68
  216. package/build/__tests__/server/handlers/drive.test.js.map +0 -1
  217. package/build/__tests__/server/handlers/email.test.d.ts +0 -1
  218. package/build/__tests__/server/handlers/email.test.js +0 -99
  219. package/build/__tests__/server/handlers/email.test.js.map +0 -1
  220. package/build/__tests__/server/handlers/validate.test.d.ts +0 -1
  221. package/build/__tests__/server/handlers/validate.test.js +0 -88
  222. package/build/__tests__/server/handlers/validate.test.js.map +0 -1
  223. package/build/__tests__/server/queue.test.d.ts +0 -1
  224. package/build/__tests__/server/queue.test.js +0 -199
  225. package/build/__tests__/server/queue.test.js.map +0 -1
  226. package/build/__tests__/server/server.test.d.ts +0 -7
  227. package/build/__tests__/server/server.test.js +0 -135
  228. package/build/__tests__/server/server.test.js.map +0 -1
  229. package/build/__tests__/server/session/context.test.d.ts +0 -1
  230. package/build/__tests__/server/session/context.test.js +0 -101
  231. package/build/__tests__/server/session/context.test.js.map +0 -1
  232. package/build/__tests__/server/session/tracker.test.d.ts +0 -1
  233. package/build/__tests__/server/session/tracker.test.js +0 -146
  234. package/build/__tests__/server/session/tracker.test.js.map +0 -1
  235. package/build/__tests__/server/tools.test.d.ts +0 -1
  236. package/build/__tests__/server/tools.test.js +0 -91
  237. package/build/__tests__/server/tools.test.js.map +0 -1
  238. package/build/__tests__/services/gmail/mime.test.d.ts +0 -1
  239. package/build/__tests__/services/gmail/mime.test.js +0 -23
  240. package/build/__tests__/services/gmail/mime.test.js.map +0 -1
  241. package/build/__tests__/services/meet/patch.test.d.ts +0 -4
  242. package/build/__tests__/services/meet/patch.test.js +0 -374
  243. package/build/__tests__/services/meet/patch.test.js.map +0 -1
  244. package/build/executor/errors.d.ts +0 -15
  245. package/build/executor/errors.js +0 -37
  246. package/build/executor/errors.js.map +0 -1
  247. package/build/executor/gws.d.ts +0 -26
  248. package/build/executor/gws.js +0 -197
  249. package/build/executor/gws.js.map +0 -1
  250. package/build/server/handlers/calendar.d.ts +0 -2
  251. package/build/server/handlers/calendar.js +0 -97
  252. package/build/server/handlers/calendar.js.map +0 -1
  253. package/build/server/handlers/drive.d.ts +0 -2
  254. package/build/server/handlers/drive.js +0 -58
  255. package/build/server/handlers/drive.js.map +0 -1
  256. package/build/server/handlers/email.d.ts +0 -2
  257. package/build/server/handlers/email.js +0 -119
  258. package/build/server/handlers/email.js.map +0 -1
  259. package/build/server/scratchpad/__tests__/docs-sync-integration.test.d.ts +0 -11
  260. package/build/server/scratchpad/__tests__/docs-sync-integration.test.js +0 -187
  261. package/build/server/scratchpad/__tests__/docs-sync-integration.test.js.map +0 -1
  262. package/build/server/scratchpad/__tests__/docs-sync.test.d.ts +0 -16
  263. package/build/server/scratchpad/__tests__/docs-sync.test.js +0 -213
  264. package/build/server/scratchpad/__tests__/docs-sync.test.js.map +0 -1
  265. package/build/server/scratchpad/__tests__/json-path.test.d.ts +0 -4
  266. package/build/server/scratchpad/__tests__/json-path.test.js +0 -121
  267. package/build/server/scratchpad/__tests__/json-path.test.js.map +0 -1
  268. package/build/server/scratchpad/__tests__/manager.test.d.ts +0 -5
  269. package/build/server/scratchpad/__tests__/manager.test.js +0 -886
  270. package/build/server/scratchpad/__tests__/manager.test.js.map +0 -1
  271. package/build/server/scratchpad/__tests__/validate.test.d.ts +0 -4
  272. package/build/server/scratchpad/__tests__/validate.test.js +0 -112
  273. package/build/server/scratchpad/__tests__/validate.test.js.map +0 -1
@@ -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,2 +0,0 @@
1
- import type { HandlerResponse } from '../handler.js';
2
- export declare function handleCalendar(params: Record<string, unknown>): Promise<HandlerResponse>;
@@ -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":"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"}
@@ -1,2 +0,0 @@
1
- import type { HandlerResponse } from '../handler.js';
2
- export declare function handleDrive(params: Record<string, unknown>): Promise<HandlerResponse>;
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA+B;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAmB,CAAC;IAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEnC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,MAAM;gBACxB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;oBACzB,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;oBAC5B,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;oBAC1C,MAAM,EAAE,4DAA4D;iBACrE,CAAC;aACH,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9D,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,KAAK;gBACvB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;oBACzB,MAAM;oBACN,MAAM,EAAE,qEAAqE;iBAC9E,CAAC;aACH,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBACnE,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,cAAc;gBAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YAChF,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,IAAI,CAAC,IAAI,IAAI,QAAQ,sBAAsB,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;oBACzF,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBACzC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aACxD,CAAC;QACJ,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { HandlerResponse } from '../handler.js';
2
- export declare function handleEmail(params: Record<string, unknown>): Promise<HandlerResponse>;
@@ -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":"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;;;GAGG;AACH,KAAK,UAAU,eAAe,CAC5B,UAAiC,EACjC,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK;gBACnC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;oBACzB,MAAM,EAAE,IAAI;oBACZ,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,MAAM,EAAE,UAAU;oBAClB,eAAe,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;iBAC7C,CAAC;aACH,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,MAAM,OAAO,GAAG,CAAE,IAAI,CAAC,OAAmC,EAAE,OAAO,IAAI,EAAE,CAA2C,CAAC;YACrH,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC;YAC1G,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC;gBAC7B,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;YACpD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA+B;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAmB,CAAC;IAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEnC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;gBACpC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;oBACzB,MAAM,EAAE,IAAI;oBACZ,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;oBACrB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;iBAC7C,CAAC;aACH,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvB,yDAAyD;YACzD,MAAM,GAAG,GAAG,MAAM,CAAC,IAA+B,CAAC;YACnD,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,IAAI,EAAE,CAA0B,CAAC;YAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,SAAS,GAAG,eAAe,CAAC;gBAChC,QAAQ;gBACR,kBAAkB,EAAE,GAAG,EAAE,kBAAkB,IAAI,CAAC;gBAChD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;aAC1B,CAAC,CAAC;YACH,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9D,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK;gBACnC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;aAC5D,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,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBACvE,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI;aACjD,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,OAAO;gBACL,IAAI,EAAE,iBAAiB,EAAE,qBAAqB,OAAO,qBAAqB,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;oBAC9F,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;gBACvC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;aAC5D,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI;aAC7D,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YACpD,OAAO;gBACL,IAAI,EAAE,kCAAkC,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;oBAC5D,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC;gBACxC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC9D,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC;QACJ,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -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 {};