@aaronsb/google-workspace-mcp 2.3.0 → 2.5.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 (63) hide show
  1. package/build/__tests__/server/handlers/drive.test.js +2 -15
  2. package/build/__tests__/server/handlers/drive.test.js.map +1 -1
  3. package/build/__tests__/server/session/context.test.d.ts +1 -0
  4. package/build/__tests__/server/session/context.test.js +101 -0
  5. package/build/__tests__/server/session/context.test.js.map +1 -0
  6. package/build/__tests__/server/session/tracker.test.d.ts +1 -0
  7. package/build/__tests__/server/session/tracker.test.js +146 -0
  8. package/build/__tests__/server/session/tracker.test.js.map +1 -0
  9. package/build/accounts/oauth.js +17 -8
  10. package/build/accounts/oauth.js.map +1 -1
  11. package/build/coverage/analyze.d.ts +13 -0
  12. package/build/coverage/analyze.js +49 -0
  13. package/build/coverage/analyze.js.map +1 -0
  14. package/build/coverage/baseline.d.ts +8 -0
  15. package/build/coverage/baseline.js +91 -0
  16. package/build/coverage/baseline.js.map +1 -0
  17. package/build/coverage/compare.d.ts +6 -0
  18. package/build/coverage/compare.js +129 -0
  19. package/build/coverage/compare.js.map +1 -0
  20. package/build/coverage/discover.d.ts +7 -0
  21. package/build/coverage/discover.js +168 -0
  22. package/build/coverage/discover.js.map +1 -0
  23. package/build/coverage/report.d.ts +6 -0
  24. package/build/coverage/report.js +93 -0
  25. package/build/coverage/report.js.map +1 -0
  26. package/build/coverage/types.d.ts +70 -0
  27. package/build/coverage/types.js +14 -0
  28. package/build/coverage/types.js.map +1 -0
  29. package/build/executor/gws.d.ts +2 -0
  30. package/build/executor/gws.js +2 -2
  31. package/build/executor/gws.js.map +1 -1
  32. package/build/factory/manifest.yaml +177 -3
  33. package/build/factory/patches.js +2 -0
  34. package/build/factory/patches.js.map +1 -1
  35. package/build/server/handler.js +36 -3
  36. package/build/server/handler.js.map +1 -1
  37. package/build/server/handlers/calendar.js +8 -4
  38. package/build/server/handlers/calendar.js.map +1 -1
  39. package/build/server/handlers/drive.js +0 -16
  40. package/build/server/handlers/drive.js.map +1 -1
  41. package/build/server/scratchpad/adapters/send-email-draft.js +11 -3
  42. package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
  43. package/build/server/scratchpad/adapters/send-email.js +8 -2
  44. package/build/server/scratchpad/adapters/send-email.js.map +1 -1
  45. package/build/server/session/context.d.ts +7 -0
  46. package/build/server/session/context.js +56 -0
  47. package/build/server/session/context.js.map +1 -0
  48. package/build/server/session/index.d.ts +9 -0
  49. package/build/server/session/index.js +14 -0
  50. package/build/server/session/index.js.map +1 -0
  51. package/build/server/session/tracker.d.ts +36 -0
  52. package/build/server/session/tracker.js +135 -0
  53. package/build/server/session/tracker.js.map +1 -0
  54. package/build/services/calendar/patch.js +4 -2
  55. package/build/services/calendar/patch.js.map +1 -1
  56. package/build/services/docs/patch.d.ts +8 -0
  57. package/build/services/docs/patch.js +72 -0
  58. package/build/services/docs/patch.js.map +1 -0
  59. package/build/services/drive/patch.js +165 -10
  60. package/build/services/drive/patch.js.map +1 -1
  61. package/build/services/gmail/patch.js +12 -7
  62. package/build/services/gmail/patch.js.map +1 -1
  63. package/package.json +2 -2
@@ -287,9 +287,12 @@ services:
287
287
 
288
288
  list:
289
289
  type: list
290
- description: "upcoming events on primary calendar"
290
+ description: "upcoming events defaults to primary calendar, use calendarId to target a specific calendar (use 'calendars' operation to discover IDs)"
291
291
  resource: events.list
292
292
  params:
293
+ calendarId:
294
+ type: string
295
+ description: "Calendar ID to query (default: 'primary'). Use 'calendars' operation to list available IDs."
293
296
  timeMin:
294
297
  type: string
295
298
  description: "Start of range (ISO 8601) — defaults to today"
