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.
- package/README.md +357 -0
- package/config/mcp-config.json +9 -0
- package/dist/__tests__/configureWizard.test.d.ts +2 -0
- package/dist/__tests__/configureWizard.test.d.ts.map +1 -0
- package/dist/__tests__/configureWizard.test.js +89 -0
- package/dist/__tests__/configureWizard.test.js.map +1 -0
- package/dist/__tests__/createPersonaTool.test.d.ts +2 -0
- package/dist/__tests__/createPersonaTool.test.d.ts.map +1 -0
- package/dist/__tests__/createPersonaTool.test.js +292 -0
- package/dist/__tests__/createPersonaTool.test.js.map +1 -0
- package/dist/__tests__/createPersonaWizard.test.d.ts +2 -0
- package/dist/__tests__/createPersonaWizard.test.d.ts.map +1 -0
- package/dist/__tests__/createPersonaWizard.test.js +138 -0
- package/dist/__tests__/createPersonaWizard.test.js.map +1 -0
- package/dist/__tests__/deletePersonaWizard.test.d.ts +2 -0
- package/dist/__tests__/deletePersonaWizard.test.d.ts.map +1 -0
- package/dist/__tests__/deletePersonaWizard.test.js +78 -0
- package/dist/__tests__/deletePersonaWizard.test.js.map +1 -0
- package/dist/__tests__/e2e.test.d.ts +2 -0
- package/dist/__tests__/e2e.test.d.ts.map +1 -0
- package/dist/__tests__/e2e.test.js +121 -0
- package/dist/__tests__/e2e.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +86 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/execution.test.d.ts +2 -0
- package/dist/__tests__/execution.test.d.ts.map +1 -0
- package/dist/__tests__/execution.test.js +792 -0
- package/dist/__tests__/execution.test.js.map +1 -0
- package/dist/__tests__/getModesTool.test.d.ts +2 -0
- package/dist/__tests__/getModesTool.test.d.ts.map +1 -0
- package/dist/__tests__/getModesTool.test.js +47 -0
- package/dist/__tests__/getModesTool.test.js.map +1 -0
- package/dist/__tests__/helpTool.test.d.ts +2 -0
- package/dist/__tests__/helpTool.test.d.ts.map +1 -0
- package/dist/__tests__/helpTool.test.js +18 -0
- package/dist/__tests__/helpTool.test.js.map +1 -0
- package/dist/__tests__/listPersonasTool.test.d.ts +2 -0
- package/dist/__tests__/listPersonasTool.test.d.ts.map +1 -0
- package/dist/__tests__/listPersonasTool.test.js +110 -0
- package/dist/__tests__/listPersonasTool.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +56 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/observability.test.d.ts +2 -0
- package/dist/__tests__/observability.test.d.ts.map +1 -0
- package/dist/__tests__/observability.test.js +60 -0
- package/dist/__tests__/observability.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +2 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +259 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- 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/__tests__/reviewContentWizard.test.d.ts +2 -0
- package/dist/__tests__/reviewContentWizard.test.d.ts.map +1 -0
- package/dist/__tests__/reviewContentWizard.test.js +148 -0
- package/dist/__tests__/reviewContentWizard.test.js.map +1 -0
- package/dist/__tests__/sanitize.test.d.ts +2 -0
- package/dist/__tests__/sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/sanitize.test.js +138 -0
- package/dist/__tests__/sanitize.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +49 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/execution/aggregator.d.ts +43 -0
- package/dist/execution/aggregator.d.ts.map +1 -0
- package/dist/execution/aggregator.js +132 -0
- package/dist/execution/aggregator.js.map +1 -0
- package/dist/execution/base.d.ts +62 -0
- package/dist/execution/base.d.ts.map +1 -0
- package/dist/execution/base.js +5 -0
- package/dist/execution/base.js.map +1 -0
- package/dist/execution/client.d.ts +9 -0
- package/dist/execution/client.d.ts.map +1 -0
- package/dist/execution/client.js +30 -0
- package/dist/execution/client.js.map +1 -0
- package/dist/execution/config.d.ts +30 -0
- package/dist/execution/config.d.ts.map +1 -0
- package/dist/execution/config.js +95 -0
- package/dist/execution/config.js.map +1 -0
- package/dist/execution/index.d.ts +19 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +151 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/limiter.d.ts +32 -0
- package/dist/execution/limiter.d.ts.map +1 -0
- package/dist/execution/limiter.js +147 -0
- package/dist/execution/limiter.js.map +1 -0
- package/dist/execution/lock.d.ts +17 -0
- package/dist/execution/lock.d.ts.map +1 -0
- package/dist/execution/lock.js +37 -0
- package/dist/execution/lock.js.map +1 -0
- package/dist/execution/modes/direct_api.d.ts +11 -0
- package/dist/execution/modes/direct_api.d.ts.map +1 -0
- package/dist/execution/modes/direct_api.js +213 -0
- package/dist/execution/modes/direct_api.js.map +1 -0
- package/dist/execution/modes/index.d.ts +7 -0
- package/dist/execution/modes/index.d.ts.map +1 -0
- package/dist/execution/modes/index.js +7 -0
- package/dist/execution/modes/index.js.map +1 -0
- package/dist/execution/modes/orchestration.d.ts +11 -0
- package/dist/execution/modes/orchestration.d.ts.map +1 -0
- package/dist/execution/modes/orchestration.js +110 -0
- package/dist/execution/modes/orchestration.js.map +1 -0
- package/dist/execution/modes/sampling.d.ts +9 -0
- package/dist/execution/modes/sampling.d.ts.map +1 -0
- package/dist/execution/modes/sampling.js +66 -0
- package/dist/execution/modes/sampling.js.map +1 -0
- package/dist/execution/parallel.d.ts +16 -0
- package/dist/execution/parallel.d.ts.map +1 -0
- package/dist/execution/parallel.js +90 -0
- package/dist/execution/parallel.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.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 +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +156 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/configureTool.d.ts +17 -0
- package/dist/tools/configureTool.d.ts.map +1 -0
- package/dist/tools/configureTool.js +104 -0
- package/dist/tools/configureTool.js.map +1 -0
- package/dist/tools/configureWizardTool.d.ts +11 -0
- package/dist/tools/configureWizardTool.d.ts.map +1 -0
- package/dist/tools/configureWizardTool.js +205 -0
- package/dist/tools/configureWizardTool.js.map +1 -0
- package/dist/tools/createPersonaTool.d.ts +37 -0
- package/dist/tools/createPersonaTool.d.ts.map +1 -0
- package/dist/tools/createPersonaTool.js +353 -0
- package/dist/tools/createPersonaTool.js.map +1 -0
- package/dist/tools/createPersonaWizardTool.d.ts +13 -0
- package/dist/tools/createPersonaWizardTool.d.ts.map +1 -0
- package/dist/tools/createPersonaWizardTool.js +713 -0
- package/dist/tools/createPersonaWizardTool.js.map +1 -0
- package/dist/tools/deletePersonaTool.d.ts +10 -0
- package/dist/tools/deletePersonaTool.d.ts.map +1 -0
- package/dist/tools/deletePersonaTool.js +75 -0
- package/dist/tools/deletePersonaTool.js.map +1 -0
- package/dist/tools/deletePersonaWizardTool.d.ts +11 -0
- package/dist/tools/deletePersonaWizardTool.d.ts.map +1 -0
- package/dist/tools/deletePersonaWizardTool.js +184 -0
- package/dist/tools/deletePersonaWizardTool.js.map +1 -0
- package/dist/tools/getModesTool.d.ts +12 -0
- package/dist/tools/getModesTool.d.ts.map +1 -0
- package/dist/tools/getModesTool.js +78 -0
- package/dist/tools/getModesTool.js.map +1 -0
- package/dist/tools/helpTool.d.ts +7 -0
- package/dist/tools/helpTool.d.ts.map +1 -0
- package/dist/tools/helpTool.js +65 -0
- package/dist/tools/helpTool.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +30 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listPersonasTool.d.ts +7 -0
- package/dist/tools/listPersonasTool.d.ts.map +1 -0
- package/dist/tools/listPersonasTool.js +118 -0
- package/dist/tools/listPersonasTool.js.map +1 -0
- 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 +13 -0
- package/dist/tools/reviewContentWizardTool.d.ts.map +1 -0
- package/dist/tools/reviewContentWizardTool.js +411 -0
- package/dist/tools/reviewContentWizardTool.js.map +1 -0
- package/dist/tools/reviewTool.d.ts +10 -0
- package/dist/tools/reviewTool.d.ts.map +1 -0
- package/dist/tools/reviewTool.js +133 -0
- package/dist/tools/reviewTool.js.map +1 -0
- package/dist/tools/types.d.ts +14 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +47 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/observability.d.ts +61 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +69 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/parser.d.ts +27 -0
- package/dist/utils/parser.d.ts.map +1 -0
- package/dist/utils/parser.js +178 -0
- package/dist/utils/parser.js.map +1 -0
- package/dist/utils/personaIdMaps.d.ts +7 -0
- package/dist/utils/personaIdMaps.d.ts.map +1 -0
- package/dist/utils/personaIdMaps.js +51 -0
- package/dist/utils/personaIdMaps.js.map +1 -0
- package/dist/utils/sanitize.d.ts +4 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +49 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/types.d.ts +8 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +42 -0
- package/skills/_template.md +66 -0
- package/skills/tmp/wizard-create-cwzrrpim_draft.json +26 -0
- package/skills/tmp/wizard-create-cwzrrpim_wizard.json +26 -0
- package/skills/tmp/wizard-create-d81intme_draft.json +26 -0
- package/skills/tmp/wizard-create-d81intme_wizard.json +26 -0
- package/skills/tmp/wizard-create-g50jqzmh_draft.json +8 -0
- package/skills/tmp/wizard-create-g50jqzmh_wizard.json +8 -0
- package/skills/tmp/wizard-create-onupu9wb_draft.json +8 -0
- package/skills/tmp/wizard-create-onupu9wb_wizard.json +8 -0
- package/skills/tmp/wizard-review-fwbxe3d2_review_wizard.json +9 -0
- package/skills/tmp/wizard-review-sypg5e9d_review_wizard.json +9 -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
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { loadAllPersonas } from "../utils/parser.js";
|
|
2
|
+
import { executeReview, loadPersonasForReview, MAX_PERSONAS } from "../execution/index.js";
|
|
3
|
+
import { getErrorInfo } from "../utils/observability.js";
|
|
4
|
+
// ── Resource limits ────────────────────────────────────────────────────────────
|
|
5
|
+
const MAX_CONTENT_LENGTH = 100_000; // 100KB
|
|
6
|
+
const MAX_CONTEXT_LENGTH = 5_000; // 5KB
|
|
7
|
+
export async function handleReviewContent(skillsDir, input) {
|
|
8
|
+
// ── Resource limits validation ───────────────────────────────────────────
|
|
9
|
+
if (!input.content || typeof input.content !== "string") {
|
|
10
|
+
return {
|
|
11
|
+
content: [{ type: "text", text: "❌ 请提供要评测的文案内容" }],
|
|
12
|
+
isError: true,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
if (input.content.length > MAX_CONTENT_LENGTH) {
|
|
16
|
+
return {
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: "text",
|
|
20
|
+
text: `❌ 文案内容超出长度限制(${MAX_CONTENT_LENGTH}字符)。当前长度:${input.content.length}字符`,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
isError: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (input.context && input.context.length > MAX_CONTEXT_LENGTH) {
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
text: `❌ 上下文说明超出长度限制(${MAX_CONTEXT_LENGTH}字符)`,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
isError: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// ── Load requested personas (or all of them) using unified helper ───────────
|
|
38
|
+
let personas;
|
|
39
|
+
if (input.persona_ids && input.persona_ids.length > 0) {
|
|
40
|
+
if (input.persona_ids.length > MAX_PERSONAS) {
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: "text",
|
|
45
|
+
text: `❌ 选择的评论员数量超出限制(最多${MAX_PERSONAS}个)`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const loadResult = await loadPersonasForReview(skillsDir, input.persona_ids);
|
|
53
|
+
personas = loadResult.personas;
|
|
54
|
+
if (loadResult.missingIds && loadResult.missingIds.length > 0) {
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: "text",
|
|
59
|
+
text: `❌ 找不到以下评论员:${loadResult.missingIds.join(", ")}。请先查看可用评论员列表。`,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (personas.length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: "text",
|
|
70
|
+
text: "⚠️ 当前没有可用评论员。请先创建自定义评论员。",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// ── Track unselected personas for continuation flow ─────────────────────
|
|
77
|
+
const allPersonas = await loadAllPersonas(skillsDir);
|
|
78
|
+
const activeIds = new Set(personas.map((p) => p.meta.id));
|
|
79
|
+
const remainingPersonas = allPersonas.filter((p) => !activeIds.has(p.meta.id));
|
|
80
|
+
// ── Execute review ─────────────────────────────────────────────────────
|
|
81
|
+
const mode = input.mode || "auto";
|
|
82
|
+
try {
|
|
83
|
+
const ctx = {
|
|
84
|
+
skillsDir,
|
|
85
|
+
personas,
|
|
86
|
+
content: input.content,
|
|
87
|
+
context: input.context,
|
|
88
|
+
samplingFn: input.samplingFn,
|
|
89
|
+
};
|
|
90
|
+
const result = await executeReview(mode, ctx);
|
|
91
|
+
// Add continuation prompt if there are remaining personas
|
|
92
|
+
const continuationNote = remainingPersonas.length > 0
|
|
93
|
+
? buildContinuationNote(remainingPersonas)
|
|
94
|
+
: "";
|
|
95
|
+
return {
|
|
96
|
+
content: [
|
|
97
|
+
{
|
|
98
|
+
type: "text",
|
|
99
|
+
text: result.report + continuationNote,
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const info = getErrorInfo(err);
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: `❌ 评测执行失败:${info.message}`,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
isError: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function buildContinuationNote(remainingPersonas) {
|
|
118
|
+
const names = remainingPersonas.map((p) => p.meta.name).join("、");
|
|
119
|
+
return `
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 🔄 延续测试
|
|
124
|
+
|
|
125
|
+
本轮有 **${remainingPersonas.length} 个人设未参与评测**:${names}。
|
|
126
|
+
|
|
127
|
+
**完成汇总报告后:**
|
|
128
|
+
1. 向用户展示报告
|
|
129
|
+
2. 询问是否要用剩余评论员(${names})继续评测
|
|
130
|
+
3. 用户同意则启动新一轮评测(复用本次内容)
|
|
131
|
+
4. 用户拒绝则结束`;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=reviewTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewTool.js","sourceRoot":"","sources":["../../src/tools/reviewTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { MultiTurnSamplingFunction } from "../execution/base.js";
|
|
3
|
+
export type ToolHandler = (args: Record<string, unknown> | undefined) => Promise<any>;
|
|
4
|
+
export interface ToolDependencies {
|
|
5
|
+
skillsDir: string;
|
|
6
|
+
tmpDir: string;
|
|
7
|
+
createMultiTurnSamplingFn: () => MultiTurnSamplingFunction;
|
|
8
|
+
updateClientSamplingSupport: () => boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ToolModule {
|
|
11
|
+
definition: Tool;
|
|
12
|
+
handler: (deps: ToolDependencies) => ToolHandler;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEtF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;IAC3D,2BAA2B,EAAE,MAAM,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,WAAW,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error types for Kevlar MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorCode {
|
|
5
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
6
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
7
|
+
CONTENT_TOO_LONG = "CONTENT_TOO_LONG",
|
|
8
|
+
TOO_MANY_PERSONAS = "TOO_MANY_PERSONAS",
|
|
9
|
+
PERSONA_NOT_FOUND = "PERSONA_NOT_FOUND",
|
|
10
|
+
DUPLICATE_ID = "DUPLICATE_ID",
|
|
11
|
+
INVALID_ID_FORMAT = "INVALID_ID_FORMAT",
|
|
12
|
+
PATH_TRAVERSAL = "PATH_TRAVERSAL",
|
|
13
|
+
FILE_NOT_FOUND = "FILE_NOT_FOUND",
|
|
14
|
+
FILE_READ_ERROR = "FILE_READ_ERROR",
|
|
15
|
+
FILE_WRITE_ERROR = "FILE_WRITE_ERROR",
|
|
16
|
+
DIRECTORY_NOT_FOUND = "DIRECTORY_NOT_FOUND",
|
|
17
|
+
PERMISSION_DENIED = "PERMISSION_DENIED",
|
|
18
|
+
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
19
|
+
UNKNOWN_TOOL = "UNKNOWN_TOOL"
|
|
20
|
+
}
|
|
21
|
+
export interface KevlarError extends Error {
|
|
22
|
+
code: ErrorCode;
|
|
23
|
+
recoverable: boolean;
|
|
24
|
+
details?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export declare function isKevlarError(err: unknown): err is KevlarError;
|
|
27
|
+
export declare function getErrorMessage(err: unknown): string;
|
|
28
|
+
import { ToolResult } from "./types.js";
|
|
29
|
+
export declare function formatErrorResponse(err: unknown): ToolResult;
|
|
30
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,SAAS;IAEnB,gBAAgB,qBAAqB;IACrC,aAAa,kBAAkB;IAC/B,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IAGjC,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IAGvC,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAE9D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKpD;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAa5D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error types for Kevlar MCP Server
|
|
3
|
+
*/
|
|
4
|
+
export var ErrorCode;
|
|
5
|
+
(function (ErrorCode) {
|
|
6
|
+
// Validation errors (4xx)
|
|
7
|
+
ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
|
|
8
|
+
ErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
|
|
9
|
+
ErrorCode["CONTENT_TOO_LONG"] = "CONTENT_TOO_LONG";
|
|
10
|
+
ErrorCode["TOO_MANY_PERSONAS"] = "TOO_MANY_PERSONAS";
|
|
11
|
+
ErrorCode["PERSONA_NOT_FOUND"] = "PERSONA_NOT_FOUND";
|
|
12
|
+
ErrorCode["DUPLICATE_ID"] = "DUPLICATE_ID";
|
|
13
|
+
ErrorCode["INVALID_ID_FORMAT"] = "INVALID_ID_FORMAT";
|
|
14
|
+
ErrorCode["PATH_TRAVERSAL"] = "PATH_TRAVERSAL";
|
|
15
|
+
// Resource errors (5xx)
|
|
16
|
+
ErrorCode["FILE_NOT_FOUND"] = "FILE_NOT_FOUND";
|
|
17
|
+
ErrorCode["FILE_READ_ERROR"] = "FILE_READ_ERROR";
|
|
18
|
+
ErrorCode["FILE_WRITE_ERROR"] = "FILE_WRITE_ERROR";
|
|
19
|
+
ErrorCode["DIRECTORY_NOT_FOUND"] = "DIRECTORY_NOT_FOUND";
|
|
20
|
+
ErrorCode["PERMISSION_DENIED"] = "PERMISSION_DENIED";
|
|
21
|
+
// Runtime errors
|
|
22
|
+
ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
23
|
+
ErrorCode["UNKNOWN_TOOL"] = "UNKNOWN_TOOL";
|
|
24
|
+
})(ErrorCode || (ErrorCode = {}));
|
|
25
|
+
export function isKevlarError(err) {
|
|
26
|
+
return err instanceof Error && "code" in err && "recoverable" in err;
|
|
27
|
+
}
|
|
28
|
+
export function getErrorMessage(err) {
|
|
29
|
+
if (err instanceof Error) {
|
|
30
|
+
return err.message;
|
|
31
|
+
}
|
|
32
|
+
return String(err);
|
|
33
|
+
}
|
|
34
|
+
export function formatErrorResponse(err) {
|
|
35
|
+
if (isKevlarError(err)) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: `❌ [${err.code}] ${err.message}` }],
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const message = getErrorMessage(err);
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: `❌ 操作失败:${message}` }],
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,SAqBX;AArBD,WAAY,SAAS;IACnB,0BAA0B;IAC1B,kDAAqC,CAAA;IACrC,4CAA+B,CAAA;IAC/B,kDAAqC,CAAA;IACrC,oDAAuC,CAAA;IACvC,oDAAuC,CAAA;IACvC,0CAA6B,CAAA;IAC7B,oDAAuC,CAAA;IACvC,8CAAiC,CAAA;IAEjC,wBAAwB;IACxB,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,kDAAqC,CAAA;IACrC,wDAA2C,CAAA;IAC3C,oDAAuC,CAAA;IAEvC,iBAAiB;IACjB,8CAAiC,CAAA;IACjC,0CAA6B,CAAA;AAC/B,CAAC,EArBW,SAAS,KAAT,SAAS,QAqBpB;AAQD,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAI,aAAa,IAAI,GAAG,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAID,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACnE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging module for Kevlar
|
|
3
|
+
* Uses pino for production-grade performance
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
6
|
+
export interface LogContext {
|
|
7
|
+
event: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
interface Logger {
|
|
11
|
+
debug(msg: string, ctx?: LogContext): void;
|
|
12
|
+
info(msg: string, ctx?: LogContext): void;
|
|
13
|
+
warn(msg: string, ctx?: LogContext): void;
|
|
14
|
+
error(msg: string, ctx?: LogContext): void;
|
|
15
|
+
}
|
|
16
|
+
export declare const logger: Logger;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,MAAM;IACd,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5C;AAgDD,eAAO,MAAM,MAAM,QAAiB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging module for Kevlar
|
|
3
|
+
* Uses pino for production-grade performance
|
|
4
|
+
*/
|
|
5
|
+
function createLogger() {
|
|
6
|
+
const level = process.env.LOG_LEVEL || "info";
|
|
7
|
+
const levels = {
|
|
8
|
+
debug: 0,
|
|
9
|
+
info: 1,
|
|
10
|
+
warn: 2,
|
|
11
|
+
error: 3,
|
|
12
|
+
};
|
|
13
|
+
const currentLevel = levels[level] ?? 1;
|
|
14
|
+
function shouldLog(level) {
|
|
15
|
+
return levels[level] >= currentLevel;
|
|
16
|
+
}
|
|
17
|
+
function formatTimestamp() {
|
|
18
|
+
return new Date().toISOString();
|
|
19
|
+
}
|
|
20
|
+
function formatCtx(ctx) {
|
|
21
|
+
if (!ctx || Object.keys(ctx).length === 0)
|
|
22
|
+
return "";
|
|
23
|
+
const { event, ...rest } = ctx;
|
|
24
|
+
if (Object.keys(rest).length === 0)
|
|
25
|
+
return ` event=${event}`;
|
|
26
|
+
return ` event=${event} ${JSON.stringify(rest)}`;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
debug(msg, ctx) {
|
|
30
|
+
if (!shouldLog("debug"))
|
|
31
|
+
return;
|
|
32
|
+
console.error(`[${formatTimestamp()}] DEBUG: ${msg}${formatCtx(ctx)}`);
|
|
33
|
+
},
|
|
34
|
+
info(msg, ctx) {
|
|
35
|
+
if (!shouldLog("info"))
|
|
36
|
+
return;
|
|
37
|
+
console.error(`[${formatTimestamp()}] INFO: ${msg}${formatCtx(ctx)}`);
|
|
38
|
+
},
|
|
39
|
+
warn(msg, ctx) {
|
|
40
|
+
if (!shouldLog("warn"))
|
|
41
|
+
return;
|
|
42
|
+
console.error(`[${formatTimestamp()}] WARN: ${msg}${formatCtx(ctx)}`);
|
|
43
|
+
},
|
|
44
|
+
error(msg, ctx) {
|
|
45
|
+
if (!shouldLog("error"))
|
|
46
|
+
return;
|
|
47
|
+
console.error(`[${formatTimestamp()}] ERROR: ${msg}${formatCtx(ctx)}`);
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export const logger = createLogger();
|
|
52
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,SAAS,YAAY;IACnB,MAAM,KAAK,GAAI,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,MAAM,CAAC;IAC5D,MAAM,MAAM,GAA6B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,SAAS,SAAS,CAAC,KAAe;QAChC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC;IACvC,CAAC;IAED,SAAS,eAAe;QACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,SAAS,CAAC,GAA2B;QAC5C,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,KAAK,EAAE,CAAC;QAC7D,OAAO,UAAU,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAW,EAAE,GAAgB;YACjC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAAE,OAAO;YAChC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,YAAY,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,GAAW,EAAE,GAAgB;YAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO;YAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,WAAW,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,GAAW,EAAE,GAAgB;YAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO;YAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,WAAW,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,KAAK,CAAC,GAAW,EAAE,GAAgB;YACjC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAAE,OAAO;YAChC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,YAAY,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight observability utilities for local-first tools.
|
|
3
|
+
*
|
|
4
|
+
* Designed for MCP servers and CLI tools that don't need OTel.
|
|
5
|
+
* Provides structured error info, duration tracking, and logger re-export.
|
|
6
|
+
*
|
|
7
|
+
* ── Usage ─────────────────────────────────────────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* import { logger, getErrorInfo, withDuration } from "./observability.js";
|
|
10
|
+
*
|
|
11
|
+
* // 1. Structured logging
|
|
12
|
+
* logger.info("Review started", { event: "review_start", mode: "direct_api", personas: 5 });
|
|
13
|
+
* logger.warn("Rate limit approaching", { event: "rate_limit_warning" });
|
|
14
|
+
* logger.error("Execution failed", { event: "execute_error", error: "TIMEOUT" });
|
|
15
|
+
*
|
|
16
|
+
* // 2. Extract structured error info (replaces ad-hoc instanceof checks)
|
|
17
|
+
* try { ... } catch (err) {
|
|
18
|
+
* const info = getErrorInfo(err);
|
|
19
|
+
* // info.code → "VALIDATION_ERROR" | "INTERNAL_ERROR" | ...
|
|
20
|
+
* // info.message → human-readable message
|
|
21
|
+
* // info.recoverable → true | false
|
|
22
|
+
* logger.error("Operation failed", { event: "op_failed", error: info.code, message: info.message, recoverable: info.recoverable });
|
|
23
|
+
* return { content: [{ type: "text", text: `❌ ${info.message}` }], isError: true };
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* // 3. Measure duration
|
|
27
|
+
* const { result, durationMs } = await withDuration(() => someAsyncWork());
|
|
28
|
+
* logger.info("Work done", { event: "work_complete", durationMs });
|
|
29
|
+
*/
|
|
30
|
+
export { logger } from "./logger.js";
|
|
31
|
+
export type { LogContext } from "./logger.js";
|
|
32
|
+
export interface ErrorInfo {
|
|
33
|
+
/** Error code for programmatic filtering (e.g. "VALIDATION_ERROR", "FILE_NOT_FOUND"). */
|
|
34
|
+
code: string;
|
|
35
|
+
/** Human-readable error message. */
|
|
36
|
+
message: string;
|
|
37
|
+
/** Whether the operation can be retried safely. */
|
|
38
|
+
recoverable: boolean;
|
|
39
|
+
/** Optional structured context attached by the error source. */
|
|
40
|
+
details?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Extract structured error info from any thrown value.
|
|
44
|
+
*
|
|
45
|
+
* - If the error is a KevlarError (has .code + .recoverable), those fields are preserved.
|
|
46
|
+
* - Otherwise, defaults to code="INTERNAL_ERROR", recoverable=false.
|
|
47
|
+
*
|
|
48
|
+
* Use this in every catch block instead of manual instanceof checks.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getErrorInfo(err: unknown): ErrorInfo;
|
|
51
|
+
/**
|
|
52
|
+
* Execute an async function and return its result alongside wall-clock duration.
|
|
53
|
+
*
|
|
54
|
+
* const { result, durationMs } = await withDuration(() => api.call(params));
|
|
55
|
+
* logger.info("API call completed", { event: "api_done", durationMs });
|
|
56
|
+
*/
|
|
57
|
+
export declare function withDuration<T>(fn: () => Promise<T>): Promise<{
|
|
58
|
+
result: T;
|
|
59
|
+
durationMs: number;
|
|
60
|
+
}>;
|
|
61
|
+
//# sourceMappingURL=observability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/utils/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,WAAW,SAAS;IACxB,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAcpD;AAID;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAI5C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight observability utilities for local-first tools.
|
|
3
|
+
*
|
|
4
|
+
* Designed for MCP servers and CLI tools that don't need OTel.
|
|
5
|
+
* Provides structured error info, duration tracking, and logger re-export.
|
|
6
|
+
*
|
|
7
|
+
* ── Usage ─────────────────────────────────────────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* import { logger, getErrorInfo, withDuration } from "./observability.js";
|
|
10
|
+
*
|
|
11
|
+
* // 1. Structured logging
|
|
12
|
+
* logger.info("Review started", { event: "review_start", mode: "direct_api", personas: 5 });
|
|
13
|
+
* logger.warn("Rate limit approaching", { event: "rate_limit_warning" });
|
|
14
|
+
* logger.error("Execution failed", { event: "execute_error", error: "TIMEOUT" });
|
|
15
|
+
*
|
|
16
|
+
* // 2. Extract structured error info (replaces ad-hoc instanceof checks)
|
|
17
|
+
* try { ... } catch (err) {
|
|
18
|
+
* const info = getErrorInfo(err);
|
|
19
|
+
* // info.code → "VALIDATION_ERROR" | "INTERNAL_ERROR" | ...
|
|
20
|
+
* // info.message → human-readable message
|
|
21
|
+
* // info.recoverable → true | false
|
|
22
|
+
* logger.error("Operation failed", { event: "op_failed", error: info.code, message: info.message, recoverable: info.recoverable });
|
|
23
|
+
* return { content: [{ type: "text", text: `❌ ${info.message}` }], isError: true };
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* // 3. Measure duration
|
|
27
|
+
* const { result, durationMs } = await withDuration(() => someAsyncWork());
|
|
28
|
+
* logger.info("Work done", { event: "work_complete", durationMs });
|
|
29
|
+
*/
|
|
30
|
+
export { logger } from "./logger.js";
|
|
31
|
+
/**
|
|
32
|
+
* Extract structured error info from any thrown value.
|
|
33
|
+
*
|
|
34
|
+
* - If the error is a KevlarError (has .code + .recoverable), those fields are preserved.
|
|
35
|
+
* - Otherwise, defaults to code="INTERNAL_ERROR", recoverable=false.
|
|
36
|
+
*
|
|
37
|
+
* Use this in every catch block instead of manual instanceof checks.
|
|
38
|
+
*/
|
|
39
|
+
export function getErrorInfo(err) {
|
|
40
|
+
if (isKevlarError(err)) {
|
|
41
|
+
return {
|
|
42
|
+
code: err.code,
|
|
43
|
+
message: err.message,
|
|
44
|
+
recoverable: err.recoverable,
|
|
45
|
+
details: err.details,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
code: "INTERNAL_ERROR",
|
|
50
|
+
message: err instanceof Error ? err.message : String(err),
|
|
51
|
+
recoverable: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// ── Duration Wrapper ──────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Execute an async function and return its result alongside wall-clock duration.
|
|
57
|
+
*
|
|
58
|
+
* const { result, durationMs } = await withDuration(() => api.call(params));
|
|
59
|
+
* logger.info("API call completed", { event: "api_done", durationMs });
|
|
60
|
+
*/
|
|
61
|
+
export async function withDuration(fn) {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
const result = await fn();
|
|
64
|
+
return { result, durationMs: Date.now() - start };
|
|
65
|
+
}
|
|
66
|
+
function isKevlarError(err) {
|
|
67
|
+
return err instanceof Error && "code" in err && "recoverable" in err;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/utils/observability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgBrC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACzD,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AACpD,CAAC;AAUD,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAI,aAAa,IAAI,GAAG,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface PersonaMeta {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
name_en: string;
|
|
5
|
+
version: string;
|
|
6
|
+
author: string;
|
|
7
|
+
tags: string[];
|
|
8
|
+
description: string;
|
|
9
|
+
culturalContext?: string;
|
|
10
|
+
authorRelation?: string;
|
|
11
|
+
stance?: string;
|
|
12
|
+
blindSpot?: string;
|
|
13
|
+
gender?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface Persona {
|
|
16
|
+
meta: PersonaMeta;
|
|
17
|
+
systemPrompt: string;
|
|
18
|
+
filePath: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function invalidatePersonasCache(): void;
|
|
21
|
+
export declare function validateWritePath(filePath: string, baseDir: string): boolean;
|
|
22
|
+
export declare function parsePersonaFile(filePath: string): Promise<Persona | null>;
|
|
23
|
+
export declare function loadAllPersonas(skillsDir: string): Promise<Persona[]>;
|
|
24
|
+
export declare function loadPersonaById(skillsDir: string, id: string): Promise<Persona | null>;
|
|
25
|
+
export declare function loadPersonasByIds(skillsDir: string, ids: string[]): Promise<Persona[]>;
|
|
26
|
+
export declare function writePersonaFile(skillsDir: string, meta: PersonaMeta, personaDescription: string, subDir?: string): Promise<string>;
|
|
27
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAO5E;AAID,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAqDhF;AAeD,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA0D3E;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CASzB;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,OAAO,EAAE,CAAC,CAGpB;AAID,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,kBAAkB,EAAE,MAAM,EAC1B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
|