@aaronsb/google-workspace-mcp 2.0.0 → 2.1.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.
- package/build/__tests__/server/queue.test.js +5 -0
- package/build/__tests__/server/queue.test.js.map +1 -1
- package/build/server/formatting/markdown.d.ts +7 -0
- package/build/server/formatting/markdown.js +1 -1
- package/build/server/formatting/markdown.js.map +1 -1
- package/build/server/formatting/next-steps.js +19 -0
- package/build/server/formatting/next-steps.js.map +1 -1
- package/build/server/handler.d.ts +4 -0
- package/build/server/handler.js +17 -1
- package/build/server/handler.js.map +1 -1
- package/build/server/queue.js +2 -0
- package/build/server/queue.js.map +1 -1
- package/build/server/scratchpad/__tests__/json-path.test.d.ts +4 -0
- package/build/server/scratchpad/__tests__/json-path.test.js +121 -0
- package/build/server/scratchpad/__tests__/json-path.test.js.map +1 -0
- package/build/server/scratchpad/__tests__/manager.test.d.ts +5 -0
- package/build/server/scratchpad/__tests__/manager.test.js +886 -0
- package/build/server/scratchpad/__tests__/manager.test.js.map +1 -0
- package/build/server/scratchpad/__tests__/validate.test.d.ts +4 -0
- package/build/server/scratchpad/__tests__/validate.test.js +112 -0
- package/build/server/scratchpad/__tests__/validate.test.js.map +1 -0
- package/build/server/scratchpad/adapters/import-doc.d.ts +16 -0
- package/build/server/scratchpad/adapters/import-doc.js +123 -0
- package/build/server/scratchpad/adapters/import-doc.js.map +1 -0
- package/build/server/scratchpad/adapters/import-drive.d.ts +12 -0
- package/build/server/scratchpad/adapters/import-drive.js +52 -0
- package/build/server/scratchpad/adapters/import-drive.js.map +1 -0
- package/build/server/scratchpad/adapters/import-email.d.ts +13 -0
- package/build/server/scratchpad/adapters/import-email.js +87 -0
- package/build/server/scratchpad/adapters/import-email.js.map +1 -0
- package/build/server/scratchpad/adapters/import-meet.d.ts +12 -0
- package/build/server/scratchpad/adapters/import-meet.js +109 -0
- package/build/server/scratchpad/adapters/import-meet.js.map +1 -0
- package/build/server/scratchpad/adapters/import-sheet.d.ts +12 -0
- package/build/server/scratchpad/adapters/import-sheet.js +55 -0
- package/build/server/scratchpad/adapters/import-sheet.js.map +1 -0
- package/build/server/scratchpad/adapters/index.d.ts +15 -0
- package/build/server/scratchpad/adapters/index.js +18 -0
- package/build/server/scratchpad/adapters/index.js.map +1 -0
- package/build/server/scratchpad/adapters/send-calendar.d.ts +15 -0
- package/build/server/scratchpad/adapters/send-calendar.js +50 -0
- package/build/server/scratchpad/adapters/send-calendar.js.map +1 -0
- package/build/server/scratchpad/adapters/send-doc.d.ts +18 -0
- package/build/server/scratchpad/adapters/send-doc.js +77 -0
- package/build/server/scratchpad/adapters/send-doc.js.map +1 -0
- package/build/server/scratchpad/adapters/send-email-draft.d.ts +12 -0
- package/build/server/scratchpad/adapters/send-email-draft.js +52 -0
- package/build/server/scratchpad/adapters/send-email-draft.js.map +1 -0
- package/build/server/scratchpad/adapters/send-email.d.ts +15 -0
- package/build/server/scratchpad/adapters/send-email.js +73 -0
- package/build/server/scratchpad/adapters/send-email.js.map +1 -0
- package/build/server/scratchpad/adapters/send-sheet.d.ts +13 -0
- package/build/server/scratchpad/adapters/send-sheet.js +71 -0
- package/build/server/scratchpad/adapters/send-sheet.js.map +1 -0
- package/build/server/scratchpad/adapters/send-task.d.ts +12 -0
- package/build/server/scratchpad/adapters/send-task.js +53 -0
- package/build/server/scratchpad/adapters/send-task.js.map +1 -0
- package/build/server/scratchpad/adapters/send-workspace.d.ts +11 -0
- package/build/server/scratchpad/adapters/send-workspace.js +69 -0
- package/build/server/scratchpad/adapters/send-workspace.js.map +1 -0
- package/build/server/scratchpad/handler.d.ts +9 -0
- package/build/server/scratchpad/handler.js +476 -0
- package/build/server/scratchpad/handler.js.map +1 -0
- package/build/server/scratchpad/json-path.d.ts +12 -0
- package/build/server/scratchpad/json-path.js +75 -0
- package/build/server/scratchpad/json-path.js.map +1 -0
- package/build/server/scratchpad/manager.d.ts +140 -0
- package/build/server/scratchpad/manager.js +561 -0
- package/build/server/scratchpad/manager.js.map +1 -0
- package/build/server/scratchpad/validate.d.ts +7 -0
- package/build/server/scratchpad/validate.js +96 -0
- package/build/server/scratchpad/validate.js.map +1 -0
- package/build/server/tools.js +48 -1
- package/build/server/tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for manage_scratchpad tool.
|
|
3
|
+
* See ADR-301: Scratchpad Buffer — Service-Agnostic Content Authoring.
|
|
4
|
+
*/
|
|
5
|
+
import { ScratchpadManager } from './manager.js';
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import { sendEmail, sendEmailDraft, sendDocCreate, sendDocWrite, sendWorkspace, sendSheetWrite, sendCalendarEvent, sendTaskCreate, importEmail, importDoc, importSheet, importDriveFile, importMeet, } from './adapters/index.js';
|
|
8
|
+
import { execute } from '../../executor/gws.js';
|
|
9
|
+
import { resolveWorkspacePath, verifyPathSafety } from '../../executor/workspace.js';
|
|
10
|
+
import { lookupMimeType } from '../../services/gmail/mime.js';
|
|
11
|
+
const scratchpads = new ScratchpadManager();
|
|
12
|
+
/** Expose the singleton for import/send adapters. */
|
|
13
|
+
export function getScratchpadManager() {
|
|
14
|
+
return scratchpads;
|
|
15
|
+
}
|
|
16
|
+
export async function handleScratchpad(params) {
|
|
17
|
+
const operation = params.operation;
|
|
18
|
+
switch (operation) {
|
|
19
|
+
// ── Buffer lifecycle ────────────────────────────────
|
|
20
|
+
case 'create':
|
|
21
|
+
return handleCreate(params);
|
|
22
|
+
case 'view':
|
|
23
|
+
return handleView(params);
|
|
24
|
+
case 'discard':
|
|
25
|
+
return handleDiscard(params);
|
|
26
|
+
case 'list':
|
|
27
|
+
return handleList();
|
|
28
|
+
// ── Line operations ─────────────────────────────────
|
|
29
|
+
case 'insert_lines':
|
|
30
|
+
return handleInsertLines(params);
|
|
31
|
+
case 'append_lines':
|
|
32
|
+
return handleAppendLines(params);
|
|
33
|
+
case 'replace_lines':
|
|
34
|
+
return handleReplaceLines(params);
|
|
35
|
+
case 'remove_lines':
|
|
36
|
+
return handleRemoveLines(params);
|
|
37
|
+
case 'copy_lines':
|
|
38
|
+
return handleCopyLines(params);
|
|
39
|
+
// ── JSON path operations ────────────────────────────
|
|
40
|
+
case 'json_get':
|
|
41
|
+
return handleJsonGet(params);
|
|
42
|
+
case 'json_set':
|
|
43
|
+
return handleJsonSet(params);
|
|
44
|
+
case 'json_delete':
|
|
45
|
+
return handleJsonDelete(params);
|
|
46
|
+
case 'json_insert':
|
|
47
|
+
return handleJsonInsert(params);
|
|
48
|
+
// ── Attachments ─────────────────────────────────────
|
|
49
|
+
case 'attach':
|
|
50
|
+
return handleAttach(params);
|
|
51
|
+
case 'detach':
|
|
52
|
+
return handleDetach(params);
|
|
53
|
+
// ── Import / Send ───────────────────────────────────
|
|
54
|
+
case 'import':
|
|
55
|
+
return handleImport(params);
|
|
56
|
+
case 'send':
|
|
57
|
+
return handleSend(params);
|
|
58
|
+
default:
|
|
59
|
+
return error(`Unknown operation: ${operation}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ── Helpers ────────────────────────────────────────────────
|
|
63
|
+
function error(text) {
|
|
64
|
+
return { text, refs: { error: true } };
|
|
65
|
+
}
|
|
66
|
+
function requireScratchpadId(params) {
|
|
67
|
+
const id = params.scratchpadId;
|
|
68
|
+
if (!id)
|
|
69
|
+
return null;
|
|
70
|
+
if (!scratchpads.get(id))
|
|
71
|
+
return null;
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
function scratchpadNotFound(id) {
|
|
75
|
+
if (!id)
|
|
76
|
+
return error('scratchpadId is required. Use create to start a new scratchpad.');
|
|
77
|
+
return error(`Scratchpad ${id} not found or expired. Use create to start a new one.`);
|
|
78
|
+
}
|
|
79
|
+
function formatMutation(result) {
|
|
80
|
+
const parts = [result.message];
|
|
81
|
+
if (result.context)
|
|
82
|
+
parts.push(result.context);
|
|
83
|
+
parts.push(result.validation);
|
|
84
|
+
return parts.join('\n');
|
|
85
|
+
}
|
|
86
|
+
// ── Buffer lifecycle ──────────────────────────────────────
|
|
87
|
+
function handleCreate(params) {
|
|
88
|
+
const id = scratchpads.create({
|
|
89
|
+
label: params.label,
|
|
90
|
+
content: params.content,
|
|
91
|
+
format: params.format,
|
|
92
|
+
});
|
|
93
|
+
const sp = scratchpads.get(id);
|
|
94
|
+
const lineInfo = sp.lines.length > 0 ? ` (${sp.lines.length} lines)` : '';
|
|
95
|
+
return {
|
|
96
|
+
text: `Scratchpad created: ${id}${lineInfo}\nFormat: ${sp.format}`,
|
|
97
|
+
refs: { scratchpadId: id, format: sp.format, lineCount: sp.lines.length },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function handleView(params) {
|
|
101
|
+
const id = requireScratchpadId(params);
|
|
102
|
+
if (!id)
|
|
103
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
104
|
+
const result = scratchpads.view(id, params.startLine, params.endLine);
|
|
105
|
+
if (!result)
|
|
106
|
+
return scratchpadNotFound(id);
|
|
107
|
+
return { text: result, refs: { scratchpadId: id } };
|
|
108
|
+
}
|
|
109
|
+
function handleDiscard(params) {
|
|
110
|
+
const id = params.scratchpadId;
|
|
111
|
+
if (!id)
|
|
112
|
+
return error('scratchpadId is required.');
|
|
113
|
+
scratchpads.discard(id);
|
|
114
|
+
return { text: `Scratchpad ${id} discarded.`, refs: { scratchpadId: id, status: 'discarded' } };
|
|
115
|
+
}
|
|
116
|
+
function handleList() {
|
|
117
|
+
const list = scratchpads.list();
|
|
118
|
+
if (list.length === 0) {
|
|
119
|
+
return { text: 'No active scratchpads.', refs: { count: 0 } };
|
|
120
|
+
}
|
|
121
|
+
const lines = list.map(sp => {
|
|
122
|
+
const label = sp.label ? ` "${sp.label}"` : '';
|
|
123
|
+
const att = sp.attachmentCount > 0 ? ` | ${sp.attachmentCount} att` : '';
|
|
124
|
+
const bound = sp.bound ? ' | live' : '';
|
|
125
|
+
return `- ${sp.id}${label} | ${sp.format} | ${sp.lineCount} lines${att}${bound} | ${sp.validation}`;
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
text: `Active scratchpads (${list.length}):\n${lines.join('\n')}`,
|
|
129
|
+
refs: { count: list.length, scratchpads: list.map(s => s.id) },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ── Line operations ───────────────────────────────────────
|
|
133
|
+
function handleInsertLines(params) {
|
|
134
|
+
const id = requireScratchpadId(params);
|
|
135
|
+
if (!id)
|
|
136
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
137
|
+
const afterLine = params.afterLine;
|
|
138
|
+
if (afterLine === undefined)
|
|
139
|
+
return error('afterLine is required for insert_lines.');
|
|
140
|
+
const content = params.content;
|
|
141
|
+
if (content === undefined)
|
|
142
|
+
return error('content is required for insert_lines.');
|
|
143
|
+
const result = scratchpads.insertLines(id, afterLine, content);
|
|
144
|
+
if (!result)
|
|
145
|
+
return scratchpadNotFound(id);
|
|
146
|
+
return { text: formatMutation(result), refs: { scratchpadId: id, lineCount: scratchpads.get(id).lines.length } };
|
|
147
|
+
}
|
|
148
|
+
function handleAppendLines(params) {
|
|
149
|
+
const id = requireScratchpadId(params);
|
|
150
|
+
if (!id)
|
|
151
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
152
|
+
const content = params.content;
|
|
153
|
+
if (content === undefined)
|
|
154
|
+
return error('content is required for append_lines.');
|
|
155
|
+
const result = scratchpads.appendLines(id, content);
|
|
156
|
+
if (!result)
|
|
157
|
+
return scratchpadNotFound(id);
|
|
158
|
+
return { text: formatMutation(result), refs: { scratchpadId: id, lineCount: scratchpads.get(id).lines.length } };
|
|
159
|
+
}
|
|
160
|
+
function handleReplaceLines(params) {
|
|
161
|
+
const id = requireScratchpadId(params);
|
|
162
|
+
if (!id)
|
|
163
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
164
|
+
const startLine = params.startLine;
|
|
165
|
+
const endLine = params.endLine;
|
|
166
|
+
if (startLine === undefined || endLine === undefined)
|
|
167
|
+
return error('startLine and endLine are required.');
|
|
168
|
+
const content = params.content;
|
|
169
|
+
if (content === undefined)
|
|
170
|
+
return error('content is required for replace_lines.');
|
|
171
|
+
const result = scratchpads.replaceLines(id, startLine, endLine, content);
|
|
172
|
+
if (!result)
|
|
173
|
+
return scratchpadNotFound(id);
|
|
174
|
+
return { text: formatMutation(result), refs: { scratchpadId: id, lineCount: scratchpads.get(id).lines.length } };
|
|
175
|
+
}
|
|
176
|
+
function handleRemoveLines(params) {
|
|
177
|
+
const id = requireScratchpadId(params);
|
|
178
|
+
if (!id)
|
|
179
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
180
|
+
const startLine = params.startLine;
|
|
181
|
+
if (startLine === undefined)
|
|
182
|
+
return error('startLine is required for remove_lines.');
|
|
183
|
+
const result = scratchpads.removeLines(id, startLine, params.endLine);
|
|
184
|
+
if (!result)
|
|
185
|
+
return scratchpadNotFound(id);
|
|
186
|
+
return { text: formatMutation(result), refs: { scratchpadId: id, lineCount: scratchpads.get(id).lines.length } };
|
|
187
|
+
}
|
|
188
|
+
function handleCopyLines(params) {
|
|
189
|
+
const id = requireScratchpadId(params);
|
|
190
|
+
if (!id)
|
|
191
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
192
|
+
const fromId = params.fromScratchpadId;
|
|
193
|
+
if (!fromId)
|
|
194
|
+
return error('fromScratchpadId is required for copy_lines.');
|
|
195
|
+
const startLine = params.startLine;
|
|
196
|
+
const endLine = params.endLine;
|
|
197
|
+
const afterLine = params.afterLine;
|
|
198
|
+
if (startLine === undefined || endLine === undefined || afterLine === undefined) {
|
|
199
|
+
return error('startLine, endLine, and afterLine are required for copy_lines.');
|
|
200
|
+
}
|
|
201
|
+
const result = scratchpads.copyLines(id, fromId, startLine, endLine, afterLine);
|
|
202
|
+
if (!result)
|
|
203
|
+
return scratchpadNotFound(id);
|
|
204
|
+
return { text: formatMutation(result), refs: { scratchpadId: id, lineCount: scratchpads.get(id).lines.length } };
|
|
205
|
+
}
|
|
206
|
+
// ── JSON path operations ──────────────────────────────────
|
|
207
|
+
function handleJsonGet(params) {
|
|
208
|
+
const id = requireScratchpadId(params);
|
|
209
|
+
if (!id)
|
|
210
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
211
|
+
const path = params.path;
|
|
212
|
+
if (!path)
|
|
213
|
+
return error('path is required for json_get.');
|
|
214
|
+
const result = scratchpads.jsonGet(id, path);
|
|
215
|
+
if (!result)
|
|
216
|
+
return scratchpadNotFound(id);
|
|
217
|
+
if ('error' in result)
|
|
218
|
+
return error(result.error);
|
|
219
|
+
const display = JSON.stringify(result.value, null, 2);
|
|
220
|
+
return {
|
|
221
|
+
text: `${path} (${result.lineSpan}):\n${display}`,
|
|
222
|
+
refs: { scratchpadId: id, path, value: result.value },
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
async function handleJsonSet(params) {
|
|
226
|
+
const id = requireScratchpadId(params);
|
|
227
|
+
if (!id)
|
|
228
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
229
|
+
const jsonPath = params.path;
|
|
230
|
+
if (!jsonPath)
|
|
231
|
+
return error('path is required for json_set.');
|
|
232
|
+
if (!('value' in params))
|
|
233
|
+
return error('value is required for json_set.');
|
|
234
|
+
// Local mutation first
|
|
235
|
+
const result = scratchpads.jsonSet(id, jsonPath, params.value);
|
|
236
|
+
if (!result)
|
|
237
|
+
return scratchpadNotFound(id);
|
|
238
|
+
// If live-bound, push to API and reload
|
|
239
|
+
const syncResult = await syncIfBound(id);
|
|
240
|
+
if (syncResult)
|
|
241
|
+
return syncResult;
|
|
242
|
+
return { text: formatMutation(result), refs: { scratchpadId: id } };
|
|
243
|
+
}
|
|
244
|
+
async function handleJsonDelete(params) {
|
|
245
|
+
const id = requireScratchpadId(params);
|
|
246
|
+
if (!id)
|
|
247
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
248
|
+
const jsonPath = params.path;
|
|
249
|
+
if (!jsonPath)
|
|
250
|
+
return error('path is required for json_delete.');
|
|
251
|
+
const result = scratchpads.jsonDelete(id, jsonPath);
|
|
252
|
+
if (!result)
|
|
253
|
+
return scratchpadNotFound(id);
|
|
254
|
+
const syncResult = await syncIfBound(id);
|
|
255
|
+
if (syncResult)
|
|
256
|
+
return syncResult;
|
|
257
|
+
return { text: formatMutation(result), refs: { scratchpadId: id } };
|
|
258
|
+
}
|
|
259
|
+
async function handleJsonInsert(params) {
|
|
260
|
+
const id = requireScratchpadId(params);
|
|
261
|
+
if (!id)
|
|
262
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
263
|
+
const jsonPath = params.path;
|
|
264
|
+
if (!jsonPath)
|
|
265
|
+
return error('path is required for json_insert.');
|
|
266
|
+
if (!('value' in params))
|
|
267
|
+
return error('value is required for json_insert.');
|
|
268
|
+
const result = scratchpads.jsonInsert(id, jsonPath, params.value);
|
|
269
|
+
if (!result)
|
|
270
|
+
return scratchpadNotFound(id);
|
|
271
|
+
const syncResult = await syncIfBound(id);
|
|
272
|
+
if (syncResult)
|
|
273
|
+
return syncResult;
|
|
274
|
+
return { text: formatMutation(result), refs: { scratchpadId: id } };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* If the scratchpad is live-bound, push the current buffer to the API
|
|
278
|
+
* and reload from the live resource. Returns an error HandlerResponse
|
|
279
|
+
* on failure, or null on success (caller uses its own mutation result).
|
|
280
|
+
*/
|
|
281
|
+
async function syncIfBound(id) {
|
|
282
|
+
const binding = scratchpads.getBinding(id);
|
|
283
|
+
if (!binding)
|
|
284
|
+
return null;
|
|
285
|
+
const content = scratchpads.getContent(id);
|
|
286
|
+
if (content === null)
|
|
287
|
+
return null;
|
|
288
|
+
try {
|
|
289
|
+
if (binding.service === 'docs') {
|
|
290
|
+
// Docs API requires batchUpdate with discrete operations (insertText,
|
|
291
|
+
// deleteContentRange, etc.) — no full JSON replace endpoint.
|
|
292
|
+
//
|
|
293
|
+
// Future (#79): translate text content changes (textRun.content) to
|
|
294
|
+
// deleteContentRange + insertText using startIndex/endIndex from
|
|
295
|
+
// the JSON structure. Structural changes (add/remove paragraphs)
|
|
296
|
+
// that batchUpdate rejects should return guidance to use markdown
|
|
297
|
+
// mode + doc_create instead. One edit per sync cycle with reload.
|
|
298
|
+
//
|
|
299
|
+
// For now: local mutations are source of truth. The buffer diverges
|
|
300
|
+
// from the live doc. Agent can send modified JSON to workspace.
|
|
301
|
+
return null; // Local mutation already applied
|
|
302
|
+
}
|
|
303
|
+
else if (binding.service === 'sheets') {
|
|
304
|
+
// For Sheets: the buffer is the values JSON.
|
|
305
|
+
// Push back via spreadsheets.values.update.
|
|
306
|
+
const data = JSON.parse(content);
|
|
307
|
+
const values = data.values;
|
|
308
|
+
const range = data.range;
|
|
309
|
+
if (values && range) {
|
|
310
|
+
await execute([
|
|
311
|
+
'sheets', 'spreadsheets', 'values', 'update',
|
|
312
|
+
'--params', JSON.stringify({
|
|
313
|
+
spreadsheetId: binding.resourceId,
|
|
314
|
+
range,
|
|
315
|
+
valueInputOption: 'USER_ENTERED',
|
|
316
|
+
requestBody: { values },
|
|
317
|
+
}),
|
|
318
|
+
], { account: binding.account });
|
|
319
|
+
}
|
|
320
|
+
// Reload from API
|
|
321
|
+
const result = await execute([
|
|
322
|
+
'sheets', 'spreadsheets', 'values', 'get',
|
|
323
|
+
'--params', JSON.stringify({
|
|
324
|
+
spreadsheetId: binding.resourceId,
|
|
325
|
+
range: range ?? 'Sheet1',
|
|
326
|
+
}),
|
|
327
|
+
], { account: binding.account });
|
|
328
|
+
const freshJson = JSON.stringify(result.data, null, 2);
|
|
329
|
+
const sp = scratchpads.get(id);
|
|
330
|
+
if (sp) {
|
|
331
|
+
sp.lines = freshJson.split('\n');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return null; // Success — caller uses its own result
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
338
|
+
return {
|
|
339
|
+
text: `Sync failed: ${message}\nLocal buffer still has your changes. Retry or discard.`,
|
|
340
|
+
refs: { error: true, scratchpadId: id },
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// ── Attachments ───────────────────────────────────────────
|
|
345
|
+
async function handleAttach(params) {
|
|
346
|
+
const id = requireScratchpadId(params);
|
|
347
|
+
if (!id)
|
|
348
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
349
|
+
const source = params.source;
|
|
350
|
+
if (!source)
|
|
351
|
+
return error('source is required for attach (workspace or drive).');
|
|
352
|
+
const filename = params.filename;
|
|
353
|
+
const fileId = params.fileId;
|
|
354
|
+
if (!filename && !fileId)
|
|
355
|
+
return error('filename (for workspace) or fileId (for drive) is required.');
|
|
356
|
+
let resolvedFilename;
|
|
357
|
+
let mimeType;
|
|
358
|
+
let size;
|
|
359
|
+
let location;
|
|
360
|
+
if (source === 'workspace') {
|
|
361
|
+
if (!filename)
|
|
362
|
+
return error('filename is required for workspace attachments.');
|
|
363
|
+
try {
|
|
364
|
+
const filePath = resolveWorkspacePath(filename);
|
|
365
|
+
await verifyPathSafety(filePath);
|
|
366
|
+
const stat = await fs.stat(filePath);
|
|
367
|
+
resolvedFilename = filename;
|
|
368
|
+
mimeType = lookupMimeType(filename);
|
|
369
|
+
size = stat.size;
|
|
370
|
+
location = filePath;
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
374
|
+
return error(`Cannot attach workspace file: ${msg}`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
// Drive attachments — use fileId as identifier, metadata resolved later on send
|
|
379
|
+
resolvedFilename = fileId ?? 'unknown';
|
|
380
|
+
mimeType = 'application/octet-stream';
|
|
381
|
+
size = 0;
|
|
382
|
+
location = fileId ?? '';
|
|
383
|
+
}
|
|
384
|
+
const result = scratchpads.attach(id, {
|
|
385
|
+
source,
|
|
386
|
+
filename: resolvedFilename,
|
|
387
|
+
mimeType,
|
|
388
|
+
size,
|
|
389
|
+
location,
|
|
390
|
+
}, params.afterLine);
|
|
391
|
+
if (!result)
|
|
392
|
+
return scratchpadNotFound(id);
|
|
393
|
+
return { text: result.message, refs: { scratchpadId: id, refId: result.refId } };
|
|
394
|
+
}
|
|
395
|
+
function handleDetach(params) {
|
|
396
|
+
const id = requireScratchpadId(params);
|
|
397
|
+
if (!id)
|
|
398
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
399
|
+
const refId = params.refId;
|
|
400
|
+
if (!refId)
|
|
401
|
+
return error('refId is required for detach.');
|
|
402
|
+
const result = scratchpads.detach(id, refId);
|
|
403
|
+
if (!result)
|
|
404
|
+
return scratchpadNotFound(id);
|
|
405
|
+
return { text: result, refs: { scratchpadId: id, refId } };
|
|
406
|
+
}
|
|
407
|
+
// ── Import / Send (stubs — adapters in separate files) ────
|
|
408
|
+
async function handleImport(params) {
|
|
409
|
+
const id = requireScratchpadId(params);
|
|
410
|
+
if (!id)
|
|
411
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
412
|
+
const source = params.source;
|
|
413
|
+
if (!source)
|
|
414
|
+
return error('source is required for import (doc, email, sheet, drive_file).');
|
|
415
|
+
const sourceParams = (params.sourceParams ?? {});
|
|
416
|
+
switch (source) {
|
|
417
|
+
case 'email':
|
|
418
|
+
return importEmail(scratchpads, id, sourceParams);
|
|
419
|
+
case 'doc':
|
|
420
|
+
return importDoc(scratchpads, id, sourceParams);
|
|
421
|
+
case 'sheet':
|
|
422
|
+
return importSheet(scratchpads, id, sourceParams);
|
|
423
|
+
case 'drive_file':
|
|
424
|
+
return importDriveFile(scratchpads, id, sourceParams);
|
|
425
|
+
case 'meet':
|
|
426
|
+
return importMeet(scratchpads, id, sourceParams);
|
|
427
|
+
default:
|
|
428
|
+
return error(`Unknown import source: ${source}. Valid sources: doc, email, sheet, drive_file, meet.`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
async function handleSend(params) {
|
|
432
|
+
const id = requireScratchpadId(params);
|
|
433
|
+
if (!id)
|
|
434
|
+
return scratchpadNotFound(params.scratchpadId);
|
|
435
|
+
const target = params.target;
|
|
436
|
+
if (!target)
|
|
437
|
+
return error('target is required for send (email, email_draft, doc_create, doc_write, workspace).');
|
|
438
|
+
const targetParams = (params.targetParams ?? {});
|
|
439
|
+
const keep = params.keep !== false; // default true
|
|
440
|
+
let result;
|
|
441
|
+
switch (target) {
|
|
442
|
+
case 'email':
|
|
443
|
+
result = await sendEmail(scratchpads, id, targetParams);
|
|
444
|
+
break;
|
|
445
|
+
case 'email_draft':
|
|
446
|
+
result = await sendEmailDraft(scratchpads, id, targetParams);
|
|
447
|
+
break;
|
|
448
|
+
case 'doc_create':
|
|
449
|
+
result = await sendDocCreate(scratchpads, id, targetParams);
|
|
450
|
+
break;
|
|
451
|
+
case 'doc_write':
|
|
452
|
+
result = await sendDocWrite(scratchpads, id, targetParams);
|
|
453
|
+
break;
|
|
454
|
+
case 'workspace':
|
|
455
|
+
result = await sendWorkspace(scratchpads, id, targetParams);
|
|
456
|
+
break;
|
|
457
|
+
case 'sheet_write':
|
|
458
|
+
result = await sendSheetWrite(scratchpads, id, targetParams);
|
|
459
|
+
break;
|
|
460
|
+
case 'calendar_event':
|
|
461
|
+
result = await sendCalendarEvent(scratchpads, id, targetParams);
|
|
462
|
+
break;
|
|
463
|
+
case 'task_create':
|
|
464
|
+
result = await sendTaskCreate(scratchpads, id, targetParams);
|
|
465
|
+
break;
|
|
466
|
+
default:
|
|
467
|
+
return error(`Unknown send target: ${target}. Valid targets: email, email_draft, doc_create, doc_write, workspace, sheet_write, calendar_event, task_create.`);
|
|
468
|
+
}
|
|
469
|
+
// Discard scratchpad on success if keep=false
|
|
470
|
+
if (!keep && !result.refs?.error) {
|
|
471
|
+
scratchpads.discard(id);
|
|
472
|
+
result.text += `\nScratchpad ${id} discarded.`;
|
|
473
|
+
}
|
|
474
|
+
return result;
|
|
475
|
+
}
|
|
476
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/server/scratchpad/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON path helpers for path-addressed editing.
|
|
3
|
+
* Supports dot/bracket notation: $.foo.bar[0].baz
|
|
4
|
+
*/
|
|
5
|
+
/** Parse a JSON path into segments. */
|
|
6
|
+
export declare function parsePath(path: string): (string | number)[];
|
|
7
|
+
/** Get a value at a JSON path. */
|
|
8
|
+
export declare function getByPath(obj: unknown, path: string): unknown;
|
|
9
|
+
/** Set a value at a JSON path. */
|
|
10
|
+
export declare function setByPath(obj: unknown, path: string, value: unknown): void;
|
|
11
|
+
/** Delete a key or array element at a JSON path. */
|
|
12
|
+
export declare function deleteByPath(obj: unknown, path: string): void;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON path helpers for path-addressed editing.
|
|
3
|
+
* Supports dot/bracket notation: $.foo.bar[0].baz
|
|
4
|
+
*/
|
|
5
|
+
/** Parse a JSON path into segments. */
|
|
6
|
+
export function parsePath(path) {
|
|
7
|
+
const segments = [];
|
|
8
|
+
const normalized = path.startsWith('$.') ? path.slice(2) : path.startsWith('$') ? path.slice(1) : path;
|
|
9
|
+
if (!normalized)
|
|
10
|
+
return segments;
|
|
11
|
+
const parts = normalized.split(/\.|\[|\]/).filter(Boolean);
|
|
12
|
+
for (const part of parts) {
|
|
13
|
+
const num = parseInt(part, 10);
|
|
14
|
+
if (!isNaN(num) && String(num) === part) {
|
|
15
|
+
segments.push(num);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
segments.push(part);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return segments;
|
|
22
|
+
}
|
|
23
|
+
/** Get a value at a JSON path. */
|
|
24
|
+
export function getByPath(obj, path) {
|
|
25
|
+
const segments = parsePath(path);
|
|
26
|
+
let current = obj;
|
|
27
|
+
for (const seg of segments) {
|
|
28
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
29
|
+
throw new Error(`Path ${path}: cannot traverse into ${typeof current}`);
|
|
30
|
+
}
|
|
31
|
+
current = current[String(seg)];
|
|
32
|
+
}
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
35
|
+
/** Set a value at a JSON path. */
|
|
36
|
+
export function setByPath(obj, path, value) {
|
|
37
|
+
const segments = parsePath(path);
|
|
38
|
+
if (segments.length === 0)
|
|
39
|
+
throw new Error('Cannot set at root path');
|
|
40
|
+
let current = obj;
|
|
41
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
42
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
43
|
+
throw new Error(`Path ${path}: cannot traverse into ${typeof current} at segment ${segments[i]}`);
|
|
44
|
+
}
|
|
45
|
+
current = current[String(segments[i])];
|
|
46
|
+
}
|
|
47
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
48
|
+
throw new Error(`Path ${path}: parent is not an object`);
|
|
49
|
+
}
|
|
50
|
+
current[String(segments[segments.length - 1])] = value;
|
|
51
|
+
}
|
|
52
|
+
/** Delete a key or array element at a JSON path. */
|
|
53
|
+
export function deleteByPath(obj, path) {
|
|
54
|
+
const segments = parsePath(path);
|
|
55
|
+
if (segments.length === 0)
|
|
56
|
+
throw new Error('Cannot delete root');
|
|
57
|
+
let current = obj;
|
|
58
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
59
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
60
|
+
throw new Error(`Path ${path}: cannot traverse into ${typeof current} at segment ${segments[i]}`);
|
|
61
|
+
}
|
|
62
|
+
current = current[String(segments[i])];
|
|
63
|
+
}
|
|
64
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
65
|
+
throw new Error(`Path ${path}: parent is not an object`);
|
|
66
|
+
}
|
|
67
|
+
const lastSeg = segments[segments.length - 1];
|
|
68
|
+
if (Array.isArray(current) && typeof lastSeg === 'number') {
|
|
69
|
+
current.splice(lastSeg, 1);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
delete current[String(lastSeg)];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=json-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-path.js","sourceRoot":"","sources":["../../../src/server/scratchpad/json-path.ts"],"names":[],"mappings":"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"}
|