@@ -320,6 +323,9 @@ services:
320
323
  description: "full event details by ID"
321
324
  resource: events.get
322
325
  params:
326
+ calendarId:
327
+ type: string
328
+ description: "Calendar ID (default: 'primary')"
323
329
  eventId:
324
330
  type: string
325
331
  description: "Event ID"
@@ -334,6 +340,9 @@ services:
334
340
  description: "create a new calendar event"
335
341
  helper: "+insert"
336
342
  params:
343
+ calendarId:
344
+ type: string
345
+ description: "Calendar ID (default: 'primary')"
337
346
  summary:
338
347
  type: string
339
348
  description: "Event title"
@@ -356,6 +365,7 @@ services:
356
365
  type: string
357
366
  description: "Comma-separated attendee emails"
358
367
  cli_args:
368
+ calendarId: "--calendar"
359
369
  summary: "--summary"
360
370
  start: "--start"
361
371
  end: "--end"
@@ -368,6 +378,9 @@ services:
368
378
  description: "create event from natural language (e.g. 'Lunch with Alice tomorrow at noon')"
369
379
  resource: events.quickAdd
370
380
  params:
381
+ calendarId:
382
+ type: string
383
+ description: "Calendar ID (default: 'primary')"
371
384
  text:
372
385
  type: string
373
386
  description: "Natural language event description"
@@ -380,6 +393,9 @@ services:
380
393
  description: "update an existing event (patch semantics — only changed fields needed)"
381
394
  resource: events.patch
382
395
  params:
396
+ calendarId:
397
+ type: string
398
+ description: "Calendar ID (default: 'primary')"
383
399
  eventId:
384
400
  type: string
385
401
  description: "Event ID to update"
@@ -407,6 +423,9 @@ services:
407
423
  description: "delete an event"
408
424
  resource: events.delete
409
425
  params:
426
+ calendarId:
427
+ type: string
428
+ description: "Calendar ID (default: 'primary')"
410
429
  eventId:
411
430
  type: string
412
431
  description: "Event ID to delete"
@@ -437,7 +456,7 @@ services:
437
456
 
438
457
  drive:
439
458
  tool_name: manage_drive
440
- description: "Search, upload, download, share, or manage files in Google Drive."
459
+ description: "Search, upload, download, share, comment on, or manage files in Google Drive."
441
460
  requires_email: true
442
461
  gws_service: drive
443
462
  operations:
@@ -461,6 +480,8 @@ services:
461
480
  maps_to: pageSize
462
481
  defaults:
463
482
  fields: "files(id, name, mimeType, modifiedTime, size, webViewLink)"
483
+ supportsAllDrives: true
484
+ includeItemsFromAllDrives: true
464
485
 
465
486
  get:
466
487
  type: detail
@@ -473,6 +494,7 @@ services:
473
494
  required: true
474
495
  defaults:
475
496
  fields: "id, name, mimeType, modifiedTime, size, webViewLink, owners, shared, parents"
497
+ supportsAllDrives: true
476
498
 
477
499
  # --- File operations ---
478
500
 
@@ -504,6 +526,8 @@ services:
504
526
  type: string
505
527
  description: "File ID of the image to view"
506
528
  required: true
529
+ defaults:
530
+ supportsAllDrives: true
507
531
 
508
532
  download:
509
533
  type: detail
@@ -519,6 +543,7 @@ services:
519
543
  description: "Local path to save the file"
520
544
  defaults:
521
545
  alt: media
546
+ supportsAllDrives: true
522
547
 
523
548
  copy:
524
549
  type: action
@@ -532,6 +557,8 @@ services:
532
557
  name:
533
558
  type: string
534
559
  description: "Name for the copy"
560
+ defaults:
561
+ supportsAllDrives: true
535
562
 
536
563
  delete:
537
564
  type: action
@@ -542,6 +569,8 @@ services:
542
569
  type: string
543
570
  description: "File ID to delete"
544
571
  required: true
572
+ defaults:
573
+ supportsAllDrives: true
545
574
 
546
575
  export:
547
576
  type: action
@@ -559,6 +588,8 @@ services:
559
588
  outputPath:
560
589
  type: string
561
590
  description: "Local path to save exported file"
591
+ defaults:
592
+ supportsAllDrives: true
562
593
 
563
594
  # --- Sharing ---
564
595
 
@@ -571,6 +602,8 @@ services:
571
602
  type: string
572
603
  description: "File ID"
573
604
  required: true
