@aaronsb/google-workspace-mcp 2.0.0 → 2.2.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__/executor/workspace.test.js +39 -13
- package/build/__tests__/executor/workspace.test.js.map +1 -1
- package/build/__tests__/server/queue.test.js +5 -0
- package/build/__tests__/server/queue.test.js.map +1 -1
- package/build/executor/file-output.d.ts +12 -1
- package/build/executor/file-output.js +52 -1
- package/build/executor/file-output.js.map +1 -1
- package/build/executor/workspace.d.ts +8 -2
- package/build/executor/workspace.js +22 -3
- package/build/executor/workspace.js.map +1 -1
- package/build/factory/manifest.yaml +26 -0
- package/build/server/formatting/markdown.d.ts +15 -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/handlers/workspace.d.ts +1 -1
- package/build/server/handlers/workspace.js +160 -23
- package/build/server/handlers/workspace.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/server.js +7 -3
- package/build/server/server.js.map +1 -1
- package/build/server/tools.js +55 -5
- package/build/server/tools.js.map +1 -1
- package/build/services/drive/patch.js +47 -1
- package/build/services/drive/patch.js.map +1 -1
- package/build/services/gmail/attachments.d.ts +9 -10
- package/build/services/gmail/attachments.js +39 -17
- package/build/services/gmail/attachments.js.map +1 -1
- package/build/services/gmail/patch.js +2 -1
- package/build/services/gmail/patch.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export type { HandlerResponse } from './formatting/markdown.js';
|
|
2
2
|
import type { HandlerResponse } from './formatting/markdown.js';
|
|
3
|
+
/** Current epoch value. */
|
|
4
|
+
export declare function getEpoch(): number;
|
|
5
|
+
/** Increment and return the new epoch. Called once per tool dispatch. */
|
|
6
|
+
export declare function advanceEpoch(): number;
|
|
3
7
|
export declare function handleToolCall(toolName: string, params: Record<string, unknown>): Promise<HandlerResponse>;
|
package/build/server/handler.js
CHANGED
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
import { handleAccounts } from './handlers/accounts.js';
|
|
2
2
|
import { handleWorkspace } from './handlers/workspace.js';
|
|
3
|
+
import { handleScratchpad } from './scratchpad/handler.js';
|
|
3
4
|
import { handleQueue } from './queue.js';
|
|
4
5
|
import { generatedTools } from '../factory/registry.js';
|
|
6
|
+
// ── Epoch counter ─────────────────────────────────────────
|
|
7
|
+
// Server-wide monotonic counter incremented on every tool call.
|
|
8
|
+
// Used by ScratchpadManager for activity-based garbage collection.
|
|
9
|
+
let epoch = 0;
|
|
10
|
+
/** Current epoch value. */
|
|
11
|
+
export function getEpoch() {
|
|
12
|
+
return epoch;
|
|
13
|
+
}
|
|
14
|
+
/** Increment and return the new epoch. Called once per tool dispatch. */
|
|
15
|
+
export function advanceEpoch() {
|
|
16
|
+
return ++epoch;
|
|
17
|
+
}
|
|
18
|
+
// ── Handler dispatch ──────────────────────────────────────
|
|
5
19
|
const domainHandlers = {
|
|
6
20
|
manage_accounts: handleAccounts,
|
|
7
21
|
manage_workspace: handleWorkspace,
|
|
22
|
+
manage_scratchpad: handleScratchpad,
|
|
8
23
|
};
|
|
9
24
|
// Register factory-generated handlers
|
|
10
25
|
for (const tool of generatedTools) {
|
|
11
26
|
domainHandlers[tool.schema.name] = tool.handler;
|
|
12
27
|
}
|
|
13
28
|
export async function handleToolCall(toolName, params) {
|
|
14
|
-
|
|
29
|
+
advanceEpoch();
|
|
30
|
+
// Queue wraps the domain handlers (each queued op also advances the epoch)
|
|
15
31
|
if (toolName === 'queue_operations') {
|
|
16
32
|
return handleQueue(params, domainHandlers);
|
|
17
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOxD,MAAM,cAAc,GAAgC;IAClD,eAAe,EAAE,cAAc;IAC/B,gBAAgB,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAOxD,6DAA6D;AAC7D,gEAAgE;AAChE,mEAAmE;AAEnE,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,2BAA2B;AAC3B,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,KAAK,CAAC;AACjB,CAAC;AAED,6DAA6D;AAE7D,MAAM,cAAc,GAAgC;IAClD,eAAe,EAAE,cAAc;IAC/B,gBAAgB,EAAE,eAAe;IACjC,iBAAiB,EAAE,gBAAgB;CACpC,CAAC;AAEF,sCAAsC;AACtC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;IAClC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAA+B;IAE/B,YAAY,EAAE,CAAC;IAEf,2EAA2E;IAC3E,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The workspace is the exchange point between the MCP server and the agent.
|
|
5
5
|
* Files saved by getAttachment, download, and export land here. The agent
|
|
6
|
-
* can also read, write, and manage files directly.
|
|
6
|
+
* can also read, write, and manage files directly — including nested directories.
|
|
7
7
|
*/
|
|
8
8
|
import type { HandlerResponse } from '../formatting/markdown.js';
|
|
9
9
|
export declare function handleWorkspace(params: Record<string, unknown>): Promise<HandlerResponse>;
|
|
@@ -3,12 +3,56 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The workspace is the exchange point between the MCP server and the agent.
|
|
5
5
|
* Files saved by getAttachment, download, and export land here. The agent
|
|
6
|
-
* can also read, write, and manage files directly.
|
|
6
|
+
* can also read, write, and manage files directly — including nested directories.
|
|
7
7
|
*/
|
|
8
8
|
import * as fs from 'node:fs/promises';
|
|
9
9
|
import * as path from 'node:path';
|
|
10
|
-
import { ensureWorkspaceDir, resolveWorkspacePath, verifyPathSafety, getWorkspaceDir } from '../../executor/workspace.js';
|
|
11
|
-
import { isTextFile } from '../../executor/file-output.js';
|
|
10
|
+
import { ensureWorkspaceDir, resolveWorkspacePath, verifyPathSafety, getWorkspaceDir, sanitizePath } from '../../executor/workspace.js';
|
|
11
|
+
import { isTextFile, buildImageBlockFromFile } from '../../executor/file-output.js';
|
|
12
|
+
/** Recursively list files under a directory, returning relative paths. Skips symlinks that escape the workspace. */
|
|
13
|
+
async function listRecursive(root, subdir = '') {
|
|
14
|
+
const entries = [];
|
|
15
|
+
const dirPath = subdir ? path.join(root, subdir) : root;
|
|
16
|
+
const resolvedRoot = path.resolve(root);
|
|
17
|
+
let dirents;
|
|
18
|
+
try {
|
|
19
|
+
dirents = await fs.readdir(dirPath, { withFileTypes: true });
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err.code === 'ENOENT')
|
|
23
|
+
return entries;
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
for (const dirent of dirents) {
|
|
27
|
+
const rel = subdir ? path.join(subdir, dirent.name) : dirent.name;
|
|
28
|
+
const fullPath = path.join(root, rel);
|
|
29
|
+
// Verify symlinks don't escape the workspace
|
|
30
|
+
try {
|
|
31
|
+
const real = await fs.realpath(fullPath);
|
|
32
|
+
if (!real.startsWith(resolvedRoot + path.sep) && real !== resolvedRoot)
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
continue; // Skip broken symlinks
|
|
37
|
+
}
|
|
38
|
+
if (dirent.isDirectory()) {
|
|
39
|
+
entries.push({ relativePath: rel, size: 0, isDir: true });
|
|
40
|
+
const children = await listRecursive(root, rel);
|
|
41
|
+
entries.push(...children);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const stat = await fs.stat(fullPath);
|
|
45
|
+
entries.push({ relativePath: rel, size: stat.size, isDir: false });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return entries;
|
|
49
|
+
}
|
|
50
|
+
/** Format a size value for display. */
|
|
51
|
+
function formatSize(size) {
|
|
52
|
+
if (size < 1024)
|
|
53
|
+
return `${size} B`;
|
|
54
|
+
return `${(size / 1024).toFixed(1)} KB`;
|
|
55
|
+
}
|
|
12
56
|
export async function handleWorkspace(params) {
|
|
13
57
|
const operation = params.operation;
|
|
14
58
|
switch (operation) {
|
|
@@ -18,30 +62,42 @@ export async function handleWorkspace(params) {
|
|
|
18
62
|
return { text: `Workspace invalid: ${wsStatus.warning}`, refs: { valid: false } };
|
|
19
63
|
}
|
|
20
64
|
const dir = getWorkspaceDir();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
65
|
+
// Optional subdirectory scope
|
|
66
|
+
let listRoot = dir;
|
|
67
|
+
if (params.path) {
|
|
68
|
+
const subPath = sanitizePath(String(params.path));
|
|
69
|
+
listRoot = path.join(dir, subPath);
|
|
70
|
+
await verifyPathSafety(listRoot);
|
|
27
71
|
}
|
|
28
|
-
|
|
72
|
+
const entries = await listRecursive(listRoot);
|
|
73
|
+
if (entries.length === 0) {
|
|
74
|
+
const label = listRoot === dir ? 'Workspace' : `${path.relative(dir, listRoot)}/`;
|
|
29
75
|
return {
|
|
30
|
-
text: `##
|
|
31
|
-
refs: { count: 0, path:
|
|
76
|
+
text: `## ${label} (empty)\n\n**Path:** ${listRoot}`,
|
|
77
|
+
refs: { count: 0, path: listRoot },
|
|
32
78
|
};
|
|
33
79
|
}
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
80
|
+
const lines = entries.map(e => {
|
|
81
|
+
const indent = ' '.repeat(e.relativePath.split(path.sep).length - 1);
|
|
82
|
+
const label = path.basename(e.relativePath);
|
|
83
|
+
const suffix = e.isDir ? '/' : ` (${formatSize(e.size)})`;
|
|
84
|
+
return `${indent}- ${label}${suffix}`;
|
|
85
|
+
});
|
|
86
|
+
const fileCount = entries.filter(e => !e.isDir).length;
|
|
87
|
+
const dirCount = entries.filter(e => e.isDir).length;
|
|
88
|
+
const summary = [
|
|
89
|
+
`${fileCount} file${fileCount !== 1 ? 's' : ''}`,
|
|
90
|
+
...(dirCount > 0 ? [`${dirCount} director${dirCount !== 1 ? 'ies' : 'y'}`] : []),
|
|
91
|
+
].join(', ');
|
|
42
92
|
return {
|
|
43
|
-
text: `## Workspace (${
|
|
44
|
-
refs: {
|
|
93
|
+
text: `## Workspace (${summary})\n\n**Path:** ${listRoot}\n\n${lines.join('\n')}`,
|
|
94
|
+
refs: {
|
|
95
|
+
count: entries.length,
|
|
96
|
+
files: fileCount,
|
|
97
|
+
directories: dirCount,
|
|
98
|
+
path: listRoot,
|
|
99
|
+
entries: entries.map(e => e.relativePath),
|
|
100
|
+
},
|
|
45
101
|
};
|
|
46
102
|
}
|
|
47
103
|
case 'read': {
|
|
@@ -51,6 +107,15 @@ export async function handleWorkspace(params) {
|
|
|
51
107
|
const filePath = resolveWorkspacePath(filename);
|
|
52
108
|
await verifyPathSafety(filePath);
|
|
53
109
|
const stat = await fs.stat(filePath);
|
|
110
|
+
// Try image block first (up to 5MB)
|
|
111
|
+
const imageBlock = await buildImageBlockFromFile(filePath, filename);
|
|
112
|
+
if (imageBlock) {
|
|
113
|
+
return {
|
|
114
|
+
text: `## ${filename}\n\n**Path:** ${filePath}\n**Size:** ${stat.size} bytes\n\n_Image included inline below._`,
|
|
115
|
+
refs: { filename, path: filePath, size: stat.size },
|
|
116
|
+
content: [imageBlock],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
54
119
|
if (stat.size > 100_000) {
|
|
55
120
|
return {
|
|
56
121
|
text: `File too large to return inline (${(stat.size / 1024).toFixed(1)} KB). Use the file path directly:\n\n**Path:** ${filePath}`,
|
|
@@ -97,10 +162,82 @@ export async function handleWorkspace(params) {
|
|
|
97
162
|
throw new Error('filename is required');
|
|
98
163
|
const filePath = resolveWorkspacePath(filename);
|
|
99
164
|
await verifyPathSafety(filePath);
|
|
165
|
+
// Prevent deleting the workspace root itself
|
|
166
|
+
const wsRoot = path.resolve(getWorkspaceDir());
|
|
167
|
+
if (path.resolve(filePath) === wsRoot) {
|
|
168
|
+
throw new Error('Cannot delete the workspace root directory');
|
|
169
|
+
}
|
|
170
|
+
const stat = await fs.lstat(filePath);
|
|
171
|
+
// If it's a symlink, just unlink it (don't follow)
|
|
172
|
+
if (stat.isSymbolicLink()) {
|
|
173
|
+
await fs.unlink(filePath);
|
|
174
|
+
return {
|
|
175
|
+
text: `Symlink deleted: **${filename}**`,
|
|
176
|
+
refs: { filename, status: 'deleted', type: 'symlink' },
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if (stat.isDirectory()) {
|
|
180
|
+
// Verify no symlinks inside escape the workspace before recursive delete
|
|
181
|
+
const resolvedRoot = path.resolve(getWorkspaceDir());
|
|
182
|
+
async function verifyTreeSafety(dir) {
|
|
183
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
184
|
+
for (const entry of entries) {
|
|
185
|
+
const entryPath = path.join(dir, entry.name);
|
|
186
|
+
const real = await fs.realpath(entryPath);
|
|
187
|
+
if (!real.startsWith(resolvedRoot + path.sep) && real !== resolvedRoot) {
|
|
188
|
+
throw new Error(`Cannot delete: "${entry.name}" links outside workspace`);
|
|
189
|
+
}
|
|
190
|
+
if (entry.isDirectory() && !entry.isSymbolicLink()) {
|
|
191
|
+
await verifyTreeSafety(entryPath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
await verifyTreeSafety(filePath);
|
|
196
|
+
await fs.rm(filePath, { recursive: true });
|
|
197
|
+
return {
|
|
198
|
+
text: `Directory deleted: **${filename}/**`,
|
|
199
|
+
refs: { filename, status: 'deleted', type: 'directory' },
|
|
200
|
+
};
|
|
201
|
+
}
|
|
100
202
|
await fs.unlink(filePath);
|
|
101
203
|
return {
|
|
102
204
|
text: `File deleted: **${filename}**`,
|
|
103
|
-
refs: { filename, status: 'deleted' },
|
|
205
|
+
refs: { filename, status: 'deleted', type: 'file' },
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
case 'move': {
|
|
209
|
+
const source = params.source;
|
|
210
|
+
const destination = params.destination;
|
|
211
|
+
if (!source)
|
|
212
|
+
throw new Error('source is required');
|
|
213
|
+
if (!destination)
|
|
214
|
+
throw new Error('destination is required');
|
|
215
|
+
const srcPath = resolveWorkspacePath(source);
|
|
216
|
+
const destPath = resolveWorkspacePath(destination);
|
|
217
|
+
await verifyPathSafety(srcPath);
|
|
218
|
+
await verifyPathSafety(destPath);
|
|
219
|
+
// Ensure destination parent exists
|
|
220
|
+
await fs.mkdir(path.dirname(destPath), { recursive: true });
|
|
221
|
+
await fs.rename(srcPath, destPath);
|
|
222
|
+
return {
|
|
223
|
+
text: `Moved: **${source}** → **${destination}**\n\n**Path:** ${destPath}`,
|
|
224
|
+
refs: { source, destination, path: destPath },
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
case 'mkdir': {
|
|
228
|
+
const dirName = params.path || params.filename;
|
|
229
|
+
if (!dirName)
|
|
230
|
+
throw new Error('path is required');
|
|
231
|
+
const wsStatus = await ensureWorkspaceDir();
|
|
232
|
+
if (!wsStatus.valid) {
|
|
233
|
+
throw new Error(`Workspace invalid: ${wsStatus.warning}`);
|
|
234
|
+
}
|
|
235
|
+
const dirPath = resolveWorkspacePath(dirName);
|
|
236
|
+
await verifyPathSafety(dirPath);
|
|
237
|
+
await fs.mkdir(dirPath, { recursive: true, mode: 0o755 });
|
|
238
|
+
return {
|
|
239
|
+
text: `Directory created: **${dirName}/**\n\n**Path:** ${dirPath}`,
|
|
240
|
+
refs: { path: dirPath, name: dirName },
|
|
104
241
|
};
|
|
105
242
|
}
|
|
106
243
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/server/handlers/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/server/handlers/workspace.ts"],"names":[],"mappings":"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"}
|
package/build/server/queue.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Handlers return { text, refs }. Queue uses refs for $N.field
|
|
6
6
|
* resolution and text for the final response.
|
|
7
7
|
*/
|
|
8
|
+
import { advanceEpoch } from './handler.js';
|
|
8
9
|
const NEXT_STEPS_SEPARATOR = '\n\n---\n**Next steps:**';
|
|
9
10
|
function stripNextSteps(text) {
|
|
10
11
|
const idx = text.indexOf(NEXT_STEPS_SEPARATOR);
|
|
@@ -46,6 +47,7 @@ export async function handleQueue(params, handlers) {
|
|
|
46
47
|
continue;
|
|
47
48
|
}
|
|
48
49
|
try {
|
|
50
|
+
advanceEpoch(); // Each queued operation is a logical tool call
|
|
49
51
|
const response = await handler(resolvedArgs);
|
|
50
52
|
const text = stripNextSteps(response.text);
|
|
51
53
|
results.push({ index: i, tool: op.tool, status: 'success', text, refs: response.refs });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/server/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/server/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for json-path.ts — JSON path parsing and manipulation helpers.
|
|
3
|
+
*/
|
|
4
|
+
import { parsePath, getByPath, setByPath, deleteByPath } from '../json-path.js';
|
|
5
|
+
describe('parsePath', () => {
|
|
6
|
+
it('parses $.foo.bar into string segments', () => {
|
|
7
|
+
expect(parsePath('$.foo.bar')).toEqual(['foo', 'bar']);
|
|
8
|
+
});
|
|
9
|
+
it('parses $.items[0] into mixed segments', () => {
|
|
10
|
+
expect(parsePath('$.items[0]')).toEqual(['items', 0]);
|
|
11
|
+
});
|
|
12
|
+
it('returns empty array for bare $', () => {
|
|
13
|
+
expect(parsePath('$')).toEqual([]);
|
|
14
|
+
});
|
|
15
|
+
it('returns empty array for empty string', () => {
|
|
16
|
+
expect(parsePath('')).toEqual([]);
|
|
17
|
+
});
|
|
18
|
+
it('parses deeply nested path with mixed access', () => {
|
|
19
|
+
expect(parsePath('$.a[1].b[2].c')).toEqual(['a', 1, 'b', 2, 'c']);
|
|
20
|
+
});
|
|
21
|
+
it('parses path without $ prefix', () => {
|
|
22
|
+
expect(parsePath('foo.bar')).toEqual(['foo', 'bar']);
|
|
23
|
+
});
|
|
24
|
+
it('distinguishes numeric strings from indices', () => {
|
|
25
|
+
// "01" is not a pure integer representation so stays as string
|
|
26
|
+
expect(parsePath('$.items[01]')).toEqual(['items', '01']);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('getByPath', () => {
|
|
30
|
+
const obj = {
|
|
31
|
+
name: 'test',
|
|
32
|
+
nested: { deep: { value: 42 } },
|
|
33
|
+
items: ['a', 'b', 'c'],
|
|
34
|
+
matrix: [[1, 2], [3, 4]],
|
|
35
|
+
};
|
|
36
|
+
it('gets a top-level key', () => {
|
|
37
|
+
expect(getByPath(obj, '$.name')).toBe('test');
|
|
38
|
+
});
|
|
39
|
+
it('gets a nested value', () => {
|
|
40
|
+
expect(getByPath(obj, '$.nested.deep.value')).toBe(42);
|
|
41
|
+
});
|
|
42
|
+
it('gets an array element by index', () => {
|
|
43
|
+
expect(getByPath(obj, '$.items[1]')).toBe('b');
|
|
44
|
+
});
|
|
45
|
+
it('gets nested array element', () => {
|
|
46
|
+
expect(getByPath(obj, '$.matrix[0][1]')).toBe(2);
|
|
47
|
+
});
|
|
48
|
+
it('returns undefined for missing key', () => {
|
|
49
|
+
expect(getByPath(obj, '$.missing')).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
it('returns the root object for bare $', () => {
|
|
52
|
+
expect(getByPath(obj, '$')).toBe(obj);
|
|
53
|
+
});
|
|
54
|
+
it('throws on non-object traversal', () => {
|
|
55
|
+
expect(() => getByPath(obj, '$.name.child')).toThrow('cannot traverse into string');
|
|
56
|
+
});
|
|
57
|
+
it('throws when traversing through null', () => {
|
|
58
|
+
const o = { a: null };
|
|
59
|
+
expect(() => getByPath(o, '$.a.b')).toThrow('cannot traverse');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('setByPath', () => {
|
|
63
|
+
it('sets a top-level key', () => {
|
|
64
|
+
const obj = { a: 1 };
|
|
65
|
+
setByPath(obj, '$.b', 2);
|
|
66
|
+
expect(obj.b).toBe(2);
|
|
67
|
+
});
|
|
68
|
+
it('sets a nested value', () => {
|
|
69
|
+
const obj = { nested: { deep: { value: 0 } } };
|
|
70
|
+
setByPath(obj, '$.nested.deep.value', 99);
|
|
71
|
+
expect(obj.nested.deep.value).toBe(99);
|
|
72
|
+
});
|
|
73
|
+
it('sets an array element', () => {
|
|
74
|
+
const obj = { items: ['a', 'b', 'c'] };
|
|
75
|
+
setByPath(obj, '$.items[1]', 'B');
|
|
76
|
+
expect(obj.items[1]).toBe('B');
|
|
77
|
+
});
|
|
78
|
+
it('creates a new key on existing object', () => {
|
|
79
|
+
const obj = { existing: {} };
|
|
80
|
+
setByPath(obj, '$.existing.newKey', 'hello');
|
|
81
|
+
expect(obj.existing.newKey).toBe('hello');
|
|
82
|
+
});
|
|
83
|
+
it('throws on root path', () => {
|
|
84
|
+
expect(() => setByPath({}, '$', 'nope')).toThrow('Cannot set at root path');
|
|
85
|
+
});
|
|
86
|
+
it('throws when traversing through non-object', () => {
|
|
87
|
+
const obj = { a: 'string' };
|
|
88
|
+
expect(() => setByPath(obj, '$.a.b', 1)).toThrow('parent is not an object');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('deleteByPath', () => {
|
|
92
|
+
it('deletes an object key', () => {
|
|
93
|
+
const obj = { a: 1, b: 2 };
|
|
94
|
+
deleteByPath(obj, '$.b');
|
|
95
|
+
expect(obj).toEqual({ a: 1 });
|
|
96
|
+
expect('b' in obj).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it('deletes an array element by index (splice)', () => {
|
|
99
|
+
const obj = { items: [10, 20, 30] };
|
|
100
|
+
deleteByPath(obj, '$.items[1]');
|
|
101
|
+
expect(obj.items).toEqual([10, 30]);
|
|
102
|
+
});
|
|
103
|
+
it('deletes a nested key', () => {
|
|
104
|
+
const obj = { nested: { x: 1, y: 2 } };
|
|
105
|
+
deleteByPath(obj, '$.nested.x');
|
|
106
|
+
expect(obj.nested).toEqual({ y: 2 });
|
|
107
|
+
});
|
|
108
|
+
it('throws on root path', () => {
|
|
109
|
+
expect(() => deleteByPath({}, '$')).toThrow('Cannot delete root');
|
|
110
|
+
});
|
|
111
|
+
it('throws when traversing through non-object', () => {
|
|
112
|
+
const obj = { a: 42 };
|
|
113
|
+
expect(() => deleteByPath(obj, '$.a.b')).toThrow('parent is not an object');
|
|
114
|
+
});
|
|
115
|
+
it('deletes first array element', () => {
|
|
116
|
+
const obj = { items: ['x', 'y', 'z'] };
|
|
117
|
+
deleteByPath(obj, '$.items[0]');
|
|
118
|
+
expect(obj.items).toEqual(['y', 'z']);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=json-path.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-path.test.js","sourceRoot":"","sources":["../../../../src/server/scratchpad/__tests__/json-path.test.ts"],"names":[],"mappings":"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"}
|