@perstack/base 0.0.64 → 0.0.65
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/bin/server.d.ts +3 -1
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +15 -15
- package/dist/bin/server.js.map +1 -1
- package/dist/package.json +46 -0
- package/dist/src/index.d.ts +12 -198
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -3
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/mime.d.ts +2 -0
- package/dist/src/lib/mime.d.ts.map +1 -0
- package/dist/src/lib/mime.js +13 -0
- package/dist/src/lib/mime.js.map +1 -0
- package/dist/src/lib/path.d.ts +3 -0
- package/dist/src/lib/path.d.ts.map +1 -0
- package/dist/src/lib/path.js +49 -0
- package/dist/src/lib/path.js.map +1 -0
- package/dist/src/lib/safe-file.d.ts +4 -0
- package/dist/src/lib/safe-file.d.ts.map +1 -0
- package/dist/src/lib/safe-file.js +38 -0
- package/dist/src/lib/safe-file.js.map +1 -0
- package/dist/src/lib/tool-result.d.ts +4 -0
- package/dist/src/lib/tool-result.d.ts.map +1 -0
- package/dist/src/lib/tool-result.js +9 -0
- package/dist/src/lib/tool-result.js.map +1 -0
- package/dist/src/server.d.ts +20 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +50 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tools/attempt-completion.d.ts +11 -0
- package/dist/src/tools/attempt-completion.d.ts.map +1 -0
- package/dist/src/tools/attempt-completion.js +27 -0
- package/dist/src/tools/attempt-completion.js.map +1 -0
- package/dist/src/tools/edit-text-file.d.ts +12 -0
- package/dist/src/tools/edit-text-file.d.ts.map +1 -0
- package/dist/src/tools/edit-text-file.js +56 -0
- package/dist/src/tools/edit-text-file.js.map +1 -0
- package/dist/src/tools/exec.d.ts +16 -0
- package/dist/src/tools/exec.d.ts.map +1 -0
- package/dist/src/tools/exec.js +86 -0
- package/dist/src/tools/exec.js.map +1 -0
- package/dist/src/tools/read-image-file.d.ts +10 -0
- package/dist/src/tools/read-image-file.d.ts.map +1 -0
- package/dist/src/tools/read-image-file.js +48 -0
- package/dist/src/tools/read-image-file.js.map +1 -0
- package/dist/src/tools/read-pdf-file.d.ts +10 -0
- package/dist/src/tools/read-pdf-file.d.ts.map +1 -0
- package/dist/src/tools/read-pdf-file.js +48 -0
- package/dist/src/tools/read-pdf-file.js.map +1 -0
- package/dist/src/tools/read-text-file.d.ts +13 -0
- package/dist/src/tools/read-text-file.d.ts.map +1 -0
- package/dist/src/tools/read-text-file.js +46 -0
- package/dist/src/tools/read-text-file.js.map +1 -0
- package/dist/src/tools/skill-management.d.ts +61 -0
- package/dist/src/tools/skill-management.d.ts.map +1 -0
- package/dist/src/tools/skill-management.js +162 -0
- package/dist/src/tools/skill-management.js.map +1 -0
- package/dist/src/tools/todo.d.ts +26 -0
- package/dist/src/tools/todo.d.ts.map +1 -0
- package/dist/src/tools/todo.js +74 -0
- package/dist/src/tools/todo.js.map +1 -0
- package/dist/src/tools/write-text-file.d.ts +10 -0
- package/dist/src/tools/write-text-file.d.ts.map +1 -0
- package/dist/src/tools/write-text-file.js +41 -0
- package/dist/src/tools/write-text-file.js.map +1 -0
- package/package.json +23 -21
- package/LICENSE +0 -202
- package/dist/server-MjrduhwZ.js +0 -607
- package/dist/server-MjrduhwZ.js.map +0 -1
package/dist/bin/server.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../bin/server.ts"],"names":[],"mappings":""}
|
package/dist/bin/server.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
import { F as name, I as version, P as description, r as createBaseServer } from "../server-MjrduhwZ.js";
|
|
1
|
+
#!/usr/bin/env bun
|
|
3
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
3
|
import { Command } from "commander";
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
5
|
+
import { createBaseServer } from "../src/server.js";
|
|
7
6
|
async function main() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name(packageJson.name)
|
|
10
|
+
.description(packageJson.description)
|
|
11
|
+
.version(packageJson.version, "-v, --version", "display the version number")
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const server = createBaseServer();
|
|
14
|
+
const transport = new StdioServerTransport();
|
|
15
|
+
console.error("Running @perstack/base version", packageJson.version);
|
|
16
|
+
await server.connect(transport);
|
|
17
|
+
});
|
|
18
|
+
program.parse();
|
|
16
19
|
}
|
|
17
20
|
main();
|
|
18
|
-
|
|
19
|
-
//#endregion
|
|
20
|
-
export { };
|
|
21
21
|
//# sourceMappingURL=server.js.map
|
package/dist/bin/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../bin/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAC7B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;SACtB,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;SACpC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;SAC3E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;QAC5C,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;QACpE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACJ,OAAO,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC;AACD,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@perstack/base",
|
|
3
|
+
"version": "0.0.65",
|
|
4
|
+
"description": "Perstack base skills for agents.",
|
|
5
|
+
"author": "Wintermute Technologies, Inc.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./src/index.ts"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"bin": {
|
|
14
|
+
"@perstack/base": "dist/bin/server.js"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": "./dist/src/index.js"
|
|
18
|
+
},
|
|
19
|
+
"types": {
|
|
20
|
+
".": "./dist/src/index.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"clean": "rm -rf dist",
|
|
28
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"test": "bun test"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
34
|
+
"@perstack/core": "workspace:*",
|
|
35
|
+
"commander": "^14.0.3",
|
|
36
|
+
"zod": "^4.3.6"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@tsconfig/node22": "^22.0.5",
|
|
40
|
+
"@types/node": "^25.3.0",
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"bun": ">=1.2.0"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,199 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
addSkill(input: {
|
|
14
|
-
name: string;
|
|
15
|
-
type: "mcpStdioSkill" | "mcpSseSkill";
|
|
16
|
-
command?: string;
|
|
17
|
-
packageName?: string;
|
|
18
|
-
args?: string[];
|
|
19
|
-
requiredEnv?: string[];
|
|
20
|
-
endpoint?: string;
|
|
21
|
-
description?: string;
|
|
22
|
-
rule?: string;
|
|
23
|
-
pick?: string[];
|
|
24
|
-
omit?: string[];
|
|
25
|
-
}): Promise<{
|
|
26
|
-
tools: string[];
|
|
27
|
-
}>;
|
|
28
|
-
removeSkill(skillName: string): Promise<void>;
|
|
29
|
-
addDelegate(expertKey: string): Promise<{
|
|
30
|
-
delegateToolName: string;
|
|
31
|
-
}>;
|
|
32
|
-
removeDelegate(expertName: string): Promise<void>;
|
|
33
|
-
createExpert(input: {
|
|
34
|
-
key: string;
|
|
35
|
-
instruction: string;
|
|
36
|
-
description?: string;
|
|
37
|
-
version?: string;
|
|
38
|
-
skills?: Record<string, {
|
|
39
|
-
type: "mcpStdioSkill" | "mcpSseSkill";
|
|
40
|
-
command?: string;
|
|
41
|
-
packageName?: string;
|
|
42
|
-
args?: string[];
|
|
43
|
-
requiredEnv?: string[];
|
|
44
|
-
endpoint?: string;
|
|
45
|
-
description?: string;
|
|
46
|
-
rule?: string;
|
|
47
|
-
pick?: string[];
|
|
48
|
-
omit?: string[];
|
|
49
|
-
lazyInit?: boolean;
|
|
50
|
-
}>;
|
|
51
|
-
delegates?: string[];
|
|
52
|
-
tags?: string[];
|
|
53
|
-
providerTools?: string[];
|
|
54
|
-
}): Promise<{
|
|
55
|
-
expertKey: string;
|
|
56
|
-
}>;
|
|
57
|
-
addDelegateFromConfig(input: {
|
|
58
|
-
configPath: string;
|
|
59
|
-
delegateExpertName: string;
|
|
60
|
-
}): Promise<{
|
|
61
|
-
delegateToolName: string;
|
|
62
|
-
}>;
|
|
63
|
-
}
|
|
64
|
-
declare function registerAddSkill(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
65
|
-
declare function registerRemoveSkill(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
66
|
-
declare function registerAddDelegate(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
67
|
-
declare function registerRemoveDelegate(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
68
|
-
declare function registerCreateExpert(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
69
|
-
declare function registerAddDelegateFromConfig(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
70
|
-
declare function registerSkillManagementTools(server: McpServer, callbacks: SkillManagementCallbacks): void;
|
|
71
|
-
//#endregion
|
|
72
|
-
//#region src/server.d.ts
|
|
73
|
-
/** Base skill name */
|
|
74
|
-
declare const BASE_SKILL_NAME: string;
|
|
75
|
-
/** Base skill version */
|
|
76
|
-
declare const BASE_SKILL_VERSION: string;
|
|
77
|
-
/**
|
|
78
|
-
* Register all base skill tools on an MCP server.
|
|
79
|
-
* This is useful for both standalone and in-process server creation.
|
|
80
|
-
*/
|
|
81
|
-
declare function registerAllTools(server: McpServer): void;
|
|
82
|
-
interface CreateBaseServerOptions {
|
|
83
|
-
skillManagement?: SkillManagementCallbacks;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create a base skill MCP server with all tools registered.
|
|
87
|
-
* Used by the runtime for in-process execution via InMemoryTransport.
|
|
88
|
-
*/
|
|
89
|
-
declare function createBaseServer(options?: CreateBaseServerOptions): McpServer;
|
|
90
|
-
//#endregion
|
|
91
|
-
//#region src/tools/attempt-completion.d.ts
|
|
92
|
-
type AttemptCompletionResult = {
|
|
93
|
-
remainingTodos: {
|
|
94
|
-
id: number;
|
|
95
|
-
title: string;
|
|
96
|
-
completed: boolean;
|
|
97
|
-
}[];
|
|
98
|
-
} | Record<string, never>;
|
|
99
|
-
declare function attemptCompletion(): Promise<AttemptCompletionResult>;
|
|
100
|
-
declare function registerAttemptCompletion(server: McpServer): void;
|
|
101
|
-
//#endregion
|
|
102
|
-
//#region src/tools/edit-text-file.d.ts
|
|
103
|
-
declare function editTextFile(input: {
|
|
104
|
-
path: string;
|
|
105
|
-
newText: string;
|
|
106
|
-
oldText: string;
|
|
107
|
-
}): Promise<{
|
|
108
|
-
path: string;
|
|
109
|
-
newText: string;
|
|
110
|
-
oldText: string;
|
|
111
|
-
}>;
|
|
112
|
-
declare function registerEditTextFile(server: McpServer): void;
|
|
113
|
-
//#endregion
|
|
114
|
-
//#region src/tools/exec.d.ts
|
|
115
|
-
type ExecInput = {
|
|
116
|
-
command: string;
|
|
117
|
-
args: string[];
|
|
118
|
-
env: Record<string, string>;
|
|
119
|
-
cwd: string;
|
|
120
|
-
stdout: boolean;
|
|
121
|
-
stderr: boolean;
|
|
122
|
-
timeout?: number;
|
|
123
|
-
};
|
|
124
|
-
declare function exec(input: ExecInput): Promise<{
|
|
125
|
-
output: string;
|
|
126
|
-
}>;
|
|
127
|
-
declare function registerExec(server: McpServer): void;
|
|
128
|
-
//#endregion
|
|
129
|
-
//#region src/tools/read-image-file.d.ts
|
|
130
|
-
declare function readImageFile(input: {
|
|
131
|
-
path: string;
|
|
132
|
-
}): Promise<{
|
|
133
|
-
path: string;
|
|
134
|
-
mimeType: string;
|
|
135
|
-
size: number;
|
|
136
|
-
}>;
|
|
137
|
-
declare function registerReadImageFile(server: McpServer): void;
|
|
138
|
-
//#endregion
|
|
139
|
-
//#region src/tools/read-pdf-file.d.ts
|
|
140
|
-
declare function readPdfFile(input: {
|
|
141
|
-
path: string;
|
|
142
|
-
}): Promise<{
|
|
143
|
-
path: string;
|
|
144
|
-
mimeType: string;
|
|
145
|
-
size: number;
|
|
146
|
-
}>;
|
|
147
|
-
declare function registerReadPdfFile(server: McpServer): void;
|
|
148
|
-
//#endregion
|
|
149
|
-
//#region src/tools/read-text-file.d.ts
|
|
150
|
-
declare function readTextFile(input: {
|
|
151
|
-
path: string;
|
|
152
|
-
from?: number;
|
|
153
|
-
to?: number;
|
|
154
|
-
}): Promise<{
|
|
155
|
-
path: string;
|
|
156
|
-
content: string;
|
|
157
|
-
from: number;
|
|
158
|
-
to: number;
|
|
159
|
-
}>;
|
|
160
|
-
declare function registerReadTextFile(server: McpServer): void;
|
|
161
|
-
//#endregion
|
|
162
|
-
//#region src/tools/todo.d.ts
|
|
163
|
-
declare function todo(input: {
|
|
164
|
-
newTodos?: string[];
|
|
165
|
-
completedTodos?: number[];
|
|
166
|
-
}): Promise<{
|
|
167
|
-
todos: {
|
|
168
|
-
id: number;
|
|
169
|
-
title: string;
|
|
170
|
-
completed: boolean;
|
|
171
|
-
}[];
|
|
172
|
-
}>;
|
|
173
|
-
declare function clearTodo(): Promise<{
|
|
174
|
-
todos: {
|
|
175
|
-
id: number;
|
|
176
|
-
title: string;
|
|
177
|
-
completed: boolean;
|
|
178
|
-
}[];
|
|
179
|
-
}>;
|
|
180
|
-
declare function getRemainingTodos(): {
|
|
181
|
-
id: number;
|
|
182
|
-
title: string;
|
|
183
|
-
completed: boolean;
|
|
184
|
-
}[];
|
|
185
|
-
declare function registerTodo(server: McpServer): void;
|
|
186
|
-
declare function registerClearTodo(server: McpServer): void;
|
|
187
|
-
//#endregion
|
|
188
|
-
//#region src/tools/write-text-file.d.ts
|
|
189
|
-
declare function writeTextFile(input: {
|
|
190
|
-
path: string;
|
|
191
|
-
text: string;
|
|
192
|
-
}): Promise<{
|
|
193
|
-
path: string;
|
|
194
|
-
text: string;
|
|
195
|
-
}>;
|
|
196
|
-
declare function registerWriteTextFile(server: McpServer): void;
|
|
197
|
-
//#endregion
|
|
198
|
-
export { AttemptCompletionResult, BASE_SKILL_NAME, BASE_SKILL_VERSION, type CreateBaseServerOptions, SkillManagementCallbacks, attemptCompletion, clearTodo, createBaseServer, editTextFile, errorToolResult, exec, getRemainingTodos, readImageFile, readPdfFile, readTextFile, registerAddDelegate, registerAddDelegateFromConfig, registerAddSkill, registerAllTools, registerAttemptCompletion, registerClearTodo, registerCreateExpert, registerEditTextFile, registerExec, registerReadImageFile, registerReadPdfFile, registerReadTextFile, registerRemoveDelegate, registerRemoveSkill, registerSkillManagementTools, registerTodo, registerWriteTextFile, successToolResult, todo, validatePath, writeTextFile };
|
|
1
|
+
export { validatePath } from "./lib/path.js";
|
|
2
|
+
export { errorToolResult, successToolResult } from "./lib/tool-result.js";
|
|
3
|
+
export { BASE_SKILL_NAME, BASE_SKILL_VERSION, type CreateBaseServerOptions, createBaseServer, registerAllTools, } from "./server.js";
|
|
4
|
+
export * from "./tools/attempt-completion.js";
|
|
5
|
+
export * from "./tools/edit-text-file.js";
|
|
6
|
+
export * from "./tools/exec.js";
|
|
7
|
+
export * from "./tools/read-image-file.js";
|
|
8
|
+
export * from "./tools/read-pdf-file.js";
|
|
9
|
+
export * from "./tools/read-text-file.js";
|
|
10
|
+
export * from "./tools/skill-management.js";
|
|
11
|
+
export * from "./tools/todo.js";
|
|
12
|
+
export * from "./tools/write-text-file.js";
|
|
199
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export { BASE_SKILL_NAME, BASE_SKILL_VERSION,
|
|
1
|
+
export { validatePath } from "./lib/path.js";
|
|
2
|
+
export { errorToolResult, successToolResult } from "./lib/tool-result.js";
|
|
3
|
+
export { BASE_SKILL_NAME, BASE_SKILL_VERSION, createBaseServer, registerAllTools, } from "./server.js";
|
|
4
|
+
export * from "./tools/attempt-completion.js";
|
|
5
|
+
export * from "./tools/edit-text-file.js";
|
|
6
|
+
export * from "./tools/exec.js";
|
|
7
|
+
export * from "./tools/read-image-file.js";
|
|
8
|
+
export * from "./tools/read-pdf-file.js";
|
|
9
|
+
export * from "./tools/read-text-file.js";
|
|
10
|
+
export * from "./tools/skill-management.js";
|
|
11
|
+
export * from "./tools/todo.js";
|
|
12
|
+
export * from "./tools/write-text-file.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,EACL,eAAe,EACf,kBAAkB,EAElB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,4BAA4B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../../src/lib/mime.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
const MIME_TYPES = {
|
|
3
|
+
".png": "image/png",
|
|
4
|
+
".jpg": "image/jpeg",
|
|
5
|
+
".jpeg": "image/jpeg",
|
|
6
|
+
".gif": "image/gif",
|
|
7
|
+
".webp": "image/webp",
|
|
8
|
+
".pdf": "application/pdf",
|
|
9
|
+
};
|
|
10
|
+
export function lookupMimeType(filePath) {
|
|
11
|
+
return MIME_TYPES[extname(filePath).toLowerCase()];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../src/lib/mime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,iBAAiB;CAC1B,CAAA;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/lib/path.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa,QAA0C,CAAA;AASpE,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCzE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
export const workspacePath = realpathSync(expandHome(process.cwd()));
|
|
6
|
+
function expandHome(filepath) {
|
|
7
|
+
if (filepath.startsWith("~/") || filepath === "~") {
|
|
8
|
+
return path.join(os.homedir(), filepath.slice(1));
|
|
9
|
+
}
|
|
10
|
+
return filepath;
|
|
11
|
+
}
|
|
12
|
+
export async function validatePath(requestedPath) {
|
|
13
|
+
const expandedPath = expandHome(requestedPath);
|
|
14
|
+
const absolute = path.isAbsolute(expandedPath)
|
|
15
|
+
? path.resolve(expandedPath)
|
|
16
|
+
: path.resolve(process.cwd(), expandedPath);
|
|
17
|
+
const perstackDir = `${workspacePath}/perstack`.toLowerCase();
|
|
18
|
+
if (absolute.toLowerCase() === perstackDir ||
|
|
19
|
+
absolute.toLowerCase().startsWith(`${perstackDir}/`)) {
|
|
20
|
+
throw new Error("Access denied - perstack directory is not allowed");
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const realAbsolute = await fs.realpath(absolute);
|
|
24
|
+
if (!isWithinWorkspace(realAbsolute)) {
|
|
25
|
+
throw new Error("Access denied - symlink target outside allowed directories");
|
|
26
|
+
}
|
|
27
|
+
return realAbsolute;
|
|
28
|
+
}
|
|
29
|
+
catch (_error) {
|
|
30
|
+
const parentDir = path.dirname(absolute);
|
|
31
|
+
try {
|
|
32
|
+
const realParentPath = await fs.realpath(parentDir);
|
|
33
|
+
if (!isWithinWorkspace(realParentPath)) {
|
|
34
|
+
throw new Error("Access denied - parent directory outside allowed directories");
|
|
35
|
+
}
|
|
36
|
+
return absolute;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
if (!isWithinWorkspace(absolute)) {
|
|
40
|
+
throw new Error(`Access denied - path outside allowed directories: ${absolute} not in ${workspacePath}`);
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Parent directory does not exist: ${parentDir}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function isWithinWorkspace(absolutePath) {
|
|
47
|
+
return absolutePath === workspacePath || absolutePath.startsWith(`${workspacePath}/`);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/lib/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;AAEpE,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,aAAqB;IACtD,MAAM,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAA;IAC7C,MAAM,WAAW,GAAG,GAAG,aAAa,WAAW,CAAC,WAAW,EAAE,CAAA;IAC7D,IACE,QAAQ,CAAC,WAAW,EAAE,KAAK,WAAW;QACtC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,EACpD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAChD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC/E,CAAC;QACD,OAAO,YAAY,CAAA;IACrB,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,qDAAqD,QAAQ,WAAW,aAAa,EAAE,CACxF,CAAA;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB;IAC7C,OAAO,YAAY,KAAK,aAAa,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC,CAAA;AACvF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-file.d.ts","sourceRoot":"","sources":["../../../src/lib/safe-file.ts"],"names":[],"mappings":"AAaA,wBAAgB,iCAAiC,IAAI,OAAO,CAE3D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { constants, lstat, open } from "node:fs/promises";
|
|
2
|
+
const O_NOFOLLOW = constants.O_NOFOLLOW ?? 0;
|
|
3
|
+
const O_NOFOLLOW_SUPPORTED = typeof constants.O_NOFOLLOW === "number";
|
|
4
|
+
async function checkNotSymlink(path) {
|
|
5
|
+
const stats = await lstat(path).catch(() => null);
|
|
6
|
+
if (stats?.isSymbolicLink()) {
|
|
7
|
+
throw new Error("Operation denied: target is a symbolic link");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function isSymlinkProtectionFullySupported() {
|
|
11
|
+
return O_NOFOLLOW_SUPPORTED;
|
|
12
|
+
}
|
|
13
|
+
export async function safeWriteFile(path, data) {
|
|
14
|
+
let handle;
|
|
15
|
+
try {
|
|
16
|
+
await checkNotSymlink(path);
|
|
17
|
+
const flags = constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | O_NOFOLLOW;
|
|
18
|
+
handle = await open(path, flags, 0o644);
|
|
19
|
+
await handle.writeFile(data, "utf-8");
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await handle?.close();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function safeReadFile(path) {
|
|
26
|
+
let handle;
|
|
27
|
+
try {
|
|
28
|
+
await checkNotSymlink(path);
|
|
29
|
+
const flags = constants.O_RDONLY | O_NOFOLLOW;
|
|
30
|
+
handle = await open(path, flags);
|
|
31
|
+
const buffer = await handle.readFile("utf-8");
|
|
32
|
+
return buffer;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await handle?.close();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=safe-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-file.js","sourceRoot":"","sources":["../../../src/lib/safe-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,CAAC,CAAA;AAC5C,MAAM,oBAAoB,GAAG,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAA;AAErE,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IACjD,IAAI,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IAC5D,IAAI,MAA8B,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,GAAG,UAAU,CAAA;QACrF,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACvC,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,MAA8B,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAA;QAC7C,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC7C,OAAO,MAAM,CAAA;IACf,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.d.ts","sourceRoot":"","sources":["../../../src/lib/tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAExE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAEjE;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,cAAc,CAIxD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function successToolResult(result) {
|
|
2
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
3
|
+
}
|
|
4
|
+
export function errorToolResult(e) {
|
|
5
|
+
return {
|
|
6
|
+
content: [{ type: "text", text: JSON.stringify({ error: e.name, message: e.message }) }],
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=tool-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../../src/lib/tool-result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAQ;IACtC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;KACzF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { SkillManagementCallbacks } from "./tools/skill-management.js";
|
|
3
|
+
/** Base skill name */
|
|
4
|
+
export declare const BASE_SKILL_NAME: string;
|
|
5
|
+
/** Base skill version */
|
|
6
|
+
export declare const BASE_SKILL_VERSION: string;
|
|
7
|
+
/**
|
|
8
|
+
* Register all base skill tools on an MCP server.
|
|
9
|
+
* This is useful for both standalone and in-process server creation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerAllTools(server: McpServer): void;
|
|
12
|
+
export interface CreateBaseServerOptions {
|
|
13
|
+
skillManagement?: SkillManagementCallbacks;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a base skill MCP server with all tools registered.
|
|
17
|
+
* Used by the runtime for in-process execution via InMemoryTransport.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createBaseServer(options?: CreateBaseServerOptions): McpServer;
|
|
20
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAQnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAK3E,sBAAsB;AACtB,eAAO,MAAM,eAAe,QAAmB,CAAA;AAE/C,yBAAyB;AACzB,eAAO,MAAM,kBAAkB,QAAsB,CAAA;AAErD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAUxD;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,wBAAwB,CAAA;CAC3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAiB7E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
3
|
+
import { registerAttemptCompletion } from "./tools/attempt-completion.js";
|
|
4
|
+
import { registerEditTextFile } from "./tools/edit-text-file.js";
|
|
5
|
+
import { registerExec } from "./tools/exec.js";
|
|
6
|
+
import { registerReadImageFile } from "./tools/read-image-file.js";
|
|
7
|
+
import { registerReadPdfFile } from "./tools/read-pdf-file.js";
|
|
8
|
+
import { registerReadTextFile } from "./tools/read-text-file.js";
|
|
9
|
+
import { registerSkillManagementTools } from "./tools/skill-management.js";
|
|
10
|
+
import { registerClearTodo, registerTodo } from "./tools/todo.js";
|
|
11
|
+
import { registerWriteTextFile } from "./tools/write-text-file.js";
|
|
12
|
+
/** Base skill name */
|
|
13
|
+
export const BASE_SKILL_NAME = packageJson.name;
|
|
14
|
+
/** Base skill version */
|
|
15
|
+
export const BASE_SKILL_VERSION = packageJson.version;
|
|
16
|
+
/**
|
|
17
|
+
* Register all base skill tools on an MCP server.
|
|
18
|
+
* This is useful for both standalone and in-process server creation.
|
|
19
|
+
*/
|
|
20
|
+
export function registerAllTools(server) {
|
|
21
|
+
registerAttemptCompletion(server);
|
|
22
|
+
registerTodo(server);
|
|
23
|
+
registerClearTodo(server);
|
|
24
|
+
registerExec(server);
|
|
25
|
+
registerReadTextFile(server);
|
|
26
|
+
registerReadImageFile(server);
|
|
27
|
+
registerReadPdfFile(server);
|
|
28
|
+
registerWriteTextFile(server);
|
|
29
|
+
registerEditTextFile(server);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a base skill MCP server with all tools registered.
|
|
33
|
+
* Used by the runtime for in-process execution via InMemoryTransport.
|
|
34
|
+
*/
|
|
35
|
+
export function createBaseServer(options) {
|
|
36
|
+
const server = new McpServer({
|
|
37
|
+
name: BASE_SKILL_NAME,
|
|
38
|
+
version: BASE_SKILL_VERSION,
|
|
39
|
+
}, {
|
|
40
|
+
capabilities: {
|
|
41
|
+
tools: {},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
registerAllTools(server);
|
|
45
|
+
if (options?.skillManagement) {
|
|
46
|
+
registerSkillManagementTools(server, options.skillManagement);
|
|
47
|
+
}
|
|
48
|
+
return server;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,sBAAsB;AACtB,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAA;AAE/C,yBAAyB;AACzB,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC,OAAO,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACjC,YAAY,CAAC,MAAM,CAAC,CAAA;IACpB,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACzB,YAAY,CAAC,MAAM,CAAC,CAAA;IACpB,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAiC;IAChE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,kBAAkB;KAC5B,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAA;IACD,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACxB,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;QAC7B,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export type AttemptCompletionResult = {
|
|
3
|
+
remainingTodos: {
|
|
4
|
+
id: number;
|
|
5
|
+
title: string;
|
|
6
|
+
completed: boolean;
|
|
7
|
+
}[];
|
|
8
|
+
} | Record<string, never>;
|
|
9
|
+
export declare function attemptCompletion(): Promise<AttemptCompletionResult>;
|
|
10
|
+
export declare function registerAttemptCompletion(server: McpServer): void;
|
|
11
|
+
//# sourceMappingURL=attempt-completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-completion.d.ts","sourceRoot":"","sources":["../../../src/tools/attempt-completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAKxE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CAAE,GACvE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEzB,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAM1E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAkB1D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { errorToolResult, successToolResult } from "../lib/tool-result.js";
|
|
3
|
+
import { getRemainingTodos } from "./todo.js";
|
|
4
|
+
export async function attemptCompletion() {
|
|
5
|
+
const remainingTodos = getRemainingTodos();
|
|
6
|
+
if (remainingTodos.length > 0) {
|
|
7
|
+
return { remainingTodos };
|
|
8
|
+
}
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
export function registerAttemptCompletion(server) {
|
|
12
|
+
server.registerTool("attemptCompletion", {
|
|
13
|
+
title: "Attempt completion",
|
|
14
|
+
description: "Signal task completion. Provide a result parameter with your final response text. Validates all todos are complete before ending.",
|
|
15
|
+
inputSchema: z.object({ result: z.string().optional() }).strict(),
|
|
16
|
+
}, async () => {
|
|
17
|
+
try {
|
|
18
|
+
return successToolResult(await attemptCompletion());
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
if (e instanceof Error)
|
|
22
|
+
return errorToolResult(e);
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=attempt-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-completion.js","sourceRoot":"","sources":["../../../src/tools/attempt-completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAM7C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAA;IAC1C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,cAAc,EAAE,CAAA;IAC3B,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,mIAAmI;QACrI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;KAClE,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,iBAAiB,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAA;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK;gBAAE,OAAO,eAAe,CAAC,CAAC,CAAC,CAAA;YACjD,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|