605
+ defaults:
606
+ supportsAllDrives: true
574
607
 
575
608
  share:
576
609
  type: action
@@ -590,6 +623,8 @@ services:
590
623
  description: "Permission level"
591
624
  enum: [reader, commenter, writer, organizer]
592
625
  default: reader
626
+ defaults:
627
+ supportsAllDrives: true
593
628
 
594
629
  unshare:
595
630
  type: action
@@ -604,6 +639,105 @@ services:
604
639
  type: string
605
640
  description: "Permission ID to remove (from listPermissions)"
606
641
  required: true
642
+ defaults:
643
+ supportsAllDrives: true
644
+
645
+ # --- Comments ---
646
+
647
+ listComments:
648
+ type: list
649
+ description: "list comments on a file"
650
+ resource: comments.list
651
+ params:
652
+ fileId:
653
+ type: string
654
+ description: "File ID"
655
+ required: true
656
+ includeDeleted:
657
+ type: boolean
658
+ description: "Include deleted comments (default: false)"
659
+ defaults:
660
+ fields: "comments(id, content, htmlContent, author(displayName, emailAddress), createdTime, modifiedTime, resolved, quotedFileContent, replies(id, content, htmlContent, author(displayName), createdTime)), nextPageToken"
661
+ supportsAllDrives: true
662
+
663
+ getComment:
664
+ type: detail
665
+ description: "get a specific comment by ID"
666
+ resource: comments.get
667
+ params:
668
+ fileId:
669
+ type: string
670
+ description: "File ID"
671
+ required: true
672
+ commentId:
673
+ type: string
674
+ description: "Comment ID"
675
+ required: true
676
+ defaults:
677
+ fields: "id, content, htmlContent, author(displayName, emailAddress), createdTime, modifiedTime, resolved, quotedFileContent, replies(id, content, htmlContent, author(displayName), createdTime)"
678
+ supportsAllDrives: true
679
+
680
+ addComment:
681
+ type: action
682
+ description: "add a comment to a file (optionally anchored to quoted text)"
683
+ resource: comments.create
684
+ params:
685
+ fileId:
686
+ type: string
687
+ description: "File ID"
688
+ required: true
689
+ content:
690
+ type: string
691
+ description: "Comment text"
692
+ required: true
693
+ quotedText:
694
+ type: string
695
+ description: "Text to anchor the comment to (optional — if provided, comment is anchored to first occurrence)"
696
+ defaults:
697
+ fields: "id, content, htmlContent, author(displayName), createdTime, quotedFileContent"
698
+ supportsAllDrives: true
699
+
700
+ resolveComment:
701
+ type: action
702
+ description: "resolve or reopen a comment"
703
+ resource: comments.update
704
+ params:
705
+ fileId:
706
+ type: string
707
+ description: "File ID"
708
+ required: true
709
+ commentId:
710
+ type: string
711
+ description: "Comment ID"
712
+ required: true
713
+ resolved:
714
+ type: boolean
715
+ description: "true to resolve, false to reopen"
716
+ required: true
717
+ defaults:
718
+ fields: "id, content, resolved"
719
+ supportsAllDrives: true
720
+
721
+ replyToComment:
722
+ type: action
723
+ description: "reply to an existing comment"
724
+ resource: replies.create
725
+ params:
726
+ fileId:
727
+ type: string
728
+ description: "File ID"
729
+ required: true
730
+ commentId:
731
+ type: string
732
+ description: "Comment ID to reply to"
733
+ required: true
734
+ content:
735
+ type: string
736
+ description: "Reply text"
737
+ required: true
738
+ defaults:
739
+ fields: "id, content, htmlContent, author(displayName), createdTime"
740
+ supportsAllDrives: true
607
741
 
608
742
  # ========================================================================
609
743
  # Sheets
@@ -702,7 +836,7 @@ services:
702
836
 
703
837
  docs:
704
838
  tool_name: manage_docs
705
- description: "Read and write Google Docs documents."
839
+ description: "Read, write, insert, and find-replace text in Google Docs documents."
706
840
  requires_email: true
707
841
  gws_service: docs
708
842
  operations:
@@ -739,6 +873,46 @@ services:
739
873
  documentId: "--document"
740
874
  text: "--text"
741
875
 
