kevlar-4u 1.1.0 → 1.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/LICENSE +21 -0
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/dist/__tests__/persona_creation_debug.test.d.ts +2 -0
- package/dist/__tests__/persona_creation_debug.test.d.ts.map +1 -0
- package/dist/__tests__/persona_creation_debug.test.js +56 -0
- package/dist/__tests__/persona_creation_debug.test.js.map +1 -0
- package/dist/__tests__/resetPersonasWizard.test.d.ts +2 -0
- package/dist/__tests__/resetPersonasWizard.test.d.ts.map +1 -0
- package/dist/__tests__/resetPersonasWizard.test.js +74 -0
- package/dist/__tests__/resetPersonasWizard.test.js.map +1 -0
- package/dist/execution/sampling.d.ts +21 -0
- package/dist/execution/sampling.d.ts.map +1 -0
- package/dist/execution/sampling.js +23 -0
- package/dist/execution/sampling.js.map +1 -0
- package/dist/prompts/reviewDispatcherPrompt.d.ts +2 -0
- package/dist/prompts/reviewDispatcherPrompt.d.ts.map +1 -0
- package/dist/prompts/reviewDispatcherPrompt.js +67 -0
- package/dist/prompts/reviewDispatcherPrompt.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +92 -66
- package/dist/server.js.map +1 -1
- package/dist/tools/configureWizardTool.d.ts.map +1 -1
- package/dist/tools/configureWizardTool.js +19 -16
- package/dist/tools/configureWizardTool.js.map +1 -1
- package/dist/tools/createPersonaTool.d.ts.map +1 -1
- package/dist/tools/createPersonaTool.js +176 -180
- package/dist/tools/createPersonaTool.js.map +1 -1
- package/dist/tools/createPersonaWizardTool.d.ts.map +1 -1
- package/dist/tools/createPersonaWizardTool.js +644 -472
- package/dist/tools/createPersonaWizardTool.js.map +1 -1
- package/dist/tools/getModesTool.d.ts.map +1 -1
- package/dist/tools/getModesTool.js +76 -58
- package/dist/tools/getModesTool.js.map +1 -1
- package/dist/tools/listPersonasTool.d.ts.map +1 -1
- package/dist/tools/listPersonasTool.js +29 -36
- package/dist/tools/listPersonasTool.js.map +1 -1
- package/dist/tools/resetPersonasTool.d.ts +7 -0
- package/dist/tools/resetPersonasTool.d.ts.map +1 -0
- package/dist/tools/resetPersonasTool.js +447 -0
- package/dist/tools/resetPersonasTool.js.map +1 -0
- package/dist/tools/resetPersonasWizardTool.d.ts +9 -0
- package/dist/tools/resetPersonasWizardTool.d.ts.map +1 -0
- package/dist/tools/resetPersonasWizardTool.js +125 -0
- package/dist/tools/resetPersonasWizardTool.js.map +1 -0
- package/dist/tools/reviewContentWizardTool.d.ts.map +1 -1
- package/dist/tools/reviewContentWizardTool.js +138 -88
- package/dist/tools/reviewContentWizardTool.js.map +1 -1
- package/dist/tools/reviewTool.d.ts.map +1 -1
- package/dist/tools/reviewTool.js +87 -79
- package/dist/tools/reviewTool.js.map +1 -1
- package/dist/tools/types.d.ts +2 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/personaIdMaps.d.ts.map +1 -1
- package/dist/utils/personaIdMaps.js +0 -1
- package/dist/utils/personaIdMaps.js.map +1 -1
- package/package.json +2 -2
- package/skills/tmp/wizard-create-3mk79v9g_draft.json +35 -0
- package/skills/tmp/wizard-create-3mk79v9g_wizard.json +35 -0
- package/skills/tmp/wizard-create-yilbwzz6_draft.json +35 -0
- package/skills/tmp/wizard-create-yilbwzz6_wizard.json +35 -0
- package/skills/wechat_official/wechat_official.md +26 -0
- package/skills/wechat_official/wechat_official_1.md +31 -0
- package/skills/xiaohongshu/xiaohongshu.md +26 -0
- package/skills/xiaohongshu/xiaohongshu_1.md +29 -0
- package/skills/xiaohongshu/xiaohongshu_2.md +34 -0
- package/skills/xiaohongshu/xiaohongshu_3.md +30 -0
- package/skills/zhihu/zhihu.md +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Kevlar-4u
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ja.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kevlar — コメント欄シミュレーター
|
|
2
2
|
|
|
3
3
|

|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
package/README.ko.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kevlar — 댓글 시뮬레이터
|
|
2
2
|
|
|
3
3
|

|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kevlar-4u — Comment Section Simulator
|
|
2
2
|
|
|
3
3
|

|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
package/README.zh.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Kevlar — 社交媒体作品发布前的反馈模拟器
|
|
2
2
|
|
|
3
3
|

|
|
4
|
-

|
|
5
5
|

|
|
6
6
|

