@aaronsb/google-workspace-mcp 2.0.0-alpha.4
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.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/build/__helpers__/testSetup.d.ts +1 -0
- package/build/__helpers__/testSetup.js +6 -0
- package/build/__helpers__/testSetup.js.map +1 -0
- package/build/__tests__/accounts/credentials.test.d.ts +1 -0
- package/build/__tests__/accounts/credentials.test.js +129 -0
- package/build/__tests__/accounts/credentials.test.js.map +1 -0
- package/build/__tests__/accounts/registry.test.d.ts +1 -0
- package/build/__tests__/accounts/registry.test.js +74 -0
- package/build/__tests__/accounts/registry.test.js.map +1 -0
- package/build/__tests__/executor/errors.test.d.ts +1 -0
- package/build/__tests__/executor/errors.test.js +42 -0
- package/build/__tests__/executor/errors.test.js.map +1 -0
- package/build/__tests__/executor/gws.test.d.ts +1 -0
- package/build/__tests__/executor/gws.test.js +178 -0
- package/build/__tests__/executor/gws.test.js.map +1 -0
- package/build/__tests__/executor/paths.test.d.ts +1 -0
- package/build/__tests__/executor/paths.test.js +60 -0
- package/build/__tests__/executor/paths.test.js.map +1 -0
- package/build/__tests__/executor/workspace.test.d.ts +1 -0
- package/build/__tests__/executor/workspace.test.js +117 -0
- package/build/__tests__/executor/workspace.test.js.map +1 -0
- package/build/__tests__/factory/generator.test.d.ts +1 -0
- package/build/__tests__/factory/generator.test.js +178 -0
- package/build/__tests__/factory/generator.test.js.map +1 -0
- package/build/__tests__/factory/patch-coverage.test.d.ts +10 -0
- package/build/__tests__/factory/patch-coverage.test.js +148 -0
- package/build/__tests__/factory/patch-coverage.test.js.map +1 -0
- package/build/__tests__/factory/safety.test.d.ts +1 -0
- package/build/__tests__/factory/safety.test.js +107 -0
- package/build/__tests__/factory/safety.test.js.map +1 -0
- package/build/__tests__/integration/executor.test.d.ts +5 -0
- package/build/__tests__/integration/executor.test.js +46 -0
- package/build/__tests__/integration/executor.test.js.map +1 -0
- package/build/__tests__/integration/handlers.test.d.ts +6 -0
- package/build/__tests__/integration/handlers.test.js +95 -0
- package/build/__tests__/integration/handlers.test.js.map +1 -0
- package/build/__tests__/integration/setup.d.ts +19 -0
- package/build/__tests__/integration/setup.js +61 -0
- package/build/__tests__/integration/setup.js.map +1 -0
- package/build/__tests__/server/formatting/markdown.test.d.ts +1 -0
- package/build/__tests__/server/formatting/markdown.test.js +149 -0
- package/build/__tests__/server/formatting/markdown.test.js.map +1 -0
- package/build/__tests__/server/formatting/next-steps.test.d.ts +1 -0
- package/build/__tests__/server/formatting/next-steps.test.js +42 -0
- package/build/__tests__/server/formatting/next-steps.test.js.map +1 -0
- package/build/__tests__/server/handler.test.d.ts +1 -0
- package/build/__tests__/server/handler.test.js +97 -0
- package/build/__tests__/server/handler.test.js.map +1 -0
- package/build/__tests__/server/handlers/__mocks__/executor.d.ts +147 -0
- package/build/__tests__/server/handlers/__mocks__/executor.js +114 -0
- package/build/__tests__/server/handlers/__mocks__/executor.js.map +1 -0
- package/build/__tests__/server/handlers/accounts.test.d.ts +1 -0
- package/build/__tests__/server/handlers/accounts.test.js +127 -0
- package/build/__tests__/server/handlers/accounts.test.js.map +1 -0
- package/build/__tests__/server/handlers/calendar.test.d.ts +1 -0
- package/build/__tests__/server/handlers/calendar.test.js +95 -0
- package/build/__tests__/server/handlers/calendar.test.js.map +1 -0
- package/build/__tests__/server/handlers/drive.test.d.ts +1 -0
- package/build/__tests__/server/handlers/drive.test.js +81 -0
- package/build/__tests__/server/handlers/drive.test.js.map +1 -0
- package/build/__tests__/server/handlers/email.test.d.ts +1 -0
- package/build/__tests__/server/handlers/email.test.js +99 -0
- package/build/__tests__/server/handlers/email.test.js.map +1 -0
- package/build/__tests__/server/handlers/validate.test.d.ts +1 -0
- package/build/__tests__/server/handlers/validate.test.js +88 -0
- package/build/__tests__/server/handlers/validate.test.js.map +1 -0
- package/build/__tests__/server/queue.test.d.ts +1 -0
- package/build/__tests__/server/queue.test.js +194 -0
- package/build/__tests__/server/queue.test.js.map +1 -0
- package/build/__tests__/server/server.test.d.ts +7 -0
- package/build/__tests__/server/server.test.js +135 -0
- package/build/__tests__/server/server.test.js.map +1 -0
- package/build/__tests__/server/tools.test.d.ts +1 -0
- package/build/__tests__/server/tools.test.js +91 -0
- package/build/__tests__/server/tools.test.js.map +1 -0
- package/build/accounts/auth.d.ts +24 -0
- package/build/accounts/auth.js +118 -0
- package/build/accounts/auth.js.map +1 -0
- package/build/accounts/credentials.d.ts +11 -0
- package/build/accounts/credentials.js +52 -0
- package/build/accounts/credentials.js.map +1 -0
- package/build/accounts/index.d.ts +6 -0
- package/build/accounts/index.js +4 -0
- package/build/accounts/index.js.map +1 -0
- package/build/accounts/registry.d.ts +11 -0
- package/build/accounts/registry.js +62 -0
- package/build/accounts/registry.js.map +1 -0
- package/build/executor/errors.d.ts +15 -0
- package/build/executor/errors.js +37 -0
- package/build/executor/errors.js.map +1 -0
- package/build/executor/file-output.d.ts +23 -0
- package/build/executor/file-output.js +67 -0
- package/build/executor/file-output.js.map +1 -0
- package/build/executor/gws.d.ts +23 -0
- package/build/executor/gws.js +144 -0
- package/build/executor/gws.js.map +1 -0
- package/build/executor/index.d.ts +4 -0
- package/build/executor/index.js +4 -0
- package/build/executor/index.js.map +1 -0
- package/build/executor/paths.d.ts +6 -0
- package/build/executor/paths.js +25 -0
- package/build/executor/paths.js.map +1 -0
- package/build/executor/workspace.d.ts +38 -0
- package/build/executor/workspace.js +146 -0
- package/build/executor/workspace.js.map +1 -0
- package/build/factory/defaults.d.ts +8 -0
- package/build/factory/defaults.js +101 -0
- package/build/factory/defaults.js.map +1 -0
- package/build/factory/generator.d.ts +23 -0
- package/build/factory/generator.js +253 -0
- package/build/factory/generator.js.map +1 -0
- package/build/factory/manifest.yaml +852 -0
- package/build/factory/patches.d.ts +6 -0
- package/build/factory/patches.js +13 -0
- package/build/factory/patches.js.map +1 -0
- package/build/factory/registry.d.ts +12 -0
- package/build/factory/registry.js +18 -0
- package/build/factory/registry.js.map +1 -0
- package/build/factory/safety.d.ts +68 -0
- package/build/factory/safety.js +157 -0
- package/build/factory/safety.js.map +1 -0
- package/build/factory/types.d.ts +102 -0
- package/build/factory/types.js +6 -0
- package/build/factory/types.js.map +1 -0
- package/build/factory/yaml.d.ts +2 -0
- package/build/factory/yaml.js +3 -0
- package/build/factory/yaml.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +14 -0
- package/build/index.js.map +1 -0
- package/build/server/formatting/markdown.d.ts +21 -0
- package/build/server/formatting/markdown.js +324 -0
- package/build/server/formatting/markdown.js.map +1 -0
- package/build/server/formatting/next-steps.d.ts +9 -0
- package/build/server/formatting/next-steps.js +123 -0
- package/build/server/formatting/next-steps.js.map +1 -0
- package/build/server/handler.d.ts +3 -0
- package/build/server/handler.js +24 -0
- package/build/server/handler.js.map +1 -0
- package/build/server/handlers/accounts.d.ts +2 -0
- package/build/server/handlers/accounts.js +181 -0
- package/build/server/handlers/accounts.js.map +1 -0
- package/build/server/handlers/calendar.d.ts +2 -0
- package/build/server/handlers/calendar.js +93 -0
- package/build/server/handlers/calendar.js.map +1 -0
- package/build/server/handlers/drive.d.ts +2 -0
- package/build/server/handlers/drive.js +74 -0
- package/build/server/handlers/drive.js.map +1 -0
- package/build/server/handlers/email.d.ts +2 -0
- package/build/server/handlers/email.js +115 -0
- package/build/server/handlers/email.js.map +1 -0
- package/build/server/handlers/validate.d.ts +3 -0
- package/build/server/handlers/validate.js +22 -0
- package/build/server/handlers/validate.js.map +1 -0
- package/build/server/handlers/workspace.d.ts +9 -0
- package/build/server/handlers/workspace.js +110 -0
- package/build/server/handlers/workspace.js.map +1 -0
- package/build/server/index.d.ts +4 -0
- package/build/server/index.js +4 -0
- package/build/server/index.js.map +1 -0
- package/build/server/queue.d.ts +11 -0
- package/build/server/queue.js +141 -0
- package/build/server/queue.js.map +1 -0
- package/build/server/server.d.ts +3 -0
- package/build/server/server.js +214 -0
- package/build/server/server.js.map +1 -0
- package/build/server/tools.d.ts +13 -0
- package/build/server/tools.js +99 -0
- package/build/server/tools.js.map +1 -0
- package/build/services/calendar/patch.d.ts +11 -0
- package/build/services/calendar/patch.js +116 -0
- package/build/services/calendar/patch.js.map +1 -0
- package/build/services/drive/patch.d.ts +10 -0
- package/build/services/drive/patch.js +131 -0
- package/build/services/drive/patch.js.map +1 -0
- package/build/services/gmail/attachments.d.ts +19 -0
- package/build/services/gmail/attachments.js +90 -0
- package/build/services/gmail/attachments.js.map +1 -0
- package/build/services/gmail/patch.d.ts +10 -0
- package/build/services/gmail/patch.js +226 -0
- package/build/services/gmail/patch.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { formatEmailList, formatEmailDetail, formatEventList, formatEventDetail, formatFileList, formatFileDetail, } from '../../../server/formatting/markdown.js';
|
|
2
|
+
describe('formatEmailList', () => {
|
|
3
|
+
it('formats triage response as markdown with pipe-delimited rows', () => {
|
|
4
|
+
const result = formatEmailList({
|
|
5
|
+
messages: [
|
|
6
|
+
{ id: 'msg-1', from: 'alice@test.com', subject: 'Hello', date: 'Mon, 10 Mar 2026' },
|
|
7
|
+
{ id: 'msg-2', from: 'bob@test.com', subject: 'Meeting' },
|
|
8
|
+
],
|
|
9
|
+
});
|
|
10
|
+
expect(result.text).toContain('## Messages (2)');
|
|
11
|
+
expect(result.text).toContain('msg-1 | alice@test.com | Hello');
|
|
12
|
+
expect(result.text).toContain('msg-2 | bob@test.com | Meeting');
|
|
13
|
+
expect(result.refs.count).toBe(2);
|
|
14
|
+
expect(result.refs.messageId).toBe('msg-1');
|
|
15
|
+
});
|
|
16
|
+
it('handles empty messages', () => {
|
|
17
|
+
expect(formatEmailList({}).text).toBe('No messages found.');
|
|
18
|
+
expect(formatEmailList({ messages: [] }).text).toBe('No messages found.');
|
|
19
|
+
expect(formatEmailList({}).refs.count).toBe(0);
|
|
20
|
+
});
|
|
21
|
+
it('falls back to items array', () => {
|
|
22
|
+
const result = formatEmailList({ items: [{ id: 'x', from: 'a@b.com', subject: 'Hi' }] });
|
|
23
|
+
expect(result.refs.count).toBe(1);
|
|
24
|
+
expect(result.text).toContain('x |');
|
|
25
|
+
});
|
|
26
|
+
it('provides message IDs array in refs', () => {
|
|
27
|
+
const result = formatEmailList({
|
|
28
|
+
messages: [{ id: 'a' }, { id: 'b' }, { id: 'c' }],
|
|
29
|
+
});
|
|
30
|
+
expect(result.refs.messages).toEqual(['a', 'b', 'c']);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('formatEmailDetail', () => {
|
|
34
|
+
it('formats as prose with headers', () => {
|
|
35
|
+
const result = formatEmailDetail({
|
|
36
|
+
id: 'msg-1', threadId: 'thread-1', snippet: 'Preview',
|
|
37
|
+
labelIds: ['INBOX'],
|
|
38
|
+
payload: {
|
|
39
|
+
headers: [
|
|
40
|
+
{ name: 'From', value: 'alice@test.com' },
|
|
41
|
+
{ name: 'Subject', value: 'Test' },
|
|
42
|
+
{ name: 'Date', value: '2026-03-14' },
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
expect(result.text).toContain('## Test');
|
|
47
|
+
expect(result.text).toContain('**From:** alice@test.com');
|
|
48
|
+
expect(result.text).toContain('**Labels:** INBOX');
|
|
49
|
+
expect(result.text).toContain('Preview');
|
|
50
|
+
expect(result.refs.from).toBe('alice@test.com');
|
|
51
|
+
expect(result.refs.subject).toBe('Test');
|
|
52
|
+
expect(result.refs.id).toBe('msg-1');
|
|
53
|
+
});
|
|
54
|
+
it('handles missing payload', () => {
|
|
55
|
+
const result = formatEmailDetail({ id: 'msg-1' });
|
|
56
|
+
expect(result.text).toContain('**From:**');
|
|
57
|
+
expect(result.refs.from).toBe('');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('formatEventList', () => {
|
|
61
|
+
it('formats events with markers and pipe-delimited fields', () => {
|
|
62
|
+
const result = formatEventList({
|
|
63
|
+
items: [
|
|
64
|
+
{ id: 'evt-1', summary: 'Standup', start: { dateTime: '2026-03-14T09:00:00Z' }, end: { dateTime: '2026-03-14T09:30:00Z' }, status: 'confirmed', attendees: [{}, {}] },
|
|
65
|
+
{ id: 'evt-2', summary: 'Lunch', start: { date: '2026-03-14' }, end: { date: '2026-03-14' }, status: 'confirmed' },
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
expect(result.text).toContain('## Events (2)');
|
|
69
|
+
expect(result.text).toContain('Standup');
|
|
70
|
+
expect(result.text).toContain('2 attendees');
|
|
71
|
+
expect(result.text).toContain('_(evt-1)_');
|
|
72
|
+
expect(result.refs.count).toBe(2);
|
|
73
|
+
expect(result.refs.eventId).toBe('evt-1');
|
|
74
|
+
});
|
|
75
|
+
it('handles missing title', () => {
|
|
76
|
+
const result = formatEventList({ items: [{ id: 'x', start: {}, end: {} }] });
|
|
77
|
+
expect(result.text).toContain('(no title)');
|
|
78
|
+
});
|
|
79
|
+
it('handles empty items', () => {
|
|
80
|
+
expect(formatEventList({}).text).toBe('No events found.');
|
|
81
|
+
expect(formatEventList({}).refs.count).toBe(0);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('formatEventDetail', () => {
|
|
85
|
+
it('formats as prose with attendees and meet link', () => {
|
|
86
|
+
const result = formatEventDetail({
|
|
87
|
+
id: 'evt-1', summary: 'Meeting',
|
|
88
|
+
start: { dateTime: '2026-03-14T10:00:00Z' },
|
|
89
|
+
end: { dateTime: '2026-03-14T11:00:00Z' },
|
|
90
|
+
organizer: { email: 'org@test.com' },
|
|
91
|
+
attendees: [{ email: 'a@test.com', responseStatus: 'accepted' }],
|
|
92
|
+
conferenceData: { entryPoints: [{ entryPointType: 'video', uri: 'https://meet.google.com/xxx' }] },
|
|
93
|
+
});
|
|
94
|
+
expect(result.text).toContain('## Meeting');
|
|
95
|
+
expect(result.text).toContain('**Organizer:** org@test.com');
|
|
96
|
+
expect(result.text).toContain('[x] a@test.com');
|
|
97
|
+
expect(result.text).toContain('https://meet.google.com/xxx');
|
|
98
|
+
expect(result.refs.organizer).toBe('org@test.com');
|
|
99
|
+
expect(result.refs.meetLink).toBe('https://meet.google.com/xxx');
|
|
100
|
+
});
|
|
101
|
+
it('handles missing conference data', () => {
|
|
102
|
+
const result = formatEventDetail({ id: 'x', start: {}, end: {} });
|
|
103
|
+
expect(result.refs.meetLink).toBeUndefined();
|
|
104
|
+
});
|
|
105
|
+
it('shows declined attendees with [-] marker', () => {
|
|
106
|
+
const result = formatEventDetail({
|
|
107
|
+
id: 'x', start: {}, end: {},
|
|
108
|
+
attendees: [{ email: 'dec@test.com', responseStatus: 'declined' }],
|
|
109
|
+
});
|
|
110
|
+
expect(result.text).toContain('[-] dec@test.com');
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('formatFileList', () => {
|
|
114
|
+
it('formats files with pipe-delimited rows', () => {
|
|
115
|
+
const result = formatFileList({
|
|
116
|
+
files: [
|
|
117
|
+
{ id: 'f-1', name: 'report.pdf', mimeType: 'application/pdf', modifiedTime: '2026-03-14', size: '1024', webViewLink: 'https://...' },
|
|
118
|
+
{ id: 'f-2', name: 'notes.gdoc', mimeType: 'application/vnd.google-apps.document', modifiedTime: '2026-03-13' },
|
|
119
|
+
],
|
|
120
|
+
});
|
|
121
|
+
expect(result.text).toContain('## Files (2)');
|
|
122
|
+
expect(result.text).toContain('report.pdf');
|
|
123
|
+
expect(result.text).toContain('pdf');
|
|
124
|
+
expect(result.text).toContain('g/document');
|
|
125
|
+
expect(result.refs.count).toBe(2);
|
|
126
|
+
expect(result.refs.fileId).toBe('f-1');
|
|
127
|
+
});
|
|
128
|
+
it('handles empty files', () => {
|
|
129
|
+
expect(formatFileList({}).text).toBe('No files found.');
|
|
130
|
+
expect(formatFileList({ files: [] }).text).toBe('No files found.');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('formatFileDetail', () => {
|
|
134
|
+
it('formats as prose with metadata', () => {
|
|
135
|
+
const result = formatFileDetail({
|
|
136
|
+
id: 'f-1', name: 'report.pdf', mimeType: 'application/pdf',
|
|
137
|
+
modifiedTime: '2026-03-14T10:00:00Z', size: '1048576',
|
|
138
|
+
webViewLink: 'https://drive.google.com/file/d/f-1/view',
|
|
139
|
+
owners: [{ emailAddress: 'user@test.com' }],
|
|
140
|
+
shared: false,
|
|
141
|
+
});
|
|
142
|
+
expect(result.text).toContain('## report.pdf');
|
|
143
|
+
expect(result.text).toContain('**Size:** 1.0 MB');
|
|
144
|
+
expect(result.text).toContain('**Owner:** user@test.com');
|
|
145
|
+
expect(result.text).toContain('**Shared:** no');
|
|
146
|
+
expect(result.refs.fileId).toBe('f-1');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=markdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/formatting/markdown.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { nextSteps } from '../../../server/formatting/next-steps.js';
|
|
2
|
+
describe('nextSteps', () => {
|
|
3
|
+
it('returns markdown footer for known domain/operation', () => {
|
|
4
|
+
const result = nextSteps('email', 'triage');
|
|
5
|
+
expect(result).toContain('---');
|
|
6
|
+
expect(result).toContain('**Next steps:**');
|
|
7
|
+
expect(result).toContain('manage_email');
|
|
8
|
+
});
|
|
9
|
+
it('returns empty string for unknown domain', () => {
|
|
10
|
+
expect(nextSteps('unknown', 'whatever')).toBe('');
|
|
11
|
+
});
|
|
12
|
+
it('returns empty string for unknown operation', () => {
|
|
13
|
+
expect(nextSteps('email', 'nonexistent')).toBe('');
|
|
14
|
+
});
|
|
15
|
+
it('replaces placeholders with context values', () => {
|
|
16
|
+
const result = nextSteps('email', 'read', { messageId: 'msg-123', email: 'u@t.com' });
|
|
17
|
+
expect(result).toContain('msg-123');
|
|
18
|
+
expect(result).toContain('u@t.com');
|
|
19
|
+
});
|
|
20
|
+
it('leaves unreplaced placeholders as-is', () => {
|
|
21
|
+
const result = nextSteps('email', 'read', { messageId: 'msg-123' });
|
|
22
|
+
// email placeholder not in context, stays as <email>
|
|
23
|
+
expect(result).toContain('<email>');
|
|
24
|
+
});
|
|
25
|
+
it('covers all domains with at least one operation', () => {
|
|
26
|
+
const domainOps = {
|
|
27
|
+
accounts: 'list', email: 'triage', calendar: 'list', drive: 'search',
|
|
28
|
+
};
|
|
29
|
+
for (const [domain, op] of Object.entries(domainOps)) {
|
|
30
|
+
const result = nextSteps(domain, op);
|
|
31
|
+
expect(result.length).toBeGreaterThan(0);
|
|
32
|
+
expect(result).toContain('**Next steps:**');
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
it('formats each step with tool name and JSON example', () => {
|
|
36
|
+
const result = nextSteps('drive', 'search');
|
|
37
|
+
// Should contain tool name in backticks and JSON example in backticks
|
|
38
|
+
expect(result).toMatch(/`manage_drive`/);
|
|
39
|
+
expect(result).toMatch(/`\{.*"operation".*\}`/);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=next-steps.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-steps.test.js","sourceRoot":"","sources":["../../../../src/__tests__/server/formatting/next-steps.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAErE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,qDAAqD;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,SAAS,GAA2B;YACxC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;SACrE,CAAC;QACF,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,sEAAsE;QACtE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Mock registry before 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 { handleToolCall } from '../../server/handler.js';
|
|
9
|
+
// Mock gws executor — all factory-generated handlers call through here
|
|
10
|
+
jest.mock('../../executor/gws.js');
|
|
11
|
+
// Mock accounts handler — still hand-coded
|
|
12
|
+
jest.mock('../../server/handlers/accounts.js');
|
|
13
|
+
// Mock queue handler — still hand-coded
|
|
14
|
+
jest.mock('../../server/queue.js');
|
|
15
|
+
import { execute } from '../../executor/gws.js';
|
|
16
|
+
import { handleAccounts } from '../../server/handlers/accounts.js';
|
|
17
|
+
import { handleQueue } from '../../server/queue.js';
|
|
18
|
+
const mockExecute = execute;
|
|
19
|
+
const mockAccounts = handleAccounts;
|
|
20
|
+
const mockQueue = handleQueue;
|
|
21
|
+
const stubResponse = { text: 'ok', refs: {} };
|
|
22
|
+
describe('handleToolCall', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
jest.resetAllMocks();
|
|
25
|
+
});
|
|
26
|
+
it('routes manage_accounts to handleAccounts', async () => {
|
|
27
|
+
mockAccounts.mockResolvedValue(stubResponse);
|
|
28
|
+
const params = { operation: 'list' };
|
|
29
|
+
await handleToolCall('manage_accounts', params);
|
|
30
|
+
expect(mockAccounts).toHaveBeenCalledWith(params);
|
|
31
|
+
expect(mockExecute).not.toHaveBeenCalled();
|
|
32
|
+
});
|
|
33
|
+
it('routes manage_email to factory-generated handler', async () => {
|
|
34
|
+
// Factory handler calls execute() for triage (helper: +triage)
|
|
35
|
+
mockExecute.mockResolvedValue({
|
|
36
|
+
success: true,
|
|
37
|
+
data: { messages: [] },
|
|
38
|
+
stderr: '',
|
|
39
|
+
});
|
|
40
|
+
const params = { operation: 'triage', email: 'u@t.com' };
|
|
41
|
+
const result = await handleToolCall('manage_email', params);
|
|
42
|
+
expect(mockExecute).toHaveBeenCalled();
|
|
43
|
+
expect(result).toHaveProperty('text');
|
|
44
|
+
expect(result).toHaveProperty('refs');
|
|
45
|
+
});
|
|
46
|
+
it('routes manage_calendar to factory-generated handler', async () => {
|
|
47
|
+
mockExecute.mockResolvedValue({
|
|
48
|
+
success: true,
|
|
49
|
+
data: { items: [] },
|
|
50
|
+
stderr: '',
|
|
51
|
+
});
|
|
52
|
+
const params = { operation: 'list', email: 'u@t.com' };
|
|
53
|
+
const result = await handleToolCall('manage_calendar', params);
|
|
54
|
+
expect(mockExecute).toHaveBeenCalled();
|
|
55
|
+
expect(result).toHaveProperty('text');
|
|
56
|
+
});
|
|
57
|
+
it('routes manage_drive to factory-generated handler', async () => {
|
|
58
|
+
mockExecute.mockResolvedValue({
|
|
59
|
+
success: true,
|
|
60
|
+
data: { files: [] },
|
|
61
|
+
stderr: '',
|
|
62
|
+
});
|
|
63
|
+
const params = { operation: 'search', email: 'u@t.com' };
|
|
64
|
+
const result = await handleToolCall('manage_drive', params);
|
|
65
|
+
expect(mockExecute).toHaveBeenCalled();
|
|
66
|
+
expect(result).toHaveProperty('text');
|
|
67
|
+
});
|
|
68
|
+
it('routes queue_operations to handleQueue with domain handlers', async () => {
|
|
69
|
+
mockQueue.mockResolvedValue(stubResponse);
|
|
70
|
+
const params = { operations: [{ tool: 'manage_email', args: {} }] };
|
|
71
|
+
await handleToolCall('queue_operations', params);
|
|
72
|
+
expect(mockQueue).toHaveBeenCalledWith(params, expect.objectContaining({
|
|
73
|
+
manage_accounts: expect.any(Function),
|
|
74
|
+
manage_email: expect.any(Function),
|
|
75
|
+
manage_calendar: expect.any(Function),
|
|
76
|
+
manage_drive: expect.any(Function),
|
|
77
|
+
}));
|
|
78
|
+
});
|
|
79
|
+
it('throws on unknown tool name', async () => {
|
|
80
|
+
await expect(handleToolCall('nonexistent', {})).rejects.toThrow('Unknown tool: nonexistent');
|
|
81
|
+
});
|
|
82
|
+
it('propagates executor errors through factory handler', async () => {
|
|
83
|
+
mockExecute.mockRejectedValue(new Error('API failure'));
|
|
84
|
+
await expect(handleToolCall('manage_email', { operation: 'triage', email: 'u@t.com' })).rejects.toThrow('API failure');
|
|
85
|
+
});
|
|
86
|
+
it('returns HandlerResponse with text and refs from factory handler', async () => {
|
|
87
|
+
mockExecute.mockResolvedValue({
|
|
88
|
+
success: true,
|
|
89
|
+
data: { messages: [{ id: 'msg-1', from: 'alice', subject: 'test', date: '2024-01-01' }] },
|
|
90
|
+
stderr: '',
|
|
91
|
+
});
|
|
92
|
+
const result = await handleToolCall('manage_email', { operation: 'triage', email: 'u@t.com' });
|
|
93
|
+
expect(result.text).toContain('msg-1');
|
|
94
|
+
expect(result.refs).toHaveProperty('count', 1);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=handler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.test.js","sourceRoot":"","sources":["../../../src/__tests__/server/handler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
import type { GwsResult } from '../../../../executor/gws.js';
|
|
8
|
+
import { execute } from '../../../../executor/gws.js';
|
|
9
|
+
export declare const mockExecute: jest.MockedFunction<typeof execute>;
|
|
10
|
+
export declare function mockGwsResponse(data: unknown): GwsResult;
|
|
11
|
+
export declare const gmailTriageResponse: {
|
|
12
|
+
messages: {
|
|
13
|
+
id: string;
|
|
14
|
+
from: string;
|
|
15
|
+
subject: string;
|
|
16
|
+
date: string;
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
export declare const gmailMessageListResponse: {
|
|
20
|
+
messages: {
|
|
21
|
+
id: string;
|
|
22
|
+
threadId: string;
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
export declare function gmailMetadataResponse(id: string, from: string, subject: string, date: string): {
|
|
26
|
+
id: string;
|
|
27
|
+
threadId: string;
|
|
28
|
+
snippet: string;
|
|
29
|
+
payload: {
|
|
30
|
+
headers: {
|
|
31
|
+
name: string;
|
|
32
|
+
value: string;
|
|
33
|
+
}[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export declare const gmailMessageDetailResponse: {
|
|
37
|
+
id: string;
|
|
38
|
+
threadId: string;
|
|
39
|
+
snippet: string;
|
|
40
|
+
labelIds: string[];
|
|
41
|
+
payload: {
|
|
42
|
+
headers: {
|
|
43
|
+
name: string;
|
|
44
|
+
value: string;
|
|
45
|
+
}[];
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export declare const gmailSendResponse: {
|
|
49
|
+
id: string;
|
|
50
|
+
threadId: string;
|
|
51
|
+
labelIds: string[];
|
|
52
|
+
};
|
|
53
|
+
export declare const calendarAgendaResponse: {
|
|
54
|
+
events: {
|
|
55
|
+
calendar: string;
|
|
56
|
+
summary: string;
|
|
57
|
+
start: string;
|
|
58
|
+
end: string;
|
|
59
|
+
}[];
|
|
60
|
+
timeMin: string;
|
|
61
|
+
timeMax: string;
|
|
62
|
+
};
|
|
63
|
+
export declare const calendarEventsListResponse: {
|
|
64
|
+
items: ({
|
|
65
|
+
id: string;
|
|
66
|
+
summary: string;
|
|
67
|
+
start: {
|
|
68
|
+
dateTime: string;
|
|
69
|
+
};
|
|
70
|
+
end: {
|
|
71
|
+
dateTime: string;
|
|
72
|
+
};
|
|
73
|
+
status: string;
|
|
74
|
+
attendees: never[];
|
|
75
|
+
} | {
|
|
76
|
+
id: string;
|
|
77
|
+
summary: string;
|
|
78
|
+
start: {
|
|
79
|
+
dateTime: string;
|
|
80
|
+
};
|
|
81
|
+
end: {
|
|
82
|
+
dateTime: string;
|
|
83
|
+
};
|
|
84
|
+
status: string;
|
|
85
|
+
attendees?: undefined;
|
|
86
|
+
})[];
|
|
87
|
+
};
|
|
88
|
+
export declare const calendarEventDetailResponse: {
|
|
89
|
+
id: string;
|
|
90
|
+
summary: string;
|
|
91
|
+
start: {
|
|
92
|
+
dateTime: string;
|
|
93
|
+
};
|
|
94
|
+
end: {
|
|
95
|
+
dateTime: string;
|
|
96
|
+
};
|
|
97
|
+
status: string;
|
|
98
|
+
location: string;
|
|
99
|
+
description: string;
|
|
100
|
+
organizer: {
|
|
101
|
+
email: string;
|
|
102
|
+
};
|
|
103
|
+
attendees: {
|
|
104
|
+
email: string;
|
|
105
|
+
responseStatus: string;
|
|
106
|
+
}[];
|
|
107
|
+
};
|
|
108
|
+
export declare const calendarInsertResponse: {
|
|
109
|
+
id: string;
|
|
110
|
+
summary: string;
|
|
111
|
+
status: string;
|
|
112
|
+
htmlLink: string;
|
|
113
|
+
};
|
|
114
|
+
export declare const driveFileListResponse: {
|
|
115
|
+
files: ({
|
|
116
|
+
id: string;
|
|
117
|
+
name: string;
|
|
118
|
+
mimeType: string;
|
|
119
|
+
modifiedTime: string;
|
|
120
|
+
size: string;
|
|
121
|
+
webViewLink: string;
|
|
122
|
+
} | {
|
|
123
|
+
id: string;
|
|
124
|
+
name: string;
|
|
125
|
+
mimeType: string;
|
|
126
|
+
modifiedTime: string;
|
|
127
|
+
size?: undefined;
|
|
128
|
+
webViewLink?: undefined;
|
|
129
|
+
})[];
|
|
130
|
+
};
|
|
131
|
+
export declare const driveFileDetailResponse: {
|
|
132
|
+
id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
mimeType: string;
|
|
135
|
+
modifiedTime: string;
|
|
136
|
+
size: string;
|
|
137
|
+
webViewLink: string;
|
|
138
|
+
owners: {
|
|
139
|
+
emailAddress: string;
|
|
140
|
+
}[];
|
|
141
|
+
shared: boolean;
|
|
142
|
+
};
|
|
143
|
+
export declare const driveUploadResponse: {
|
|
144
|
+
id: string;
|
|
145
|
+
name: string;
|
|
146
|
+
mimeType: string;
|
|
147
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
// --- Drive contract responses ---
|
|
93
|
+
export const driveFileListResponse = {
|
|
94
|
+
files: [
|
|
95
|
+
{ 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' },
|
|
96
|
+
{ id: 'file-2', name: 'notes.gdoc', mimeType: 'application/vnd.google-apps.document', modifiedTime: '2026-03-13T10:00:00Z' },
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
export const driveFileDetailResponse = {
|
|
100
|
+
id: 'file-1',
|
|
101
|
+
name: 'report.pdf',
|
|
102
|
+
mimeType: 'application/pdf',
|
|
103
|
+
modifiedTime: '2026-03-14T10:00:00Z',
|
|
104
|
+
size: '1024',
|
|
105
|
+
webViewLink: 'https://drive.google.com/file/d/file-1/view',
|
|
106
|
+
owners: [{ emailAddress: 'user@test.com' }],
|
|
107
|
+
shared: false,
|
|
108
|
+
};
|
|
109
|
+
export const driveUploadResponse = {
|
|
110
|
+
id: 'file-new',
|
|
111
|
+
name: 'uploaded.txt',
|
|
112
|
+
mimeType: 'text/plain',
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../src/__tests__/server/handlers/__mocks__/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|