@agent-workspace/mcp-server 0.8.2 → 0.9.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/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/sync.d.ts +6 -0
- package/dist/tools/sync.d.ts.map +1 -0
- package/dist/tools/sync.js +191 -0
- package/dist/tools/sync.js.map +1 -0
- package/package.json +4 -3
- package/dist/utils.d.ts +0 -23
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -56
- package/dist/utils.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { registerProjectTools } from "./tools/project.js";
|
|
|
19
19
|
import { registerTaskTools } from "./tools/task.js";
|
|
20
20
|
import { registerConfigTools } from "./tools/config.js";
|
|
21
21
|
import { registerSwarmTools } from "./tools/swarm.js";
|
|
22
|
+
import { registerSyncTools } from "./tools/sync.js";
|
|
22
23
|
// Create MCP server
|
|
23
24
|
const server = new McpServer({
|
|
24
25
|
name: "awp-workspace",
|
|
@@ -35,6 +36,7 @@ registerProjectTools(server);
|
|
|
35
36
|
registerTaskTools(server);
|
|
36
37
|
registerConfigTools(server);
|
|
37
38
|
registerSwarmTools(server);
|
|
39
|
+
registerSyncTools(server);
|
|
38
40
|
// Start the server
|
|
39
41
|
const transport = new StdioServerTransport();
|
|
40
42
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,4BAA4B;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,4BAA4B;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC;AAEH,2BAA2B;AAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE1B,mBAAmB;AACnB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuOzD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { getWorkspaceRoot } from "@agent-workspace/utils";
|
|
3
|
+
import { SyncEngine, addRemote, removeRemote, listRemotes, loadSyncState, listConflicts, resolveConflict, } from "@agent-workspace/sync";
|
|
4
|
+
/**
|
|
5
|
+
* Register sync-related tools.
|
|
6
|
+
*/
|
|
7
|
+
export function registerSyncTools(server) {
|
|
8
|
+
// --- Tool: awp_sync_remote_list ---
|
|
9
|
+
server.registerTool("awp_sync_remote_list", {
|
|
10
|
+
title: "List Sync Remotes",
|
|
11
|
+
description: "List all configured remote workspaces for sync.",
|
|
12
|
+
inputSchema: {},
|
|
13
|
+
}, async () => {
|
|
14
|
+
const root = getWorkspaceRoot();
|
|
15
|
+
const remotes = await listRemotes(root);
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: "text", text: JSON.stringify({ remotes }, null, 2) }],
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
// --- Tool: awp_sync_remote_add ---
|
|
21
|
+
server.registerTool("awp_sync_remote_add", {
|
|
22
|
+
title: "Add Sync Remote",
|
|
23
|
+
description: "Add a remote workspace for sync. Supports local-fs and git-remote transports.",
|
|
24
|
+
inputSchema: {
|
|
25
|
+
name: z.string().describe("Remote name (e.g., origin)"),
|
|
26
|
+
url: z.string().describe("Remote URL or filesystem path"),
|
|
27
|
+
transport: z
|
|
28
|
+
.enum(["local-fs", "git-remote"])
|
|
29
|
+
.optional()
|
|
30
|
+
.default("local-fs")
|
|
31
|
+
.describe("Transport type"),
|
|
32
|
+
},
|
|
33
|
+
}, async ({ name, url, transport }) => {
|
|
34
|
+
const root = getWorkspaceRoot();
|
|
35
|
+
await addRemote(root, name, {
|
|
36
|
+
url,
|
|
37
|
+
transport: transport,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: JSON.stringify({ success: true, remote: name, url, transport }, null, 2),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
// --- Tool: awp_sync_remote_remove ---
|
|
49
|
+
server.registerTool("awp_sync_remote_remove", {
|
|
50
|
+
title: "Remove Sync Remote",
|
|
51
|
+
description: "Remove a configured remote workspace.",
|
|
52
|
+
inputSchema: {
|
|
53
|
+
name: z.string().describe("Remote name to remove"),
|
|
54
|
+
},
|
|
55
|
+
}, async ({ name }) => {
|
|
56
|
+
const root = getWorkspaceRoot();
|
|
57
|
+
await removeRemote(root, name);
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{ type: "text", text: JSON.stringify({ success: true, removed: name }, null, 2) },
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
// --- Tool: awp_sync_pull ---
|
|
65
|
+
server.registerTool("awp_sync_pull", {
|
|
66
|
+
title: "Sync Pull",
|
|
67
|
+
description: "Pull artifacts from a remote workspace. Supports slug patterns, tag filters, dry-run mode, and auto-merge control.",
|
|
68
|
+
inputSchema: {
|
|
69
|
+
remote: z.string().describe("Remote name"),
|
|
70
|
+
slugPattern: z.string().optional().describe("Filter by slug pattern (supports * wildcards)"),
|
|
71
|
+
tag: z.string().optional().describe("Filter by tag"),
|
|
72
|
+
dryRun: z.boolean().optional().default(false).describe("Preview changes without applying"),
|
|
73
|
+
noAutoMerge: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.optional()
|
|
76
|
+
.default(false)
|
|
77
|
+
.describe("Create conflict files instead of auto-merging"),
|
|
78
|
+
},
|
|
79
|
+
}, async ({ remote, slugPattern, tag, dryRun, noAutoMerge }) => {
|
|
80
|
+
const root = getWorkspaceRoot();
|
|
81
|
+
const engine = new SyncEngine(root);
|
|
82
|
+
const result = await engine.pull(remote, { slugPattern, tag, dryRun, noAutoMerge });
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
// --- Tool: awp_sync_push ---
|
|
88
|
+
server.registerTool("awp_sync_push", {
|
|
89
|
+
title: "Sync Push",
|
|
90
|
+
description: "Push artifacts to a remote workspace.",
|
|
91
|
+
inputSchema: {
|
|
92
|
+
remote: z.string().describe("Remote name"),
|
|
93
|
+
slugPattern: z.string().optional().describe("Filter by slug pattern (supports * wildcards)"),
|
|
94
|
+
dryRun: z.boolean().optional().default(false).describe("Preview changes without applying"),
|
|
95
|
+
},
|
|
96
|
+
}, async ({ remote, slugPattern, dryRun }) => {
|
|
97
|
+
const root = getWorkspaceRoot();
|
|
98
|
+
const engine = new SyncEngine(root);
|
|
99
|
+
const result = await engine.push(remote, { slugPattern, dryRun });
|
|
100
|
+
return {
|
|
101
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
// --- Tool: awp_sync_diff ---
|
|
105
|
+
server.registerTool("awp_sync_diff", {
|
|
106
|
+
title: "Sync Diff",
|
|
107
|
+
description: "Show differences between local and remote artifacts without applying changes.",
|
|
108
|
+
inputSchema: {
|
|
109
|
+
remote: z.string().describe("Remote name"),
|
|
110
|
+
direction: z
|
|
111
|
+
.enum(["pull", "push"])
|
|
112
|
+
.optional()
|
|
113
|
+
.default("pull")
|
|
114
|
+
.describe("Diff direction"),
|
|
115
|
+
},
|
|
116
|
+
}, async ({ remote, direction }) => {
|
|
117
|
+
const root = getWorkspaceRoot();
|
|
118
|
+
const engine = new SyncEngine(root);
|
|
119
|
+
const entries = await engine.diff(remote, direction);
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: JSON.stringify({ entries }, null, 2) }],
|
|
122
|
+
};
|
|
123
|
+
});
|
|
124
|
+
// --- Tool: awp_sync_status ---
|
|
125
|
+
server.registerTool("awp_sync_status", {
|
|
126
|
+
title: "Sync Status",
|
|
127
|
+
description: "Show sync status for one or all remotes, including last sync time and tracked artifact/signal counts.",
|
|
128
|
+
inputSchema: {
|
|
129
|
+
remote: z.string().optional().describe("Remote name (omit to show all)"),
|
|
130
|
+
},
|
|
131
|
+
}, async ({ remote: remoteName }) => {
|
|
132
|
+
const root = getWorkspaceRoot();
|
|
133
|
+
const remotes = await listRemotes(root);
|
|
134
|
+
const names = remoteName ? [remoteName] : Object.keys(remotes);
|
|
135
|
+
const statuses = [];
|
|
136
|
+
for (const name of names) {
|
|
137
|
+
const rem = remotes[name];
|
|
138
|
+
if (!rem)
|
|
139
|
+
continue;
|
|
140
|
+
const state = await loadSyncState(root, name);
|
|
141
|
+
statuses.push({
|
|
142
|
+
name,
|
|
143
|
+
url: rem.url,
|
|
144
|
+
transport: rem.transport,
|
|
145
|
+
lastSync: state.lastSync,
|
|
146
|
+
trackedArtifacts: Object.keys(state.artifacts).length,
|
|
147
|
+
signalsSynced: state.signals.signalCount,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
content: [{ type: "text", text: JSON.stringify({ remotes: statuses }, null, 2) }],
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
// --- Tool: awp_sync_conflicts ---
|
|
155
|
+
server.registerTool("awp_sync_conflicts", {
|
|
156
|
+
title: "Sync Conflicts",
|
|
157
|
+
description: "List pending sync conflicts that need resolution.",
|
|
158
|
+
inputSchema: {},
|
|
159
|
+
}, async () => {
|
|
160
|
+
const root = getWorkspaceRoot();
|
|
161
|
+
const conflicts = await listConflicts(root);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: JSON.stringify({ conflicts }, null, 2) }],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
// --- Tool: awp_sync_resolve ---
|
|
167
|
+
server.registerTool("awp_sync_resolve", {
|
|
168
|
+
title: "Resolve Sync Conflict",
|
|
169
|
+
description: "Resolve a sync conflict. 'local' keeps current version, 'remote' overwrites with remote version, 'merged' assumes manual edit was done.",
|
|
170
|
+
inputSchema: {
|
|
171
|
+
slug: z.string().describe("Artifact slug with the conflict"),
|
|
172
|
+
mode: z
|
|
173
|
+
.enum(["local", "remote", "merged"])
|
|
174
|
+
.optional()
|
|
175
|
+
.default("local")
|
|
176
|
+
.describe("Resolution mode"),
|
|
177
|
+
},
|
|
178
|
+
}, async ({ slug, mode }) => {
|
|
179
|
+
const root = getWorkspaceRoot();
|
|
180
|
+
await resolveConflict(root, slug, mode);
|
|
181
|
+
return {
|
|
182
|
+
content: [
|
|
183
|
+
{
|
|
184
|
+
type: "text",
|
|
185
|
+
text: JSON.stringify({ success: true, slug, mode }, null, 2),
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-workspace/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "MCP server exposing Agent Workspace Protocol operations — plug any AWP workspace into any MCP client",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -42,8 +42,9 @@
|
|
|
42
42
|
"prepublishOnly": "npm run build"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@agent-workspace/core": "
|
|
46
|
-
"@agent-workspace/
|
|
45
|
+
"@agent-workspace/core": "*",
|
|
46
|
+
"@agent-workspace/sync": "*",
|
|
47
|
+
"@agent-workspace/utils": "*",
|
|
47
48
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
48
49
|
"ajv": "^8.17.1",
|
|
49
50
|
"ajv-formats": "^3.0.1",
|
package/dist/utils.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security and validation utilities for the AWP MCP server.
|
|
3
|
-
* Extracted to allow unit testing without server initialization side effects.
|
|
4
|
-
*/
|
|
5
|
-
/** Maximum file size allowed (1MB) */
|
|
6
|
-
export declare const MAX_FILE_SIZE: number;
|
|
7
|
-
/** Pattern for valid slugs */
|
|
8
|
-
export declare const SLUG_PATTERN: RegExp;
|
|
9
|
-
/**
|
|
10
|
-
* Validate that a path is within the workspace root (prevents directory traversal).
|
|
11
|
-
* Returns the normalized absolute path if valid, or throws an error.
|
|
12
|
-
*/
|
|
13
|
-
export declare function validatePath(root: string, targetPath: string): string;
|
|
14
|
-
/**
|
|
15
|
-
* Validate and sanitize a slug.
|
|
16
|
-
* Slugs must be lowercase alphanumeric with hyphens, not starting with hyphen.
|
|
17
|
-
*/
|
|
18
|
-
export declare function validateSlug(slug: string): string;
|
|
19
|
-
/**
|
|
20
|
-
* Read a file with size limit check.
|
|
21
|
-
*/
|
|
22
|
-
export declare function safeReadFile(path: string): Promise<string>;
|
|
23
|
-
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,sCAAsC;AACtC,eAAO,MAAM,aAAa,QAAc,CAAC;AAEzC,8BAA8B;AAC9B,eAAO,MAAM,YAAY,QAAyB,CAAC;AAMnD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAUrE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE"}
|
package/dist/utils.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Security and validation utilities for the AWP MCP server.
|
|
3
|
-
* Extracted to allow unit testing without server initialization side effects.
|
|
4
|
-
*/
|
|
5
|
-
import { stat } from "node:fs/promises";
|
|
6
|
-
import { readFile } from "node:fs/promises";
|
|
7
|
-
import { resolve, relative, isAbsolute } from "node:path";
|
|
8
|
-
// =============================================================================
|
|
9
|
-
// Security Constants
|
|
10
|
-
// =============================================================================
|
|
11
|
-
/** Maximum file size allowed (1MB) */
|
|
12
|
-
export const MAX_FILE_SIZE = 1024 * 1024;
|
|
13
|
-
/** Pattern for valid slugs */
|
|
14
|
-
export const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
15
|
-
// =============================================================================
|
|
16
|
-
// Security Utilities
|
|
17
|
-
// =============================================================================
|
|
18
|
-
/**
|
|
19
|
-
* Validate that a path is within the workspace root (prevents directory traversal).
|
|
20
|
-
* Returns the normalized absolute path if valid, or throws an error.
|
|
21
|
-
*/
|
|
22
|
-
export function validatePath(root, targetPath) {
|
|
23
|
-
const normalized = resolve(root, targetPath);
|
|
24
|
-
const rel = relative(root, normalized);
|
|
25
|
-
// Prevent directory traversal
|
|
26
|
-
if (rel.startsWith("..") || isAbsolute(rel)) {
|
|
27
|
-
throw new Error(`Path traversal detected: ${targetPath}`);
|
|
28
|
-
}
|
|
29
|
-
return normalized;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Validate and sanitize a slug.
|
|
33
|
-
* Slugs must be lowercase alphanumeric with hyphens, not starting with hyphen.
|
|
34
|
-
*/
|
|
35
|
-
export function validateSlug(slug) {
|
|
36
|
-
const trimmed = slug.trim().toLowerCase();
|
|
37
|
-
if (!SLUG_PATTERN.test(trimmed)) {
|
|
38
|
-
throw new Error(`Invalid slug: "${slug}". Must be lowercase alphanumeric with hyphens, not starting with hyphen.`);
|
|
39
|
-
}
|
|
40
|
-
// Additional safety: limit length
|
|
41
|
-
if (trimmed.length > 100) {
|
|
42
|
-
throw new Error(`Slug too long: max 100 characters`);
|
|
43
|
-
}
|
|
44
|
-
return trimmed;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Read a file with size limit check.
|
|
48
|
-
*/
|
|
49
|
-
export async function safeReadFile(path) {
|
|
50
|
-
const stats = await stat(path);
|
|
51
|
-
if (stats.size > MAX_FILE_SIZE) {
|
|
52
|
-
throw new Error(`File too large: ${stats.size} bytes (max: ${MAX_FILE_SIZE})`);
|
|
53
|
-
}
|
|
54
|
-
return readFile(path, "utf-8");
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE1D,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF,sCAAsC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAEnD,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,UAAkB;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,2EAA2E,CAClG,CAAC;IACJ,CAAC;IACD,kCAAkC;IAClC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,gBAAgB,aAAa,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
|