876
+ insertText:
877
+ type: action
878
+ description: "insert text at a specific position in a document"
879
+ resource: documents.batchUpdate
880
+ params:
881
+ documentId:
882
+ type: string
883
+ description: "Document ID"
884
+ required: true
885
+ text:
886
+ type: string
887
+ description: "Text to insert"
888
+ required: true
889
+ index:
890
+ type: number
891
+ description: "Character index to insert at (1 = start of document body)"
892
+ required: true
893
+
894
+ replaceText:
895
+ type: action
896
+ description: "find and replace text in a document"
897
+ resource: documents.batchUpdate
898
+ params:
899
+ documentId:
900
+ type: string
901
+ description: "Document ID"
902
+ required: true
903
+ findText:
904
+ type: string
905
+ description: "Text to find"
906
+ required: true
907
+ replaceWith:
908
+ type: string
909
+ description: "Replacement text"
910
+ required: true
911
+ matchCase:
912
+ type: boolean
913
+ description: "Case-sensitive match (default: true)"
914
+ default: true
915
+
742
916
  # ========================================================================
743
917
  # Tasks
744
918
  # ========================================================================
@@ -5,11 +5,13 @@
5
5
  import { gmailPatch } from '../services/gmail/patch.js';
6
6
  import { calendarPatch } from '../services/calendar/patch.js';
7
7
  import { drivePatch } from '../services/drive/patch.js';
8
+ import { docsPatch } from '../services/docs/patch.js';
8
9
  import { meetPatch } from '../services/meet/patch.js';
9
10
  export const patches = {
10
11
  gmail: gmailPatch,
11
12
  calendar: calendarPatch,
12
13
  drive: drivePatch,
14
+ docs: docsPatch,
13
15
  meet: meetPatch,
14
16
  };
15
17
  //# sourceMappingURL=patches.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patches.js","sourceRoot":"","sources":["../../src/factory/patches.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,MAAM,CAAC,MAAM,OAAO,GAAiC;IACnD,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;CAChB,CAAC"}