|
|
7
7
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona_creation_debug.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/persona_creation_debug.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { describe, it, before, after } from "node:test";
|
|
5
|
+
import { ok } from "node:assert";
|
|
6
|
+
import { handleCreatePersonaWizard } from "../tools/createPersonaWizardTool.js";
|
|
7
|
+
import { loadAllPersonas } from "../utils/parser.js";
|
|
8
|
+
describe("persona creation debug", () => {
|
|
9
|
+
const skillsDir = path.join(tmpdir(), `kevlar-debug-${Date.now()}`);
|
|
10
|
+
const tmpDir = path.join(tmpdir(), `kevlar-debug-tmp-${Date.now()}`);
|
|
11
|
+
before(() => {
|
|
12
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
13
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
14
|
+
});
|
|
15
|
+
after(() => {
|
|
16
|
+
fs.rmSync(skillsDir, { recursive: true, force: true });
|
|
17
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
it("generateIdFromDraft with real wizard data", async () => {
|
|
20
|
+
// Simulate full wizard flow
|
|
21
|
+
const r1 = await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "创建一个美食评论员" });
|
|
22
|
+
const sidMatch = r1.content[0].text.match(/sessionId: (\S+)/);
|
|
23
|
+
const sessionId = sidMatch ? sidMatch[1] : "";
|
|
24
|
+
ok(sessionId, "should have sessionId");
|
|
25
|
+
await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "25-30岁", sessionId });
|
|
26
|
+
await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "美食、旅行、科技", sessionId });
|
|
27
|
+
// Step 4: traits - use "宅男" which is NOT in the trait map (real-world case)
|
|
28
|
+
const r4 = await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "宅男、孤僻", sessionId });
|
|
29
|
+
const r5 = await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "知乎", sessionId });
|
|
30
|
+
// Step 6: author relation - shows final confirm with preview
|
|
31
|
+
const r6 = await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "已关注", sessionId });
|
|
32
|
+
// Print the confirmation message
|
|
33
|
+
console.log("\n=== CONFIRMATION MESSAGE ===");
|
|
34
|
+
console.log(r6.content[0].text);
|
|
35
|
+
console.log("=== END ===\n");
|
|
36
|
+
// Check if preview shows the correct path
|
|
37
|
+
const previewMatch = r6.content[0].text.match(/📄 (\S+)/);
|
|
38
|
+
if (previewMatch) {
|
|
39
|
+
console.log("Preview path:", previewMatch[1]);
|
|
40
|
+
// Should be skills/zhihu/zhihu.md or similar (not persona_xxx)
|
|
41
|
+
ok(!previewMatch[1].includes("persona_"), "Preview should NOT show random persona_ ID");
|
|
42
|
+
}
|
|
43
|
+
// Now confirm
|
|
44
|
+
const r7 = await handleCreatePersonaWizard(skillsDir, tmpDir, { userMessage: "确认创建", sessionId });
|
|
45
|
+
console.log("Creation result:", r7.content[0].text.substring(0, 200));
|
|
46
|
+
// Load personas to check actual file
|
|
47
|
+
const personas = await loadAllPersonas(skillsDir);
|
|
48
|
+
console.log("\nCreated personas:", personas.length);
|
|
49
|
+
for (const p of personas) {
|
|
50
|
+
console.log(` ID: ${p.meta.id}, Name: ${p.meta.name}, File: ${p.filePath}`);
|
|
51
|
+
ok(!p.meta.id.startsWith("persona_"), `ID ${p.meta.id} should NOT be random`);
|
|
52
|
+
ok(p.filePath.includes("zhihu/"), `File ${p.filePath} should be in zhihu/ subdirectory`);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=persona_creation_debug.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona_creation_debug.test.js","sourceRoot":"","sources":["../../src/__tests__/persona_creation_debug.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resetPersonasWizard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resetPersonasWizard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import * as os from "os";
|
|
6
|
+
import { handleResetPersonasWizard } from "../tools/resetPersonasWizardTool.js";
|
|
7
|
+
import { handleResetPersonas } from "../tools/resetPersonasTool.js";
|
|
8
|
+
import { invalidatePersonasCache } from "../utils/parser.js";
|
|
9
|
+
let skillsDir;
|
|
10
|
+
let tmpDir;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
skillsDir = fs.mkdtempSync(path.join(os.tmpdir(), "kevlar-reset-wizard-"));
|
|
13
|
+
tmpDir = path.join(skillsDir, "tmp");
|
|
14
|
+
invalidatePersonasCache();
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
fs.rmSync(skillsDir, { recursive: true, force: true });
|
|
18
|
+
invalidatePersonasCache();
|
|
19
|
+
});
|
|
20
|
+
function textOf(result) {
|
|
21
|
+
return result.content.map((c) => c.text).join("\n");
|
|
22
|
+
}
|
|
23
|
+
function extractSessionId(text) {
|
|
24
|
+
const match = text.match(/sessionId:\s*([a-z0-9-]+)/);
|
|
25
|
+
assert.ok(match, `expected sessionId in response: ${text}`);
|
|
26
|
+
return match[1];
|
|
27
|
+
}
|
|
28
|
+
describe("handleResetPersonasWizard", () => {
|
|
29
|
+
it("previews impact and does not restore before explicit confirmation", async () => {
|
|
30
|
+
const result = await handleResetPersonasWizard(skillsDir, tmpDir, {
|
|
31
|
+
userMessage: "恢复默认人设",
|
|
32
|
+
});
|
|
33
|
+
const text = textOf(result);
|
|
34
|
+
assert.ok(text.includes("将恢复系统内置默认评论员"));
|
|
35
|
+
assert.ok(text.includes("currentStep: confirmReset"));
|
|
36
|
+
assert.equal(fs.readdirSync(skillsDir).filter((f) => f.endsWith(".md")).length, 0);
|
|
37
|
+
});
|
|
38
|
+
it("runs reset only after exact confirmation phrase", async () => {
|
|
39
|
+
const started = await handleResetPersonasWizard(skillsDir, tmpDir, {
|
|
40
|
+
userMessage: "恢复默认人设",
|
|
41
|
+
});
|
|
42
|
+
const sessionId = extractSessionId(textOf(started));
|
|
43
|
+
const wrongConfirm = await handleResetPersonasWizard(skillsDir, tmpDir, {
|
|
44
|
+
sessionId,
|
|
45
|
+
userMessage: "确认",
|
|
46
|
+
});
|
|
47
|
+
assert.ok(textOf(wrongConfirm).includes("请回复完整确认语"));
|
|
48
|
+
assert.equal(fs.readdirSync(skillsDir).filter((f) => f.endsWith(".md")).length, 0);
|
|
49
|
+
const restored = await handleResetPersonasWizard(skillsDir, tmpDir, {
|
|
50
|
+
sessionId,
|
|
51
|
+
userMessage: "确认恢复默认评论员",
|
|
52
|
+
});
|
|
53
|
+
const restoredText = textOf(restored);
|
|
54
|
+
assert.ok(restoredText.includes("系统人设恢复完成"));
|
|
55
|
+
assert.ok(fs.readdirSync(skillsDir).some((f) => f.endsWith(".md")));
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("handleResetPersonas (direct tool)", () => {
|
|
59
|
+
it("blocks reset when confirm is false", async () => {
|
|
60
|
+
const result = await handleResetPersonas(skillsDir, { confirm: false });
|
|
61
|
+
assert.ok(result.isError);
|
|
62
|
+
assert.ok(result.content[0]?.text.includes("二次确认"));
|
|
63
|
+
assert.equal(fs.readdirSync(skillsDir).filter((f) => f.endsWith(".md")).length, 0);
|
|
64
|
+
});
|
|
65
|
+
it("writes built-in persona files when confirm is true", async () => {
|
|
66
|
+
const result = await handleResetPersonas(skillsDir, { confirm: true });
|
|
67
|
+
assert.ok(!result.isError);
|
|
68
|
+
const files = fs.readdirSync(skillsDir).filter((f) => f.endsWith(".md"));
|
|
69
|
+
assert.ok(files.includes("impatient_passerby.md"));
|
|
70
|
+
assert.ok(files.includes("keyboard_warrior.md"));
|
|
71
|
+
assert.ok(files.includes("first_time_reader.md"));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=resetPersonasWizard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resetPersonasWizard.test.js","sourceRoot":"","sources":["../../src/__tests__/resetPersonasWizard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sampling Resolution Module
|
|
3
|
+
*
|
|
4
|
+
* Extracts the repetitive "check client + create samplingFn" pattern
|
|
5
|
+
* from individual tool handlers into a single reusable function.
|
|
6
|
+
*
|
|
7
|
+
* Returns undefined if the connected MCP client does not support sampling,
|
|
8
|
+
* otherwise returns a ready-to-use MultiTurnSamplingFunction.
|
|
9
|
+
*/
|
|
10
|
+
import type { MultiTurnSamplingFunction } from "./base.js";
|
|
11
|
+
export interface SamplingResolverDeps {
|
|
12
|
+
/** Returns raw client version info from the MCP connection handshake. */
|
|
13
|
+
getClientVersion: () => {
|
|
14
|
+
name: string;
|
|
15
|
+
version?: string;
|
|
16
|
+
} | undefined;
|
|
17
|
+
/** Factory that creates a MultiTurnSamplingFunction bound to the server instance. */
|
|
18
|
+
createFn: () => MultiTurnSamplingFunction;
|
|
19
|
+
}
|
|
20
|
+
export declare function resolveSamplingFn(deps: SamplingResolverDeps): MultiTurnSamplingFunction | undefined;
|
|
21
|
+
//# sourceMappingURL=sampling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.d.ts","sourceRoot":"","sources":["../../src/execution/sampling.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,gBAAgB,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACvE,qFAAqF;IACrF,QAAQ,EAAE,MAAM,yBAAyB,CAAC;CAC3C;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,oBAAoB,GACzB,yBAAyB,GAAG,SAAS,CAYvC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sampling Resolution Module
|
|
3
|
+
*
|
|
4
|
+
* Extracts the repetitive "check client + create samplingFn" pattern
|
|
5
|
+
* from individual tool handlers into a single reusable function.
|
|
6
|
+
*
|
|
7
|
+
* Returns undefined if the connected MCP client does not support sampling,
|
|
8
|
+
* otherwise returns a ready-to-use MultiTurnSamplingFunction.
|
|
9
|
+
*/
|
|
10
|
+
import { setClientInfo, isSamplingSupported } from "./client.js";
|
|
11
|
+
export function resolveSamplingFn(deps) {
|
|
12
|
+
if (process.env.KEVLAR_ENABLE_SAMPLING === "true") {
|
|
13
|
+
return deps.createFn();
|
|
14
|
+
}
|
|
15
|
+
const cv = deps.getClientVersion();
|
|
16
|
+
if (!cv)
|
|
17
|
+
return undefined;
|
|
18
|
+
setClientInfo(cv.name, cv.version);
|
|
19
|
+
if (!isSamplingSupported(cv.name))
|
|
20
|
+
return undefined;
|
|
21
|
+
return deps.createFn();
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../src/execution/sampling.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUjE,MAAM,UAAU,iBAAiB,CAC/B,IAA0B;IAE1B,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,MAAM,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAE1B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const REVIEW_DISPATCHER_PROMPT = "\u4F60\u662F\u4E00\u4E2A\u5185\u5BB9\u8BC4\u8BBA\u8C03\u5EA6\u5F15\u64CE\uFF0C\u8D1F\u8D23\u4E3A\u7528\u6237\u63D0\u4EA4\u7684\u5185\u5BB9\u5339\u914D\u5408\u9002\u7684\u8BC4\u8BBA\u5458\uFF0C\u534F\u8C03\u5B50\u4EE3\u7406\u6267\u884C\u8BC4\u8BBA\u4EFB\u52A1\uFF0C\u5E76\u5728\u6240\u6709\u8BC4\u8BBA\u5B8C\u6210\u540E\u751F\u6210\u7ED3\u6784\u5316\u8BCA\u65AD\u62A5\u544A\u4EA4\u4ED8\u7ED9\u7528\u6237\u3002\n\n**\u4E00\u3001\u8BC4\u8BBA\u5458\u5339\u914D**\n\n\u89D2\u8272\u5E93\u68C0\u67E5\uFF08\u4F18\u5148\u6267\u884C\uFF09\uFF1A\n- \u82E5\u89D2\u8272\u6570\u91CF = 0\uFF1A\u505C\u6B62\u5339\u914D\u6D41\u7A0B\uFF0C\u63D0\u793A\u7528\u6237\uFF1A\u300C\u5F53\u524D\u8FD8\u6CA1\u6709\u53EF\u7528\u7684\u8BC4\u8BBA\u5458\uFF0C\u8BF7\u5148\u521B\u5EFA\u81F3\u5C11\u4E00\u4E2A\u89D2\u8272\uFF0C\u518D\u63D0\u4EA4\u5185\u5BB9\u8FDB\u884C\u8BC4\u8BBA\u3002\u300D\uFF08\u6CE8\u610F\uFF1A\u5728\u63D0\u793A\u521B\u5EFA\u524D\uFF0C\u52A1\u5FC5\u8BB0\u5F55\u5E76\u6682\u5B58\u7528\u6237\u672C\u6B21\u63D0\u4EA4\u7684\u6587\u6848\u5185\u5BB9\uFF0C\u4EE5\u4FBF\u5728\u89D2\u8272\u521B\u5EFA\u5B8C\u6210\u540E\u81EA\u52A8\u6216\u624B\u52A8\u5524\u9192\u5E76\u7EE7\u7EED\u672C\u6B21\u8BC4\u8BBA\u4EFB\u52A1\uFF09\n- \u82E5\u89D2\u8272\u6570\u91CF = 1-2\uFF1A\u8DF3\u8FC7\u63A8\u8350\u6B65\u9AA4\uFF0C\u76F4\u63A5\u5C55\u793A\u5168\u90E8\u53EF\u7528\u89D2\u8272\uFF0C\u8BF4\u660E\uFF1A\u300C\u5F53\u524D\u53EA\u6709 N \u4F4D\u8BC4\u8BBA\u5458\u53EF\u7528\uFF0C\u5DF2\u4E3A\u4F60\u5C55\u793A\u5168\u90E8\u89D2\u8272\uFF0C\u8BF7\u786E\u8BA4\u662F\u5426\u4F7F\u7528\u3002\u300D\n- \u82E5\u89D2\u8272\u6570\u91CF \u2265 3\uFF1A\u6267\u884C\u6B63\u5E38\u5339\u914D\u63A8\u8350\u6D41\u7A0B\n\n\u7528\u6237\u63D0\u4EA4\u5185\u5BB9\u540E\uFF0C\u5206\u6790\u5185\u5BB9\u7684\u7C7B\u578B\u3001\u98CE\u683C\u3001\u5E73\u53F0\u7279\u5F81\uFF0C\u4ECE\u5DF2\u521B\u5EFA\u7684\u89D2\u8272\u5E93\u4E2D\u81EA\u52A8\u5339\u914D\u6700\u5408\u9002\u7684\u8BC4\u8BBA\u5458\u7EC4\u5408\u3002\n\uFF08\u8BFB\u53D6\u6307\u5357\uFF1A\u89D2\u8272\u5E93\u6587\u4EF6\u4E3A Markdown \u683C\u5F0F\uFF0C\u4EE5\u201C\u952E\uFF1A\u503C\u201D\u6216\u65E0\u6807\u9898\u5E73\u94FA\u65B9\u5F0F\u5B58\u50A8\u3002\u8BF7\u901A\u8FC7\u63D0\u53D6\u201C\u5174\u8DA3\u65B9\u5411\u201D\u3001\u201C\u5E38\u7528\u5E73\u53F0\u201D\u3001\u201C\u6027\u683C\u7279\u8D28\u201D\u7B49\u5B57\u6BB5\u8FDB\u884C\u4EA4\u53C9\u6BD4\u5BF9\u3002\uFF09\n\u5411\u7528\u6237\u5C55\u793A\u63A8\u8350\u540D\u5355\u5E76\u8BF7\u6C42\u786E\u8BA4\uFF1A\n\n> \u6211\u4E3A\u8FD9\u7BC7\u5185\u5BB9\u63A8\u8350\u4E86\u4EE5\u4E0B\u8BC4\u8BBA\u5458\uFF1A\n> - [\u89D2\u8272A]\uFF08\u63A8\u8350\u7406\u7531\uFF1A[\u7ED3\u6784\u5316\u7406\u7531]\uFF09\n> - [\u89D2\u8272B]\uFF08\u63A8\u8350\u7406\u7531\uFF1A[\u7ED3\u6784\u5316\u7406\u7531]\uFF09\n>\n> \u786E\u8BA4\u4F7F\u7528\u4EE5\u4E0A\u8BC4\u8BBA\u5458\uFF0C\u8FD8\u662F\u9700\u8981\u4ECE\u5B8C\u6574\u5217\u8868\u4E2D\u81EA\u9009\uFF1F\n\n\u63A8\u8350\u7406\u7531\u5FC5\u987B\u5305\u542B\u4EE5\u4E0B\u4E09\u9879\u4E2D\u7684\u81F3\u5C11\u4E24\u9879\uFF1A\n\u2460 \u5185\u5BB9\u7C7B\u578B\u5339\u914D\uFF1A\u8BE5\u89D2\u8272\u7684\u5174\u8DA3\u65B9\u5411\u4E0E\u5185\u5BB9\u4E3B\u9898\u7684\u5173\u8054\n\u2461 \u5E73\u53F0\u5339\u914D\uFF1A\u8BE5\u89D2\u8272\u7684\u5E38\u7528\u5E73\u53F0\u4E0E\u5185\u5BB9\u5206\u53D1\u6E20\u9053\u4E00\u81F4\n\u2462 \u98CE\u683C\u5339\u914D\uFF1A\u8BE5\u89D2\u8272\u7684\u6027\u683C\u7279\u8D28\u4E0E\u5185\u5BB9\u98CE\u683C\u7684\u5173\u8054\n\u793A\u4F8B\u683C\u5F0F\uFF1A\u300C\u89D2\u8272A\uFF08\u63A8\u8350\u7406\u7531\uFF1A\u5185\u5BB9\u662F\u6570\u7801\u7C7B\u6D4B\u8BC4\uFF0C\u8BE5\u89D2\u8272\u5174\u8DA3\u65B9\u5411\u5305\u542B\u79D1\u6280\u6570\u7801\uFF0C\u4E14\u5E38\u7528\u5E73\u53F0\u4E3A\u5C0F\u7EA2\u4E66\uFF0C\u4E0E\u672C\u6B21\u5185\u5BB9\u5206\u53D1\u6E20\u9053\u4E00\u81F4\uFF09\u300D\n\n\u7528\u6237\u786E\u8BA4\u540E\uFF0C\u6240\u6709\u9009\u4E2D\u7684\u8BC4\u8BBA\u5458\u5E76\u884C\u5F00\u59CB\u6267\u884C\u8BC4\u8BBA\u4EFB\u52A1\u3002\n\u7528\u6237\u9009\u62E9\u81EA\u9009\u65F6\uFF0C\u5217\u51FA\u5269\u4F59\u8BC4\u8BBA\u5458\u4F9B\u7528\u6237\u52FE\u9009\u3002\u81EA\u9009\u5217\u8868\u5C55\u793A\u683C\u5F0F\uFF08\u6BCF\u4E2A\u89D2\u8272\u4E00\u884C\uFF09\uFF1A\n[\u89D2\u8272\u540D] \u00B7 [\u5E38\u7528\u5E73\u53F0] \u00B7 [\u4E00\u53E5\u8BDD\u63CF\u8FF0]\n\u793A\u4F8B\uFF1A\n- \u6311\u5254\u7684\u6570\u7801\u4E70\u5BB6 \u00B7 \u5C0F\u7EA2\u4E66 \u00B7 \u4E60\u60EF\u5148\u770B\u8BC4\u8BBA\u533A\uFF0C\u5BF9\u6CA1\u6709\u771F\u5B9E\u4F7F\u7528\u611F\u53D7\u7684\u5185\u5BB9\u76F4\u63A5\u5212\u8D70\n\n**\u4E8C\u3001\u5B50\u4EE3\u7406\u534F\u8C03**\n\n\u8BC4\u8BBA\u5458\u786E\u8BA4\u540E\uFF0C\u5C06\u4EE5\u4E0B\u4FE1\u606F\u4F20\u9012\u7ED9\u6BCF\u4E2A\u5B50\u4EE3\u7406\uFF1A\n- \u5F85\u8BC4\u8BBA\u7684\u5B8C\u6574\u5185\u5BB9\n- \u8BE5\u8BC4\u8BBA\u5458\u7684\u5B8C\u6574\u89D2\u8272\u63CF\u8FF0\uFF08\u4ECE\u89D2\u8272\u5E93\u8BFB\u53D6\uFF09\n- \u6267\u884C\u6307\u4EE4\uFF1A\u6309 reviewPersonaPrompt \u5B8C\u6210\u8BC4\u8BBA\u4EFB\u52A1\u5E76\u8FD4\u56DE\u8BCA\u65AD\u8F93\u51FA\n\n\u5B50\u4EE3\u7406\u6267\u884C\u8FC7\u7A0B\u5168\u90E8\u5728\u540E\u53F0\u8FDB\u884C\uFF0C\u6267\u884C\u7EC6\u8282\u4E0D\u5BF9\u7528\u6237\u5C55\u793A\u3002\n\n\u5B50\u4EE3\u7406\u6267\u884C\u5F02\u5E38\u5904\u7406\uFF1A\n- \u82E5\u67D0\u4E2A\u5B50\u4EE3\u7406\u8FD4\u56DE\u9519\u8BEF\u6216\u8D85\u65F6\u672A\u54CD\u5E94\uFF1A\u6807\u8BB0\u8BE5\u8BC4\u8BBA\u5458\u72B6\u6001\u4E3A\u300C\u6267\u884C\u5931\u8D25\u300D\uFF0C\u4E0D\u963B\u585E\u5176\u4ED6\u5B50\u4EE3\u7406\u7684\u6267\u884C\u3002\u6C47\u603B\u65F6\u5728\u5BF9\u5E94\u8BC4\u8BBA\u5458\u4F4D\u7F6E\u8F93\u51FA\uFF1A\u300C[\u89D2\u8272\u540D] \u00B7 \u672C\u6B21\u6267\u884C\u672A\u80FD\u5B8C\u6210\u3002\u9519\u8BEF\u539F\u56E0\uFF1A[\u900F\u4F20\u5B50\u4EE3\u7406\u8FD4\u56DE\u7684\u5177\u4F53\u62A5\u9519\u4FE1\u606F]\u3002\u300D\u5E76\u63D0\u4F9B\u4FEE\u590D\u5EFA\u8BAE\u5F15\u5BFC\u7528\u6237\u3002\n- \u82E5\u6240\u6709\u5B50\u4EE3\u7406\u5747\u5931\u8D25\uFF1A\u544A\u77E5\u7528\u6237\u300C\u672C\u6B21\u8BC4\u8BBA\u5168\u90E8\u672A\u80FD\u5B8C\u6210\u300D\uFF0C\u63D0\u4F9B\u6BCF\u4E2A\u5B50\u4EE3\u7406\u7684\u5177\u4F53\u62A5\u9519\u539F\u56E0\u5E76\u63D0\u793A\u91CD\u8BD5\uFF0C\u4E0D\u751F\u6210\u7A7A\u62A5\u544A\u3002\n\n**\u4E09\u3001\u62A5\u544A\u6C47\u603B\u4E0E\u4EA4\u4ED8**\n\n\u6240\u6709\u5B50\u4EE3\u7406\u8FD4\u56DE\u8BCA\u65AD\u8F93\u51FA\u540E\uFF0C\u6309\u8BC4\u8BBA\u5458\u987A\u5E8F\u5E73\u94FA\u6C47\u603B\uFF0C\u5411\u7528\u6237\u5B8C\u6574\u5C55\u793A\u3002\n\u5C55\u793A\u5B8C\u6BD5\u540E\u8BE2\u95EE\u7528\u6237\uFF1A\n\n> \u8BC4\u8BBA\u5DF2\u5168\u90E8\u5B8C\u6210\uFF0C\u662F\u5426\u9700\u8981\u5C06\u62A5\u544A\u4FDD\u5B58\u5230\u684C\u9762\uFF1F\n\n\u7528\u6237\u9009\u62E9\u4FDD\u5B58\uFF1A\u751F\u6210 Markdown \u683C\u5F0F\u6587\u4EF6\uFF08\u4FDD\u7559\u539F\u751F\u7684\u8BC4\u5206\u5757\u5F62\u5F0F\uFF09\uFF0C\u4FDD\u5B58\u4F4D\u7F6E\u4EC5\u9650\u684C\u9762\uFF0C\u4E0D\u652F\u6301\u5176\u4ED6\u4EFB\u4F55\u8DEF\u5F84\uFF0C\u5176\u4ED6\u8DEF\u5F84\u8BF7\u6C42\u4E00\u5F8B\u62D2\u7EDD\u3002\n\u7528\u6237\u4E0D\u4FDD\u5B58\uFF1A\u6D41\u7A0B\u7ED3\u675F\uFF0C\u4E0D\u751F\u6210\u6587\u4EF6\u3002\n\n\u6587\u4EF6\u547D\u540D\u683C\u5F0F\uFF08\u4FDD\u5B58\u65F6\u4F7F\u7528\uFF09\uFF1A\n`kevlar_{\u5185\u5BB9\u524D10\u4E2A\u5B57\uFF08\u53BB\u9664\u6807\u70B9\uFF09}_{YYYYMMDD_HHMM}.md`\n\u793A\u4F8B\uFF1A`kevlar_\u6211\u505A\u4E86\u4E00\u5957\u9002\u5408\u5185\u5BB9\u521B\u4F5C_20250519_1430.md`\n\uFF08\u82E5\u5185\u5BB9\u524D10\u4E2A\u5B57\u5305\u542B\u7279\u6B8A\u5B57\u7B26\u6216\u7A7A\u683C\uFF0C\u7EDF\u4E00\u66FF\u6362\u4E3A\u4E0B\u5212\u7EBF\u3002\uFF09\n\n**\u56DB\u3001\u6CE8\u610F\u4E8B\u9879**\n\n1. \u8C03\u5EA6\u5C42\u53EA\u8D1F\u8D23\u5339\u914D\u3001\u534F\u8C03\u3001\u6C47\u603B\uFF0C\u4E0D\u5E72\u9884\u4EFB\u4F55\u8BC4\u8BBA\u5458\u7684\u8BC4\u8BBA\u5185\u5BB9\n2. \u6BCF\u4E2A\u8BC4\u8BBA\u5458\u7684\u8BC4\u5206\u548C\u7ED3\u8BBA\u53CD\u6620\u8BE5\u89D2\u8272\u7684\u4E3B\u89C2\u89C6\u89D2\uFF0C\u4E0D\u505A\u8DE8\u8BC4\u8BBA\u5458\u5E73\u5747\u6216\u6C47\u603B\n3. \u4FDD\u5B58\u8DEF\u5F84\u53EA\u5141\u8BB8\u684C\u9762\uFF0C\u4EFB\u4F55\u5176\u4ED6\u8DEF\u5F84\u8BF7\u6C42\u4E00\u5F8B\u62D2\u7EDD\uFF08\u6CE8\uFF1A\u6B64\u89C4\u5219\u7EA6\u675F\u5BBF\u4E3B AI \u7684\u884C\u4E3A\uFF0CKevlar \u670D\u52A1\u7AEF\u672C\u8EAB\u4E0D\u5177\u5907\u5199\u51FA\u6700\u7EC8\u62A5\u544A\u6587\u4EF6\u7684\u80FD\u529B\uFF09";
|
|
2
|
+
//# sourceMappingURL=reviewDispatcherPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewDispatcherPrompt.d.ts","sourceRoot":"","sources":["../../src/prompts/reviewDispatcherPrompt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,+qQA+DkC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// ⚠️ 内部设计参考,不再通过 MCP Prompts 暴露。
|
|
2
|
+
// review_content_wizard 工具在服务端内部已实现相同逻辑。
|
|
3
|
+
export const REVIEW_DISPATCHER_PROMPT = `你是一个内容评论调度引擎,负责为用户提交的内容匹配合适的评论员,协调子代理执行评论任务,并在所有评论完成后生成结构化诊断报告交付给用户。
|
|
4
|
+
|
|
5
|
+
**一、评论员匹配**
|
|
6
|
+
|
|
7
|
+
角色库检查(优先执行):
|
|
8
|
+
- 若角色数量 = 0:停止匹配流程,提示用户:「当前还没有可用的评论员,请先创建至少一个角色,再提交内容进行评论。」(注意:在提示创建前,务必记录并暂存用户本次提交的文案内容,以便在角色创建完成后自动或手动唤醒并继续本次评论任务)
|
|
9
|
+
- 若角色数量 = 1-2:跳过推荐步骤,直接展示全部可用角色,说明:「当前只有 N 位评论员可用,已为你展示全部角色,请确认是否使用。」
|
|
10
|
+
- 若角色数量 ≥ 3:执行正常匹配推荐流程
|
|
11
|
+
|
|
12
|
+
用户提交内容后,分析内容的类型、风格、平台特征,从已创建的角色库中自动匹配最合适的评论员组合。
|
|
13
|
+
(读取指南:角色库文件为 Markdown 格式,以“键:值”或无标题平铺方式存储。请通过提取“兴趣方向”、“常用平台”、“性格特质”等字段进行交叉比对。)
|
|
14
|
+
向用户展示推荐名单并请求确认:
|
|
15
|
+
|
|
16
|
+
> 我为这篇内容推荐了以下评论员:
|
|
17
|
+
> - [角色A](推荐理由:[结构化理由])
|
|
18
|
+
> - [角色B](推荐理由:[结构化理由])
|
|
19
|
+
>
|
|
20
|
+
> 确认使用以上评论员,还是需要从完整列表中自选?
|
|
21
|
+
|
|
22
|
+
推荐理由必须包含以下三项中的至少两项:
|
|
23
|
+
① 内容类型匹配:该角色的兴趣方向与内容主题的关联
|
|
24
|
+
② 平台匹配:该角色的常用平台与内容分发渠道一致
|
|
25
|
+
③ 风格匹配:该角色的性格特质与内容风格的关联
|
|
26
|
+
示例格式:「角色A(推荐理由:内容是数码类测评,该角色兴趣方向包含科技数码,且常用平台为小红书,与本次内容分发渠道一致)」
|
|
27
|
+
|
|
28
|
+
用户确认后,所有选中的评论员并行开始执行评论任务。
|
|
29
|
+
用户选择自选时,列出剩余评论员供用户勾选。自选列表展示格式(每个角色一行):
|
|
30
|
+
[角色名] · [常用平台] · [一句话描述]
|
|
31
|
+
示例:
|
|
32
|
+
- 挑剔的数码买家 · 小红书 · 习惯先看评论区,对没有真实使用感受的内容直接划走
|
|
33
|
+
|
|
34
|
+
**二、子代理协调**
|
|
35
|
+
|
|
36
|
+
评论员确认后,将以下信息传递给每个子代理:
|
|
37
|
+
- 待评论的完整内容
|
|
38
|
+
- 该评论员的完整角色描述(从角色库读取)
|
|
39
|
+
- 执行指令:按 reviewPersonaPrompt 完成评论任务并返回诊断输出
|
|
40
|
+
|
|
41
|
+
子代理执行过程全部在后台进行,执行细节不对用户展示。
|
|
42
|
+
|
|
43
|
+
子代理执行异常处理:
|
|
44
|
+
- 若某个子代理返回错误或超时未响应:标记该评论员状态为「执行失败」,不阻塞其他子代理的执行。汇总时在对应评论员位置输出:「[角色名] · 本次执行未能完成。错误原因:[透传子代理返回的具体报错信息]。」并提供修复建议引导用户。
|
|
45
|
+
- 若所有子代理均失败:告知用户「本次评论全部未能完成」,提供每个子代理的具体报错原因并提示重试,不生成空报告。
|
|
46
|
+
|
|
47
|
+
**三、报告汇总与交付**
|
|
48
|
+
|
|
49
|
+
所有子代理返回诊断输出后,按评论员顺序平铺汇总,向用户完整展示。
|
|
50
|
+
展示完毕后询问用户:
|
|
51
|
+
|
|
52
|
+
> 评论已全部完成,是否需要将报告保存到桌面?
|
|
53
|
+
|
|
54
|
+
用户选择保存:生成 Markdown 格式文件(保留原生的评分块形式),保存位置仅限桌面,不支持其他任何路径,其他路径请求一律拒绝。
|
|
55
|
+
用户不保存:流程结束,不生成文件。
|
|
56
|
+
|
|
57
|
+
文件命名格式(保存时使用):
|
|
58
|
+
\`kevlar_{内容前10个字(去除标点)}_{YYYYMMDD_HHMM}.md\`
|
|
59
|
+
示例:\`kevlar_我做了一套适合内容创作_20250519_1430.md\`
|
|
60
|
+
(若内容前10个字包含特殊字符或空格,统一替换为下划线。)
|
|
61
|
+
|
|
62
|
+
**四、注意事项**
|
|
63
|
+
|
|
64
|
+
1. 调度层只负责匹配、协调、汇总,不干预任何评论员的评论内容
|
|
65
|
+
2. 每个评论员的评分和结论反映该角色的主观视角,不做跨评论员平均或汇总
|
|
66
|
+
3. 保存路径只允许桌面,任何其他路径请求一律拒绝(注:此规则约束宿主 AI 的行为,Kevlar 服务端本身不具备写出最终报告文件的能力)`;
|
|
67
|
+
//# sourceMappingURL=reviewDispatcherPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewDispatcherPrompt.js","sourceRoot":"","sources":["../../src/prompts/reviewDispatcherPrompt.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEA+D+B,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqLpE,wBAAgB,kBAAkB,IAAI,SAAS,CA6B9C"}
|
package/dist/server.js
CHANGED
|
@@ -7,7 +7,7 @@ import { createToolRegistry } from "./tools/index.js";
|
|
|
7
7
|
import { logger } from "./utils/logger.js";
|
|
8
8
|
import { formatErrorResponse } from "./utils/errors.js";
|
|
9
9
|
import { getErrorInfo } from "./utils/observability.js";
|
|
10
|
-
import {
|
|
10
|
+
import { resolveSamplingFn } from "./execution/sampling.js";
|
|
11
11
|
import { setConfigPath } from "./execution/config.js";
|
|
12
12
|
// Priority:
|
|
13
13
|
// 1. KEVLAR_SKILLS_DIR environment variable (absolute path)
|
|
@@ -22,37 +22,52 @@ function resolveSkillsDir() {
|
|
|
22
22
|
const repoRoot = path.resolve(__dirname, "..");
|
|
23
23
|
return path.join(repoRoot, "skills");
|
|
24
24
|
}
|
|
25
|
+
const STALE_WIZARD_SUFFIXES = new Set([
|
|
26
|
+
'_draft.json',
|
|
27
|
+
'_wizard.json',
|
|
28
|
+
'_review_wizard.json',
|
|
29
|
+
'_configure_wizard.json',
|
|
30
|
+
'_delete_wizard.json',
|
|
31
|
+
]);
|
|
32
|
+
function isWizardFile(file) {
|
|
33
|
+
for (const suffix of STALE_WIZARD_SUFFIXES) {
|
|
34
|
+
if (file.endsWith(suffix))
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
25
39
|
async function cleanStaleDrafts(tmpDir) {
|
|
26
40
|
try {
|
|
27
41
|
if (!fs.existsSync(tmpDir))
|
|
28
42
|
return;
|
|
29
43
|
const files = await fs.promises.readdir(tmpDir);
|
|
30
44
|
const now = Date.now();
|
|
45
|
+
const deletePromises = [];
|
|
31
46
|
for (const file of files) {
|
|
32
|
-
if (!
|
|
47
|
+
if (!isWizardFile(file))
|
|
33
48
|
continue;
|
|
34
49
|
const filePath = path.join(tmpDir, file);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
deletePromises.push((async () => {
|
|
51
|
+
try {
|
|
52
|
+
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
53
|
+
const state = JSON.parse(data);
|
|
54
|
+
if (state.createdAt && now - state.createdAt > 86400000) {
|
|
55
|
+
await fs.promises.unlink(filePath);
|
|
56
|
+
logger.info("Cleaned stale wizard state", { event: "clean_stale_wizard", file });
|
|
57
|
+
}
|
|
41
58
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
59
|
+
catch {
|
|
60
|
+
}
|
|
61
|
+
})());
|
|
45
62
|
}
|
|
63
|
+
await Promise.all(deletePromises);
|
|
46
64
|
}
|
|
47
65
|
catch (err) {
|
|
48
66
|
const info = getErrorInfo(err);
|
|
49
67
|
logger.warn("Failed to clean stale wizard states", { event: "clean_stale_wizards_error", error: info.code, message: info.message });
|
|
50
68
|
}
|
|
51
69
|
}
|
|
52
|
-
|
|
53
|
-
const skillsDir = resolveSkillsDir();
|
|
54
|
-
const tmpDir = path.join(skillsDir, "tmp");
|
|
55
|
-
setConfigPath(skillsDir);
|
|
70
|
+
function ensureSkillsDirectory(skillsDir) {
|
|
56
71
|
if (!fs.existsSync(skillsDir)) {
|
|
57
72
|
fs.mkdirSync(skillsDir, { recursive: true });
|
|
58
73
|
logger.info("Created skills directory", { event: "dir_created", path: skillsDir });
|
|
@@ -60,70 +75,60 @@ export function createKevlarServer() {
|
|
|
60
75
|
else {
|
|
61
76
|
logger.info("Using skills directory", { event: "dir_using", path: skillsDir });
|
|
62
77
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
}
|
|
79
|
+
function createMultiTurnSamplingFn(serverInstance) {
|
|
80
|
+
return async (params) => {
|
|
81
|
+
try {
|
|
82
|
+
const result = await serverInstance.createMessage({
|
|
83
|
+
systemPrompt: params.systemPrompt,
|
|
84
|
+
messages: params.messages.map(m => ({
|
|
85
|
+
role: m.role,
|
|
86
|
+
content: { type: "text", text: m.content },
|
|
87
|
+
})),
|
|
88
|
+
maxTokens: params.maxTokens || 4096,
|
|
89
|
+
});
|
|
90
|
+
const textContent = result.content.type === "text" ? result.content.text : "";
|
|
91
|
+
return {
|
|
92
|
+
content: textContent,
|
|
93
|
+
stopReason: result.stopReason,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const info = getErrorInfo(err);
|
|
98
|
+
logger.error("Multi-turn Sampling request failed", {
|
|
99
|
+
event: "multi_sampling_request_error",
|
|
100
|
+
error: info.code,
|
|
101
|
+
message: info.message,
|
|
102
|
+
recoverable: info.recoverable,
|
|
103
|
+
});
|
|
104
|
+
throw new Error(`多轮 Sampling 调用失败: ${info.message}`);
|
|
79
105
|
}
|
|
80
|
-
return false;
|
|
81
|
-
};
|
|
82
|
-
const createMultiTurnSamplingFn = (serverInstance) => {
|
|
83
|
-
return async (params) => {
|
|
84
|
-
try {
|
|
85
|
-
const result = await serverInstance.createMessage({
|
|
86
|
-
systemPrompt: params.systemPrompt,
|
|
87
|
-
messages: params.messages.map(m => ({
|
|
88
|
-
role: m.role,
|
|
89
|
-
content: { type: "text", text: m.content }
|
|
90
|
-
})),
|
|
91
|
-
maxTokens: params.maxTokens || 4096,
|
|
92
|
-
});
|
|
93
|
-
const textContent = result.content.type === "text" ? result.content.text : "";
|
|
94
|
-
return {
|
|
95
|
-
content: textContent,
|
|
96
|
-
stopReason: result.stopReason,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
const info = getErrorInfo(err);
|
|
101
|
-
logger.error("Multi-turn Sampling request failed", {
|
|
102
|
-
event: "multi_sampling_request_error",
|
|
103
|
-
error: info.code,
|
|
104
|
-
message: info.message,
|
|
105
|
-
recoverable: info.recoverable,
|
|
106
|
-
});
|
|
107
|
-
throw new Error(`多轮 Sampling 调用失败: ${info.message}`);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
106
|
};
|
|
111
|
-
|
|
107
|
+
}
|
|
108
|
+
function buildToolDependencies(skillsDir, tmpDir, underlyingServer) {
|
|
109
|
+
return {
|
|
112
110
|
skillsDir,
|
|
113
111
|
tmpDir,
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
resolveSamplingFn: () => resolveSamplingFn({
|
|
113
|
+
getClientVersion: () => underlyingServer.getClientVersion(),
|
|
114
|
+
createFn: () => createMultiTurnSamplingFn(underlyingServer),
|
|
115
|
+
}),
|
|
116
116
|
};
|
|
117
|
-
|
|
117
|
+
}
|
|
118
|
+
function setupListToolsHandler(underlyingServer, toolDefinitions) {
|
|
118
119
|
underlyingServer.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
119
120
|
return { tools: toolDefinitions };
|
|
120
121
|
});
|
|
122
|
+
}
|
|
123
|
+
function setupCallToolHandler(underlyingServer, registry) {
|
|
121
124
|
underlyingServer.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
122
125
|
const { name, arguments: args } = request.params;
|
|
123
126
|
const startTime = Date.now();
|
|
124
127
|
logger.debug("Tool call received", { event: "tool_called", tool: name });
|
|
125
128
|
try {
|
|
126
|
-
const sanitizedArgs = args && typeof args === "object"
|
|
129
|
+
const sanitizedArgs = args && typeof args === "object"
|
|
130
|
+
? args
|
|
131
|
+
: undefined;
|
|
127
132
|
const handler = registry.get(name);
|
|
128
133
|
if (!handler) {
|
|
129
134
|
logger.warn("Unknown tool requested", { event: "unknown_tool", tool: name });
|
|
@@ -151,6 +156,27 @@ export function createKevlarServer() {
|
|
|
151
156
|
return formatErrorResponse(err);
|
|
152
157
|
}
|
|
153
158
|
});
|
|
159
|
+
}
|
|
160
|
+
export function createKevlarServer() {
|
|
161
|
+
const skillsDir = resolveSkillsDir();
|
|
162
|
+
const tmpDir = path.join(skillsDir, "tmp");
|
|
163
|
+
setConfigPath(skillsDir);
|
|
164
|
+
ensureSkillsDirectory(skillsDir);
|
|
165
|
+
cleanStaleDrafts(tmpDir).catch(() => { });
|
|
166
|
+
const mcpServer = new McpServer({
|
|
167
|
+
name: "kevlar-4u",
|
|
168
|
+
version: "1.0.0",
|
|
169
|
+
}, {
|
|
170
|
+
capabilities: {
|
|
171
|
+
tools: {},
|
|
172
|
+
prompts: {},
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
const underlyingServer = mcpServer.server;
|
|
176
|
+
const deps = buildToolDependencies(skillsDir, tmpDir, underlyingServer);
|
|
177
|
+
const { registry, toolDefinitions } = createToolRegistry(deps);
|
|
178
|
+
setupListToolsHandler(underlyingServer, toolDefinitions);
|
|
179
|
+
setupCallToolHandler(underlyingServer, registry);
|
|
154
180
|
return mcpServer;
|
|
155
181
|
}
|
|
156
182
|
//# sourceMappingURL=server.js.map
|