@aaronsb/google-workspace-mcp 2.0.0 → 2.1.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 (75) hide show
  1. package/build/__tests__/server/queue.test.js +5 -0
  2. package/build/__tests__/server/queue.test.js.map +1 -1
  3. package/build/server/formatting/markdown.d.ts +7 -0
  4. package/build/server/formatting/markdown.js +1 -1
  5. package/build/server/formatting/markdown.js.map +1 -1
  6. package/build/server/formatting/next-steps.js +19 -0
  7. package/build/server/formatting/next-steps.js.map +1 -1
  8. package/build/server/handler.d.ts +4 -0
  9. package/build/server/handler.js +17 -1
  10. package/build/server/handler.js.map +1 -1
  11. package/build/server/queue.js +2 -0
  12. package/build/server/queue.js.map +1 -1
  13. package/build/server/scratchpad/__tests__/json-path.test.d.ts +4 -0
  14. package/build/server/scratchpad/__tests__/json-path.test.js +121 -0
  15. package/build/server/scratchpad/__tests__/json-path.test.js.map +1 -0
  16. package/build/server/scratchpad/__tests__/manager.test.d.ts +5 -0
  17. package/build/server/scratchpad/__tests__/manager.test.js +886 -0
  18. package/build/server/scratchpad/__tests__/manager.test.js.map +1 -0
  19. package/build/server/scratchpad/__tests__/validate.test.d.ts +4 -0
  20. package/build/server/scratchpad/__tests__/validate.test.js +112 -0
  21. package/build/server/scratchpad/__tests__/validate.test.js.map +1 -0
  22. package/build/server/scratchpad/adapters/import-doc.d.ts +16 -0
  23. package/build/server/scratchpad/adapters/import-doc.js +123 -0
  24. package/build/server/scratchpad/adapters/import-doc.js.map +1 -0
  25. package/build/server/scratchpad/adapters/import-drive.d.ts +12 -0
  26. package/build/server/scratchpad/adapters/import-drive.js +52 -0
  27. package/build/server/scratchpad/adapters/import-drive.js.map +1 -0
  28. package/build/server/scratchpad/adapters/import-email.d.ts +13 -0
  29. package/build/server/scratchpad/adapters/import-email.js +87 -0
  30. package/build/server/scratchpad/adapters/import-email.js.map +1 -0
  31. package/build/server/scratchpad/adapters/import-meet.d.ts +12 -0
  32. package/build/server/scratchpad/adapters/import-meet.js +109 -0
  33. package/build/server/scratchpad/adapters/import-meet.js.map +1 -0
  34. package/build/server/scratchpad/adapters/import-sheet.d.ts +12 -0
  35. package/build/server/scratchpad/adapters/import-sheet.js +55 -0
  36. package/build/server/scratchpad/adapters/import-sheet.js.map +1 -0
  37. package/build/server/scratchpad/adapters/index.d.ts +15 -0
  38. package/build/server/scratchpad/adapters/index.js +18 -0
  39. package/build/server/scratchpad/adapters/index.js.map +1 -0
  40. package/build/server/scratchpad/adapters/send-calendar.d.ts +15 -0
  41. package/build/server/scratchpad/adapters/send-calendar.js +50 -0
  42. package/build/server/scratchpad/adapters/send-calendar.js.map +1 -0
  43. package/build/server/scratchpad/adapters/send-doc.d.ts +18 -0
  44. package/build/server/scratchpad/adapters/send-doc.js +77 -0
  45. package/build/server/scratchpad/adapters/send-doc.js.map +1 -0
  46. package/build/server/scratchpad/adapters/send-email-draft.d.ts +12 -0
  47. package/build/server/scratchpad/adapters/send-email-draft.js +52 -0
  48. package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -0
  49. package/build/server/scratchpad/adapters/send-email.d.ts +15 -0
  50. package/build/server/scratchpad/adapters/send-email.js +73 -0
  51. package/build/server/scratchpad/adapters/send-email.js.map +1 -0
  52. package/build/server/scratchpad/adapters/send-sheet.d.ts +13 -0
  53. package/build/server/scratchpad/adapters/send-sheet.js +71 -0
  54. package/build/server/scratchpad/adapters/send-sheet.js.map +1 -0
  55. package/build/server/scratchpad/adapters/send-task.d.ts +12 -0
  56. package/build/server/scratchpad/adapters/send-task.js +53 -0
  57. package/build/server/scratchpad/adapters/send-task.js.map +1 -0
  58. package/build/server/scratchpad/adapters/send-workspace.d.ts +11 -0
  59. package/build/server/scratchpad/adapters/send-workspace.js +69 -0
  60. package/build/server/scratchpad/adapters/send-workspace.js.map +1 -0
  61. package/build/server/scratchpad/handler.d.ts +9 -0
  62. package/build/server/scratchpad/handler.js +476 -0
  63. package/build/server/scratchpad/handler.js.map +1 -0
  64. package/build/server/scratchpad/json-path.d.ts +12 -0
  65. package/build/server/scratchpad/json-path.js +75 -0
  66. package/build/server/scratchpad/json-path.js.map +1 -0
  67. package/build/server/scratchpad/manager.d.ts +140 -0
  68. package/build/server/scratchpad/manager.js +561 -0
  69. package/build/server/scratchpad/manager.js.map +1 -0
  70. package/build/server/scratchpad/validate.d.ts +7 -0
  71. package/build/server/scratchpad/validate.js +96 -0
  72. package/build/server/scratchpad/validate.js.map +1 -0
  73. package/build/server/tools.js +48 -1
  74. package/build/server/tools.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Send adapter: sheet_write — writes scratchpad CSV content to a Google Sheet.
