@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,374 +0,0 @@
1
- /**
2
- * Meet patch tests — formatters and custom handlers.
3
- */
4
- jest.mock('../../../executor/gws.js');
5
- import { execute } from '../../../executor/gws.js';
6
- const mockExecute = execute;
7
- import { meetPatch } from '../../../services/meet/patch.js';
8
- function ctx(operation, params = {}) {
9
- return { operation, params, account: 'user@test.com' };
10
- }
11
- describe('Meet patch formatters', () => {
12
- describe('formatList', () => {
13
- it('formats conference list with meeting codes and times', () => {
14
- const data = {
15
- conferenceRecords: [
16
- {
17
- name: 'conferenceRecords/abc123',
18
- space: { meetingCode: 'abc-mnop-xyz' },
19
- startTime: '2026-03-18T14:00:00Z',
20
- endTime: '2026-03-18T15:00:00Z',
21
- },
22
- {
23
- name: 'conferenceRecords/def456',
24
- space: { meetingCode: 'def-ghij-klm' },
25
- startTime: '2026-03-17T10:00:00Z',
26
- endTime: '2026-03-17T10:30:00Z',
27
- },
28
- ],
29
- };
30
- const result = meetPatch.formatList(data, ctx('listConferences'));
31
- expect(result.text).toContain('Conferences (2)');
32
- expect(result.text).toContain('abc-mnop-xyz');
33
- expect(result.text).toContain('def-ghij-klm');
34
- expect(result.text).toContain('1h');
35
- expect(result.text).toContain('30m');
36
- expect(result.refs.count).toBe(2);
37
- expect(result.refs.conferenceId).toBe('abc123');
38
- });
39
- it('handles empty conference list', () => {
40
- const result = meetPatch.formatList({ conferenceRecords: [] }, ctx('listConferences'));
41
- expect(result.text).toContain('No conferences found');
42
- expect(result.refs.count).toBe(0);
43
- });
44
- it('formats participant list with display names', () => {
45
- const data = {
46
- participants: [
47
- {
48
- signedinUser: { displayName: 'Alice Smith', user: 'users/alice@test.com' },
49
- earliestStartTime: '2026-03-18T14:00:00Z',
50
- latestEndTime: '2026-03-18T15:00:00Z',
51
- },
52
- {
53
- anonymousUser: { displayName: 'Anonymous Panda' },
54
- earliestStartTime: '2026-03-18T14:05:00Z',
55
- latestEndTime: '2026-03-18T14:45:00Z',
56
- },
57
- ],
58
- };
59
- const result = meetPatch.formatList(data, ctx('listParticipants'));
60
- expect(result.text).toContain('Participants (2)');
61
- expect(result.text).toContain('Alice Smith');
62
- expect(result.text).toContain('Anonymous Panda');
63
- expect(result.refs.count).toBe(2);
64
- });
65
- it('handles empty participant list', () => {
66
- const result = meetPatch.formatList({ participants: [] }, ctx('listParticipants'));
67
- expect(result.text).toContain('No participants found');
68
- });
69
- it('formats transcript list', () => {
70
- const data = {
71
- transcripts: [
72
- {
73
- name: 'conferenceRecords/abc123/transcripts/t1',
74
- state: 'ENDED',
75
- startTime: '2026-03-18T14:00:00Z',
76
- endTime: '2026-03-18T15:00:00Z',
77
- docsDestination: { exportUri: 'https://docs.google.com/doc/abc' },
78
- },
79
- ],
80
- };
81
- const result = meetPatch.formatList(data, ctx('listTranscripts'));
82
- expect(result.text).toContain('Transcripts (1)');
83
- expect(result.text).toContain('ENDED');
84
- expect(result.text).toContain('Docs');
85
- expect(result.refs.transcriptName).toContain('transcripts/t1');
86
- });
87
- it('formats transcript entries with who-said-what collapsed by speaker', () => {
88
- const data = {
89
- transcriptEntries: [
90
- { participantDisplayName: 'Alice Smith', text: 'Hello everyone', startTime: '2026-03-18T14:01:00Z' },
91
- { participantDisplayName: 'Alice Smith', text: 'Lets get started', startTime: '2026-03-18T14:01:05Z' },
92
- { participantDisplayName: 'Bob Jones', text: 'Hi Alice', startTime: '2026-03-18T14:01:30Z' },
93
- ],
94
- };
95
- const result = meetPatch.formatList(data, ctx('listTranscriptEntries'));
96
- expect(result.text).toContain('Transcript (3 entries)');
97
- // Alice's lines should be collapsed into one block
98
- expect(result.text).toContain('**Alice Smith**');
99
- expect(result.text).toContain('Hello everyone\nLets get started');
100
- expect(result.text).toContain('**Bob Jones**');
101
- expect(result.refs.count).toBe(3);
102
- });
103
- it('formats recording list', () => {
104
- const data = {
105
- recordings: [
106
- {
107
- name: 'conferenceRecords/abc123/recordings/r1',
108
- state: 'FILE_GENERATED',
109
- startTime: '2026-03-18T14:00:00Z',
110
- endTime: '2026-03-18T15:00:00Z',
111
- driveDestination: { exportUri: 'https://drive.google.com/file/abc' },
112
- },
113
- ],
114
- };
115
- const result = meetPatch.formatList(data, ctx('listRecordings'));
116
- expect(result.text).toContain('Recordings (1)');
117
- expect(result.text).toContain('FILE_GENERATED');
118
- expect(result.text).toContain('Drive');
119
- expect(result.refs.recordingName).toContain('recordings/r1');
120
- });
121
- it('formats smart notes list', () => {
122
- const data = {
123
- smartNotes: [
124
- {
125
- name: 'conferenceRecords/abc123/smartNotes/sn1',
126
- state: 'ENDED',
127
- docsDestination: { exportUri: 'https://docs.google.com/doc/sn1' },
128
- },
129
- ],
130
- };
131
- const result = meetPatch.formatList(data, ctx('listSmartNotes'));
132
- expect(result.text).toContain('Smart Notes (1)');
133
- expect(result.text).toContain('Docs');
134
- expect(result.refs.smartNoteName).toContain('smartNotes/sn1');
135
- });
136
- });
137
- describe('formatDetail', () => {
138
- it('formats conference detail with meeting code and duration', () => {
139
- const data = {
140
- name: 'conferenceRecords/abc123',
141
- space: { meetingCode: 'abc-mnop-xyz' },
142
- startTime: '2026-03-18T14:00:00Z',
143
- endTime: '2026-03-18T15:30:00Z',
144
- expireTime: '2026-03-25T15:30:00Z',
145
- };
146
- const result = meetPatch.formatDetail(data, ctx('getConference'));
147
- expect(result.text).toContain('Conference abc123');
148
- expect(result.text).toContain('abc-mnop-xyz');
149
- expect(result.text).toContain('1h 30m');
150
- expect(result.refs.conferenceId).toBe('abc123');
151
- expect(result.refs.meetingCode).toBe('abc-mnop-xyz');
152
- });
153
- it('formats other detail types with generic key/value', () => {
154
- const data = {
155
- name: 'conferenceRecords/abc123/recordings/r1',
156
- state: 'FILE_GENERATED',
157
- };
158
- const result = meetPatch.formatDetail(data, ctx('getRecording'));
159
- expect(result.text).toContain('Recording');
160
- expect(result.text).toContain('FILE_GENERATED');
161
- expect(result.refs.name).toContain('recordings/r1');
162
- });
163
- });
164
- });
165
- describe('Meet beforeExecute hooks', () => {
166
- it('prefixes conferenceRecords/ on bare parent IDs', async () => {
167
- const hook = meetPatch.beforeExecute.listParticipants;
168
- const args = ['meet', 'conferenceRecords', 'participants', 'list', '--params', '{"parent":"abc123","pageSize":100}'];
169
- const result = await hook(args, ctx('listParticipants', { conferenceId: 'abc123' }));
170
- const params = JSON.parse(result[result.indexOf('--params') + 1]);
171
- expect(params.parent).toBe('conferenceRecords/abc123');
172
- });
173
- it('does not double-prefix already-prefixed parent IDs', async () => {
174
- const hook = meetPatch.beforeExecute.listTranscripts;
175
- const args = ['meet', 'conferenceRecords', 'transcripts', 'list', '--params', '{"parent":"conferenceRecords/abc123"}'];
176
- const result = await hook(args, ctx('listTranscripts', { conferenceId: 'conferenceRecords/abc123' }));
177
- const params = JSON.parse(result[result.indexOf('--params') + 1]);
178
- expect(params.parent).toBe('conferenceRecords/abc123');
179
- });
180
- it('prefixes conferenceRecords/ on bare name IDs for getConference', async () => {
181
- const hook = meetPatch.beforeExecute.getConference;
182
- const args = ['meet', 'conferenceRecords', 'get', '--params', '{"name":"abc123"}'];
183
- const result = await hook(args, ctx('getConference', { conferenceId: 'abc123' }));
184
- const params = JSON.parse(result[result.indexOf('--params') + 1]);
185
- expect(params.name).toBe('conferenceRecords/abc123');
186
- });
187
- it('returns args unchanged when --params is missing', async () => {
188
- const hook = meetPatch.beforeExecute.listParticipants;
189
- const args = ['meet', 'conferenceRecords', 'participants', 'list'];
190
- const result = await hook(args, ctx('listParticipants'));
191
- expect(result).toEqual(args);
192
- });
193
- it('returns args unchanged when --params has no following value', async () => {
194
- const hook = meetPatch.beforeExecute.listRecordings;
195
- const args = ['meet', 'conferenceRecords', 'recordings', 'list', '--params'];
196
- const result = await hook(args, ctx('listRecordings'));
197
- expect(result).toEqual(args);
198
- });
199
- });
200
- describe('Meet custom handlers', () => {
201
- beforeEach(() => mockExecute.mockReset());
202
- describe('getFullTranscript', () => {
203
- it('chains transcripts.list, entries.list, and participants.list to resolve names', async () => {
204
- // Step 1: transcripts.list
205
- mockExecute.mockResolvedValueOnce({
206
- success: true,
207
- stderr: '',
208
- data: {
209
- transcripts: [{
210
- name: 'conferenceRecords/abc123/transcripts/t1',
211
- docsDestination: { exportUri: 'https://docs.google.com/doc/abc' },
212
- }],
213
- },
214
- });
215
- // Step 2 (parallel): entries.list
216
- mockExecute.mockResolvedValueOnce({
217
- success: true,
218
- stderr: '',
219
- data: {
220
- transcriptEntries: [
221
- { participant: 'conferenceRecords/abc123/participants/111', text: 'Hello', startTime: '2026-03-18T14:01:00Z' },
222
- { participant: 'conferenceRecords/abc123/participants/222', text: 'Hi there', startTime: '2026-03-18T14:01:30Z' },
223
- ],
224
- },
225
- });
226
- // Step 2 (parallel): participants.list
227
- mockExecute.mockResolvedValueOnce({
228
- success: true,
229
- stderr: '',
230
- data: {
231
- participants: [
232
- { name: 'conferenceRecords/abc123/participants/111', signedinUser: { displayName: 'Alice Smith' } },
233
- { name: 'conferenceRecords/abc123/participants/222', signedinUser: { displayName: 'Bob Jones' } },
234
- ],
235
- },
236
- });
237
- const handler = meetPatch.customHandlers.getFullTranscript;
238
- const result = await handler({ conferenceId: 'abc123', email: 'user@test.com' }, 'user@test.com');
239
- expect(result.text).toContain('Transcript (2 entries)');
240
- expect(result.text).toContain('**Alice Smith**');
241
- expect(result.text).toContain('Hello');
242
- expect(result.text).toContain('**Bob Jones**');
243
- expect(result.text).toContain('Hi there');
244
- expect(result.text).toContain('Google Docs');
245
- expect(result.refs.conferenceId).toBe('abc123');
246
- expect(result.refs.count).toBe(2);
247
- // No nextPageToken = last page, so Docs link shown
248
- expect(result.refs.nextPageToken).toBeNull();
249
- // Verify the chained calls (3 total: transcripts, then entries + participants in parallel)
250
- expect(mockExecute).toHaveBeenCalledTimes(3);
251
- });
252
- it('paginates with nextPageToken and shows continue prompt', async () => {
253
- mockExecute.mockResolvedValueOnce({
254
- success: true, stderr: '',
255
- data: {
256
- transcripts: [{
257
- name: 'conferenceRecords/abc123/transcripts/t1',
258
- docsDestination: { exportUri: 'https://docs.google.com/doc/abc' },
259
- }],
260
- },
261
- });
262
- mockExecute.mockResolvedValueOnce({
263
- success: true, stderr: '',
264
- data: {
265
- transcriptEntries: [
266
- { participant: 'conferenceRecords/abc123/participants/111', text: 'Page one', startTime: '2026-03-18T14:01:00Z' },
267
- ],
268
- nextPageToken: 'tok_page2',
269
- },
270
- });
271
- mockExecute.mockResolvedValueOnce({
272
- success: true, stderr: '',
273
- data: { participants: [
274
- { name: 'conferenceRecords/abc123/participants/111', signedinUser: { displayName: 'Alice' } },
275
- ] },
276
- });
277
- const handler = meetPatch.customHandlers.getFullTranscript;
278
- const result = await handler({ conferenceId: 'abc123', email: 'user@test.com' }, 'user@test.com');
279
- // First page: shows Docs link + continue prompt
280
- expect(result.text).toContain('Google Docs');
281
- expect(result.text).toContain('More entries available');
282
- expect(result.text).toContain('tok_page2');
283
- expect(result.refs.nextPageToken).toBe('tok_page2');
284
- });
285
- it('passes pageToken to entries API when continuing', async () => {
286
- mockExecute.mockResolvedValueOnce({
287
- success: true, stderr: '',
288
- data: {
289
- transcripts: [{
290
- name: 'conferenceRecords/abc123/transcripts/t1',
291
- docsDestination: { exportUri: 'https://docs.google.com/doc/abc' },
292
- }],
293
- },
294
- });
295
- mockExecute.mockResolvedValueOnce({
296
- success: true, stderr: '',
297
- data: {
298
- transcriptEntries: [
299
- { participant: 'conferenceRecords/abc123/participants/111', text: 'Last page', startTime: '2026-03-18T14:10:00Z' },
300
- ],
301
- },
302
- });
303
- mockExecute.mockResolvedValueOnce({
304
- success: true, stderr: '',
305
- data: { participants: [
306
- { name: 'conferenceRecords/abc123/participants/111', signedinUser: { displayName: 'Alice' } },
307
- ] },
308
- });
309
- const handler = meetPatch.customHandlers.getFullTranscript;
310
- const result = await handler({ conferenceId: 'abc123', email: 'user@test.com', pageToken: 'tok_page2' }, 'user@test.com');
311
- // Verify pageToken was passed to entries call
312
- const entriesArgs = mockExecute.mock.calls[1][0];
313
- const entriesParams = JSON.parse(entriesArgs[entriesArgs.indexOf('--params') + 1]);
314
- expect(entriesParams.pageToken).toBe('tok_page2');
315
- // Last page (no nextPageToken): shows Docs link, no continue prompt
316
- expect(result.text).toContain('Google Docs');
317
- expect(result.text).not.toContain('More entries available');
318
- expect(result.refs.nextPageToken).toBeNull();
319
- });
320
- it('returns helpful message when no transcripts exist', async () => {
321
- mockExecute.mockResolvedValueOnce({
322
- success: true,
323
- stderr: '',
324
- data: { transcripts: [] },
325
- });
326
- const handler = meetPatch.customHandlers.getFullTranscript;
327
- const result = await handler({ conferenceId: 'abc123', email: 'user@test.com' }, 'user@test.com');
328
- expect(result.text).toContain('No transcripts found');
329
- expect(result.text).toContain('Business Standard');
330
- expect(result.refs.count).toBe(0);
331
- });
332
- it('handles transcript with no entries yet', async () => {
333
- mockExecute.mockResolvedValueOnce({
334
- success: true,
335
- stderr: '',
336
- data: {
337
- transcripts: [{ name: 'conferenceRecords/abc123/transcripts/t1' }],
338
- },
339
- });
340
- // entries.list (parallel)
341
- mockExecute.mockResolvedValueOnce({
342
- success: true,
343
- stderr: '',
344
- data: { transcriptEntries: [] },
345
- });
346
- // participants.list (parallel)
347
- mockExecute.mockResolvedValueOnce({
348
- success: true,
349
- stderr: '',
350
- data: { participants: [] },
351
- });
352
- const handler = meetPatch.customHandlers.getFullTranscript;
353
- const result = await handler({ conferenceId: 'abc123', email: 'user@test.com' }, 'user@test.com');
354
- expect(result.text).toContain('no entries available');
355
- expect(result.text).toContain('processing');
356
- });
357
- it('throws when conferenceId is missing', async () => {
358
- const handler = meetPatch.customHandlers.getFullTranscript;
359
- await expect(handler({}, 'user@test.com')).rejects.toThrow('conferenceId is required');
360
- });
361
- it('handles conferenceId with or without prefix', async () => {
362
- // With prefix
363
- mockExecute.mockResolvedValueOnce({
364
- success: true, stderr: '',
365
- data: { transcripts: [] },
366
- });
367
- const handler = meetPatch.customHandlers.getFullTranscript;
368
- await handler({ conferenceId: 'conferenceRecords/abc123', email: 'user@test.com' }, 'user@test.com');
369
- const params = JSON.parse(mockExecute.mock.calls[0][0][mockExecute.mock.calls[0][0].indexOf('--params') + 1]);
370
- expect(params.parent).toBe('conferenceRecords/abc123');
371
- });
372
- });
373
- });
374
- //# sourceMappingURL=patch.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patch.test.js","sourceRoot":"","sources":["../../../../src/__tests__/services/meet/patch.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Integration-ish tests for the docs-bound mutation path through the
3
- * scratchpad handler. Mocks `execute` from the gws executor; everything
4
- * else is real (ScratchpadManager, the docs-sync translator).
5
- *
6
- * Covers the two test cases that the pure-translator tests can't:
7
- * - API rejects → local buffer preserved, error response returned.
8
- * - API succeeds → reloadDocsBuffer fires, sp.lines replaced from the
9
- * fresh response, binding revisionId updated.
10
- */
11
- export {};
@@ -1,187 +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
- jest.mock('../../../executor/gws.js');
12
- jest.mock('../../handler.js', () => ({ getEpoch: () => 0 }));
13
- import { execute } from '../../../executor/gws.js';
14
- import { handleScratchpad } from '../handler.js';
15
- import { getScratchpadManager } from '../handler.js';
16
- const mockExecute = execute;
17
- /** Seed a docs-bound JSON scratchpad with a one-paragraph doc and return its id. */
18
- function seedDocsBoundScratchpad(opts) {
19
- const manager = getScratchpadManager();
20
- const id = manager.create({ format: 'json' });
21
- const doc = {
22
- documentId: 'doc-1',
23
- revisionId: opts?.revisionId ?? 'rev-1',
24
- body: {
25
- content: [
26
- {
27
- startIndex: 1,
28
- endIndex: 13,
29
- paragraph: {
30
- elements: [
31
- { startIndex: 1, endIndex: 13, textRun: { content: 'Hello world\n' } },
32
- ],
33
- paragraphStyle: { namedStyleType: 'NORMAL_TEXT' },
34
- },
35
- },
36
- ],
37
- },
38
- };
39
- const sp = manager.get(id);
40
- sp.lines = JSON.stringify(doc, null, 2).split('\n');
41
- manager.setBinding(id, {
42
- service: 'docs', resourceId: 'doc-1', account: 'me@test.com',
43
- revisionId: opts?.revisionId ?? 'rev-1',
44
- });
45
- return id;
46
- }
47
- describe('docs-bound json_set', () => {
48
- beforeEach(() => {
49
- mockExecute.mockReset();
50
- });
51
- it('rejects an unsupported path WITHOUT mutating the local buffer (pre-validation)', async () => {
52
- const id = seedDocsBoundScratchpad();
53
- const manager = getScratchpadManager();
54
- const linesBefore = [...manager.get(id).lines];
55
- const result = await handleScratchpad({
56
- operation: 'json_set',
57
- scratchpadId: id,
58
- // textStyle.bold is structural in the supported-path sense — not in the allowlist.
59
- path: '$.body.content[0].paragraph.elements[0].textStyle.bold',
60
- value: true,
61
- });
62
- expect(result.text).toMatch(/rejected/);
63
- expect(result.text).toMatch(/not supported/);
64
- // Pre-validation contract: the buffer is untouched on rejection.
65
- expect(manager.get(id).lines).toEqual(linesBefore);
66
- expect(mockExecute).not.toHaveBeenCalled();
67
- });
68
- it('on API success, pushes batchUpdate and reloads the buffer from documents.get', async () => {
69
- const id = seedDocsBoundScratchpad({ revisionId: 'rev-1' });
70
- const manager = getScratchpadManager();
71
- // First call: batchUpdate succeeds.
72
- // Second call: documents.get returns the fresh doc (with bumped revisionId).
73
- mockExecute
74
- .mockResolvedValueOnce({ success: true, data: {}, stderr: '' })
75
- .mockResolvedValueOnce({
76
- success: true,
77
- data: {
78
- documentId: 'doc-1',
79
- revisionId: 'rev-2',
80
- body: {
81
- content: [{
82
- startIndex: 1,
83
- endIndex: 9,
84
- paragraph: {
85
- elements: [{ startIndex: 1, endIndex: 9, textRun: { content: 'Goodbye\n' } }],
86
- paragraphStyle: { namedStyleType: 'NORMAL_TEXT' },
87
- },
88
- }],
89
- },
90
- },
91
- stderr: '',
92
- });
93
- const result = await handleScratchpad({
94
- operation: 'json_set',
95
- scratchpadId: id,
96
- path: '$.body.content[0].paragraph.elements[0].textRun.content',
97
- value: 'Goodbye',
98
- });
99
- expect(result.refs.synced).toBe(true);
100
- expect(mockExecute).toHaveBeenCalledTimes(2);
101
- // First call: batchUpdate with the translated request + writeControl.
102
- const batchArgs = mockExecute.mock.calls[0][0];
103
- expect(batchArgs.slice(0, 3)).toEqual(['docs', 'documents', 'batchUpdate']);
104
- const body = JSON.parse(batchArgs[batchArgs.indexOf('--json') + 1]);
105
- expect(body.requests[0]).toEqual({ deleteContentRange: { range: { startIndex: 1, endIndex: 12 } } });
106
- expect(body.requests[1]).toEqual({ insertText: { text: 'Goodbye', location: { index: 1 } } });
107
- expect(body.writeControl).toEqual({ requiredRevisionId: 'rev-1' });
108
- // Second call: documents.get for the reload.
109
- expect(mockExecute.mock.calls[1][0].slice(0, 3)).toEqual(['docs', 'documents', 'get']);
110
- // Buffer reloaded from fresh response.
111
- const reloaded = JSON.parse(manager.get(id).lines.join('\n'));
112
- expect(reloaded.revisionId).toBe('rev-2');
113
- expect(reloaded.body.content[0].paragraph.elements[0].textRun.content).toBe('Goodbye\n');
114
- // Binding revisionId advanced for the NEXT sync.
115
- expect(manager.getBinding(id)?.revisionId).toBe('rev-2');
116
- });
117
- it('on API rejection, preserves the local buffer change and returns an error', async () => {
118
- const id = seedDocsBoundScratchpad({ revisionId: 'rev-1' });
119
- const manager = getScratchpadManager();
120
- // Simulate the API rejecting (e.g., stale requiredRevisionId).
121
- mockExecute.mockRejectedValueOnce(new Error('precondition failed: revisionId mismatch'));
122
- const result = await handleScratchpad({
123
- operation: 'json_set',
124
- scratchpadId: id,
125
- path: '$.body.content[0].paragraph.elements[0].textRun.content',
126
- value: 'Goodbye',
127
- });
128
- expect(result.refs.error).toBe(true);
129
- expect(result.text).toMatch(/Sync failed/);
130
- expect(result.text).toMatch(/Retry or use scratchpad reset to discard/);
131
- // The batchUpdate was attempted; the reload (second call) was NOT.
132
- expect(mockExecute).toHaveBeenCalledTimes(1);
133
- // Local buffer holds the would-have-synced change — agent retries or discards.
134
- const buffer = JSON.parse(manager.get(id).lines.join('\n'));
135
- expect(buffer.body.content[0].paragraph.elements[0].textRun.content).toBe('Goodbye');
136
- // Binding revisionId did NOT advance — still the original.
137
- expect(manager.getBinding(id)?.revisionId).toBe('rev-1');
138
- });
139
- it('json_delete on a docs-bound scratchpad is rejected (structural)', async () => {
140
- const id = seedDocsBoundScratchpad();
141
- const manager = getScratchpadManager();
142
- const linesBefore = [...manager.get(id).lines];
143
- const result = await handleScratchpad({
144
- operation: 'json_delete',
145
- scratchpadId: id,
146
- path: '$.body.content[0]',
147
- });
148
- expect(result.text).toMatch(/rejected/);
149
- expect(result.text).toMatch(/structural/);
150
- expect(manager.get(id).lines).toEqual(linesBefore);
151
- expect(mockExecute).not.toHaveBeenCalled();
152
- });
153
- it('omits writeControl when the binding has no revisionId (legacy import)', async () => {
154
- const id = seedDocsBoundScratchpad({ revisionId: undefined });
155
- // Need to clear it explicitly — the seed helper defaults to 'rev-1'.
156
- const manager = getScratchpadManager();
157
- manager.setBinding(id, { service: 'docs', resourceId: 'doc-1', account: 'me@test.com' });
158
- mockExecute
159
- .mockResolvedValueOnce({ success: true, data: {}, stderr: '' })
160
- .mockResolvedValueOnce({
161
- success: true,
162
- data: {
163
- documentId: 'doc-1',
164
- revisionId: 'rev-9',
165
- body: { content: [{
166
- startIndex: 1, endIndex: 13,
167
- paragraph: {
168
- elements: [{ startIndex: 1, endIndex: 13, textRun: { content: 'Hello world\n' } }],
169
- paragraphStyle: {},
170
- },
171
- }] },
172
- },
173
- stderr: '',
174
- });
175
- await handleScratchpad({
176
- operation: 'json_set',
177
- scratchpadId: id,
178
- path: '$.body.content[0].paragraph.elements[0].textRun.content',
179
- value: 'X',
180
- });
181
- const body = JSON.parse(mockExecute.mock.calls[0][0][mockExecute.mock.calls[0][0].indexOf('--json') + 1]);
182
- expect(body.writeControl).toBeUndefined();
183
- // But the reload picks up a fresh revisionId for the next sync.
184
- expect(manager.getBinding(id)?.revisionId).toBe('rev-9');
185
- });
186
- });
187
- //# sourceMappingURL=docs-sync-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs-sync-integration.test.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/__tests__/docs-sync-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Tests for docs-sync — translating a scratchpad JSON-mode mutation into
3
- * a Docs batchUpdate request. Pure translator; no API calls (mocked or
4
- * otherwise) in this file. See issue #79.
5
- */
6
- export {};
7
- /**
8
- * Suggested next pass — handler-level integration tests that mock `execute`
9
- * to cover the API-error-preserves-buffer and success-reloads-buffer cases.
10
- * Co-located with this file would be reasonable; a separate file under the
11
- * same dir keeps the unit-vs-integration split clear.
12
- *
13
- * - API rejects (stale revisionId, structural error) → buffer preserved.
14
- * - API succeeds → reloadDocsBuffer fires, sp.lines replaced, binding
15
- * revisionId updated from the fresh response.
16
- */