kevlar-4u 1.0.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.
Files changed (238) hide show
  1. package/README.md +357 -0
  2. package/config/mcp-config.json +9 -0
  3. package/dist/__tests__/configureWizard.test.d.ts +2 -0
  4. package/dist/__tests__/configureWizard.test.d.ts.map +1 -0
  5. package/dist/__tests__/configureWizard.test.js +89 -0
  6. package/dist/__tests__/configureWizard.test.js.map +1 -0
  7. package/dist/__tests__/createPersonaTool.test.d.ts +2 -0
  8. package/dist/__tests__/createPersonaTool.test.d.ts.map +1 -0
  9. package/dist/__tests__/createPersonaTool.test.js +292 -0
  10. package/dist/__tests__/createPersonaTool.test.js.map +1 -0
  11. package/dist/__tests__/createPersonaWizard.test.d.ts +2 -0
  12. package/dist/__tests__/createPersonaWizard.test.d.ts.map +1 -0
  13. package/dist/__tests__/createPersonaWizard.test.js +138 -0
  14. package/dist/__tests__/createPersonaWizard.test.js.map +1 -0
  15. package/dist/__tests__/deletePersonaWizard.test.d.ts +2 -0
  16. package/dist/__tests__/deletePersonaWizard.test.d.ts.map +1 -0
  17. package/dist/__tests__/deletePersonaWizard.test.js +78 -0
  18. package/dist/__tests__/deletePersonaWizard.test.js.map +1 -0
  19. package/dist/__tests__/e2e.test.d.ts +2 -0
  20. package/dist/__tests__/e2e.test.d.ts.map +1 -0
  21. package/dist/__tests__/e2e.test.js +121 -0
  22. package/dist/__tests__/e2e.test.js.map +1 -0
  23. package/dist/__tests__/errors.test.d.ts +2 -0
  24. package/dist/__tests__/errors.test.d.ts.map +1 -0
  25. package/dist/__tests__/errors.test.js +86 -0
  26. package/dist/__tests__/errors.test.js.map +1 -0
  27. package/dist/__tests__/execution.test.d.ts +2 -0
  28. package/dist/__tests__/execution.test.d.ts.map +1 -0
  29. package/dist/__tests__/execution.test.js +792 -0
  30. package/dist/__tests__/execution.test.js.map +1 -0
  31. package/dist/__tests__/getModesTool.test.d.ts +2 -0
  32. package/dist/__tests__/getModesTool.test.d.ts.map +1 -0
  33. package/dist/__tests__/getModesTool.test.js +47 -0
  34. package/dist/__tests__/getModesTool.test.js.map +1 -0
  35. package/dist/__tests__/helpTool.test.d.ts +2 -0
  36. package/dist/__tests__/helpTool.test.d.ts.map +1 -0
  37. package/dist/__tests__/helpTool.test.js +18 -0
  38. package/dist/__tests__/helpTool.test.js.map +1 -0
  39. package/dist/__tests__/listPersonasTool.test.d.ts +2 -0
  40. package/dist/__tests__/listPersonasTool.test.d.ts.map +1 -0
  41. package/dist/__tests__/listPersonasTool.test.js +110 -0
  42. package/dist/__tests__/listPersonasTool.test.js.map +1 -0
  43. package/dist/__tests__/logger.test.d.ts +2 -0
  44. package/dist/__tests__/logger.test.d.ts.map +1 -0
  45. package/dist/__tests__/logger.test.js +56 -0
  46. package/dist/__tests__/logger.test.js.map +1 -0
  47. package/dist/__tests__/observability.test.d.ts +2 -0
  48. package/dist/__tests__/observability.test.d.ts.map +1 -0
  49. package/dist/__tests__/observability.test.js +60 -0
  50. package/dist/__tests__/observability.test.js.map +1 -0
  51. package/dist/__tests__/parser.test.d.ts +2 -0
  52. package/dist/__tests__/parser.test.d.ts.map +1 -0
  53. package/dist/__tests__/parser.test.js +259 -0
  54. package/dist/__tests__/parser.test.js.map +1 -0
  55. package/dist/__tests__/persona_creation_debug.test.d.ts +2 -0
  56. package/dist/__tests__/persona_creation_debug.test.d.ts.map +1 -0
  57. package/dist/__tests__/persona_creation_debug.test.js +56 -0
  58. package/dist/__tests__/persona_creation_debug.test.js.map +1 -0
  59. package/dist/__tests__/resetPersonasWizard.test.d.ts +2 -0
  60. package/dist/__tests__/resetPersonasWizard.test.d.ts.map +1 -0
  61. package/dist/__tests__/resetPersonasWizard.test.js +74 -0
  62. package/dist/__tests__/resetPersonasWizard.test.js.map +1 -0
  63. package/dist/__tests__/reviewContentWizard.test.d.ts +2 -0
  64. package/dist/__tests__/reviewContentWizard.test.d.ts.map +1 -0
  65. package/dist/__tests__/reviewContentWizard.test.js +148 -0
  66. package/dist/__tests__/reviewContentWizard.test.js.map +1 -0
  67. package/dist/__tests__/sanitize.test.d.ts +2 -0
  68. package/dist/__tests__/sanitize.test.d.ts.map +1 -0
  69. package/dist/__tests__/sanitize.test.js +138 -0
  70. package/dist/__tests__/sanitize.test.js.map +1 -0
  71. package/dist/__tests__/server.test.d.ts +2 -0
  72. package/dist/__tests__/server.test.d.ts.map +1 -0
  73. package/dist/__tests__/server.test.js +49 -0
  74. package/dist/__tests__/server.test.js.map +1 -0
  75. package/dist/execution/aggregator.d.ts +43 -0
  76. package/dist/execution/aggregator.d.ts.map +1 -0
  77. package/dist/execution/aggregator.js +132 -0
  78. package/dist/execution/aggregator.js.map +1 -0
  79. package/dist/execution/base.d.ts +62 -0
  80. package/dist/execution/base.d.ts.map +1 -0
  81. package/dist/execution/base.js +5 -0
  82. package/dist/execution/base.js.map +1 -0
  83. package/dist/execution/client.d.ts +9 -0
  84. package/dist/execution/client.d.ts.map +1 -0
  85. package/dist/execution/client.js +30 -0
  86. package/dist/execution/client.js.map +1 -0
  87. package/dist/execution/config.d.ts +30 -0
  88. package/dist/execution/config.d.ts.map +1 -0
  89. package/dist/execution/config.js +95 -0
  90. package/dist/execution/config.js.map +1 -0
  91. package/dist/execution/index.d.ts +19 -0
  92. package/dist/execution/index.d.ts.map +1 -0
  93. package/dist/execution/index.js +151 -0
  94. package/dist/execution/index.js.map +1 -0
  95. package/dist/execution/limiter.d.ts +32 -0
  96. package/dist/execution/limiter.d.ts.map +1 -0
  97. package/dist/execution/limiter.js +147 -0
  98. package/dist/execution/limiter.js.map +1 -0
  99. package/dist/execution/lock.d.ts +17 -0
  100. package/dist/execution/lock.d.ts.map +1 -0
  101. package/dist/execution/lock.js +37 -0
  102. package/dist/execution/lock.js.map +1 -0
  103. package/dist/execution/modes/direct_api.d.ts +11 -0
  104. package/dist/execution/modes/direct_api.d.ts.map +1 -0
  105. package/dist/execution/modes/direct_api.js +213 -0
  106. package/dist/execution/modes/direct_api.js.map +1 -0
  107. package/dist/execution/modes/index.d.ts +7 -0
  108. package/dist/execution/modes/index.d.ts.map +1 -0
  109. package/dist/execution/modes/index.js +7 -0
  110. package/dist/execution/modes/index.js.map +1 -0
  111. package/dist/execution/modes/orchestration.d.ts +11 -0
  112. package/dist/execution/modes/orchestration.d.ts.map +1 -0
  113. package/dist/execution/modes/orchestration.js +110 -0
  114. package/dist/execution/modes/orchestration.js.map +1 -0
  115. package/dist/execution/modes/sampling.d.ts +9 -0
  116. package/dist/execution/modes/sampling.d.ts.map +1 -0
  117. package/dist/execution/modes/sampling.js +66 -0
  118. package/dist/execution/modes/sampling.js.map +1 -0
  119. package/dist/execution/parallel.d.ts +16 -0
  120. package/dist/execution/parallel.d.ts.map +1 -0
  121. package/dist/execution/parallel.js +90 -0
  122. package/dist/execution/parallel.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +17 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/prompts/reviewDispatcherPrompt.d.ts +2 -0
  128. package/dist/prompts/reviewDispatcherPrompt.d.ts.map +1 -0
  129. package/dist/prompts/reviewDispatcherPrompt.js +67 -0
  130. package/dist/prompts/reviewDispatcherPrompt.js.map +1 -0
  131. package/dist/server.d.ts +3 -0
  132. package/dist/server.d.ts.map +1 -0
  133. package/dist/server.js +156 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/tools/configureTool.d.ts +17 -0
  136. package/dist/tools/configureTool.d.ts.map +1 -0
  137. package/dist/tools/configureTool.js +104 -0
  138. package/dist/tools/configureTool.js.map +1 -0
  139. package/dist/tools/configureWizardTool.d.ts +11 -0
  140. package/dist/tools/configureWizardTool.d.ts.map +1 -0
  141. package/dist/tools/configureWizardTool.js +205 -0
  142. package/dist/tools/configureWizardTool.js.map +1 -0
  143. package/dist/tools/createPersonaTool.d.ts +37 -0
  144. package/dist/tools/createPersonaTool.d.ts.map +1 -0
  145. package/dist/tools/createPersonaTool.js +353 -0
  146. package/dist/tools/createPersonaTool.js.map +1 -0
  147. package/dist/tools/createPersonaWizardTool.d.ts +13 -0
  148. package/dist/tools/createPersonaWizardTool.d.ts.map +1 -0
  149. package/dist/tools/createPersonaWizardTool.js +713 -0
  150. package/dist/tools/createPersonaWizardTool.js.map +1 -0
  151. package/dist/tools/deletePersonaTool.d.ts +10 -0
  152. package/dist/tools/deletePersonaTool.d.ts.map +1 -0
  153. package/dist/tools/deletePersonaTool.js +75 -0
  154. package/dist/tools/deletePersonaTool.js.map +1 -0
  155. package/dist/tools/deletePersonaWizardTool.d.ts +11 -0
  156. package/dist/tools/deletePersonaWizardTool.d.ts.map +1 -0
  157. package/dist/tools/deletePersonaWizardTool.js +184 -0
  158. package/dist/tools/deletePersonaWizardTool.js.map +1 -0
  159. package/dist/tools/getModesTool.d.ts +12 -0
  160. package/dist/tools/getModesTool.d.ts.map +1 -0
  161. package/dist/tools/getModesTool.js +78 -0
  162. package/dist/tools/getModesTool.js.map +1 -0
  163. package/dist/tools/helpTool.d.ts +7 -0
  164. package/dist/tools/helpTool.d.ts.map +1 -0
  165. package/dist/tools/helpTool.js +65 -0
  166. package/dist/tools/helpTool.js.map +1 -0
  167. package/dist/tools/index.d.ts +9 -0
  168. package/dist/tools/index.d.ts.map +1 -0
  169. package/dist/tools/index.js +30 -0
  170. package/dist/tools/index.js.map +1 -0
  171. package/dist/tools/listPersonasTool.d.ts +7 -0
  172. package/dist/tools/listPersonasTool.d.ts.map +1 -0
  173. package/dist/tools/listPersonasTool.js +118 -0
  174. package/dist/tools/listPersonasTool.js.map +1 -0
  175. package/dist/tools/resetPersonasTool.d.ts +7 -0
  176. package/dist/tools/resetPersonasTool.d.ts.map +1 -0
  177. package/dist/tools/resetPersonasTool.js +447 -0
  178. package/dist/tools/resetPersonasTool.js.map +1 -0
  179. package/dist/tools/resetPersonasWizardTool.d.ts +9 -0
  180. package/dist/tools/resetPersonasWizardTool.d.ts.map +1 -0
  181. package/dist/tools/resetPersonasWizardTool.js +125 -0
  182. package/dist/tools/resetPersonasWizardTool.js.map +1 -0
  183. package/dist/tools/reviewContentWizardTool.d.ts +13 -0
  184. package/dist/tools/reviewContentWizardTool.d.ts.map +1 -0
  185. package/dist/tools/reviewContentWizardTool.js +411 -0
  186. package/dist/tools/reviewContentWizardTool.js.map +1 -0
  187. package/dist/tools/reviewTool.d.ts +10 -0
  188. package/dist/tools/reviewTool.d.ts.map +1 -0
  189. package/dist/tools/reviewTool.js +133 -0
  190. package/dist/tools/reviewTool.js.map +1 -0
  191. package/dist/tools/types.d.ts +14 -0
  192. package/dist/tools/types.d.ts.map +1 -0
  193. package/dist/tools/types.js +2 -0
  194. package/dist/tools/types.js.map +1 -0
  195. package/dist/utils/errors.d.ts +30 -0
  196. package/dist/utils/errors.d.ts.map +1 -0
  197. package/dist/utils/errors.js +47 -0
  198. package/dist/utils/errors.js.map +1 -0
  199. package/dist/utils/logger.d.ts +18 -0
  200. package/dist/utils/logger.d.ts.map +1 -0
  201. package/dist/utils/logger.js +52 -0
  202. package/dist/utils/logger.js.map +1 -0
  203. package/dist/utils/observability.d.ts +61 -0
  204. package/dist/utils/observability.d.ts.map +1 -0
  205. package/dist/utils/observability.js +69 -0
  206. package/dist/utils/observability.js.map +1 -0
  207. package/dist/utils/parser.d.ts +27 -0
  208. package/dist/utils/parser.d.ts.map +1 -0
  209. package/dist/utils/parser.js +178 -0
  210. package/dist/utils/parser.js.map +1 -0
  211. package/dist/utils/personaIdMaps.d.ts +7 -0
  212. package/dist/utils/personaIdMaps.d.ts.map +1 -0
  213. package/dist/utils/personaIdMaps.js +51 -0
  214. package/dist/utils/personaIdMaps.js.map +1 -0
  215. package/dist/utils/sanitize.d.ts +4 -0
  216. package/dist/utils/sanitize.d.ts.map +1 -0
  217. package/dist/utils/sanitize.js +49 -0
  218. package/dist/utils/sanitize.js.map +1 -0
  219. package/dist/utils/types.d.ts +8 -0
  220. package/dist/utils/types.d.ts.map +1 -0
  221. package/dist/utils/types.js +2 -0
  222. package/dist/utils/types.js.map +1 -0
  223. package/package.json +42 -0
  224. package/skills/_template.md +66 -0
  225. package/skills/tmp/wizard-create-cwzrrpim_draft.json +26 -0
  226. package/skills/tmp/wizard-create-cwzrrpim_wizard.json +26 -0
  227. package/skills/tmp/wizard-create-d81intme_draft.json +26 -0
  228. package/skills/tmp/wizard-create-d81intme_wizard.json +26 -0
  229. package/skills/tmp/wizard-create-g50jqzmh_draft.json +8 -0
  230. package/skills/tmp/wizard-create-g50jqzmh_wizard.json +8 -0
  231. package/skills/tmp/wizard-create-onupu9wb_draft.json +8 -0
  232. package/skills/tmp/wizard-create-onupu9wb_wizard.json +8 -0
  233. package/skills/tmp/wizard-review-fwbxe3d2_review_wizard.json +9 -0
  234. package/skills/tmp/wizard-review-sypg5e9d_review_wizard.json +9 -0
  235. package/skills/wechat_official/wechat_official.md +26 -0
  236. package/skills/wechat_official/wechat_official_1.md +31 -0
  237. package/skills/xiaohongshu/xiaohongshu.md +26 -0
  238. package/skills/xiaohongshu/xiaohongshu_1.md +29 -0
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createKevlarServer(): McpServer;
3
+ //# 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,CAAC;AAwDpE,wBAAgB,kBAAkB,IAAI,SAAS,CAsH9C"}
package/dist/server.js ADDED
@@ -0,0 +1,156 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import * as path from "path";
4
+ import * as fs from "fs";
5
+ import { fileURLToPath } from "url";
6
+ import { createToolRegistry } from "./tools/index.js";
7
+ import { logger } from "./utils/logger.js";
8
+ import { formatErrorResponse } from "./utils/errors.js";
9
+ import { getErrorInfo } from "./utils/observability.js";
10
+ import { isSamplingSupported, setClientInfo } from "./execution/client.js";
11
+ import { setConfigPath } from "./execution/config.js";
12
+ // Priority:
13
+ // 1. KEVLAR_SKILLS_DIR environment variable (absolute path)
14
+ // 2. <repo-root>/skills/ (relative to this file's compiled location)
15
+ function resolveSkillsDir() {
16
+ if (process.env.KEVLAR_SKILLS_DIR) {
17
+ return path.resolve(process.env.KEVLAR_SKILLS_DIR);
18
+ }
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ // dist/ after compilation; go up one level to repo root
22
+ const repoRoot = path.resolve(__dirname, "..");
23
+ return path.join(repoRoot, "skills");
24
+ }
25
+ async function cleanStaleDrafts(tmpDir) {
26
+ try {
27
+ if (!fs.existsSync(tmpDir))
28
+ return;
29
+ const files = await fs.promises.readdir(tmpDir);
30
+ const now = Date.now();
31
+ for (const file of files) {
32
+ if (!file.endsWith('_draft.json') && !file.endsWith('_wizard.json') && !file.endsWith('_review_wizard.json') && !file.endsWith('_configure_wizard.json') && !file.endsWith('_delete_wizard.json'))
33
+ continue;
34
+ const filePath = path.join(tmpDir, file);
35
+ try {
36
+ const data = await fs.promises.readFile(filePath, 'utf-8');
37
+ const state = JSON.parse(data);
38
+ if (state.createdAt && now - state.createdAt > 86400000) {
39
+ await fs.promises.unlink(filePath);
40
+ logger.info("Cleaned stale wizard state", { event: "clean_stale_wizard", file });
41
+ }
42
+ }
43
+ catch (err) {
44
+ }
45
+ }
46
+ }
47
+ catch (err) {
48
+ const info = getErrorInfo(err);
49
+ logger.warn("Failed to clean stale wizard states", { event: "clean_stale_wizards_error", error: info.code, message: info.message });
50
+ }
51
+ }
52
+ export function createKevlarServer() {
53
+ const skillsDir = resolveSkillsDir();
54
+ const tmpDir = path.join(skillsDir, "tmp");
55
+ setConfigPath(skillsDir);
56
+ if (!fs.existsSync(skillsDir)) {
57
+ fs.mkdirSync(skillsDir, { recursive: true });
58
+ logger.info("Created skills directory", { event: "dir_created", path: skillsDir });
59
+ }
60
+ else {
61
+ logger.info("Using skills directory", { event: "dir_using", path: skillsDir });
62
+ }
63
+ cleanStaleDrafts(tmpDir).catch(() => { });
64
+ const mcpServer = new McpServer({
65
+ name: "kevlar",
66
+ version: "1.0.0",
67
+ }, {
68
+ capabilities: {
69
+ tools: {},
70
+ prompts: {},
71
+ },
72
+ });
73
+ const underlyingServer = mcpServer.server;
74
+ const updateClientSamplingSupport = () => {
75
+ const clientVersion = underlyingServer.getClientVersion();
76
+ if (clientVersion) {
77
+ setClientInfo(clientVersion.name, clientVersion.version);
78
+ return isSamplingSupported(clientVersion.name);
79
+ }
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
+ };
111
+ const deps = {
112
+ skillsDir,
113
+ tmpDir,
114
+ createMultiTurnSamplingFn: () => createMultiTurnSamplingFn(underlyingServer),
115
+ updateClientSamplingSupport,
116
+ };
117
+ const { registry, toolDefinitions } = createToolRegistry(deps);
118
+ underlyingServer.setRequestHandler(ListToolsRequestSchema, async () => {
119
+ return { tools: toolDefinitions };
120
+ });
121
+ underlyingServer.setRequestHandler(CallToolRequestSchema, async (request) => {
122
+ const { name, arguments: args } = request.params;
123
+ const startTime = Date.now();
124
+ logger.debug("Tool call received", { event: "tool_called", tool: name });
125
+ try {
126
+ const sanitizedArgs = args && typeof args === "object" ? args : undefined;
127
+ const handler = registry.get(name);
128
+ if (!handler) {
129
+ logger.warn("Unknown tool requested", { event: "unknown_tool", tool: name });
130
+ throw new Error(`Unknown tool: ${name}`);
131
+ }
132
+ const result = await handler(sanitizedArgs);
133
+ logger.info("Tool completed", {
134
+ event: "tool_completed",
135
+ tool: name,
136
+ durationMs: Date.now() - startTime,
137
+ });
138
+ return result;
139
+ }
140
+ catch (err) {
141
+ const durationMs = Date.now() - startTime;
142
+ const info = getErrorInfo(err);
143
+ logger.error("Tool execution failed", {
144
+ event: "tool_error",
145
+ tool: name,
146
+ error: info.code,
147
+ message: info.message,
148
+ recoverable: info.recoverable,
149
+ durationMs,
150
+ });
151
+ return formatErrorResponse(err);
152
+ }
153
+ });
154
+ return mcpServer;
155
+ }
156
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Configure Tool
3
+ *
4
+ * Write user preferences to kevlar-config.json.
5
+ * Does NOT handle API keys - those come from environment variables only.
6
+ */
7
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
8
+ import { ToolResult } from "../utils/types.js";
9
+ import type { ToolModule } from "./types.js";
10
+ export declare const configureToolDefinition: Tool;
11
+ export interface ConfigureInput {
12
+ mode?: "auto" | "orchestration" | "mcp_sampling" | "direct_api";
13
+ maxConcurrency?: number;
14
+ }
15
+ export declare const configureModule: ToolModule;
16
+ export declare function handleConfigure(input: ConfigureInput): Promise<ToolResult>;
17
+ //# sourceMappingURL=configureTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureTool.d.ts","sourceRoot":"","sources":["../../src/tools/configureTool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C,eAAO,MAAM,uBAAuB,EAAE,IAuBrC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,UAM7B,CAAC;AAEF,wBAAsB,eAAe,CACpC,KAAK,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Configure Tool
3
+ *
4
+ * Write user preferences to kevlar-config.json.
5
+ * Does NOT handle API keys - those come from environment variables only.
6
+ */
7
+ import { updateConfig, isValidMode, isValidConcurrency, } from "../execution/config.js";
8
+ import { logger, getErrorInfo } from "../utils/observability.js";
9
+ export const configureToolDefinition = {
10
+ name: "configure",
11
+ description: "直接修改 Kevlar 运行配置(执行模式、并发数等),改动即时写入 kevlar-config.json。" +
12
+ "无需对话确认,适合明确的单次配置变更场景。" +
13
+ "如需先预览再写入,请使用 configure_wizard。",
14
+ inputSchema: {
15
+ type: "object",
16
+ properties: {
17
+ mode: {
18
+ type: "string",
19
+ enum: ["auto", "orchestration", "mcp_sampling", "direct_api"],
20
+ description: "执行模式。不传则不修改当前值。",
21
+ },
22
+ maxConcurrency: {
23
+ type: "number",
24
+ minimum: 1,
25
+ maximum: 10,
26
+ description: "最大并发数(仅 mcp_sampling / direct_api 模式生效)。不传则不修改。",
27
+ },
28
+ },
29
+ },
30
+ };
31
+ export const configureModule = {
32
+ definition: configureToolDefinition,
33
+ handler: () => async (args) => {
34
+ if (!args)
35
+ throw new Error("配置需要提供参数");
36
+ return await handleConfigure(args);
37
+ },
38
+ };
39
+ export async function handleConfigure(input) {
40
+ // Validate mode
41
+ if (input.mode !== undefined && !isValidMode(input.mode)) {
42
+ return {
43
+ content: [{ type: "text", text: `❌ 无效的执行模式:${input.mode}` }],
44
+ isError: true,
45
+ };
46
+ }
47
+ // Validate concurrency
48
+ if (input.maxConcurrency !== undefined &&
49
+ !isValidConcurrency(input.maxConcurrency)) {
50
+ return {
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: "❌ 并发数必须在 1-10 之间",
55
+ },
56
+ ],
57
+ isError: true,
58
+ };
59
+ }
60
+ try {
61
+ const updated = await updateConfig({
62
+ mode: input.mode,
63
+ maxConcurrency: input.maxConcurrency,
64
+ });
65
+ const changes = [];
66
+ if (input.mode !== undefined) {
67
+ const modeLabels = {
68
+ auto: "自动",
69
+ orchestration: "宿主辅助兜底模式",
70
+ mcp_sampling: "MCP 采样模式",
71
+ direct_api: "直接 API 模式",
72
+ };
73
+ changes.push(`执行模式:${modeLabels[input.mode]}`);
74
+ }
75
+ if (input.maxConcurrency !== undefined) {
76
+ changes.push(`并发数:${input.maxConcurrency}`);
77
+ }
78
+ const changesText = changes.length > 0 ? changes.join("、") : "(无变更)";
79
+ logger.info("Configuration updated via tool", {
80
+ event: "configure_tool",
81
+ mode: input.mode,
82
+ maxConcurrency: input.maxConcurrency,
83
+ });
84
+ return {
85
+ content: [
86
+ {
87
+ type: "text",
88
+ text: `✅ 配置已更新
89
+ - ${changesText}
90
+
91
+ 下次评测(review_content_wizard)时自动生效。`,
92
+ },
93
+ ],
94
+ };
95
+ }
96
+ catch (err) {
97
+ const info = getErrorInfo(err);
98
+ return {
99
+ content: [{ type: "text", text: `❌ 配置更新失败:${info.message}` }],
100
+ isError: true,
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=configureTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureTool.js","sourceRoot":"","sources":["../../src/tools/configureTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ToolResult } from "../utils/types.js";
3
+ import type { ToolModule } from "./types.js";
4
+ export declare const configureWizardToolDefinition: Tool;
5
+ export interface ConfigureWizardInput {
6
+ sessionId?: string;
7
+ userMessage: string;
8
+ }
9
+ export declare const configureWizardModule: ToolModule;
10
+ export declare function handleConfigureWizard(tmpDir: string, input: ConfigureWizardInput): Promise<ToolResult>;
11
+ //# sourceMappingURL=configureWizardTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureWizardTool.d.ts","sourceRoot":"","sources":["../../src/tools/configureWizardTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,6BAA6B,EAAE,IAoB3C,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACpB;AAaD,eAAO,MAAM,qBAAqB,EAAE,UAMnC,CAAC;AAEF,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,GACzB,OAAO,CAAC,UAAU,CAAC,CAkDrB"}
@@ -0,0 +1,205 @@
1
+ import * as path from "path";
2
+ import * as fs from "fs";
3
+ import { handleConfigure } from "./configureTool.js";
4
+ import { isValidMode, isValidConcurrency } from "../execution/config.js";
5
+ import { logger, getErrorInfo } from "../utils/observability.js";
6
+ export const configureWizardToolDefinition = {
7
+ name: "configure_wizard",
8
+ description: "当用户说「设置/配置/切换模式/改并发数」时,调用此工具。工具先预览配置变更,用户确认后才写入 kevlar-config.json。API Key 不由此工具处理,只能通过环境变量设置。",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ sessionId: {
13
+ type: "string",
14
+ description: "配置向导的会话标识。首次调用请留空,工具会自动生成并返回一个 sessionId。后续调用必须传入此值以继续上一次的配置会话。",
15
+ },
16
+ userMessage: {
17
+ type: "string",
18
+ description: "用户在当前步骤的回复内容。首次调用时传入用户原话(例如「切换到 MCP 采样模式」「并发数改成 5」),工具解析变更项并预览。后续步骤传入用户对工具提问的回复。",
19
+ },
20
+ },
21
+ required: ["userMessage"],
22
+ },
23
+ };
24
+ const CONFIRM_PHRASE = "确认修改配置";
25
+ export const configureWizardModule = {
26
+ definition: configureWizardToolDefinition,
27
+ handler: (deps) => async (args) => {
28
+ if (!args)
29
+ throw new Error("配置向导需要提供参数");
30
+ return await handleConfigureWizard(deps.tmpDir, args);
31
+ },
32
+ };
33
+ export async function handleConfigureWizard(tmpDir, input) {
34
+ if (!input.userMessage || typeof input.userMessage !== "string") {
35
+ return {
36
+ content: [{ type: "text", text: "❌ 请提供当前步骤的用户回复。" }],
37
+ isError: true,
38
+ };
39
+ }
40
+ try {
41
+ await fs.promises.mkdir(tmpDir, { recursive: true });
42
+ const state = await loadOrCreateState(tmpDir, input);
43
+ if (!input.sessionId) {
44
+ const pending = parseConfigRequest(input.userMessage);
45
+ validatePending(pending);
46
+ state.pending = pending;
47
+ await saveState(tmpDir, state);
48
+ return toolResponse(state, buildPreviewMessage(pending));
49
+ }
50
+ if (state.step === "completed") {
51
+ return toolResponse(state, "这个配置修改流程已经完成。");
52
+ }
53
+ if (!normalize(input.userMessage).includes(normalize(CONFIRM_PHRASE))) {
54
+ await saveState(tmpDir, state);
55
+ return toolResponse(state, `请回复完整确认语「${CONFIRM_PHRASE}」后再写入配置。`);
56
+ }
57
+ const result = await handleConfigure(state.pending);
58
+ if (!result.isError) {
59
+ state.step = "completed";
60
+ await saveState(tmpDir, state);
61
+ await cleanupState(tmpDir, state.sessionId);
62
+ }
63
+ return result;
64
+ }
65
+ catch (err) {
66
+ const info = getErrorInfo(err);
67
+ logger.error("Configure wizard failed", {
68
+ event: "configure_wizard_error",
69
+ error: info.code,
70
+ message: info.message,
71
+ });
72
+ return {
73
+ content: [{ type: "text", text: `❌ 配置向导失败:${info.message}` }],
74
+ isError: true,
75
+ };
76
+ }
77
+ }
78
+ function parseConfigRequest(message) {
79
+ const normalized = message.toLowerCase();
80
+ const pending = {};
81
+ if (/direct[\s_-]*api|直接\s*api|直连/.test(normalized)) {
82
+ pending.mode = "direct_api";
83
+ }
84
+ else if (/mcp[\s_-]*sampling|sampling|采样/.test(normalized)) {
85
+ pending.mode = "mcp_sampling";
86
+ }
87
+ else if (/orchestration|编排|兜底|宿主辅助/.test(normalized)) {
88
+ pending.mode = "orchestration";
89
+ }
90
+ else if (/auto|自动/.test(normalized)) {
91
+ pending.mode = "auto";
92
+ }
93
+ const concurrencyMatch = normalized.match(/(?:并发|concurrency|maxconcurrency)\D*(10|[1-9])/);
94
+ if (concurrencyMatch) {
95
+ pending.maxConcurrency = Number(concurrencyMatch[1]);
96
+ }
97
+ if (!pending.mode && pending.maxConcurrency === undefined) {
98
+ throw new Error("没有识别到要修改的配置。请说明执行模式或并发数。");
99
+ }
100
+ return pending;
101
+ }
102
+ function validatePending(pending) {
103
+ if (pending.mode !== undefined && !isValidMode(pending.mode)) {
104
+ throw new Error(`无效的执行模式:${pending.mode}`);
105
+ }
106
+ if (pending.maxConcurrency !== undefined &&
107
+ !isValidConcurrency(pending.maxConcurrency)) {
108
+ throw new Error("并发数必须在 1-10 之间");
109
+ }
110
+ }
111
+ function buildPreviewMessage(pending) {
112
+ const lines = ["准备修改配置:", ""];
113
+ if (pending.mode) {
114
+ lines.push(`- 执行模式:${modeLabel(pending.mode)}`);
115
+ }
116
+ if (pending.maxConcurrency !== undefined) {
117
+ lines.push(`- 并发数:${pending.maxConcurrency}`);
118
+ }
119
+ lines.push("");
120
+ lines.push(`如确认写入配置,请回复:${CONFIRM_PHRASE}`);
121
+ return lines.join("\n");
122
+ }
123
+ async function loadOrCreateState(tmpDir, input) {
124
+ if (input.sessionId && !/^[a-z0-9-]+$/.test(input.sessionId)) {
125
+ throw new Error("sessionId 格式不合法。");
126
+ }
127
+ const sessionId = input.sessionId ||
128
+ `wizard-configure-${Math.random().toString(36).substring(2, 10)}`;
129
+ const statePath = getStatePath(tmpDir, sessionId);
130
+ if (input.sessionId && fs.existsSync(statePath)) {
131
+ const raw = await fs.promises.readFile(statePath, "utf-8");
132
+ return JSON.parse(raw);
133
+ }
134
+ return {
135
+ sessionId,
136
+ createdAt: Date.now(),
137
+ step: "confirmConfigure",
138
+ pending: {},
139
+ };
140
+ }
141
+ async function saveState(tmpDir, state) {
142
+ await fs.promises.mkdir(tmpDir, { recursive: true });
143
+ const statePath = getStatePath(tmpDir, state.sessionId);
144
+ const tmpPath = statePath + ".tmp";
145
+ await fs.promises.writeFile(tmpPath, JSON.stringify(state, null, 2), "utf-8");
146
+ await fs.promises.rename(tmpPath, statePath);
147
+ }
148
+ async function cleanupState(tmpDir, sessionId) {
149
+ const statePath = getStatePath(tmpDir, sessionId);
150
+ try {
151
+ if (fs.existsSync(statePath))
152
+ await fs.promises.unlink(statePath);
153
+ }
154
+ catch (err) {
155
+ const info = getErrorInfo(err);
156
+ logger.warn("Failed to clean configure wizard state", {
157
+ event: "configure_wizard_cleanup_error",
158
+ path: statePath,
159
+ error: info.code,
160
+ message: info.message,
161
+ });
162
+ }
163
+ }
164
+ function getStatePath(tmpDir, sessionId) {
165
+ return path.join(tmpDir, `${sessionId}_configure_wizard.json`);
166
+ }
167
+ function toolResponse(state, assistantMessage) {
168
+ return {
169
+ content: [
170
+ {
171
+ type: "text",
172
+ text: [
173
+ assistantMessage,
174
+ "",
175
+ "```kevlar-state",
176
+ `sessionId: ${state.sessionId}`,
177
+ "workflow: configure",
178
+ `currentStep: ${state.step}`,
179
+ state.pending.mode
180
+ ? `pendingMode: ${state.pending.mode}`
181
+ : undefined,
182
+ state.pending.maxConcurrency !== undefined
183
+ ? `pendingMaxConcurrency: ${state.pending.maxConcurrency}`
184
+ : undefined,
185
+ "```",
186
+ ]
187
+ .filter(Boolean)
188
+ .join("\n"),
189
+ },
190
+ ],
191
+ };
192
+ }
193
+ function modeLabel(mode) {
194
+ const labels = {
195
+ auto: "自动",
196
+ orchestration: "宿主辅助兜底模式",
197
+ mcp_sampling: "MCP 采样模式",
198
+ direct_api: "直接 API 模式",
199
+ };
200
+ return labels[mode];
201
+ }
202
+ function normalize(input) {
203
+ return input.replace(/\s+/g, "").toLowerCase();
204
+ }
205
+ //# sourceMappingURL=configureWizardTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureWizardTool.js","sourceRoot":"","sources":["../../src/tools/configureWizardTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { ToolResult } from "../utils/types.js";
2
+ export declare const DESCRIPTION_PRINCIPLES: {
3
+ readonly LANGUAGE: "Use the same language as the user's input for the description";
4
+ readonly SCENARIO: "Describe the persona's content-consumption behaviour first; don't just list collected fields";
5
+ readonly CONCRETE: "Use specific, observable behaviours instead of abstract labels";
6
+ readonly CONCISE: "Single sentence, under 120 characters";
7
+ };
8
+ export interface CreatePersonaInput {
9
+ id?: string;
10
+ name: string;
11
+ name_en?: string;
12
+ description?: string;
13
+ tags?: string[];
14
+ author?: string;
15
+ sessionId?: string;
16
+ culturalContext?: string;
17
+ authorRelation?: string;
18
+ stance?: string;
19
+ blindSpot?: string;
20
+ gender?: string;
21
+ }
22
+ export declare function handleSaveDraft(tmpDir: string, input: CreatePersonaInput): Promise<any>;
23
+ export declare function handleCreatePersona(skillsDir: string, tmpDir: string, input: CreatePersonaInput): Promise<ToolResult>;
24
+ export declare function generateIdFromDraft(draft: any): string | undefined;
25
+ export declare function getSubDirFromDraft(draft: any): string | undefined;
26
+ export declare function applyDedup(skillsDir: string, baseId: string, subDir?: string): string;
27
+ export interface UpdatePersonaDraftInput {
28
+ sessionId: string;
29
+ field: "ageRange" | "interests" | "traits" | "platform" | "authorRelation";
30
+ value: string | string[];
31
+ }
32
+ export declare function handleUpdatePersonaDraft(tmpDir: string, input: UpdatePersonaDraftInput): Promise<ToolResult>;
33
+ export interface DeletePersonaDraftInput {
34
+ sessionId: string;
35
+ }
36
+ export declare function handleDeletePersonaDraft(tmpDir: string, input: DeletePersonaDraftInput): Promise<ToolResult>;
37
+ //# sourceMappingURL=createPersonaTool.d.ts.map