3
+ * Parses CSV lines back into a values array for spreadsheets.values.update.
4
+ */
5
+ import { execute } from '../../../executor/gws.js';
6
+ export async function sendSheetWrite(scratchpads, scratchpadId, targetParams) {
7
+ const content = scratchpads.getContent(scratchpadId);
8
+ if (content === null) {
9
+ return { text: `Scratchpad ${scratchpadId} not found.`, refs: { error: true } };
10
+ }
11
+ const { email, spreadsheetId, range = 'Sheet1' } = targetParams;
12
+ if (!email || !spreadsheetId) {
13
+ return {
14
+ text: `Send failed: email and spreadsheetId are required for sheet_write.\nScratchpad ${scratchpadId} is still active.`,
15
+ refs: { error: true, scratchpadId },
16
+ };
17
+ }
18
+ // Parse CSV lines into values array
19
+ const lines = content.split('\n').filter(l => l.trim());
20
+ const values = lines.map(parseCsvLine);
21
+ try {
22
+ await execute([
23
+ 'sheets', 'spreadsheets', 'values', 'update',
24
+ '--params', JSON.stringify({
25
+ spreadsheetId,
26
+ range,
27
+ valueInputOption: 'USER_ENTERED',
28
+ requestBody: { values },
29
+ }),
30
+ ], { account: email });
31
+ return {
32
+ text: `Written ${values.length} rows to sheet ${spreadsheetId} (${range}).`,
33
+ refs: { scratchpadId, spreadsheetId, range, rows: values.length },
34
+ };
35
+ }
36
+ catch (err) {
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ return {
39
+ text: `Send failed: ${message}\nScratchpad ${scratchpadId} is still active.`,
40
+ refs: { error: true, scratchpadId },
41
+ };
42
+ }
43
+ }
44
+ /** Parse a CSV line respecting quoted fields. */
45
+ function parseCsvLine(line) {
46
+ const fields = [];
47
+ let current = '';
48
+ let inQuotes = false;
49
+ for (let i = 0; i < line.length; i++) {
50
+ const ch = line[i];
51
+ if (ch === '"') {
52
+ if (inQuotes && line[i + 1] === '"') {
53
+ current += '"';
54
+ i++;
55
+ }
56
+ else {
57
+ inQuotes = !inQuotes;
58
+ }
59
+ }
60
+ else if (ch === ',' && !inQuotes) {
61
+ fields.push(current);
62
+ current = '';
63
+ }
64
+ else {
65
+ current += ch;
66
+ }
67
+ }
68
+ fields.push(current);
69
+ return fields;
70
+ }
71
+ //# sourceMappingURL=send-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-sheet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-sheet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Send adapter: task_create — creates a Google Task from scratchpad content.
3
+ * First line becomes the task title, remaining lines become the notes.
4
+ */
5
+ import type { HandlerResponse } from '../../handler.js';
6
+ import type { ScratchpadManager } from '../manager.js';
7
+ interface TaskCreateParams {
8
+ email: string;
9
+ taskListId?: string;
10
+ }
11
+ export declare function sendTaskCreate(scratchpads: ScratchpadManager, scratchpadId: string, targetParams: TaskCreateParams): Promise<HandlerResponse>;
12
+ export {};
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Send adapter: task_create — creates a Google Task from scratchpad content.
3
+ * First line becomes the task title, remaining lines become the notes.
4
+ */
5
+ import { execute } from '../../../executor/gws.js';
6
+ export async function sendTaskCreate(scratchpads, scratchpadId, targetParams) {
7
+ const content = scratchpads.getContent(scratchpadId);
8
+ if (content === null) {
9
+ return { text: `Scratchpad ${scratchpadId} not found.`, refs: { error: true } };
10
+ }
11
+ const { email, taskListId = '@default' } = targetParams;
12
+ if (!email) {
13
+ return {
14
+ text: `Send failed: email is required for task_create.\nScratchpad ${scratchpadId} is still active.`,
15
+ refs: { error: true, scratchpadId },
16
+ };
17
+ }
18
+ // First non-empty line → title, rest → notes
19
+ const lines = content.split('\n');
20
+ const titleLine = lines.findIndex(l => l.trim().length > 0);
21
+ if (titleLine === -1) {
22
+ return {
23
+ text: `Send failed: scratchpad is empty, no task title.\nScratchpad ${scratchpadId} is still active.`,
24
+ refs: { error: true, scratchpadId },
25
+ };
26
+ }
27
+ const title = lines[titleLine].replace(/^#+\s*/, '').trim(); // strip markdown heading prefix
28
+ const notes = lines.slice(titleLine + 1).join('\n').trim();
29
+ const requestBody = { title };
30
+ if (notes)
31
+ requestBody.notes = notes;
32
+ try {
33
+ const result = await execute([
34
+ 'tasks', 'tasks', 'insert',
35
+ '--params', JSON.stringify({ tasklist: taskListId, requestBody }),
36
+ ], { account: email });
37
+ const data = result.data;
38
+ return {
39
+ text: `Task created: **${title}**\n\n` +
40
+ (notes ? `**Notes:** ${notes.split('\n').length} lines\n` : '') +
41
+ `**Task ID:** ${data.id ?? 'unknown'}`,
42
+ refs: { scratchpadId, taskId: data.id, title },
43
+ };
44
+ }
45
+ catch (err) {
46
+ const message = err instanceof Error ? err.message : String(err);
47
+ return {
48
+ text: `Send failed: ${message}\nScratchpad ${scratchpadId} is still active.`,
49
+ refs: { error: true, scratchpadId },
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=send-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-task.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AASnD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAA8B,EAC9B,YAAoB,EACpB,YAA8B;IAE9B,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,cAAc,YAAY,aAAa,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,+DAA+D,YAAY,mBAAmB;YACpG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,gEAAgE,YAAY,mBAAmB;YACrG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,gCAAgC;IAC7F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3D,MAAM,WAAW,GAA2B,EAAE,KAAK,EAAE,CAAC;IACtD,IAAI,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,QAAQ;YAC1B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;SAClE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QAEpD,OAAO;YACL,IAAI,EAAE,mBAAmB,KAAK,QAAQ;gBACpC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,gBAAgB,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;YACxC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE;SAC/C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,gBAAgB,OAAO,gBAAgB,YAAY,mBAAmB;YAC5E,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Send adapter: workspace — writes scratchpad content to a file in the workspace directory.
3
+ * Attachments are copied alongside the content file.
4
+ */
5
+ import type { HandlerResponse } from '../../handler.js';
6
+ import type { ScratchpadManager } from '../manager.js';
7
+ interface WorkspaceTargetParams {
8
+ filename: string;
9
+ }
10
+ export declare function sendWorkspace(scratchpads: ScratchpadManager, scratchpadId: string, targetParams: WorkspaceTargetParams): Promise<HandlerResponse>;
11
+ export {};
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Send adapter: workspace — writes scratchpad content to a file in the workspace directory.
3
+ * Attachments are copied alongside the content file.
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ import { resolveWorkspacePath, verifyPathSafety } from '../../../executor/workspace.js';
8
+ import { ensureWorkspaceDir } from '../../../executor/workspace.js';
9
+ export async function sendWorkspace(scratchpads, scratchpadId, targetParams) {
10
+ const content = scratchpads.getContent(scratchpadId);
11
+ if (content === null) {
12
+ return { text: `Scratchpad ${scratchpadId} not found.`, refs: { error: true } };
13
+ }
14
+ const { filename } = targetParams;
15
+ if (!filename) {
16
+ return {
17
+ text: `Send failed: filename is required for workspace target.\nScratchpad ${scratchpadId} is still active.`,
18
+ refs: { error: true, scratchpadId },
19
+ };
20
+ }
21
+ const wsStatus = await ensureWorkspaceDir();
22
+ if (!wsStatus.valid) {
23
+ return {
24
+ text: `Send failed: workspace invalid — ${wsStatus.warning}\nScratchpad ${scratchpadId} is still active.`,
25
+ refs: { error: true, scratchpadId },
26
+ };
27
+ }
28
+ try {
29
+ const filePath = resolveWorkspacePath(filename);
30
+ await verifyPathSafety(filePath);
31
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
32
+ await fs.writeFile(filePath, content, 'utf-8');
33
+ const size = Buffer.byteLength(content);
34
+ // Copy attachments alongside the content file
35
+ const attachments = scratchpads.getAttachments(scratchpadId);
36
+ let copiedCount = 0;
37
+ if (attachments && attachments.size > 0) {
38
+ const targetDir = path.dirname(filePath);
39
+ for (const att of attachments.values()) {
40
+ if (!att.location)
41
+ continue;
42
+ try {
43
+ const destPath = path.join(targetDir, att.filename);
44
+ // Only copy if source and dest differ (workspace files may already be in place)
45
+ if (path.resolve(att.location) !== path.resolve(destPath)) {
46
+ await fs.copyFile(att.location, destPath);
47
+ }
48
+ copiedCount++;
49
+ }
50
+ catch {
51
+ // Non-fatal: log but continue
52
+ }
53
+ }
54
+ }
55
+ const attNote = copiedCount > 0 ? `\n${copiedCount} attachment(s) copied alongside.` : '';
56
+ return {
57
+ text: `Written to workspace: **${filename}** (${size} bytes)${attNote}\n\n**Path:** ${filePath}`,
58
+ refs: { scratchpadId, filename, path: filePath, size, attachmentsCopied: copiedCount },
59
+ };
60
+ }
61
+ catch (err) {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ return {
64
+ text: `Send failed: ${message}\nScratchpad ${scratchpadId} is still active.`,
65
+ refs: { error: true, scratchpadId },
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=send-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-workspace.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Handler for manage_scratchpad tool.
3
+ * See ADR-301: Scratchpad Buffer — Service-Agnostic Content Authoring.
4
+ */
5
+ import { ScratchpadManager } from './manager.js';
6
+ import type { HandlerResponse } from '../handler.js';
7
+ /** Expose the singleton for import/send adapters. */
8
+ export declare function getScratchpadManager(): ScratchpadManager;
9
+ export declare function handleScratchpad(params: Record<string, unknown>): Promise<HandlerResponse>;