@aaronsb/google-workspace-mcp 2.7.0 → 3.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 (142) hide show
  1. package/README.md +21 -10
  2. package/build/factory/generator.d.ts +0 -2
  3. package/build/factory/generator.js +32 -27
  4. package/build/factory/generator.js.map +1 -1
  5. package/build/factory/manifest/gmail.yaml +24 -2
  6. package/build/factory/registry.d.ts +2 -3
  7. package/build/factory/registry.js +3 -9
  8. package/build/factory/registry.js.map +1 -1
  9. package/build/index.js +27 -1
  10. package/build/index.js.map +1 -1
  11. package/build/node-floor.d.ts +16 -0
  12. package/build/node-floor.js +73 -0
  13. package/build/node-floor.js.map +1 -0
  14. package/build/services/gmail/patch.js +67 -3
  15. package/build/services/gmail/patch.js.map +1 -1
  16. package/build/version.d.ts +1 -1
  17. package/build/version.js +2 -2
  18. package/build/version.js.map +1 -1
  19. package/package.json +17 -10
  20. package/build/__helpers__/testSetup.d.ts +0 -1
  21. package/build/__helpers__/testSetup.js +0 -6
  22. package/build/__helpers__/testSetup.js.map +0 -1
  23. package/build/__tests__/accounts/credentials.test.d.ts +0 -1
  24. package/build/__tests__/accounts/credentials.test.js +0 -127
  25. package/build/__tests__/accounts/credentials.test.js.map +0 -1
  26. package/build/__tests__/accounts/oauth.test.d.ts +0 -1
  27. package/build/__tests__/accounts/oauth.test.js +0 -71
  28. package/build/__tests__/accounts/oauth.test.js.map +0 -1
  29. package/build/__tests__/accounts/registry.test.d.ts +0 -1
  30. package/build/__tests__/accounts/registry.test.js +0 -74
  31. package/build/__tests__/accounts/registry.test.js.map +0 -1
  32. package/build/__tests__/accounts/token-service.test.d.ts +0 -1
  33. package/build/__tests__/accounts/token-service.test.js +0 -126
  34. package/build/__tests__/accounts/token-service.test.js.map +0 -1
  35. package/build/__tests__/executor/errors.test.d.ts +0 -1
  36. package/build/__tests__/executor/errors.test.js +0 -42
  37. package/build/__tests__/executor/errors.test.js.map +0 -1
  38. package/build/__tests__/executor/gws.test.d.ts +0 -1
  39. package/build/__tests__/executor/gws.test.js +0 -187
  40. package/build/__tests__/executor/gws.test.js.map +0 -1
  41. package/build/__tests__/executor/paths.test.d.ts +0 -1
  42. package/build/__tests__/executor/paths.test.js +0 -60
  43. package/build/__tests__/executor/paths.test.js.map +0 -1
  44. package/build/__tests__/executor/resolve-binary.test.d.ts +0 -1
  45. package/build/__tests__/executor/resolve-binary.test.js +0 -58
  46. package/build/__tests__/executor/resolve-binary.test.js.map +0 -1
  47. package/build/__tests__/executor/workspace.test.d.ts +0 -1
  48. package/build/__tests__/executor/workspace.test.js +0 -143
  49. package/build/__tests__/executor/workspace.test.js.map +0 -1
  50. package/build/__tests__/factory/calendar-patch.test.d.ts +0 -5
  51. package/build/__tests__/factory/calendar-patch.test.js +0 -269
  52. package/build/__tests__/factory/calendar-patch.test.js.map +0 -1
  53. package/build/__tests__/factory/drive-patch.test.d.ts +0 -5
  54. package/build/__tests__/factory/drive-patch.test.js +0 -344
  55. package/build/__tests__/factory/drive-patch.test.js.map +0 -1
  56. package/build/__tests__/factory/generator.test.d.ts +0 -1
  57. package/build/__tests__/factory/generator.test.js +0 -240
  58. package/build/__tests__/factory/generator.test.js.map +0 -1
  59. package/build/__tests__/factory/patch-coverage.test.d.ts +0 -10
  60. package/build/__tests__/factory/patch-coverage.test.js +0 -182
  61. package/build/__tests__/factory/patch-coverage.test.js.map +0 -1
  62. package/build/__tests__/factory/safety.test.d.ts +0 -1
  63. package/build/__tests__/factory/safety.test.js +0 -107
  64. package/build/__tests__/factory/safety.test.js.map +0 -1
  65. package/build/__tests__/factory/sheets-patch.test.d.ts +0 -6
  66. package/build/__tests__/factory/sheets-patch.test.js +0 -498
  67. package/build/__tests__/factory/sheets-patch.test.js.map +0 -1
  68. package/build/__tests__/integration/executor.test.d.ts +0 -5
  69. package/build/__tests__/integration/executor.test.js +0 -38
  70. package/build/__tests__/integration/executor.test.js.map +0 -1
  71. package/build/__tests__/integration/handlers.test.d.ts +0 -6
  72. package/build/__tests__/integration/handlers.test.js +0 -95
  73. package/build/__tests__/integration/handlers.test.js.map +0 -1
  74. package/build/__tests__/integration/setup.d.ts +0 -19
  75. package/build/__tests__/integration/setup.js +0 -61
  76. package/build/__tests__/integration/setup.js.map +0 -1
  77. package/build/__tests__/server/formatting/html-sanitize.test.d.ts +0 -7
  78. package/build/__tests__/server/formatting/html-sanitize.test.js +0 -174
  79. package/build/__tests__/server/formatting/html-sanitize.test.js.map +0 -1
  80. package/build/__tests__/server/formatting/markdown.test.d.ts +0 -1
  81. package/build/__tests__/server/formatting/markdown.test.js +0 -259
  82. package/build/__tests__/server/formatting/markdown.test.js.map +0 -1
  83. package/build/__tests__/server/formatting/next-steps.test.d.ts +0 -1
  84. package/build/__tests__/server/formatting/next-steps.test.js +0 -42
  85. package/build/__tests__/server/formatting/next-steps.test.js.map +0 -1
  86. package/build/__tests__/server/handler.test.d.ts +0 -1
  87. package/build/__tests__/server/handler.test.js +0 -97
  88. package/build/__tests__/server/handler.test.js.map +0 -1
  89. package/build/__tests__/server/handlers/__mocks__/executor.d.ts +0 -173
  90. package/build/__tests__/server/handlers/__mocks__/executor.js +0 -135
  91. package/build/__tests__/server/handlers/__mocks__/executor.js.map +0 -1
  92. package/build/__tests__/server/handlers/accounts.test.d.ts +0 -1
  93. package/build/__tests__/server/handlers/accounts.test.js +0 -129
  94. package/build/__tests__/server/handlers/accounts.test.js.map +0 -1
  95. package/build/__tests__/server/handlers/calendar.test.d.ts +0 -1
  96. package/build/__tests__/server/handlers/calendar.test.js +0 -96
  97. package/build/__tests__/server/handlers/calendar.test.js.map +0 -1
  98. package/build/__tests__/server/handlers/drive.test.d.ts +0 -1
  99. package/build/__tests__/server/handlers/drive.test.js +0 -68
  100. package/build/__tests__/server/handlers/drive.test.js.map +0 -1
  101. package/build/__tests__/server/handlers/email.test.d.ts +0 -1
  102. package/build/__tests__/server/handlers/email.test.js +0 -99
  103. package/build/__tests__/server/handlers/email.test.js.map +0 -1
  104. package/build/__tests__/server/handlers/validate.test.d.ts +0 -1
  105. package/build/__tests__/server/handlers/validate.test.js +0 -88
  106. package/build/__tests__/server/handlers/validate.test.js.map +0 -1
  107. package/build/__tests__/server/queue.test.d.ts +0 -1
  108. package/build/__tests__/server/queue.test.js +0 -199
  109. package/build/__tests__/server/queue.test.js.map +0 -1
  110. package/build/__tests__/server/server.test.d.ts +0 -7
  111. package/build/__tests__/server/server.test.js +0 -135
  112. package/build/__tests__/server/server.test.js.map +0 -1
  113. package/build/__tests__/server/session/context.test.d.ts +0 -1
  114. package/build/__tests__/server/session/context.test.js +0 -101
  115. package/build/__tests__/server/session/context.test.js.map +0 -1
  116. package/build/__tests__/server/session/tracker.test.d.ts +0 -1
  117. package/build/__tests__/server/session/tracker.test.js +0 -146
  118. package/build/__tests__/server/session/tracker.test.js.map +0 -1
  119. package/build/__tests__/server/tools.test.d.ts +0 -1
  120. package/build/__tests__/server/tools.test.js +0 -91
  121. package/build/__tests__/server/tools.test.js.map +0 -1
  122. package/build/__tests__/services/gmail/mime.test.d.ts +0 -1
  123. package/build/__tests__/services/gmail/mime.test.js +0 -23
  124. package/build/__tests__/services/gmail/mime.test.js.map +0 -1
  125. package/build/__tests__/services/meet/patch.test.d.ts +0 -4
  126. package/build/__tests__/services/meet/patch.test.js +0 -374
  127. package/build/__tests__/services/meet/patch.test.js.map +0 -1
  128. package/build/server/scratchpad/__tests__/docs-sync-integration.test.d.ts +0 -11
  129. package/build/server/scratchpad/__tests__/docs-sync-integration.test.js +0 -187
  130. package/build/server/scratchpad/__tests__/docs-sync-integration.test.js.map +0 -1
  131. package/build/server/scratchpad/__tests__/docs-sync.test.d.ts +0 -16
  132. package/build/server/scratchpad/__tests__/docs-sync.test.js +0 -213
  133. package/build/server/scratchpad/__tests__/docs-sync.test.js.map +0 -1
  134. package/build/server/scratchpad/__tests__/json-path.test.d.ts +0 -4
  135. package/build/server/scratchpad/__tests__/json-path.test.js +0 -121
  136. package/build/server/scratchpad/__tests__/json-path.test.js.map +0 -1
  137. package/build/server/scratchpad/__tests__/manager.test.d.ts +0 -5
  138. package/build/server/scratchpad/__tests__/manager.test.js +0 -886
  139. package/build/server/scratchpad/__tests__/manager.test.js.map +0 -1
  140. package/build/server/scratchpad/__tests__/validate.test.d.ts +0 -4
  141. package/build/server/scratchpad/__tests__/validate.test.js +0 -112
  142. package/build/server/scratchpad/__tests__/validate.test.js.map +0 -1
