@aaronsb/google-workspace-mcp 3.0.0 → 4.0.1
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 +201 -21
- package/LICENSE-MIT +21 -0
- package/NOTICE +24 -0
- package/README.md +90 -52
- package/build/accounts/auth.d.ts +1 -1
- package/build/accounts/auth.js +1 -1
- package/build/accounts/oauth.js +3 -3
- package/build/accounts/oauth.js.map +1 -1
- package/build/accounts/token-service.js +1 -1
- package/build/accounts/token-service.js.map +1 -1
- package/build/coverage/analyze.d.ts +1 -1
- package/build/coverage/analyze.js +6 -4
- package/build/coverage/analyze.js.map +1 -1
- package/build/coverage/baseline.js +37 -20
- package/build/coverage/baseline.js.map +1 -1
- package/build/coverage/compare.d.ts +1 -1
- package/build/coverage/compare.js +19 -10
- package/build/coverage/compare.js.map +1 -1
- package/build/coverage/discover.d.ts +5 -5
- package/build/coverage/discover.js +71 -155
- package/build/coverage/discover.js.map +1 -1
- package/build/coverage/report.js +3 -3
- package/build/coverage/report.js.map +1 -1
- package/build/coverage/types.d.ts +19 -4
- package/build/executor/index.d.ts +0 -3
- package/build/executor/index.js +1 -2
- package/build/executor/index.js.map +1 -1
- package/build/factory/defaults.js +30 -4
- package/build/factory/defaults.js.map +1 -1
- package/build/factory/generator.d.ts +10 -2
- package/build/factory/generator.js +54 -69
- package/build/factory/generator.js.map +1 -1
- package/build/factory/manifest/README.md +4 -3
- package/build/factory/manifest/calendar.yaml +1 -11
- package/build/factory/manifest/docs.yaml +15 -6
- package/build/factory/manifest/drive.yaml +1 -5
- package/build/factory/manifest/gmail.yaml +9 -24
- package/build/factory/manifest/meet.yaml +1 -1
- package/build/factory/manifest/sheets.yaml +2 -5
- package/build/factory/manifest/tasks.yaml +40 -2
- package/build/factory/patches.js +2 -0
- package/build/factory/patches.js.map +1 -1
- package/build/factory/safety.js +4 -4
- package/build/factory/safety.js.map +1 -1
- package/build/factory/types.d.ts +16 -15
- package/build/google/client.d.ts +45 -0
- package/build/google/client.js +283 -0
- package/build/google/client.js.map +1 -0
- package/build/google/descriptor.d.ts +40 -0
- package/build/google/descriptor.js +37 -0
- package/build/google/descriptor.js.map +1 -0
- package/build/google/descriptor.json +5271 -0
- package/build/google/errors.d.ts +45 -0
- package/build/google/errors.js +44 -0
- package/build/google/errors.js.map +1 -0
- package/build/google/methods.d.ts +37 -0
- package/build/google/methods.js +13 -0
- package/build/google/methods.js.map +1 -0
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/build/node-floor.js +1 -1
- package/build/node-floor.js.map +1 -1
- package/build/server/formatting/markdown.d.ts +10 -1
- package/build/server/formatting/markdown.js +24 -1
- package/build/server/formatting/markdown.js.map +1 -1
- package/build/server/formatting/next-steps.js +1 -1
- package/build/server/formatting/next-steps.js.map +1 -1
- package/build/server/handlers/accounts.js +2 -2
- package/build/server/handlers/accounts.js.map +1 -1
- package/build/server/scratchpad/adapters/import-doc.js +15 -13
- package/build/server/scratchpad/adapters/import-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/import-drive.js +16 -11
- package/build/server/scratchpad/adapters/import-drive.js.map +1 -1
- package/build/server/scratchpad/adapters/import-email.js +3 -15
- package/build/server/scratchpad/adapters/import-email.js.map +1 -1
- package/build/server/scratchpad/adapters/import-meet.js +5 -17
- package/build/server/scratchpad/adapters/import-meet.js.map +1 -1
- package/build/server/scratchpad/adapters/import-sheet.js +5 -6
- package/build/server/scratchpad/adapters/import-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-calendar.js +18 -13
- package/build/server/scratchpad/adapters/send-calendar.js.map +1 -1
- package/build/server/scratchpad/adapters/send-doc.js +22 -17
- package/build/server/scratchpad/adapters/send-doc.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.d.ts +1 -1
- package/build/server/scratchpad/adapters/send-email-draft.js +17 -25
- package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -1
- package/build/server/scratchpad/adapters/send-email.d.ts +2 -2
- package/build/server/scratchpad/adapters/send-email.js +21 -25
- package/build/server/scratchpad/adapters/send-email.js.map +1 -1
- package/build/server/scratchpad/adapters/send-sheet.js +10 -10
- package/build/server/scratchpad/adapters/send-sheet.js.map +1 -1
- package/build/server/scratchpad/adapters/send-task.js +9 -8
- package/build/server/scratchpad/adapters/send-task.js.map +1 -1
- package/build/server/scratchpad/handler.js +22 -28
- package/build/server/scratchpad/handler.js.map +1 -1
- package/build/server/scratchpad/manager.d.ts +1 -1
- package/build/server/server.js +13 -10
- package/build/server/server.js.map +1 -1
- package/build/server/session/tracker.js +44 -27
- package/build/server/session/tracker.js.map +1 -1
- package/build/server/tools.d.ts +1 -1
- package/build/server/tools.js +3 -3
- package/build/server/tools.js.map +1 -1
- package/build/services/calendar/patch.js +178 -68
- package/build/services/calendar/patch.js.map +1 -1
- package/build/services/docs/patch.d.ts +5 -3
- package/build/services/docs/patch.js +89 -19
- package/build/services/docs/patch.js.map +1 -1
- package/build/services/drive/patch.d.ts +1 -1
- package/build/services/drive/patch.js +115 -143
- package/build/services/drive/patch.js.map +1 -1
- package/build/services/gmail/attachments.js +10 -15
- package/build/services/gmail/attachments.js.map +1 -1
- package/build/services/gmail/mail.d.ts +34 -0
- package/build/services/gmail/mail.js +245 -0
- package/build/services/gmail/mail.js.map +1 -0
- package/build/services/gmail/mime.d.ts +45 -4
- package/build/services/gmail/mime.js +138 -4
- package/build/services/gmail/mime.js.map +1 -1
- package/build/services/gmail/patch.js +109 -90
- package/build/services/gmail/patch.js.map +1 -1
- package/build/services/meet/patch.js +24 -31
- package/build/services/meet/patch.js.map +1 -1
- package/build/services/sheets/patch.js +30 -35
- package/build/services/sheets/patch.js.map +1 -1
- package/build/services/tasks/patch.d.ts +18 -0
- package/build/services/tasks/patch.js +37 -0
- package/build/services/tasks/patch.js.map +1 -0
- package/build/version.d.ts +1 -1
- package/build/version.js +1 -1
- package/package.json +12 -6
- package/build/executor/errors.d.ts +0 -15
- package/build/executor/errors.js +0 -37
- package/build/executor/errors.js.map +0 -1
- package/build/executor/gws.d.ts +0 -26
- package/build/executor/gws.js +0 -197
- package/build/executor/gws.js.map +0 -1
- package/build/server/handlers/calendar.d.ts +0 -2
- package/build/server/handlers/calendar.js +0 -97
- package/build/server/handlers/calendar.js.map +0 -1
- package/build/server/handlers/drive.d.ts +0 -2
- package/build/server/handlers/drive.js +0 -58
- package/build/server/handlers/drive.js.map +0 -1
- package/build/server/handlers/email.d.ts +0 -2
- package/build/server/handlers/email.js +0 -119
- package/build/server/handlers/email.js.map +0 -1
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Only supports text-based files. Binary files return an error with guidance.
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from 'node:fs/promises';
|
|
6
|
-
import {
|
|
7
|
-
import { ensureWorkspaceDir, resolveWorkspacePath } from '../../../executor/workspace.js';
|
|
6
|
+
import { call, download } from '../../../google/client.js';
|
|
7
|
+
import { ensureWorkspaceDir, resolveWorkspacePath, verifyPathSafety } from '../../../executor/workspace.js';
|
|
8
8
|
const TEXT_MIME_PREFIXES = ['text/', 'application/json', 'application/xml', 'application/x-yaml'];
|
|
9
9
|
export async function importDriveFile(scratchpads, scratchpadId, sourceParams) {
|
|
10
10
|
const { email, fileId } = sourceParams;
|
|
@@ -13,11 +13,11 @@ export async function importDriveFile(scratchpads, scratchpadId, sourceParams) {
|
|
|
13
13
|
}
|
|
14
14
|
try {
|
|
15
15
|
// Get file metadata to check type
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const meta = await call('drive', 'files.get', {
|
|
17
|
+
fileId,
|
|
18
|
+
fields: 'id,name,mimeType,size',
|
|
19
|
+
supportsAllDrives: true,
|
|
20
|
+
}, { account: email });
|
|
21
21
|
const mimeType = String(meta.mimeType ?? '');
|
|
22
22
|
const name = String(meta.name ?? fileId);
|
|
23
23
|
const isText = TEXT_MIME_PREFIXES.some(p => mimeType.startsWith(p));
|
|
@@ -27,12 +27,17 @@ export async function importDriveFile(scratchpads, scratchpadId, sourceParams) {
|
|
|
27
27
|
refs: { error: true, scratchpadId, fileId, mimeType },
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
// Download to workspace, then read
|
|
30
|
+
// Download to workspace, then read. `alt: 'media'` is what turns files.get from
|
|
31
|
+
// a metadata read into a byte stream. Without it this is a metadata read, and the
|
|
32
|
+
// feature silently returns no bytes.
|
|
31
33
|
await ensureWorkspaceDir();
|
|
32
|
-
await execute([
|
|
33
|
-
'drive', '+download', '--file-id', fileId,
|
|
34
|
-
], { account: email });
|
|
35
34
|
const filePath = resolveWorkspacePath(name);
|
|
35
|
+
await verifyPathSafety(filePath);
|
|
36
|
+
await download('drive', 'files.get', {
|
|
37
|
+
fileId,
|
|
38
|
+
alt: 'media',
|
|
39
|
+
supportsAllDrives: true,
|
|
40
|
+
}, filePath, { account: email });
|
|
36
41
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
37
42
|
const lines = content.split('\n');
|
|
38
43
|
scratchpads.appendRawLines(scratchpadId, lines);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-drive.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-drive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"import-drive.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-drive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAI5G,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAOlG,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAA8B,EAC9B,YAAoB,EACpB,YAA+B;IAE/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,sDAAsD,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;YAC5C,MAAM;YACN,MAAM,EAAE,uBAAuB;YAC/B,iBAAiB,EAAE,IAAI;SACxB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAA4B,CAAC;QAElD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,SAAS,IAAI,QAAQ,QAAQ,6GAA6G;gBAChJ,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;aACtD,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,kFAAkF;QAClF,qCAAqC;QACrC,MAAM,kBAAkB,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEjC,MAAM,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE;YACnC,MAAM;YACN,GAAG,EAAE,OAAO;YACZ,iBAAiB,EAAE,IAAI;SACxB,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAEhD,OAAO;YACL,IAAI,EAAE,aAAa,IAAI,MAAM,KAAK,CAAC,MAAM,2BAA2B,YAAY,GAAG;YACnF,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE;SAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,kBAAkB,OAAO,EAAE;YACjC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracts plain text body and registers file attachments in the side-table.
|
|
4
4
|
*/
|
|
5
5
|
import * as fs from 'node:fs/promises';
|
|
6
|
-
import {
|
|
6
|
+
import { call } from '../../../google/client.js';
|
|
7
7
|
import { ensureWorkspaceDir, resolveWorkspacePath } from '../../../executor/workspace.js';
|
|
8
8
|
import { extractBodyFromPayload, extractAttachments } from '../../formatting/markdown.js';
|
|
9
9
|
export async function importEmail(scratchpads, scratchpadId, sourceParams) {
|
|
@@ -12,11 +12,7 @@ export async function importEmail(scratchpads, scratchpadId, sourceParams) {
|
|
|
12
12
|
return { text: 'email and messageId are required for email import.', refs: { error: true } };
|
|
13
13
|
}
|
|
14
14
|
try {
|
|
15
|
-
const
|
|
16
|
-
'gmail', 'users', 'messages', 'get',
|
|
17
|
-
'--params', JSON.stringify({ userId: 'me', id: messageId }),
|
|
18
|
-
], { account: email });
|
|
19
|
-
const msg = result.data;
|
|
15
|
+
const msg = await call('gmail', 'users.messages.get', { userId: 'me', id: messageId }, { account: email });
|
|
20
16
|
const payload = msg.payload;
|
|
21
17
|
const body = extractBodyFromPayload(payload);
|
|
22
18
|
if (!body.trim()) {
|
|
@@ -36,15 +32,7 @@ export async function importEmail(scratchpads, scratchpadId, sourceParams) {
|
|
|
36
32
|
for (const att of emailAttachments) {
|
|
37
33
|
try {
|
|
38
34
|
// Download attachment data
|
|
39
|
-
const
|
|
40
|
-
'gmail', 'users', 'messages', 'attachments', 'get',
|
|
41
|
-
'--params', JSON.stringify({
|
|
42
|
-
userId: 'me',
|
|
43
|
-
messageId,
|
|
44
|
-
id: att.attachmentId,
|
|
45
|
-
}),
|
|
46
|
-
], { account: email });
|
|
47
|
-
const attData = attResult.data;
|
|
35
|
+
const attData = await call('gmail', 'users.messages.attachments.get', { userId: 'me', messageId, id: att.attachmentId }, { account: email });
|
|
48
36
|
const base64Data = String(attData.data ?? '');
|
|
49
37
|
if (!base64Data)
|
|
50
38
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-email.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"import-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Import adapter: meet — loads a Meet conference transcript into a scratchpad.
|
|
3
3
|
* Imports as markdown with speaker attribution. No live binding (transcripts are read-only).
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { call } from '../../../google/client.js';
|
|
6
6
|
export async function importMeet(scratchpads, scratchpadId, sourceParams) {
|
|
7
7
|
const { email, conferenceId } = sourceParams;
|
|
8
8
|
if (!email || !conferenceId) {
|
|
@@ -13,11 +13,7 @@ export async function importMeet(scratchpads, scratchpadId, sourceParams) {
|
|
|
13
13
|
? conferenceId
|
|
14
14
|
: `conferenceRecords/${conferenceId}`;
|
|
15
15
|
// Step 1: List transcripts
|
|
16
|
-
const
|
|
17
|
-
'meet', 'conferenceRecords', 'transcripts', 'list',
|
|
18
|
-
'--params', JSON.stringify({ parent }),
|
|
19
|
-
], { account: email, format: 'json' });
|
|
20
|
-
const transcriptsData = transcriptsResult.data;
|
|
16
|
+
const transcriptsData = await call('meet', 'conferenceRecords.transcripts.list', { parent }, { account: email });
|
|
21
17
|
const transcripts = (transcriptsData?.transcripts ?? []);
|
|
22
18
|
if (transcripts.length === 0) {
|
|
23
19
|
return {
|
|
@@ -27,17 +23,10 @@ export async function importMeet(scratchpads, scratchpadId, sourceParams) {
|
|
|
27
23
|
}
|
|
28
24
|
// Step 2: Fetch entries and participants in parallel
|
|
29
25
|
const transcriptName = String(transcripts[0].name ?? '');
|
|
30
|
-
const [
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
'--params', JSON.stringify({ parent: transcriptName, pageSize: 100 }),
|
|
34
|
-
], { account: email, format: 'json' }),
|
|
35
|
-
execute([
|
|
36
|
-
'meet', 'conferenceRecords', 'participants', 'list',
|
|
37
|
-
'--params', JSON.stringify({ parent, pageSize: 100 }),
|
|
38
|
-
], { account: email, format: 'json' }),
|
|
26
|
+
const [entriesData, participantsData] = await Promise.all([
|
|
27
|
+
call('meet', 'conferenceRecords.transcripts.entries.list', { parent: transcriptName, pageSize: 100 }, { account: email }),
|
|
28
|
+
call('meet', 'conferenceRecords.participants.list', { parent, pageSize: 100 }, { account: email }),
|
|
39
29
|
]);
|
|
40
|
-
const entriesData = entriesResult.data;
|
|
41
30
|
const entries = (entriesData?.transcriptEntries ?? []);
|
|
42
31
|
if (entries.length === 0) {
|
|
43
32
|
return {
|
|
@@ -46,7 +35,6 @@ export async function importMeet(scratchpads, scratchpadId, sourceParams) {
|
|
|
46
35
|
};
|
|
47
36
|
}
|
|
48
37
|
// Step 3: Build participant lookup
|
|
49
|
-
const participantsData = participantsResult.data;
|
|
50
38
|
const participants = (participantsData?.participants ?? []);
|
|
51
39
|
const nameMap = new Map();
|
|
52
40
|
for (const p of participants) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-meet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-meet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"import-meet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-meet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Import adapter: sheet — loads a Google Sheet as CSV lines into a scratchpad.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { call } from '../../../google/client.js';
|
|
5
5
|
export async function importSheet(scratchpads, scratchpadId, sourceParams) {
|
|
6
6
|
const { email, spreadsheetId, range } = sourceParams;
|
|
7
7
|
if (!email || !spreadsheetId) {
|
|
@@ -13,11 +13,10 @@ export async function importSheet(scratchpads, scratchpadId, sourceParams) {
|
|
|
13
13
|
params.range = range;
|
|
14
14
|
// Default to first sheet if no range specified
|
|
15
15
|
const rangeArg = range ?? 'Sheet1';
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const data = result.data;
|
|
16
|
+
const data = await call('sheets', 'spreadsheets.values.get', {
|
|
17
|
+
spreadsheetId,
|
|
18
|
+
range: rangeArg,
|
|
19
|
+
}, { account: email });
|
|
21
20
|
const values = (data.values ?? []);
|
|
22
21
|
if (values.length === 0) {
|
|
23
22
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-sheet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-sheet.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"import-sheet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/import-sheet.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAUjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAA8B,EAC9B,YAAoB,EACpB,YAA+B;IAE/B,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,wDAAwD,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACnG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAA4B,EAAE,aAAa,EAAE,CAAC;QAC1D,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAEhC,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC;QAEnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,yBAAyB,EAAE;YAC3D,aAAa;YACb,KAAK,EAAE,QAAQ;SAChB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAA4B,CAAC;QAElD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAe,CAAC;QAEjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,SAAS,aAAa,KAAK,QAAQ,8BAA8B,YAAY,aAAa;gBAChG,IAAI,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE;aACtC,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtE,WAAW,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnD,WAAW,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAE3C,OAAO;YACL,IAAI,EAAE,0BAA0B,QAAQ,CAAC,MAAM,0BAA0B,YAAY,GAAG;YACxF,IAAI,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE;SACtF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,kBAAkB,OAAO,EAAE;YACjC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Send adapter: calendar_event — creates a calendar event with scratchpad content as description.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { call } from '../../../google/client.js';
|
|
5
5
|
import { nextSteps } from '../../formatting/next-steps.js';
|
|
6
6
|
export async function sendCalendarEvent(scratchpads, scratchpadId, targetParams) {
|
|
7
7
|
const content = scratchpads.getContent(scratchpadId);
|
|
@@ -15,20 +15,25 @@ export async function sendCalendarEvent(scratchpads, scratchpadId, targetParams)
|
|
|
15
15
|
refs: { error: true, scratchpadId },
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
'
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
// `calendarId` is the one PATH param the descriptor declares; everything else
|
|
19
|
+
// here is the Event resource and lands in the body. Same shape as
|
|
20
|
+
// services/calendar/patch.ts `create`.
|
|
21
|
+
const body = {
|
|
22
|
+
calendarId: 'primary',
|
|
23
|
+
summary,
|
|
24
|
+
start: { dateTime: start },
|
|
25
|
+
end: { dateTime: end },
|
|
26
|
+
description: content,
|
|
27
|
+
};
|
|
25
28
|
if (location)
|
|
26
|
-
|
|
27
|
-
if (attendees)
|
|
28
|
-
|
|
29
|
+
body.location = location;
|
|
30
|
+
if (attendees) {
|
|
31
|
+
body.attendees = attendees
|
|
32
|
+
.split(',').map((e) => e.trim()).filter(Boolean)
|
|
33
|
+
.map((address) => ({ email: address }));
|
|
34
|
+
}
|
|
29
35
|
try {
|
|
30
|
-
const
|
|
31
|
-
const data = result.data;
|
|
36
|
+
const data = await call('calendar', 'events.insert', body, { account: email });
|
|
32
37
|
return {
|
|
33
38
|
text: `Event created: **${summary}**\n\n` +
|
|
34
39
|
`**When:** ${start} – ${end}\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-calendar.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send-calendar.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAW3D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAA8B,EAC9B,YAAoB,EACpB,YAAiC;IAEjC,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,cAAc,YAAY,aAAa,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;IACzE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,4FAA4F,YAAY,mBAAmB;YACjI,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,kEAAkE;IAClE,uCAAuC;IACvC,MAAM,IAAI,GAA4B;QACpC,UAAU,EAAE,SAAS;QACrB,OAAO;QACP,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1B,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;QACtB,WAAW,EAAE,OAAO;KACrB,CAAC;IACF,IAAI,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvC,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,SAAS;aACvB,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;aAC/C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAA4B,CAAC;QAE1G,OAAO;YACL,IAAI,EAAE,oBAAoB,OAAO,QAAQ;gBACvC,aAAa,KAAK,MAAM,GAAG,IAAI;gBAC/B,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,wCAAwC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,WAAW;gBAC7E,iBAAiB,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE;gBACvC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;YAC5C,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;SAC9D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,gBAAgB,OAAO,gBAAgB,YAAY,mBAAmB;YAC5E,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,23 @@
|
|
|
3
3
|
* doc_create: creates a new Google Doc and writes scratchpad content.
|
|
4
4
|
* doc_write: appends scratchpad content to an existing Google Doc.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { call } from '../../../google/client.js';
|
|
7
|
+
/**
|
|
8
|
+
* Append text to the end of a document's body.
|
|
9
|
+
*
|
|
10
|
+
* `documentId` is the only declared path param;
|
|
11
|
+
* `requests` is the batchUpdate body. `endOfSegmentLocation` with an empty
|
|
12
|
+
* `segmentId` means "the end of the document body" — the append semantics the
|
|
13
|
+
* adapter has always claimed.
|
|
14
|
+
*/
|
|
15
|
+
async function appendText(account, documentId, text) {
|
|
16
|
+
await call('docs', 'documents.batchUpdate', {
|
|
17
|
+
documentId,
|
|
18
|
+
requests: [
|
|
19
|
+
{ insertText: { text, endOfSegmentLocation: { segmentId: '' } } },
|
|
20
|
+
],
|
|
21
|
+
}, { account });
|
|
22
|
+
}
|
|
7
23
|
export async function sendDocCreate(scratchpads, scratchpadId, targetParams) {
|
|
8
24
|
const content = scratchpads.getContent(scratchpadId);
|
|
9
25
|
if (content === null) {
|
|
@@ -17,19 +33,12 @@ export async function sendDocCreate(scratchpads, scratchpadId, targetParams) {
|
|
|
17
33
|
};
|
|
18
34
|
}
|
|
19
35
|
try {
|
|
20
|
-
// Step 1: Create empty doc (title
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
'--json', JSON.stringify({ title }),
|
|
24
|
-
], { account: email });
|
|
25
|
-
const doc = createResult.data;
|
|
36
|
+
// Step 1: Create empty doc (title is the request body — documents.create
|
|
37
|
+
// declares no path/query params, so it lands in the body).
|
|
38
|
+
const doc = await call('docs', 'documents.create', { title }, { account: email });
|
|
26
39
|
const documentId = doc.documentId;
|
|
27
40
|
// Step 2: Write content
|
|
28
|
-
await
|
|
29
|
-
'docs', '+write',
|
|
30
|
-
'--document', documentId,
|
|
31
|
-
'--text', content,
|
|
32
|
-
], { account: email });
|
|
41
|
+
await appendText(email, documentId, content);
|
|
33
42
|
return {
|
|
34
43
|
text: `Document created from scratchpad.\n\n**Title:** ${title}\n**Document ID:** ${documentId}`,
|
|
35
44
|
refs: { scratchpadId, documentId, title },
|
|
@@ -56,11 +65,7 @@ export async function sendDocWrite(scratchpads, scratchpadId, targetParams) {
|
|
|
56
65
|
};
|
|
57
66
|
}
|
|
58
67
|
try {
|
|
59
|
-
await
|
|
60
|
-
'docs', '+write',
|
|
61
|
-
'--document', documentId,
|
|
62
|
-
'--text', content,
|
|
63
|
-
], { account: email });
|
|
68
|
+
await appendText(email, documentId, content);
|
|
64
69
|
return {
|
|
65
70
|
text: `Content appended to document ${documentId}.`,
|
|
66
71
|
refs: { scratchpadId, documentId },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-doc.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-doc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send-doc.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Send adapter: email_draft — creates a Gmail draft from scratchpad content.
|
|
3
|
-
*
|
|
3
|
+
* sendMail(..., { draft: true }) builds the MIME message and uploads it.
|
|
4
4
|
*/
|
|
5
5
|
import type { HandlerResponse } from '../../handler.js';
|
|
6
6
|
import type { ScratchpadManager } from '../manager.js';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Send adapter: email_draft — creates a Gmail draft from scratchpad content.
|
|
3
|
-
*
|
|
3
|
+
* sendMail(..., { draft: true }) builds the MIME message and uploads it.
|
|
4
4
|
*/
|
|
5
5
|
import * as path from 'node:path';
|
|
6
|
-
import {
|
|
6
|
+
import { sendMail } from '../../../services/gmail/mail.js';
|
|
7
7
|
import { getWorkspaceDir } from '../../../executor/workspace.js';
|
|
8
8
|
export async function sendEmailDraft(scratchpads, scratchpadId, targetParams) {
|
|
9
9
|
const content = scratchpads.getContent(scratchpadId);
|
|
@@ -17,33 +17,25 @@ export async function sendEmailDraft(scratchpads, scratchpadId, targetParams) {
|
|
|
17
17
|
refs: { error: true, scratchpadId },
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
'gmail', '+send', '--draft',
|
|
23
|
-
'--to', to || email,
|
|
24
|
-
'--subject', subject || '(draft)',
|
|
25
|
-
'--body', content,
|
|
26
|
-
];
|
|
27
|
-
// Attach workspace files if scratchpad has attachments
|
|
20
|
+
// Attach workspace files if the scratchpad has attachments. sendMail() takes
|
|
21
|
+
// workspace-relative names and resolves + path-checks them itself.
|
|
28
22
|
const attachments = scratchpads.getAttachments(scratchpadId);
|
|
29
|
-
const
|
|
30
|
-
|
|
23
|
+
const wsDir = getWorkspaceDir();
|
|
24
|
+
const attachmentNames = attachments
|
|
25
|
+
? [...attachments.values()].filter(a => a.location).map(a => path.relative(wsDir, a.location))
|
|
31
26
|
: [];
|
|
32
|
-
// gws validates --attach paths are within cwd, so set cwd to workspace dir
|
|
33
|
-
let execOptions = { account: email };
|
|
34
|
-
if (attachmentPaths.length > 0) {
|
|
35
|
-
const wsDir = getWorkspaceDir();
|
|
36
|
-
for (const p of attachmentPaths) {
|
|
37
|
-
args.push('--attach', path.relative(wsDir, p));
|
|
38
|
-
}
|
|
39
|
-
execOptions = { account: email, cwd: wsDir };
|
|
40
|
-
}
|
|
41
27
|
try {
|
|
42
|
-
|
|
43
|
-
const data =
|
|
28
|
+
// A draft still needs To and Subject headers; fall back to the account itself.
|
|
29
|
+
const data = await sendMail(email, {
|
|
30
|
+
to: to || email,
|
|
31
|
+
subject: subject || '(draft)',
|
|
32
|
+
body: content,
|
|
33
|
+
draft: true,
|
|
34
|
+
...(attachmentNames.length > 0 ? { attachments: attachmentNames } : {}),
|
|
35
|
+
});
|
|
44
36
|
const draftId = data.id ?? 'unknown';
|
|
45
|
-
const attNote =
|
|
46
|
-
? `\n**Attachments:** ${
|
|
37
|
+
const attNote = attachmentNames.length > 0
|
|
38
|
+
? `\n**Attachments:** ${attachmentNames.length}`
|
|
47
39
|
: '';
|
|
48
40
|
return {
|
|
49
41
|
text: `Draft created.\n\n**Draft ID:** ${draftId}${to ? `\n**To:** ${to}` : ''}${subject ? `\n**Subject:** ${subject}` : ''}${attNote}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-email-draft.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email-draft.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send-email-draft.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email-draft.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAUjE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAA8B,EAC9B,YAAoB,EACpB,YAAoC;IAEpC,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,cAAc,YAAY,aAAa,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,IAAI,EAAE,yDAAyD,YAAY,mBAAmB;YAC9F,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,mEAAmE;IACnE,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,eAAe,GAAG,WAAW;QACjC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9F,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,CAAC;QACH,+EAA+E;QAC/E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE;YACjC,EAAE,EAAE,EAAE,IAAI,KAAK;YACf,OAAO,EAAE,OAAO,IAAI,SAAS;YAC7B,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI;YACX,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC;QACrC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,sBAAsB,eAAe,CAAC,MAAM,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;YACL,IAAI,EAAE,mCAAmC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE;YACvI,IAAI,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE;SAChC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,gBAAgB,OAAO,gBAAgB,YAAY,mBAAmB;YAC5E,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;SACpC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Send adapter: email — delivers scratchpad content as an email.
|
|
3
|
-
* When attachments are present, creates a draft
|
|
4
|
-
*
|
|
3
|
+
* When attachments are present, creates a draft so the agent can review before
|
|
4
|
+
* sending. Without attachments, sends directly.
|
|
5
5
|
*/
|
|
6
6
|
import type { HandlerResponse } from '../../handler.js';
|
|
7
7
|
import type { ScratchpadManager } from '../manager.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Send adapter: email — delivers scratchpad content as an email.
|
|
3
|
-
* When attachments are present, creates a draft
|
|
4
|
-
*
|
|
3
|
+
* When attachments are present, creates a draft so the agent can review before
|
|
4
|
+
* sending. Without attachments, sends directly.
|
|
5
5
|
*/
|
|
6
6
|
import * as path from 'node:path';
|
|
7
|
-
import {
|
|
7
|
+
import { sendMail } from '../../../services/gmail/mail.js';
|
|
8
8
|
import { getWorkspaceDir } from '../../../executor/workspace.js';
|
|
9
9
|
import { nextSteps } from '../../formatting/next-steps.js';
|
|
10
10
|
export async function sendEmail(scratchpads, scratchpadId, targetParams) {
|
|
@@ -19,30 +19,26 @@ export async function sendEmail(scratchpads, scratchpadId, targetParams) {
|
|
|
19
19
|
refs: { error: true, scratchpadId },
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
+
// sendMail() takes WORKSPACE-RELATIVE names — it resolves and path-safety-checks
|
|
23
|
+
// them itself. The side-table stores absolute locations, so relativise them here.
|
|
22
24
|
const attachments = scratchpads.getAttachments(scratchpadId);
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
+
const wsDir = getWorkspaceDir();
|
|
26
|
+
const attachmentNames = attachments
|
|
27
|
+
? [...attachments.values()].filter(a => a.location).map(a => path.relative(wsDir, a.location))
|
|
28
|
+
: [];
|
|
25
29
|
try {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
args.push('--attach', path.relative(wsDir, p));
|
|
39
|
-
}
|
|
40
|
-
execOptions = { account: email, cwd: wsDir };
|
|
41
|
-
}
|
|
42
|
-
const result = await execute(args, execOptions);
|
|
43
|
-
const data = result.data;
|
|
44
|
-
if (attachmentPaths.length > 0) {
|
|
45
|
-
const attNote = ` (${attachmentPaths.length} attachment(s))`;
|
|
30
|
+
// Attachments present → draft, so the agent can review before it goes out.
|
|
31
|
+
const isDraft = attachmentNames.length > 0;
|
|
32
|
+
const data = await sendMail(email, {
|
|
33
|
+
to,
|
|
34
|
+
subject,
|
|
35
|
+
body: content,
|
|
36
|
+
cc,
|
|
37
|
+
bcc,
|
|
38
|
+
...(isDraft ? { draft: true, attachments: attachmentNames } : {}),
|
|
39
|
+
});
|
|
40
|
+
if (isDraft) {
|
|
41
|
+
const attNote = ` (${attachmentNames.length} attachment(s))`;
|
|
46
42
|
return {
|
|
47
43
|
text: `Draft created for ${to}${attNote}.\n\n**Subject:** ${subject}\n**Draft ID:** ${data.id ?? 'unknown'}\n\n` +
|
|
48
44
|
`_Draft with attachments saved to Gmail. Review and send from Gmail or use manage_email to send the draft._` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send-email.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-email.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Send adapter: sheet_write — writes scratchpad CSV content to a Google Sheet.
|
|
3
3
|
* Parses CSV lines back into a values array for spreadsheets.values.update.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { call } from '../../../google/client.js';
|
|
6
6
|
export async function sendSheetWrite(scratchpads, scratchpadId, targetParams) {
|
|
7
7
|
const content = scratchpads.getContent(scratchpadId);
|
|
8
8
|
if (content === null) {
|
|
@@ -19,15 +19,15 @@ export async function sendSheetWrite(scratchpads, scratchpadId, targetParams) {
|
|
|
19
19
|
const lines = content.split('\n').filter(l => l.trim());
|
|
20
20
|
const values = lines.map(parseCsvLine);
|
|
21
21
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
// `values` is the request BODY; the descriptor declares only
|
|
23
|
+
// spreadsheetId/range/valueInputOption, so it goes at the top level
|
|
24
|
+
// rather than nested under a `requestBody` key.
|
|
25
|
+
await call('sheets', 'spreadsheets.values.update', {
|
|
26
|
+
spreadsheetId,
|
|
27
|
+
range,
|
|
28
|
+
valueInputOption: 'USER_ENTERED',
|
|
29
|
+
values,
|
|
30
|
+
}, { account: email });
|
|
31
31
|
return {
|
|
32
32
|
text: `Written ${values.length} rows to sheet ${spreadsheetId} (${range}).`,
|
|
33
33
|
refs: { scratchpadId, spreadsheetId, range, rows: values.length },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-sheet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-sheet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"send-sheet.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/adapters/send-sheet.ts"],"names":[],"mappings":"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"}
|