@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,88 +0,0 @@
1
- import { requireEmail, requireString, clamp } from '../../../server/handlers/validate.js';
2
- describe('requireEmail', () => {
3
- it('returns valid email', () => {
4
- expect(requireEmail({ email: 'user@example.com' })).toBe('user@example.com');
5
- });
6
- it('rejects missing email', () => {
7
- expect(() => requireEmail({})).toThrow('valid email');
8
- });
9
- it('rejects non-string email', () => {
10
- expect(() => requireEmail({ email: 42 })).toThrow('valid email');
11
- expect(() => requireEmail({ email: null })).toThrow('valid email');
12
- expect(() => requireEmail({ email: undefined })).toThrow('valid email');
13
- });
14
- it('rejects empty string', () => {
15
- expect(() => requireEmail({ email: '' })).toThrow('valid email');
16
- });
17
- it('rejects path traversal attempts', () => {
18
- expect(() => requireEmail({ email: '../etc/passwd' })).toThrow('valid email');
19
- expect(() => requireEmail({ email: '../../shadow' })).toThrow('valid email');
20
- });
21
- it('rejects emails without domain', () => {
22
- expect(() => requireEmail({ email: 'user@' })).toThrow('valid email');
23
- expect(() => requireEmail({ email: '@example.com' })).toThrow('valid email');
24
- });
25
- it('rejects emails with spaces', () => {
26
- expect(() => requireEmail({ email: 'user @example.com' })).toThrow('valid email');
27
- });
28
- it('accepts plus-addressed emails', () => {
29
- expect(requireEmail({ email: 'user+tag@example.com' })).toBe('user+tag@example.com');
30
- });
31
- it('accepts dotted local parts', () => {
32
- expect(requireEmail({ email: 'first.last@example.com' })).toBe('first.last@example.com');
33
- });
34
- it('accepts hyphenated domains', () => {
35
- expect(requireEmail({ email: 'user@my-domain.co.uk' })).toBe('user@my-domain.co.uk');
36
- });
37
- });
38
- describe('requireString', () => {
39
- it('returns valid string', () => {
40
- expect(requireString({ name: 'hello' }, 'name')).toBe('hello');
41
- });
42
- it('rejects missing field', () => {
43
- expect(() => requireString({}, 'name')).toThrow('name');
44
- });
45
- it('rejects non-string values', () => {
46
- expect(() => requireString({ n: 42 }, 'n')).toThrow('n');
47
- expect(() => requireString({ n: true }, 'n')).toThrow('n');
48
- expect(() => requireString({ n: null }, 'n')).toThrow('n');
49
- });
50
- it('rejects whitespace-only strings', () => {
51
- expect(() => requireString({ n: ' ' }, 'n')).toThrow('n');
52
- expect(() => requireString({ n: '\t\n' }, 'n')).toThrow('n');
53
- });
54
- it('accepts strings with leading/trailing whitespace and content', () => {
55
- expect(requireString({ n: ' hello ' }, 'n')).toBe(' hello ');
56
- });
57
- });
58
- describe('clamp', () => {
59
- it('returns default when value is undefined', () => {
60
- expect(clamp(undefined, 10, 50)).toBe(10);
61
- });
62
- it('returns default when value is null', () => {
63
- expect(clamp(null, 10, 50)).toBe(10);
64
- });
65
- it('returns default when value is NaN', () => {
66
- expect(clamp(NaN, 10, 50)).toBe(10);
67
- expect(clamp('not-a-number', 10, 50)).toBe(10);
68
- });
69
- it('returns default when value is 0 or negative', () => {
70
- expect(clamp(0, 10, 50)).toBe(10);
71
- expect(clamp(-5, 10, 50)).toBe(10);
72
- expect(clamp(-100, 10, 50)).toBe(10);
73
- });
74
- it('clamps to max when value exceeds it', () => {
75
- expect(clamp(200, 10, 50)).toBe(50);
76
- expect(clamp(51, 10, 50)).toBe(50);
77
- });
78
- it('passes through values within range', () => {
79
- expect(clamp(25, 10, 50)).toBe(25);
80
- expect(clamp(1, 10, 50)).toBe(1);
81
- expect(clamp(50, 10, 50)).toBe(50);
82
- });
83
- it('coerces string numbers', () => {
84
- expect(clamp('25', 10, 50)).toBe(25);
85
- expect(clamp('100', 10, 50)).toBe(50);
86
- });
87
- });
88
- //# sourceMappingURL=validate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/handlers/validate.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,199 +0,0 @@
1
- // Mock handler.js to avoid loading registry.ts (which uses import.meta.url)
2
- jest.mock('../../server/handler.js', () => ({
3
- advanceEpoch: jest.fn(() => 1),
4
- getEpoch: jest.fn(() => 1),
5
- }));
6
- import { handleQueue } from '../../server/queue.js';
7
- // Mock handlers returning HandlerResponse { text, refs }
8
- const handlers = {
9
- tool_a: async (params) => ({
10
- text: `Result A: ${params.input ?? 'default'}`,
11
- refs: { id: 'result-a', value: params.input ?? 'default' },
12
- }),
13
- tool_b: async (params) => ({
14
- text: `Result B: ref=${params.ref ?? 'none'}`,
15
- refs: { id: 'result-b', ref: params.ref ?? 'none' },
16
- }),
17
- tool_fail: async () => { throw new Error('intentional failure'); },
18
- };
19
- describe('handleQueue', () => {
20
- it('executes operations sequentially', async () => {
21
- const result = await handleQueue({
22
- operations: [
23
- { tool: 'tool_a', args: { input: 'hello' } },
24
- { tool: 'tool_b', args: { ref: 'world' } },
25
- ],
26
- }, handlers);
27
- expect(result.text).toContain('2/2 succeeded');
28
- expect(result.text).toContain('✓ tool_a');
29
- expect(result.text).toContain('✓ tool_b');
30
- expect(result.refs.succeeded).toBe(2);
31
- });
32
- it('resolves $N.field references from refs', async () => {
33
- const result = await handleQueue({
34
- operations: [
35
- { tool: 'tool_a', args: { input: 'first' } },
36
- { tool: 'tool_b', args: { ref: '$0.id' } },
37
- ],
38
- }, handlers);
39
- // tool_b should have received ref='result-a' (from tool_a's refs.id)
40
- expect(result.text).toContain('✓ tool_b');
41
- expect(result.refs.succeeded).toBe(2);
42
- });
43
- it('bails on error by default', async () => {
44
- const result = await handleQueue({
45
- operations: [
46
- { tool: 'tool_a', args: {} },
47
- { tool: 'tool_fail', args: {} },
48
- { tool: 'tool_b', args: {} },
49
- ],
50
- }, handlers);
51
- expect(result.refs.succeeded).toBe(1);
52
- expect(result.refs.failed).toBe(1);
53
- expect(result.refs.skipped).toBe(1);
54
- expect(result.text).toContain('✗ tool_fail');
55
- expect(result.text).toContain('○ tool_b');
56
- });
57
- it('continues on error when onError is continue', async () => {
58
- const result = await handleQueue({
59
- operations: [
60
- { tool: 'tool_a', args: {} },
61
- { tool: 'tool_fail', args: {}, onError: 'continue' },
62
- { tool: 'tool_b', args: {} },
63
- ],
64
- }, handlers);
65
- expect(result.refs.succeeded).toBe(2);
66
- expect(result.refs.failed).toBe(1);
67
- expect(result.refs.skipped).toBe(0);
68
- });
69
- it('errors on forward references', async () => {
70
- const result = await handleQueue({
71
- operations: [
72
- { tool: 'tool_a', args: { input: '$1.id' } },
73
- { tool: 'tool_b', args: {} },
74
- ],
75
- }, handlers);
76
- expect(result.text).toContain('✗ tool_a');
77
- expect(result.text).toContain("hasn't run yet");
78
- });
79
- it('errors on references to failed operations', async () => {
80
- const result = await handleQueue({
81
- operations: [
82
- { tool: 'tool_fail', args: {}, onError: 'continue' },
83
- { tool: 'tool_b', args: { ref: '$0.id' } },
84
- ],
85
- }, handlers);
86
- expect(result.refs.failed).toBe(2);
87
- });
88
- it('errors on missing field in reference', async () => {
89
- const result = await handleQueue({
90
- operations: [
91
- { tool: 'tool_a', args: {} },
92
- { tool: 'tool_b', args: { ref: '$0.nonexistent' }, onError: 'continue' },
93
- ],
94
- }, handlers);
95
- expect(result.text).toContain('not found');
96
- });
97
- it('errors on unknown tool', async () => {
98
- const result = await handleQueue({
99
- operations: [
100
- { tool: 'unknown_tool', args: {} },
101
- ],
102
- }, handlers);
103
- expect(result.text).toContain('✗ unknown_tool');
104
- expect(result.text).toContain('Unknown tool');
105
- });
106
- it('strips next_steps from per-operation text in summary', async () => {
107
- const handlersWithSteps = {
108
- tool_with_steps: async () => ({
109
- text: 'Some result\n\n---\n**Next steps:**\n- Do something',
110
- refs: { id: '1' },
111
- }),
112
- };
113
- const result = await handleQueue({
114
- operations: [{ tool: 'tool_with_steps', args: {} }],
115
- }, handlersWithSteps);
116
- // Summary line should not contain next-steps
117
- const lines = result.text.split('\n');
118
- const summaryLine = lines.find(l => l.includes('tool_with_steps'));
119
- expect(summaryLine).not.toContain('Next steps');
120
- // But consolidated next-steps from last success should be appended
121
- expect(result.text).toContain('**Next steps:**');
122
- });
123
- it('rejects empty operations array', async () => {
124
- await expect(handleQueue({ operations: [] }, handlers)).rejects.toThrow('must not be empty');
125
- });
126
- it('returns markdown summary', async () => {
127
- const result = await handleQueue({
128
- operations: [
129
- { tool: 'tool_a', args: { input: 'test' } },
130
- ],
131
- }, handlers);
132
- expect(result.text).toContain('## Queue Results');
133
- expect(result.text).toContain('1/1 succeeded');
134
- });
135
- it('exposes per-operation refs in results array', async () => {
136
- const result = await handleQueue({
137
- operations: [
138
- { tool: 'tool_a', args: { input: 'hello' } },
139
- { tool: 'tool_b', args: { ref: 'world' } },
140
- ],
141
- }, handlers);
142
- const opResults = result.refs.results;
143
- expect(opResults).toHaveLength(2);
144
- expect(opResults[0]).toMatchObject({ tool: 'tool_a', status: 'success', id: 'result-a' });
145
- expect(opResults[1]).toMatchObject({ tool: 'tool_b', status: 'success', id: 'result-b' });
146
- });
147
- it('includes error status in per-operation results', async () => {
148
- const result = await handleQueue({
149
- operations: [
150
- { tool: 'tool_fail', args: {}, onError: 'continue' },
151
- { tool: 'tool_a', args: {} },
152
- ],
153
- }, handlers);
154
- const opResults = result.refs.results;
155
- expect(opResults[0]).toMatchObject({ tool: 'tool_fail', status: 'error' });
156
- expect(opResults[1]).toMatchObject({ tool: 'tool_a', status: 'success' });
157
- });
158
- describe('detail: full', () => {
159
- it('includes complete operation output below summary lines', async () => {
160
- const result = await handleQueue({
161
- operations: [
162
- { tool: 'tool_a', args: { input: 'hello' } },
163
- { tool: 'tool_b', args: { ref: 'world' } },
164
- ],
165
- detail: 'full',
166
- }, handlers);
167
- expect(result.text).toContain('## Queue Results');
168
- // Full output should appear
169
- expect(result.text).toContain('Result A: hello');
170
- expect(result.text).toContain('Result B: ref=world');
171
- });
172
- it('does not include output for failed operations', async () => {
173
- const result = await handleQueue({
174
- operations: [
175
- { tool: 'tool_a', args: {} },
176
- { tool: 'tool_fail', args: {}, onError: 'continue' },
177
- ],
178
- detail: 'full',
179
- }, handlers);
180
- expect(result.text).toContain('Result A: default');
181
- expect(result.text).toContain('✗ tool_fail');
182
- // Error message appears in summary line, not as full output
183
- });
184
- });
185
- describe('detail: summary (default)', () => {
186
- it('only shows one-liner per operation, not full output blocks', async () => {
187
- const result = await handleQueue({
188
- operations: [
189
- { tool: 'tool_a', args: { input: 'hello' } },
190
- ],
191
- }, handlers);
192
- // Summary line contains the first content line
193
- expect(result.text).toContain('✓ tool_a — Result A: hello');
194
- // No blank-line-separated full output block
195
- expect(result.text).not.toMatch(/\n\nResult A: hello\n/);
196
- });
197
- });
198
- });
199
- //# sourceMappingURL=queue.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.test.js","sourceRoot":"","sources":["../../../src/__tests__/server/queue.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Tests for server.ts MCP wiring.
3
- *
4
- * We mock the MCP SDK (ESM-only) and verify that createServer
5
- * wires handlers correctly and maps responses/errors.
6
- */
7
- export {};
@@ -1,135 +0,0 @@
1
- /**
2
- * Tests for server.ts MCP wiring.
3
- *
4
- * We mock the MCP SDK (ESM-only) and verify that createServer
5
- * wires handlers correctly and maps responses/errors.
6
- */
7
- // Mock registry before any server imports — avoids import.meta.url in Jest
8
- jest.mock('../../factory/registry.js', () => {
9
- const { loadManifest, generateTools } = jest.requireActual('../../factory/generator.js');
10
- const { patches } = jest.requireActual('../../factory/patches.js');
11
- const manifest = loadManifest();
12
- return { manifest, generatedTools: generateTools(manifest, patches) };
13
- });
14
- const mockSetRequestHandler = jest.fn();
15
- const mockServerConnect = jest.fn();
16
- jest.mock('@modelcontextprotocol/sdk/server/index.js', () => ({
17
- Server: jest.fn().mockImplementation(() => ({
18
- setRequestHandler: mockSetRequestHandler,
19
- connect: mockServerConnect,
20
- })),
21
- }));
22
- jest.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
23
- StdioServerTransport: jest.fn(),
24
- }));
25
- jest.mock('@modelcontextprotocol/sdk/types.js', () => ({
26
- CallToolRequestSchema: 'CallToolRequestSchema',
27
- ListToolsRequestSchema: 'ListToolsRequestSchema',
28
- }));
29
- jest.mock('../../server/handler.js');
30
- import { createServer } from '../../server/server.js';
31
- import { handleToolCall } from '../../server/handler.js';
32
- import { GwsError, GwsExitCode } from '../../executor/errors.js';
33
- const mockHandleToolCall = handleToolCall;
34
- describe('createServer', () => {
35
- let listToolsHandler;
36
- let callToolHandler;
37
- beforeAll(() => {
38
- createServer();
39
- // Extract handlers by schema key, not registration order
40
- for (const [schema, handler] of mockSetRequestHandler.mock.calls) {
41
- if (schema === 'ListToolsRequestSchema')
42
- listToolsHandler = handler;
43
- if (schema === 'CallToolRequestSchema')
44
- callToolHandler = handler;
45
- }
46
- });
47
- beforeEach(() => {
48
- mockHandleToolCall.mockReset();
49
- });
50
- it('registers ListTools and CallTool handlers', () => {
51
- expect(listToolsHandler).toBeInstanceOf(Function);
52
- expect(callToolHandler).toBeInstanceOf(Function);
53
- });
54
- describe('ListTools handler', () => {
55
- it('returns all 5 tool schemas', async () => {
56
- const result = await listToolsHandler({});
57
- const names = result.tools.map((t) => t.name);
58
- expect(names).toContain('manage_accounts');
59
- expect(names).toContain('manage_email');
60
- expect(names).toContain('manage_sheets');
61
- expect(names).toContain('manage_tasks');
62
- expect(names.length).toBeGreaterThanOrEqual(8);
63
- });
64
- it('each tool has name, description, and inputSchema', async () => {
65
- const result = await listToolsHandler({});
66
- for (const tool of result.tools) {
67
- expect(tool).toHaveProperty('name');
68
- expect(tool).toHaveProperty('description');
69
- expect(tool).toHaveProperty('inputSchema');
70
- }
71
- });
72
- });
73
- describe('CallTool handler', () => {
74
- it('returns markdown text content on success', async () => {
75
- const response = { text: '## Messages (1)\n\nmsg-1 | alice', refs: { count: 1 } };
76
- mockHandleToolCall.mockResolvedValue(response);
77
- const result = await callToolHandler({
78
- params: { name: 'manage_email', arguments: { operation: 'triage', email: 'u@t.com' } },
79
- });
80
- expect(result.content).toHaveLength(1);
81
- expect(result.content[0].type).toBe('text');
82
- expect(result.content[0].text).toBe('## Messages (1)\n\nmsg-1 | alice');
83
- expect(result.isError).toBeUndefined();
84
- });
85
- it('maps GwsError to structured isError response', async () => {
86
- mockHandleToolCall.mockRejectedValue(new GwsError('Token expired', GwsExitCode.AuthError, 'authError', 'stderr: token invalid'));
87
- const result = await callToolHandler({
88
- params: { name: 'manage_email', arguments: { operation: 'triage', email: 'u@t.com' } },
89
- });
90
- expect(result.isError).toBe(true);
91
- const text = result.content[0].text;
92
- // Error JSON is followed by auth remediation guidance
93
- expect(text).toContain('"error": "Token expired"');
94
- expect(text).toContain(`"exitCode": ${GwsExitCode.AuthError}`);
95
- expect(text).toContain('"reason": "authError"');
96
- // Auth error should include remediation guidance
97
- expect(text).toContain('**Next steps:**');
98
- expect(text).toContain('Re-authenticate');
99
- });
100
- it('maps generic Error to plain error message', async () => {
101
- mockHandleToolCall.mockRejectedValue(new Error('Something broke'));
102
- const result = await callToolHandler({
103
- params: { name: 'manage_email', arguments: {} },
104
- });
105
- expect(result.isError).toBe(true);
106
- expect(result.content[0].text).toBe('Error: Something broke');
107
- });
108
- it('handles non-Error thrown values', async () => {
109
- mockHandleToolCall.mockRejectedValue('string error');
110
- const result = await callToolHandler({
111
- params: { name: 'manage_email', arguments: {} },
112
- });
113
- expect(result.isError).toBe(true);
114
- expect(result.content[0].text).toBe('Error: string error');
115
- });
116
- it('passes arguments to handleToolCall', async () => {
117
- mockHandleToolCall.mockResolvedValue({ text: 'ok', refs: {} });
118
- await callToolHandler({
119
- params: { name: 'manage_drive', arguments: { operation: 'search', email: 'u@t.com' } },
120
- });
121
- expect(mockHandleToolCall).toHaveBeenCalledWith('manage_drive', {
122
- operation: 'search',
123
- email: 'u@t.com',
124
- });
125
- });
126
- it('defaults to empty object when arguments are undefined', async () => {
127
- mockHandleToolCall.mockResolvedValue({ text: 'ok', refs: {} });
128
- await callToolHandler({
129
- params: { name: 'manage_accounts' },
130
- });
131
- expect(mockHandleToolCall).toHaveBeenCalledWith('manage_accounts', {});
132
- });
133
- });
134
- });
135
- //# sourceMappingURL=server.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/__tests__/server/server.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,101 +0,0 @@
1
- import { sessionContext } from '../../../server/session/context.js';
2
- import { SessionTracker } from '../../../server/session/tracker.js';
3
- // Create a tracker with pre-set session data (no API calls needed)
4
- function trackerWith(email, session) {
5
- const tracker = new SessionTracker();
6
- // Use getContext to verify empty, then set via ensureBaseline internals
7
- // Instead, we'll use a helper that sets state directly for testing
8
- tracker.sessions.set(email, session);
9
- return tracker;
10
- }
11
- function baseSession(overrides = {}) {
12
- return {
13
- baselineUnreadCount: 10,
14
- currentUnreadCount: 10,
15
- baselineTodayEmailCount: 20,
16
- currentTodayEmailCount: 20,
17
- nextEvent: null,
18
- lastRefreshedEpoch: 1,
19
- initialized: true,
20
- ...overrides,
21
- };
22
- }
23
- describe('sessionContext', () => {
24
- it('returns empty string when email is undefined', async () => {
25
- const tracker = new SessionTracker();
26
- expect(await sessionContext('manage_email', undefined, tracker)).toBe('');
27
- });
28
- it('returns empty string for unknown account', async () => {
29
- const tracker = new SessionTracker();
30
- expect(await sessionContext('manage_email', 'nobody@test.com', tracker)).toBe('');
31
- });
32
- it('returns empty string for uninitialized session', async () => {
33
- const tracker = trackerWith('u@t.com', baseSession({ initialized: false }));
34
- expect(await sessionContext('manage_email', 'u@t.com', tracker)).toBe('');
35
- });
36
- it('shows positive email delta', async () => {
37
- const tracker = trackerWith('u@t.com', baseSession({
38
- baselineUnreadCount: 10,
39
- currentUnreadCount: 13,
40
- currentTodayEmailCount: 25,
41
- }));
42
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
43
- expect(result).toContain('3 new unread emails since session start');
44
- expect(result).toContain('13 unread');
45
- expect(result).toContain('25 today');
46
- });
47
- it('shows singular for delta of 1', async () => {
48
- const tracker = trackerWith('u@t.com', baseSession({
49
- baselineUnreadCount: 10,
50
- currentUnreadCount: 11,
51
- }));
52
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
53
- expect(result).toContain('1 new unread email since session start');
54
- });
55
- it('shows negative delta (user read emails)', async () => {
56
- const tracker = trackerWith('u@t.com', baseSession({
57
- baselineUnreadCount: 10,
58
- currentUnreadCount: 8,
59
- }));
60
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
61
- expect(result).toContain('2 fewer unread since session start');
62
- });
63
- it('shows zero delta', async () => {
64
- const tracker = trackerWith('u@t.com', baseSession());
65
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
66
- expect(result).toContain('No new unread emails since session start');
67
- });
68
- it('shows next event with relative time', async () => {
69
- const inThirty = new Date(Date.now() + 30 * 60_000).toISOString();
70
- const tracker = trackerWith('u@t.com', baseSession({
71
- nextEvent: { summary: 'Standup', startTime: inThirty },
72
- }));
73
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
74
- expect(result).toContain('Next: "Standup" in 30 min');
75
- });
76
- it('shows next event with absolute time when >2h away', async () => {
77
- const inFive = new Date(Date.now() + 5 * 60 * 60_000).toISOString();
78
- const tracker = trackerWith('u@t.com', baseSession({
79
- nextEvent: { summary: 'Lunch', startTime: inFive },
80
- }));
81
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
82
- expect(result).toContain('Next: "Lunch" at');
83
- expect(result).toMatch(/at \d{1,2}:\d{2}\s*(AM|PM)/);
84
- });
85
- it('shows "no more events" when nextEvent is null', async () => {
86
- const tracker = trackerWith('u@t.com', baseSession({ nextEvent: null }));
87
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
88
- expect(result).toContain('No more events today');
89
- });
90
- it('includes section header with email', async () => {
91
- const tracker = trackerWith('user@example.com', baseSession());
92
- const result = await sessionContext('manage_email', 'user@example.com', tracker);
93
- expect(result).toContain('**Session context** (user@example.com):');
94
- });
95
- it('starts with separator', async () => {
96
- const tracker = trackerWith('u@t.com', baseSession());
97
- const result = await sessionContext('manage_email', 'u@t.com', tracker);
98
- expect(result).toMatch(/^\n\n---\n/);
99
- });
100
- });
101
- //# sourceMappingURL=context.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/session/context.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};