@@ -1,135 +0,0 @@
1
- /**
2
- * Shared executor mock for handler tests.
3
- *
4
- * Provides typed mock responses matching gws output contracts
5
- * so handlers can be tested without spawning subprocesses.
6
- */
7
- // Mock the executor module
8
- jest.mock('../../../../executor/gws.js');
9
- import { execute } from '../../../../executor/gws.js';
10
- export const mockExecute = execute;
11
- export function mockGwsResponse(data) {
12
- return { success: true, data, stderr: '' };
13
- }
14
- // --- Gmail contract responses ---
15
- export const gmailTriageResponse = {
16
- messages: [
17
- { id: 'msg-1', from: 'alice@test.com', subject: 'Hello', date: 'Mon, 10 Mar 2026 10:00:00 -0500' },
18
- { id: 'msg-2', from: 'bob@test.com', subject: 'Meeting', date: 'Mon, 10 Mar 2026 11:00:00 -0500' },
19
- ],
20
- };
21
- export const gmailMessageListResponse = {
22
- messages: [
23
- { id: 'msg-1', threadId: 'thread-1' },
24
- { id: 'msg-2', threadId: 'thread-2' },
25
- ],
26
- };
27
- // Metadata responses for hydration (format: metadata)
28
- export function gmailMetadataResponse(id, from, subject, date) {
29
- return {
30
- id,
31
- threadId: `thread-${id}`,
32
- snippet: `Preview of ${subject}`,
33
- payload: {
34
- headers: [
35
- { name: 'From', value: from },
36
- { name: 'Subject', value: subject },
37
- { name: 'Date', value: date },
38
- ],
39
- },
40
- };
41
- }
42
- export const gmailMessageDetailResponse = {
43
- id: 'msg-1',
44
- threadId: 'thread-1',
45
- snippet: 'Preview text...',
46
- labelIds: ['INBOX'],
47
- payload: {
48
- headers: [
49
- { name: 'From', value: 'alice@test.com' },
50
- { name: 'To', value: 'user@test.com' },
51
- { name: 'Subject', value: 'Test Subject' },
52
- { name: 'Date', value: 'Mon, 10 Mar 2026 10:00:00 -0500' },
53
- ],
54
- },
55
- };
56
- export const gmailSendResponse = {
57
- id: 'sent-1',
58
- threadId: 'thread-new',
59
- labelIds: ['SENT'],
60
- };
61
- // --- Calendar contract responses ---
62
- export const calendarAgendaResponse = {
63
- events: [
64
- { calendar: 'user@test.com', summary: 'Standup', start: '2026-03-14T09:00:00Z', end: '2026-03-14T09:30:00Z' },
65
- ],
66
- timeMin: '2026-03-14T00:00:00Z',
67
- timeMax: '2026-03-14T23:59:59Z',
68
- };
69
- export const calendarEventsListResponse = {
70
- items: [
71
- { id: 'evt-1', summary: 'Standup', start: { dateTime: '2026-03-14T09:00:00Z' }, end: { dateTime: '2026-03-14T09:30:00Z' }, status: 'confirmed', attendees: [] },
72
- { id: 'evt-2', summary: 'Lunch', start: { dateTime: '2026-03-14T12:00:00Z' }, end: { dateTime: '2026-03-14T13:00:00Z' }, status: 'confirmed' },
73
- ],
74
- };
75
- export const calendarEventDetailResponse = {
76
- id: 'evt-1',
77
- summary: 'Standup',
78
- start: { dateTime: '2026-03-14T09:00:00Z' },
79
- end: { dateTime: '2026-03-14T09:30:00Z' },
80
- status: 'confirmed',
81
- location: 'Room A',
82
- description: 'Daily standup',
83
- organizer: { email: 'user@test.com' },
84
- attendees: [{ email: 'alice@test.com', responseStatus: 'accepted' }],
85
- };
86
- export const calendarInsertResponse = {
87
- id: 'evt-new',
88
- summary: 'New Event',
89
- status: 'confirmed',
90
- htmlLink: 'https://calendar.google.com/event?eid=xxx',
91
- };
92
- export const calendarFreeBusyResponse = {
93
- calendars: {
94
- 'user@test.com': {
95
- busy: [
96
- { start: '2026-04-09T14:00:00Z', end: '2026-04-09T15:00:00Z' },
97
- { start: '2026-04-09T16:00:00Z', end: '2026-04-09T16:30:00Z' },
98
- ],
99
- },
100
- 'colleague@test.com': {
101
- busy: [],
102
- },
103
- },
104
- };
105
- export const calendarFreeBusyErrorResponse = {
106
- calendars: {
107
- 'user@test.com': { busy: [] },
108
- 'private@test.com': {
109
- errors: [{ domain: 'calendar', reason: 'notFound' }],
110
- },
111
- },
112
- };
113
- // --- Drive contract responses ---
114
- export const driveFileListResponse = {
115
- files: [
116
- { id: 'file-1', name: 'report.pdf', mimeType: 'application/pdf', modifiedTime: '2026-03-14T10:00:00Z', size: '1024', webViewLink: 'https://drive.google.com/file/d/file-1/view' },
117
- { id: 'file-2', name: 'notes.gdoc', mimeType: 'application/vnd.google-apps.document', modifiedTime: '2026-03-13T10:00:00Z' },
118
- ],
119
- };
120
- export const driveFileDetailResponse = {
121
- id: 'file-1',
122
- name: 'report.pdf',
123
- mimeType: 'application/pdf',
124
- modifiedTime: '2026-03-14T10:00:00Z',
125
- size: '1024',
126
- webViewLink: 'https://drive.google.com/file/d/file-1/view',
127
- owners: [{ emailAddress: 'user@test.com' }],
128
- shared: false,
129
- };
130
- export const driveUploadResponse = {
131
- id: 'file-new',
132
- name: 'uploaded.txt',
133
- mimeType: 'text/plain',
134
- };
135
- //# sourceMappingURL=executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../src/__tests__/server/handlers/__mocks__/executor.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,129 +0,0 @@
1
- // Mock registry before accounts handler imports it — avoids import.meta.url in Jest
2
- jest.mock('../../../factory/registry.js', () => {
3
- const { loadManifest, generateTools } = jest.requireActual('../../../factory/generator.js');
4
- const { patches } = jest.requireActual('../../../factory/patches.js');
5
- const manifest = loadManifest();
6
- return { manifest, generatedTools: generateTools(manifest, patches) };
7
- });
8
- import { handleAccounts } from '../../../server/handlers/accounts.js';
9
- // Mock dependencies
10
- jest.mock('../../../accounts/registry.js');
11
- jest.mock('../../../accounts/auth.js');
12
- jest.mock('../../../accounts/token-service.js');
13
- import { listAccounts, removeAccount } from '../../../accounts/registry.js';
14
- import { checkAccountStatus, reauthWithServices } from '../../../accounts/auth.js';
15
- import { getAccessToken, invalidateToken } from '../../../accounts/token-service.js';
16
- const mockListAccounts = listAccounts;
17
- const mockRemoveAccount = removeAccount;
18
- const mockCheckStatus = checkAccountStatus;
19
- const mockReauth = reauthWithServices;
20
- const mockGetAccessToken = getAccessToken;
21
- const mockInvalidateToken = invalidateToken;
22
- describe('handleAccounts', () => {
23
- beforeEach(() => jest.resetAllMocks());
24
- describe('list', () => {
25
- it('returns markdown account list', async () => {
26
- mockListAccounts.mockResolvedValue([
27
- { email: 'a@test.com', category: 'personal', hasCredential: true },
28
- { email: 'b@test.com', category: 'work', description: 'Work', hasCredential: false },
29
- ]);
30
- const result = await handleAccounts({ operation: 'list' });
31
- expect(result.text).toContain('## Accounts (2)');
32
- expect(result.text).toContain('[x] a@test.com');
33
- expect(result.text).toContain('[ ] b@test.com');
34
- expect(result.text).toContain('Work');
35
- expect(result.refs.count).toBe(2);
36
- });
37
- it('returns empty message when no accounts', async () => {
38
- mockListAccounts.mockResolvedValue([]);
39
- const result = await handleAccounts({ operation: 'list' });
40
- expect(result.text).toContain('No accounts configured');
41
- expect(result.refs.count).toBe(0);
42
- });
43
- });
44
- describe('remove', () => {
45
- it('removes account and returns confirmation', async () => {
46
- mockRemoveAccount.mockResolvedValue(undefined);
47
- const result = await handleAccounts({ operation: 'remove', email: 'a@test.com' });
48
- expect(result.text).toContain('Account removed: a@test.com');
49
- expect(mockRemoveAccount).toHaveBeenCalledWith('a@test.com');
50
- });
51
- it('requires email', async () => {
52
- await expect(handleAccounts({ operation: 'remove' })).rejects.toThrow('email is required');
53
- });
54
- });
55
- describe('status', () => {
56
- it('returns formatted account status', async () => {
57
- mockCheckStatus.mockResolvedValue({
58
- email: 'a@test.com',
59
- tokenValid: true,
60
- scopes: ['https://www.googleapis.com/auth/gmail.modify', 'https://www.googleapis.com/auth/drive'],
61
- scopeCount: 2,
62
- hasRefreshToken: true,
63
- });
64
- const result = await handleAccounts({ operation: 'status', email: 'a@test.com' });
65
- expect(result.text).toContain('## Account Status: a@test.com');
66
- expect(result.text).toContain('[x] Token valid');
67
- expect(result.text).toContain('[x] Has refresh token');
68
- expect(result.text).toContain('gmail.modify');
69
- expect(result.text).toContain('drive');
70
- expect(result.refs.tokenValid).toBe(true);
71
- expect(result.refs.scopeCount).toBe(2);
72
- });
73
- it('shows invalid token status', async () => {
74
- mockCheckStatus.mockResolvedValue({
75
- email: 'a@test.com',
76
- tokenValid: false,
77
- scopes: [],
78
- scopeCount: 0,
79
- hasRefreshToken: false,
80
- });
81
- const result = await handleAccounts({ operation: 'status', email: 'a@test.com' });
82
- expect(result.text).toContain('[ ] Token invalid');
83
- expect(result.text).toContain('[ ] No refresh token');
84
- expect(result.refs.tokenValid).toBe(false);
85
- });
86
- it('requires email', async () => {
87
- await expect(handleAccounts({ operation: 'status' })).rejects.toThrow('email is required');
88
- });
89
- });
90
- describe('refresh', () => {
91
- it('invalidates cache and re-fetches token', async () => {
92
- mockGetAccessToken.mockResolvedValue('fresh-token');
93
- const result = await handleAccounts({ operation: 'refresh', email: 'a@test.com' });
94
- expect(result.text).toContain('Token refreshed for a@test.com');
95
- expect(result.refs.status).toBe('refreshed');
96
- expect(mockInvalidateToken).toHaveBeenCalledWith('a@test.com');
97
- expect(mockGetAccessToken).toHaveBeenCalledWith('a@test.com');
98
- });
99
- it('requires email', async () => {
100
- await expect(handleAccounts({ operation: 'refresh' })).rejects.toThrow('email is required');
101
- });
102
- });
103
- describe('scopes', () => {
104
- const originalEnv = process.env;
105
- beforeEach(() => {
106
- process.env = { ...originalEnv, GOOGLE_CLIENT_ID: 'test-id', GOOGLE_CLIENT_SECRET: 'test-secret' };
107
- });
108
- afterEach(() => {
109
- process.env = originalEnv;
110
- });
111
- it('re-authenticates with specified services', async () => {
112
- mockReauth.mockResolvedValue({ status: 'success', account: 'a@test.com' });
113
- const result = await handleAccounts({ operation: 'scopes', email: 'a@test.com', services: 'gmail,drive' });
114
- expect(result.text).toContain('Scopes updated');
115
- expect(result.text).toContain('gmail,drive');
116
- expect(mockReauth).toHaveBeenCalledWith('test-id', 'test-secret', 'gmail,drive');
117
- });
118
- it('requires email', async () => {
119
- await expect(handleAccounts({ operation: 'scopes', services: 'gmail' })).rejects.toThrow('email is required');
120
- });
121
- it('requires services', async () => {
122
- await expect(handleAccounts({ operation: 'scopes', email: 'a@test.com' })).rejects.toThrow('services is required');
123
- });
124
- });
125
- it('rejects unknown operation', async () => {
126
- await expect(handleAccounts({ operation: 'nope' })).rejects.toThrow('Unknown');
127
- });
128
- });
129
- //# sourceMappingURL=accounts.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accounts.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/handlers/accounts.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,96 +0,0 @@
1
- import { mockExecute, mockGwsResponse, calendarAgendaResponse, calendarEventsListResponse, calendarEventDetailResponse, calendarInsertResponse, } from './__mocks__/executor.js';
2
- import { handleCalendar } from '../../../server/handlers/calendar.js';
3
- describe('handleCalendar', () => {
4
- beforeEach(() => mockExecute.mockReset());
5
- it('rejects missing email', async () => {
6
- await expect(handleCalendar({ operation: 'list' })).rejects.toThrow('valid email');
7
- });
8
- describe('list', () => {
9
- it('returns markdown with events', async () => {
10
- mockExecute.mockResolvedValue(mockGwsResponse(calendarEventsListResponse));
11
- const result = await handleCalendar({ operation: 'list', email: 'user@test.com' });
12
- expect(result.text).toContain('## Events (2)');
13
- expect(result.text).toContain('Standup');
14
- expect(result.text).toContain('**Next steps:**');
15
- expect(result.refs.count).toBe(2);
16
- });
17
- it('defaults timeMin to today', async () => {
18
- mockExecute.mockResolvedValue(mockGwsResponse(calendarEventsListResponse));
19
- await handleCalendar({ operation: 'list', email: 'user@test.com' });
20
- const args = mockExecute.mock.calls[0][0];
21
- const params = JSON.parse(args[args.indexOf('--params') + 1]);
22
- expect(params.timeMin).toBeDefined();
23
- expect(params.singleEvents).toBe(true);
24
- });
25
- it('clamps maxResults to 50', async () => {
26
- mockExecute.mockResolvedValue(mockGwsResponse(calendarEventsListResponse));
27
- await handleCalendar({ operation: 'list', email: 'user@test.com', maxResults: 100 });
28
- const args = mockExecute.mock.calls[0][0];
29
- const params = JSON.parse(args[args.indexOf('--params') + 1]);
30
- expect(params.maxResults).toBe(50);
31
- });
32
- });
33
- describe('agenda', () => {
34
- it('calls gws calendar +agenda', async () => {
35
- mockExecute.mockResolvedValue(mockGwsResponse(calendarAgendaResponse));
36
- await handleCalendar({ operation: 'agenda', email: 'user@test.com' });
37
- expect(mockExecute).toHaveBeenCalledWith(['calendar', '+agenda'], expect.objectContaining({ account: 'user@test.com' }));
38
- });
39
- });
40
- describe('create', () => {
41
- it('requires summary, start, end', async () => {
42
- await expect(handleCalendar({ operation: 'create', email: 'user@test.com' })).rejects.toThrow('summary');
43
- await expect(handleCalendar({ operation: 'create', email: 'user@test.com', summary: 'X' })).rejects.toThrow('start');
44
- await expect(handleCalendar({ operation: 'create', email: 'user@test.com', summary: 'X', start: 'Y' })).rejects.toThrow('end');
45
- });
46
- it('passes optional fields', async () => {
47
- mockExecute.mockResolvedValue(mockGwsResponse(calendarInsertResponse));
48
- await handleCalendar({
49
- operation: 'create', email: 'user@test.com',
50
- summary: 'Meeting', start: '2026-03-14T10:00:00Z', end: '2026-03-14T11:00:00Z',
51
- location: 'Room A', attendees: 'a@b.com',
52
- });
53
- const args = mockExecute.mock.calls[0][0];
54
- expect(args).toContain('--location');
55
- // gws expects the singular form --attendee (the plural --attendees is rejected by the CLI).
56
- expect(args).toContain('--attendee');
57
- });
58
- it('returns markdown with event details', async () => {
59
- mockExecute.mockResolvedValue(mockGwsResponse(calendarInsertResponse));
60
- const result = await handleCalendar({
61
- operation: 'create', email: 'user@test.com',
62
- summary: 'Meeting', start: 'X', end: 'Y',
63
- });
64
- expect(result.text).toContain('Event created: **Meeting**');
65
- expect(result.refs.summary).toBe('Meeting');
66
- });
67
- });
68
- describe('get', () => {
69
- it('requires eventId', async () => {
70
- await expect(handleCalendar({ operation: 'get', email: 'user@test.com' })).rejects.toThrow('eventId');
71
- });
72
- it('returns markdown event detail', async () => {
73
- mockExecute.mockResolvedValue(mockGwsResponse(calendarEventDetailResponse));
74
- const result = await handleCalendar({ operation: 'get', email: 'user@test.com', eventId: 'evt-1' });
75
- expect(result.text).toContain('## Standup');
76
- expect(result.text).toContain('alice@test.com');
77
- expect(result.refs.eventId).toBe('evt-1');
78
- });
79
- });
80
- describe('delete', () => {
81
- it('requires eventId', async () => {
82
- await expect(handleCalendar({ operation: 'delete', email: 'user@test.com' })).rejects.toThrow('eventId');
83
- });
84
- it('returns deleted status', async () => {
85
- mockExecute.mockResolvedValue(mockGwsResponse({}));
86
- const result = await handleCalendar({ operation: 'delete', email: 'user@test.com', eventId: 'evt-1' });
87
- expect(result.text).toContain('Event deleted: evt-1');
88
- expect(result.refs.status).toBe('deleted');
89
- expect(result.refs.eventId).toBe('evt-1');
90
- });
91
- });
92
- it('rejects unknown operation', async () => {
93
- await expect(handleCalendar({ operation: 'nope', email: 'user@test.com' })).rejects.toThrow('Unknown');
94
- });
95
- });
96
- //# sourceMappingURL=calendar.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/handlers/calendar.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { mockExecute, mockGwsResponse, driveFileListResponse, driveFileDetailResponse, driveUploadResponse, } from './__mocks__/executor.js';
2
- import { handleDrive } from '../../../server/handlers/drive.js';
3
- describe('handleDrive', () => {
4
- beforeEach(() => mockExecute.mockReset());
5
- it('rejects missing email', async () => {
6
- await expect(handleDrive({ operation: 'search' })).rejects.toThrow('valid email');
7
- });
8
- describe('search', () => {
9
- it('returns markdown file list', async () => {
10
- mockExecute.mockResolvedValue(mockGwsResponse(driveFileListResponse));
11
- const result = await handleDrive({ operation: 'search', email: 'user@test.com' });
12
- expect(result.text).toContain('## Files (2)');
13
- expect(result.text).toContain('report.pdf');
14
- expect(result.text).toContain('**Next steps:**');
15
- expect(result.refs.count).toBe(2);
16
- });
17
- it('passes query to gws', async () => {
18
- mockExecute.mockResolvedValue(mockGwsResponse(driveFileListResponse));
19
- await handleDrive({ operation: 'search', email: 'user@test.com', query: "name contains 'report'" });
20
- const args = mockExecute.mock.calls[0][0];
21
- const params = JSON.parse(args[args.indexOf('--params') + 1]);
22
- expect(params.q).toBe("name contains 'report'");
23
- });
24
- it('clamps maxResults to 50', async () => {
25
- mockExecute.mockResolvedValue(mockGwsResponse(driveFileListResponse));
26
- await handleDrive({ operation: 'search', email: 'user@test.com', maxResults: 999 });
27
- const args = mockExecute.mock.calls[0][0];
28
- const params = JSON.parse(args[args.indexOf('--params') + 1]);
29
- expect(params.pageSize).toBe(50);
30
- });
31
- });
32
- describe('get', () => {
33
- it('requires fileId', async () => {
34
- await expect(handleDrive({ operation: 'get', email: 'user@test.com' })).rejects.toThrow('fileId');
35
- });
36
- it('returns markdown file detail', async () => {
37
- mockExecute.mockResolvedValue(mockGwsResponse(driveFileDetailResponse));
38
- const result = await handleDrive({ operation: 'get', email: 'user@test.com', fileId: 'file-1' });
39
- expect(result.text).toContain('## report.pdf');
40
- expect(result.refs.fileId).toBe('file-1');
41
- });
42
- });
43
- describe('upload', () => {
44
- it('requires filePath', async () => {
45
- await expect(handleDrive({ operation: 'upload', email: 'user@test.com' })).rejects.toThrow('filePath');
46
- });
47
- it('calls gws drive +upload with path', async () => {
48
- mockExecute.mockResolvedValue(mockGwsResponse(driveUploadResponse));
49
- const result = await handleDrive({ operation: 'upload', email: 'user@test.com', filePath: '/tmp/doc.txt' });
50
- const args = mockExecute.mock.calls[0][0];
51
- expect(args).toContain('+upload');
52
- expect(args).toContain('/tmp/doc.txt');
53
- expect(result.text).toContain('File uploaded');
54
- });
55
- it('passes optional name and parent', async () => {
56
- mockExecute.mockResolvedValue(mockGwsResponse(driveUploadResponse));
57
- await handleDrive({ operation: 'upload', email: 'user@test.com', filePath: '/tmp/f.txt', name: 'doc.txt', parentFolderId: 'folder-1' });
58
- const args = mockExecute.mock.calls[0][0];
59
- expect(args[args.indexOf('--name') + 1]).toBe('doc.txt');
60
- expect(args[args.indexOf('--parent') + 1]).toBe('folder-1');
61
- });
62
- });
63
- it('rejects unknown operation (including removed download)', async () => {
64
- await expect(handleDrive({ operation: 'download', email: 'user@test.com' })).rejects.toThrow('Unknown');
65
- await expect(handleDrive({ operation: 'nope', email: 'user@test.com' })).rejects.toThrow('Unknown');
66
- });
67
- });
68
- //# sourceMappingURL=drive.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drive.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/handlers/drive.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,99 +0,0 @@
1
- import { mockExecute, mockGwsResponse, gmailTriageResponse, gmailMessageDetailResponse, gmailSendResponse, gmailMessageListResponse, gmailMetadataResponse, } from './__mocks__/executor.js';
2
- import { handleEmail } from '../../../server/handlers/email.js';
3
- describe('handleEmail', () => {
4
- beforeEach(() => mockExecute.mockReset());
5
- it('rejects missing email', async () => {
6
- await expect(handleEmail({ operation: 'triage' })).rejects.toThrow('valid email');
7
- });
8
- it('rejects invalid email format', async () => {
9
- await expect(handleEmail({ operation: 'triage', email: '../etc/passwd' })).rejects.toThrow('valid email');
10
- });
11
- describe('triage', () => {
12
- it('calls gws gmail +triage and returns markdown with messages', async () => {
13
- mockExecute.mockResolvedValue(mockGwsResponse(gmailTriageResponse));
14
- const result = await handleEmail({ operation: 'triage', email: 'user@test.com' });
15
- expect(result.text).toContain('## Messages (2)');
16
- expect(result.text).toContain('alice@test.com');
17
- expect(result.text).toContain('**Next steps:**');
18
- expect(result.refs.count).toBe(2);
19
- expect(mockExecute).toHaveBeenCalledWith(['gmail', '+triage'], expect.objectContaining({ account: 'user@test.com' }));
20
- });
21
- });
22
- describe('search', () => {
23
- it('passes query to gws and hydrates results with metadata', async () => {
24
- // First call: messages.list returns IDs only
25
- // Subsequent calls: messages.get with format=metadata for each ID
26
- mockExecute
27
- .mockResolvedValueOnce(mockGwsResponse(gmailMessageListResponse))
28
- .mockResolvedValueOnce(mockGwsResponse(gmailMetadataResponse('msg-1', 'alice@test.com', 'Hello', 'Mon, 10 Mar 2026')))
29
- .mockResolvedValueOnce(mockGwsResponse(gmailMetadataResponse('msg-2', 'bob@test.com', 'Meeting', 'Mon, 10 Mar 2026')));
30
- const result = await handleEmail({ operation: 'search', email: 'user@test.com', query: 'from:alice' });
31
- // Verify list call
32
- const listArgs = mockExecute.mock.calls[0][0];
33
- const listParams = JSON.parse(listArgs[listArgs.indexOf('--params') + 1]);
34
- expect(listParams.q).toBe('from:alice');
35
- expect(listParams.userId).toBe('me');
36
- // Verify hydration calls used metadata format
37
- const getArgs = mockExecute.mock.calls[1][0];
38
- const getParams = JSON.parse(getArgs[getArgs.indexOf('--params') + 1]);
39
- expect(getParams.format).toBe('metadata');
40
- // Verify formatted output has actual content
41
- expect(result.text).toContain('alice@test.com');
42
- expect(result.text).toContain('Hello');
43
- expect(result.refs.count).toBe(2);
44
- });
45
- it('clamps maxResults to 50', async () => {
46
- mockExecute
47
- .mockResolvedValueOnce(mockGwsResponse({ messages: [] }));
48
- await handleEmail({ operation: 'search', email: 'user@test.com', maxResults: 200 });
49
- const args = mockExecute.mock.calls[0][0];
50
- const params = JSON.parse(args[args.indexOf('--params') + 1]);
51
- expect(params.maxResults).toBe(50);
52
- });
53
- it('handles empty search results without hydration calls', async () => {
54
- mockExecute.mockResolvedValueOnce(mockGwsResponse({ messages: [], resultSizeEstimate: 0 }));
55
- const result = await handleEmail({ operation: 'search', email: 'user@test.com', query: 'nonexistent' });
56
- expect(mockExecute).toHaveBeenCalledTimes(1); // only the list call
57
- expect(result.text).toContain('No messages found');
58
- });
59
- });
60
- describe('read', () => {
61
- it('requires messageId', async () => {
62
- await expect(handleEmail({ operation: 'read', email: 'user@test.com' })).rejects.toThrow('messageId');
63
- });
64
- it('returns markdown email detail', async () => {
65
- mockExecute.mockResolvedValue(mockGwsResponse(gmailMessageDetailResponse));
66
- const result = await handleEmail({ operation: 'read', email: 'user@test.com', messageId: 'msg-1' });
67
- expect(result.text).toContain('## Test Subject');
68
- expect(result.text).toContain('**From:** alice@test.com');
69
- expect(result.refs.from).toBe('alice@test.com');
70
- expect(result.refs.subject).toBe('Test Subject');
71
- });
72
- });
73
- describe('send', () => {
74
- it('requires to, subject, body', async () => {
75
- await expect(handleEmail({ operation: 'send', email: 'user@test.com' })).rejects.toThrow('to');
76
- await expect(handleEmail({ operation: 'send', email: 'user@test.com', to: 'a@b.com' })).rejects.toThrow('subject');
77
- await expect(handleEmail({ operation: 'send', email: 'user@test.com', to: 'a@b.com', subject: 'Hi' })).rejects.toThrow('body');
78
- });
79
- it('calls gws gmail +send with correct args', async () => {
80
- mockExecute.mockResolvedValue(mockGwsResponse(gmailSendResponse));
81
- const result = await handleEmail({ operation: 'send', email: 'user@test.com', to: 'bob@test.com', subject: 'Hi', body: 'Hello' });
82
- const args = mockExecute.mock.calls[0][0];
83
- expect(args).toContain('+send');
84
- expect(args[args.indexOf('--to') + 1]).toBe('bob@test.com');
85
- expect(result.text).toContain('Email sent to bob@test.com');
86
- expect(result.refs.to).toBe('bob@test.com');
87
- });
88
- });
89
- describe('reply', () => {
90
- it('requires messageId and body', async () => {
91
- await expect(handleEmail({ operation: 'reply', email: 'user@test.com' })).rejects.toThrow('messageId');
92
- await expect(handleEmail({ operation: 'reply', email: 'user@test.com', messageId: 'x' })).rejects.toThrow('body');
93
- });
94
- });
95
- it('rejects unknown operation', async () => {
96
- await expect(handleEmail({ operation: 'explode', email: 'user@test.com' })).rejects.toThrow('Unknown');
97
- });
98
- });
99
- //# sourceMappingURL=email.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/handlers/email.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};