1
+ {"version":3,"file":"patches.js","sourceRoot":"","sources":["../../src/factory/patches.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,MAAM,CAAC,MAAM,OAAO,GAAiC;IACnD,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;CAChB,CAAC"}
@@ -3,6 +3,7 @@ import { handleWorkspace } from './handlers/workspace.js';
3
3
  import { handleScratchpad } from './scratchpad/handler.js';
4
4
  import { handleQueue } from './queue.js';
5
5
  import { generatedTools } from '../factory/registry.js';
6
+ import { getSessionTracker, sessionContext } from './session/index.js';
6
7
  // ── Epoch counter ─────────────────────────────────────────
7
8
  // Server-wide monotonic counter incremented on every tool call.
8
9
  // Used by ScratchpadManager for activity-based garbage collection.
@@ -26,15 +27,47 @@ for (const tool of generatedTools) {
26
27
  domainHandlers[tool.schema.name] = tool.handler;
27
28
  }
28
29
  export async function handleToolCall(toolName, params) {
29
- advanceEpoch();
30
+ const currentEpoch = advanceEpoch();
31
+ const tracker = getSessionTracker();
30
32
  // Queue wraps the domain handlers (each queued op also advances the epoch)
31
33
  if (toolName === 'queue_operations') {
32
- return handleQueue(params, domainHandlers);
34
+ const result = await handleQueue(params, domainHandlers);
35
+ const queueEmail = extractEmailFromQueue(params);
36
+ if (queueEmail) {
37
+ await tracker.ensureBaseline(queueEmail, currentEpoch);
38
+ tracker.refresh(queueEmail, currentEpoch);
39
+ const ctx = sessionContext(toolName, queueEmail, tracker);
40
+ if (ctx)
41
+ result.text += ctx;
42
+ }
43
+ return result;
33
44
  }
34
45
  const handler = domainHandlers[toolName];
35
46
  if (!handler) {
36
47
  throw new Error(`Unknown tool: ${toolName}`);
37
48
  }
38
- return handler(params);
49
+ const email = typeof params.email === 'string' ? params.email : undefined;
50
+ if (email) {
51
+ await tracker.ensureBaseline(email, currentEpoch);
52
+ }
53
+ const result = await handler(params);
54
+ if (email) {
55
+ tracker.refresh(email, currentEpoch);
56
+ const ctx = sessionContext(toolName, email, tracker);
57
+ if (ctx)
58
+ result.text += ctx;
59
+ }
60
+ return result;
61
+ }
62
+ /** Extract email from the first queue operation that has one. */
63
+ function extractEmailFromQueue(params) {
64
+ const operations = params.operations;
65
+ if (!Array.isArray(operations))
66
+ return undefined;
67
+ for (const op of operations) {
68
+ if (typeof op.args?.email === 'string')
69
+ return op.args.email;
70
+ }
71
+ return undefined;
39
72
  }
40
73
  //# sourceMappingURL=handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOxD,6DAA6D;AAC7D,gEAAgE;AAChE,mEAAmE;AAEnE,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,2BAA2B;AAC3B,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,KAAK,CAAC;AACjB,CAAC;AAED,6DAA6D;AAE7D,MAAM,cAAc,GAAgC;IAClD,eAAe,EAAE,cAAc;IAC/B,gBAAgB,EAAE,eAAe;IACjC,iBAAiB,EAAE,gBAAgB;CACpC,CAAC;AAEF,sCAAsC;AACtC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;IAClC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAA+B;IAE/B,YAAY,EAAE,CAAC;IAEf,2EAA2E;IAC3E,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"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"}
@@ -9,10 +9,11 @@ export async function handleCalendar(params) {
9
9
  case 'list': {
10
10
  const now = new Date();
11
11
  const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).toISOString();
12
+ const calendarId = params.calendarId || 'primary';
12
13
  const result = await execute([
13
14
  'calendar', 'events', 'list',
14
15
  '--params', JSON.stringify({
15
- calendarId: 'primary',
16
+ calendarId,
16
17
  timeMin: params.timeMin || todayStart,
17
18
  timeMax: params.timeMax || undefined,
18
19
  maxResults: clamp(params.maxResults, 10, 50),
@@ -45,7 +46,8 @@ export async function handleCalendar(params) {
45
46
  const summary = requireString(params, 'summary');
46
47
  const start = requireString(params, 'start');
47
48
  const end = requireString(params, 'end');
48
- const args = ['calendar', '+insert', '--summary', summary, '--start', start, '--end', end];
49
+ const calendarId = params.calendarId || 'primary';
50
+ const args = ['calendar', '+insert', '--calendar', calendarId, '--summary', summary, '--start', start, '--end', end];
49
51
  if (params.description)
50
52
  args.push('--description', String(params.description));
51
53
  if (params.location)
@@ -65,9 +67,10 @@ export async function handleCalendar(params) {
65
67
  }
66
68
  case 'get': {
67
69
  const eventId = requireString(params, 'eventId');
70
+ const calendarId = params.calendarId || 'primary';
68
71
  const result = await execute([
69
72
  'calendar', 'events', 'get',
70
- '--params', JSON.stringify({ calendarId: 'primary', eventId }),
73
+ '--params', JSON.stringify({ calendarId, eventId }),
71
74
  ], { account: email });
72
75
  const formatted = formatEventDetail(result.data);
73
76
  return {
@@ -77,9 +80,10 @@ export async function handleCalendar(params) {
77
80
  }
78
81
  case 'delete': {
79
82
  const eventId = requireString(params, 'eventId');
83
+ const calendarId = params.calendarId || 'primary';
80
84
  await execute([
81
85
  'calendar', 'events', 'delete',
82
- '--params', JSON.stringify({ calendarId: 'primary', eventId }),
86
+ '--params', JSON.stringify({ calendarId, eventId }),
83
87
  ], { account: email });
84
88
  return {
85
89
  text: `Event deleted: ${eventId}` + nextSteps('calendar', 'delete', { email }),
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/server/handlers/calendar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/server/handlers/calendar.ts"],"names":[],"mappings":"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"}
@@ -51,22 +51,6 @@ export async function handleDrive(params) {
51
51
  refs: { id: data.id, fileId: data.id, name: data.name },
52
52
  };
53
53
  }
54
- case 'download': {
55
- const fileId = requireString(params, 'fileId');
56
- const args = [
57
- 'drive', 'files', 'get',
58
- '--params', JSON.stringify({ fileId, alt: 'media' }),
59
- ];
60
- if (params.outputPath)
61
- args.push('--output', String(params.outputPath));
62
- await execute(args, { account: email });
63
- return {
64
- text: `File downloaded: ${fileId}` +
65
- (params.outputPath ? ` → ${params.outputPath}` : '') +
66
- nextSteps('drive', 'download', { email }),
67
- refs: { fileId, status: 'downloaded' },
68
- };
69
- }
70
54
  default:
71
55
  throw new Error(`Unknown drive operation: ${operation}`);
72
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/server/handlers/drive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/server/handlers/drive.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,9 @@
2
2
  * Send adapter: email_draft — creates a Gmail draft from scratchpad content.
3
3
  * Uses gws +send --draft for proper MIME construction and attachment support.
4
4
  */
5
+ import * as path from 'node:path';
5
6
  import { execute } from '../../../executor/gws.js';
7
+ import { getWorkspaceDir } from '../../../executor/workspace.js';
6
8
  export async function sendEmailDraft(scratchpads, scratchpadId, targetParams) {
7
9
  const content = scratchpads.getContent(scratchpadId);
8
10
  if (content === null) {
@@ -27,11 +29,17 @@ export async function sendEmailDraft(scratchpads, scratchpadId, targetParams) {
27
29
  const attachmentPaths = attachments
28
30
  ? [...attachments.values()].filter(a => a.location).map(a => a.location)
29
31
  : [];
30
- for (const p of attachmentPaths) {
31
- args.push('--attach', p);
32
+ // gws validates --attach paths are within cwd, so set cwd to workspace dir
33
+ let execOptions = { account: email };
34
+ if (attachmentPaths.length > 0) {
35
+ const wsDir = getWorkspaceDir();
36
+ for (const p of attachmentPaths) {
37
+ args.push('--attach', path.relative(wsDir, p));
38
+ }
39
+ execOptions = { account: email, cwd: wsDir };
32
40
  }
33
41
  try {
34
- const result = await execute(args, { account: email });
42
+ const result = await execute(args, execOptions);
35
43
  const data = result.data;
36
44
  const draftId = data.id ?? 'unknown';
37
45
  const attNote = attachmentPaths.length > 0
@@ -1 +1 @@
1
- {"version":3,"file":"send-email-draft.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email-draft.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAUnD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAA8B,EAC9B,YAAoB,EACpB,YAAoC;IAEpC,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,EAAE,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,yDAAyD,YAAY,mBAAmB;YAC9F,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,OAAO,EAAE,SAAS;QAC3B,MAAM,EAAE,EAAE,IAAI,KAAK;QACnB,WAAW,EAAE,OAAO,IAAI,SAAS;QACjC,QAAQ,EAAE,OAAO;KAClB,CAAC;IAEF,uDAAuD;IACvD,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,WAAW;QACjC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxE,CAAC,CAAC,EAAE,CAAC;IACP,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC;QACrC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,sBAAsB,eAAe,CAAC,MAAM,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;YACL,IAAI,EAAE,mCAAmC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE;YACvI,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;SAChC,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"}
1
+ {"version":3,"file":"send-email-draft.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email-draft.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@
3
3
  * When attachments are present, creates a draft (with --attach and --draft flags)
4
4
  * so the agent can review before sending. Without attachments, sends directly.
5
5
  */
6
+ import * as path from 'node:path';
6
7
  import { execute } from '../../../executor/gws.js';
8
+ import { getWorkspaceDir } from '../../../executor/workspace.js';
7
9
  import { nextSteps } from '../../formatting/next-steps.js';
8
10
  export async function sendEmail(scratchpads, scratchpadId, targetParams) {
9
11
  const content = scratchpads.getContent(scratchpadId);
@@ -27,13 +29,17 @@ export async function sendEmail(scratchpads, scratchpadId, targetParams) {
27
29
  if (bcc)
28
30
  args.push('--bcc', bcc);
29
31
  // Attachments present → create draft (gws handles MIME + upload endpoint, 35MB limit)
32
+ // gws validates --attach paths are within cwd, so set cwd to workspace dir
33
+ let execOptions = { account: email };
30
34
  if (attachmentPaths.length > 0) {
35
+ const wsDir = getWorkspaceDir();
31
36
  args.push('--draft');
32
37
  for (const p of attachmentPaths) {
33
- args.push('--attach', p);
38
+ args.push('--attach', path.relative(wsDir, p));
34
39
  }
40
+ execOptions = { account: email, cwd: wsDir };
35
41
  }
36
- const result = await execute(args, { account: email });
42
+ const result = await execute(args, execOptions);
37
43
  const data = result.data;
38
44
  if (attachmentPaths.length > 0) {
39
45
  const attNote = ` (${attachmentPaths.length} attachment(s))`;
@@ -1 +1 @@
1
- {"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Session context formatter — builds a markdown footer with ambient
3
+ * workspace awareness (email deltas, next calendar event).
4
+ */
5
+ import type { SessionTracker } from './tracker.js';
6
+ /** Format the session context footer for a tool response. */
7
+ export declare function sessionContext(_toolName: string, email: string | undefined, tracker: SessionTracker): string;