oh-my-knowledge 0.0.1 → 0.18.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.md +537 -332
- package/dist/src/analysis/coverage-analyzer.d.ts +57 -0
- package/dist/src/analysis/coverage-analyzer.d.ts.map +1 -0
- package/dist/src/analysis/coverage-analyzer.js +262 -0
- package/dist/src/analysis/coverage-analyzer.js.map +1 -0
- package/dist/src/analysis/gap-analyzer.d.ts +114 -0
- package/dist/src/analysis/gap-analyzer.d.ts.map +1 -0
- package/dist/src/analysis/gap-analyzer.js +439 -0
- package/dist/src/analysis/gap-analyzer.js.map +1 -0
- package/dist/src/analysis/hedging-classifier.d.ts +34 -0
- package/dist/src/analysis/hedging-classifier.d.ts.map +1 -0
- package/dist/src/analysis/hedging-classifier.js +144 -0
- package/dist/src/analysis/hedging-classifier.js.map +1 -0
- package/dist/src/analysis/report-diagnostics.d.ts +9 -0
- package/dist/src/analysis/report-diagnostics.d.ts.map +1 -0
- package/dist/src/analysis/report-diagnostics.js +631 -0
- package/dist/src/analysis/report-diagnostics.js.map +1 -0
- package/dist/src/authoring/evolver.d.ts +64 -0
- package/dist/src/authoring/evolver.d.ts.map +1 -0
- package/dist/src/authoring/evolver.js +275 -0
- package/dist/src/authoring/evolver.js.map +1 -0
- package/dist/src/authoring/generator.d.ts +13 -0
- package/dist/src/authoring/generator.d.ts.map +1 -0
- package/dist/src/authoring/generator.js +60 -0
- package/dist/src/authoring/generator.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +1004 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/eval-core/cache.d.ts +11 -0
- package/dist/src/eval-core/cache.d.ts.map +1 -0
- package/dist/src/eval-core/cache.js +53 -0
- package/dist/src/eval-core/cache.js.map +1 -0
- package/dist/src/eval-core/ci-gates.d.ts +17 -0
- package/dist/src/eval-core/ci-gates.d.ts.map +1 -0
- package/dist/src/eval-core/ci-gates.js +42 -0
- package/dist/src/eval-core/ci-gates.js.map +1 -0
- package/dist/src/eval-core/dependency-checker.d.ts +37 -0
- package/dist/src/eval-core/dependency-checker.d.ts.map +1 -0
- package/dist/src/eval-core/dependency-checker.js +280 -0
- package/dist/src/eval-core/dependency-checker.js.map +1 -0
- package/dist/src/eval-core/evaluation-execution.d.ts +26 -0
- package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-execution.js +196 -0
- package/dist/src/eval-core/evaluation-execution.js.map +1 -0
- package/dist/src/eval-core/evaluation-job.d.ts +48 -0
- package/dist/src/eval-core/evaluation-job.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-job.js +112 -0
- package/dist/src/eval-core/evaluation-job.js.map +1 -0
- package/dist/src/eval-core/evaluation-reporting.d.ts +28 -0
- package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-reporting.js +123 -0
- package/dist/src/eval-core/evaluation-reporting.js.map +1 -0
- package/dist/src/eval-core/execution-strategy.d.ts +11 -0
- package/dist/src/eval-core/execution-strategy.d.ts.map +1 -0
- package/dist/src/eval-core/execution-strategy.js +121 -0
- package/dist/src/eval-core/execution-strategy.js.map +1 -0
- package/dist/src/eval-core/fact-checker.d.ts +25 -0
- package/dist/src/eval-core/fact-checker.d.ts.map +1 -0
- package/dist/src/eval-core/fact-checker.js +66 -0
- package/dist/src/eval-core/fact-checker.js.map +1 -0
- package/dist/src/eval-core/schema.d.ts +30 -0
- package/dist/src/eval-core/schema.d.ts.map +1 -0
- package/dist/src/eval-core/schema.js +195 -0
- package/dist/src/eval-core/schema.js.map +1 -0
- package/dist/src/eval-core/statistics.d.ts +86 -0
- package/dist/src/eval-core/statistics.d.ts.map +1 -0
- package/dist/src/eval-core/statistics.js +210 -0
- package/dist/src/eval-core/statistics.js.map +1 -0
- package/dist/src/eval-core/task-planner.d.ts +4 -0
- package/dist/src/eval-core/task-planner.d.ts.map +1 -0
- package/dist/src/eval-core/task-planner.js +33 -0
- package/dist/src/eval-core/task-planner.js.map +1 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +133 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.js +169 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -0
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts +38 -0
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -0
- package/dist/src/eval-workflows/evaluation-pipeline.js +214 -0
- package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -0
- package/dist/src/eval-workflows/evaluation-preparation.d.ts +64 -0
- package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -0
- package/dist/src/eval-workflows/evaluation-preparation.js +90 -0
- package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -0
- package/dist/src/eval-workflows/run-evaluation.d.ts +105 -0
- package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -0
- package/dist/src/eval-workflows/run-evaluation.js +264 -0
- package/dist/src/eval-workflows/run-evaluation.js.map +1 -0
- package/dist/src/executors/anthropic-api.d.ts +3 -0
- package/dist/src/executors/anthropic-api.d.ts.map +1 -0
- package/dist/src/executors/anthropic-api.js +43 -0
- package/dist/src/executors/anthropic-api.js.map +1 -0
- package/dist/src/executors/claude-cli.d.ts +3 -0
- package/dist/src/executors/claude-cli.d.ts.map +1 -0
- package/dist/src/executors/claude-cli.js +103 -0
- package/dist/src/executors/claude-cli.js.map +1 -0
- package/dist/src/executors/claude-sdk-trace.d.ts +10 -0
- package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -0
- package/dist/src/executors/claude-sdk-trace.js +100 -0
- package/dist/src/executors/claude-sdk-trace.js.map +1 -0
- package/dist/src/executors/claude-sdk.d.ts +3 -0
- package/dist/src/executors/claude-sdk.d.ts.map +1 -0
- package/dist/src/executors/claude-sdk.js +160 -0
- package/dist/src/executors/claude-sdk.js.map +1 -0
- package/dist/src/executors/gemini.d.ts +3 -0
- package/dist/src/executors/gemini.d.ts.map +1 -0
- package/dist/src/executors/gemini.js +78 -0
- package/dist/src/executors/gemini.js.map +1 -0
- package/dist/src/executors/index.d.ts +7 -0
- package/dist/src/executors/index.d.ts.map +1 -0
- package/dist/src/executors/index.js +22 -0
- package/dist/src/executors/index.js.map +1 -0
- package/dist/src/executors/openai-api.d.ts +3 -0
- package/dist/src/executors/openai-api.d.ts.map +1 -0
- package/dist/src/executors/openai-api.js +40 -0
- package/dist/src/executors/openai-api.js.map +1 -0
- package/dist/src/executors/openai-cli.d.ts +3 -0
- package/dist/src/executors/openai-cli.d.ts.map +1 -0
- package/dist/src/executors/openai-cli.js +60 -0
- package/dist/src/executors/openai-cli.js.map +1 -0
- package/dist/src/executors/script.d.ts +3 -0
- package/dist/src/executors/script.d.ts.map +1 -0
- package/dist/src/executors/script.js +63 -0
- package/dist/src/executors/script.js.map +1 -0
- package/dist/src/executors/shared.d.ts +117 -0
- package/dist/src/executors/shared.d.ts.map +1 -0
- package/dist/src/executors/shared.js +49 -0
- package/dist/src/executors/shared.js.map +1 -0
- package/dist/src/grading/assertions.d.ts +18 -0
- package/dist/src/grading/assertions.d.ts.map +1 -0
- package/dist/src/grading/assertions.js +239 -0
- package/dist/src/grading/assertions.js.map +1 -0
- package/dist/src/grading/index.d.ts +26 -0
- package/dist/src/grading/index.d.ts.map +1 -0
- package/dist/src/grading/index.js +98 -0
- package/dist/src/grading/index.js.map +1 -0
- package/dist/src/grading/judge.d.ts +13 -0
- package/dist/src/grading/judge.d.ts.map +1 -0
- package/dist/src/grading/judge.js +98 -0
- package/dist/src/grading/judge.js.map +1 -0
- package/dist/src/grading/layered-scores.d.ts +13 -0
- package/dist/src/grading/layered-scores.d.ts.map +1 -0
- package/dist/src/grading/layered-scores.js +62 -0
- package/dist/src/grading/layered-scores.js.map +1 -0
- package/dist/src/inputs/eval-config.d.ts +13 -0
- package/dist/src/inputs/eval-config.d.ts.map +1 -0
- package/dist/src/inputs/eval-config.js +136 -0
- package/dist/src/inputs/eval-config.js.map +1 -0
- package/dist/src/inputs/load-samples.d.ts +16 -0
- package/dist/src/inputs/load-samples.d.ts.map +1 -0
- package/dist/src/inputs/load-samples.js +51 -0
- package/dist/src/inputs/load-samples.js.map +1 -0
- package/dist/src/inputs/mcp-resolver.d.ts +50 -0
- package/dist/src/inputs/mcp-resolver.d.ts.map +1 -0
- package/dist/src/inputs/mcp-resolver.js +307 -0
- package/dist/src/inputs/mcp-resolver.js.map +1 -0
- package/dist/src/inputs/skill-loader.d.ts +18 -0
- package/dist/src/inputs/skill-loader.d.ts.map +1 -0
- package/dist/src/inputs/skill-loader.js +222 -0
- package/dist/src/inputs/skill-loader.js.map +1 -0
- package/dist/src/inputs/url-fetcher.d.ts +19 -0
- package/dist/src/inputs/url-fetcher.d.ts.map +1 -0
- package/dist/src/inputs/url-fetcher.js +241 -0
- package/dist/src/inputs/url-fetcher.js.map +1 -0
- package/dist/src/observability/production-analyzer.d.ts +61 -0
- package/dist/src/observability/production-analyzer.d.ts.map +1 -0
- package/dist/src/observability/production-analyzer.js +183 -0
- package/dist/src/observability/production-analyzer.js.map +1 -0
- package/dist/src/observability/trace-adapter.d.ts +75 -0
- package/dist/src/observability/trace-adapter.d.ts.map +1 -0
- package/dist/src/observability/trace-adapter.js +341 -0
- package/dist/src/observability/trace-adapter.js.map +1 -0
- package/dist/src/renderer/html-renderer.d.ts +9 -0
- package/dist/src/renderer/html-renderer.d.ts.map +1 -0
- package/dist/src/renderer/html-renderer.js +338 -0
- package/dist/src/renderer/html-renderer.js.map +1 -0
- package/dist/src/renderer/layout.d.ts +13 -0
- package/dist/src/renderer/layout.d.ts.map +1 -0
- package/dist/src/renderer/layout.js +476 -0
- package/dist/src/renderer/layout.js.map +1 -0
- package/dist/src/renderer/skill-health-renderer.d.ts +20 -0
- package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -0
- package/dist/src/renderer/skill-health-renderer.js +218 -0
- package/dist/src/renderer/skill-health-renderer.js.map +1 -0
- package/dist/src/renderer/summary.d.ts +21 -0
- package/dist/src/renderer/summary.d.ts.map +1 -0
- package/dist/src/renderer/summary.js +1072 -0
- package/dist/src/renderer/summary.js.map +1 -0
- package/dist/src/renderer/table.d.ts +3 -0
- package/dist/src/renderer/table.d.ts.map +1 -0
- package/dist/src/renderer/table.js +134 -0
- package/dist/src/renderer/table.js.map +1 -0
- package/dist/src/renderer/trends.d.ts +6 -0
- package/dist/src/renderer/trends.d.ts.map +1 -0
- package/dist/src/renderer/trends.js +127 -0
- package/dist/src/renderer/trends.js.map +1 -0
- package/dist/src/server/job-store.d.ts +4 -0
- package/dist/src/server/job-store.d.ts.map +1 -0
- package/dist/src/server/job-store.js +68 -0
- package/dist/src/server/job-store.js.map +1 -0
- package/dist/src/server/report-server.d.ts +16 -0
- package/dist/src/server/report-server.d.ts.map +1 -0
- package/dist/src/server/report-server.js +196 -0
- package/dist/src/server/report-server.js.map +1 -0
- package/dist/src/server/report-store.d.ts +44 -0
- package/dist/src/server/report-store.d.ts.map +1 -0
- package/dist/src/server/report-store.js +190 -0
- package/dist/src/server/report-store.js.map +1 -0
- package/dist/src/types.d.ts +553 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +44 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP-based URL resolver for eval-samples.
|
|
3
|
+
*
|
|
4
|
+
* Reads a MCP config file (.mcp.json), launches configured MCP servers,
|
|
5
|
+
* and uses them to fetch URL content that cannot be reached via plain HTTP
|
|
6
|
+
* (e.g. private documentation behind SSO).
|
|
7
|
+
*
|
|
8
|
+
* Config format (.mcp.json):
|
|
9
|
+
* {
|
|
10
|
+
* "mcpServers": {
|
|
11
|
+
* "docs": {
|
|
12
|
+
* "command": "npx",
|
|
13
|
+
* "args": ["@example/docs-mcp-server"],
|
|
14
|
+
* "env": { "DOCS_API_TOKEN": "xxx" },
|
|
15
|
+
* "urlPatterns": ["docs.example.com"],
|
|
16
|
+
* "fetchTool": { "name": "get_doc", "urlParam": "url" }
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* Advanced: urlTransform + contentExtract for complex MCP tools:
|
|
22
|
+
* {
|
|
23
|
+
* "fetchTool": {
|
|
24
|
+
* "name": "fetch_doc",
|
|
25
|
+
* "urlTransform": {
|
|
26
|
+
* "regex": "docs\\.example\\.com/([^/]+/[^/]+)/([^/?#]+)",
|
|
27
|
+
* "params": { "namespace": "$1", "slug": "$2" }
|
|
28
|
+
* },
|
|
29
|
+
* "contentExtract": "data.body"
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
34
|
+
import { resolve } from 'node:path';
|
|
35
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
36
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
37
|
+
import { isPlaceholderUrl } from './url-fetcher.js';
|
|
38
|
+
// Reuse the same URL regex from url-fetcher.mjs
|
|
39
|
+
const URL_REGEX = /https?:\/\/[A-Za-z0-9\-._~:/?#[\]@!$&'()*+,;=%]+/g;
|
|
40
|
+
const MCP_CALL_TIMEOUT_MS = 30_000;
|
|
41
|
+
/** Active MCP client connections — keyed by server name. */
|
|
42
|
+
const activeClients = new Map();
|
|
43
|
+
function isRecord(value) {
|
|
44
|
+
return typeof value === 'object' && value !== null;
|
|
45
|
+
}
|
|
46
|
+
function getErrorMessage(err) {
|
|
47
|
+
return err instanceof Error ? err.message : String(err);
|
|
48
|
+
}
|
|
49
|
+
function isMcpServerDef(value) {
|
|
50
|
+
if (!isRecord(value))
|
|
51
|
+
return false;
|
|
52
|
+
return typeof value.command === 'string'
|
|
53
|
+
&& Array.isArray(value.urlPatterns)
|
|
54
|
+
&& isRecord(value.fetchTool)
|
|
55
|
+
&& typeof value.fetchTool.name === 'string';
|
|
56
|
+
}
|
|
57
|
+
function asToolCallResult(value) {
|
|
58
|
+
return isRecord(value) ? value : {};
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Public API
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* Load MCP config from a JSON file.
|
|
65
|
+
* Returns only servers that declare `urlPatterns` + `fetchTool`.
|
|
66
|
+
* Returns null if file not found or no eligible servers.
|
|
67
|
+
*/
|
|
68
|
+
export function loadMcpConfig(configPath) {
|
|
69
|
+
const filePath = configPath ? resolve(configPath) : resolve('.mcp.json');
|
|
70
|
+
if (!existsSync(filePath))
|
|
71
|
+
return null;
|
|
72
|
+
let raw;
|
|
73
|
+
try {
|
|
74
|
+
raw = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
process.stderr.write(`⚠ MCP 配置文件解析失败: ${filePath}\n ${getErrorMessage(err)}\n`);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
if (!isRecord(raw))
|
|
81
|
+
return null;
|
|
82
|
+
const serverDefs = isRecord(raw.mcpServers) ? raw.mcpServers : isRecord(raw.servers) ? raw.servers : {};
|
|
83
|
+
const eligible = {};
|
|
84
|
+
for (const [name, def] of Object.entries(serverDefs)) {
|
|
85
|
+
if (isMcpServerDef(def) && def.urlPatterns.length > 0) {
|
|
86
|
+
eligible[name] = def;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (Object.keys(eligible).length === 0)
|
|
90
|
+
return null;
|
|
91
|
+
return eligible;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve URLs in samples via MCP servers.
|
|
95
|
+
* Mutates samples in-place — same contract as url-fetcher's resolveUrls().
|
|
96
|
+
*/
|
|
97
|
+
export async function resolveMcpUrls(samples, mcpServers) {
|
|
98
|
+
const resolved = new Set();
|
|
99
|
+
if (!mcpServers)
|
|
100
|
+
return resolved;
|
|
101
|
+
// 1. Collect unique URLs and track which sample/field they belong to
|
|
102
|
+
const urlMap = new Map(); // url -> [{sample, field}]
|
|
103
|
+
for (const sample of samples) {
|
|
104
|
+
for (const field of ['prompt', 'context']) {
|
|
105
|
+
const text = sample[field];
|
|
106
|
+
if (!text)
|
|
107
|
+
continue;
|
|
108
|
+
const matches = text.match(URL_REGEX);
|
|
109
|
+
if (!matches)
|
|
110
|
+
continue;
|
|
111
|
+
for (const url of matches) {
|
|
112
|
+
if (isPlaceholderUrl(url))
|
|
113
|
+
continue; // RFC 2606 placeholder domains are documentation-only
|
|
114
|
+
if (!urlMap.has(url))
|
|
115
|
+
urlMap.set(url, []);
|
|
116
|
+
urlMap.get(url).push({ sample, field });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (urlMap.size === 0)
|
|
121
|
+
return resolved;
|
|
122
|
+
// 2. Match URLs to MCP servers by urlPatterns
|
|
123
|
+
const serverUrlGroups = new Map(); // serverName -> [url]
|
|
124
|
+
const matchedUrls = new Set();
|
|
125
|
+
for (const url of urlMap.keys()) {
|
|
126
|
+
for (const [serverName, def] of Object.entries(mcpServers)) {
|
|
127
|
+
if (def.urlPatterns.some((pattern) => url.includes(pattern))) {
|
|
128
|
+
if (!serverUrlGroups.has(serverName))
|
|
129
|
+
serverUrlGroups.set(serverName, []);
|
|
130
|
+
serverUrlGroups.get(serverName).push(url);
|
|
131
|
+
matchedUrls.add(url);
|
|
132
|
+
break; // first match wins
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (matchedUrls.size === 0)
|
|
137
|
+
return resolved;
|
|
138
|
+
process.stderr.write(`ℹ MCP: ${matchedUrls.size} 个 URL 匹配到 MCP Server,正在获取内容:\n`);
|
|
139
|
+
for (const [serverName, urls] of serverUrlGroups) {
|
|
140
|
+
for (const url of urls) {
|
|
141
|
+
process.stderr.write(` - [${serverName}] ${url}\n`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// 3. Fetch content from each MCP server
|
|
145
|
+
const fetched = new Map(); // url -> { ok, content, error }
|
|
146
|
+
const fetchPromises = [];
|
|
147
|
+
for (const [serverName, urls] of serverUrlGroups) {
|
|
148
|
+
fetchPromises.push(fetchFromServer(serverName, mcpServers[serverName], urls, fetched));
|
|
149
|
+
}
|
|
150
|
+
await Promise.allSettled(fetchPromises);
|
|
151
|
+
// 4. Report failures
|
|
152
|
+
const failCount = [...fetched.values()].filter((r) => !r.ok).length;
|
|
153
|
+
for (const [url, result] of fetched) {
|
|
154
|
+
if (!result.ok) {
|
|
155
|
+
const affectedSamples = urlMap.get(url).map((r) => r.sample.sample_id);
|
|
156
|
+
const unique = [...new Set(affectedSamples)];
|
|
157
|
+
process.stderr.write(`\n✗ MCP 获取失败 (sample ${unique.map((id) => `"${id}"`).join(', ')}):\n` +
|
|
158
|
+
` URL: ${url}\n` +
|
|
159
|
+
` 错误: ${result.error}\n`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (failCount > 0) {
|
|
163
|
+
process.stderr.write(`\n⚠ ${failCount} 个 URL 通过 MCP 获取失败,将尝试 HTTP 回退\n\n`);
|
|
164
|
+
}
|
|
165
|
+
// 5. Inline successful results into samples
|
|
166
|
+
const successCount = [...fetched.values()].filter((r) => r.ok).length;
|
|
167
|
+
for (const [url, result] of fetched) {
|
|
168
|
+
if (!result.ok)
|
|
169
|
+
continue;
|
|
170
|
+
resolved.add(url);
|
|
171
|
+
const replacement = `${url}\n\n---\n${result.content}\n---`;
|
|
172
|
+
for (const { sample, field } of urlMap.get(url)) {
|
|
173
|
+
const current = typeof sample[field] === 'string' ? sample[field] : '';
|
|
174
|
+
sample[field] = current.replace(url, replacement);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (successCount > 0) {
|
|
178
|
+
process.stderr.write(`✓ MCP: 成功获取 ${successCount} 个 URL 的内容\n\n`);
|
|
179
|
+
}
|
|
180
|
+
return resolved;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Close all active MCP client connections.
|
|
184
|
+
* Should be called when the evaluation run finishes.
|
|
185
|
+
*/
|
|
186
|
+
export async function stopAllServers() {
|
|
187
|
+
const promises = [];
|
|
188
|
+
for (const [name, client] of activeClients) {
|
|
189
|
+
promises.push(client.close().catch((err) => {
|
|
190
|
+
process.stderr.write(`⚠ MCP server "${name}" 关闭异常: ${getErrorMessage(err)}\n`);
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
await Promise.allSettled(promises);
|
|
194
|
+
activeClients.clear();
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Internal helpers
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
/**
|
|
200
|
+
* Build tool arguments from a URL, using either simple urlParam or urlTransform.
|
|
201
|
+
* Returns null if urlTransform regex doesn't match.
|
|
202
|
+
*/
|
|
203
|
+
function buildToolArgs(fetchTool, url) {
|
|
204
|
+
if (fetchTool.urlTransform) {
|
|
205
|
+
const { regex, params } = fetchTool.urlTransform;
|
|
206
|
+
const match = url.match(new RegExp(regex));
|
|
207
|
+
if (!match)
|
|
208
|
+
return null;
|
|
209
|
+
const args = {};
|
|
210
|
+
for (const [key, template] of Object.entries(params)) {
|
|
211
|
+
args[key] = template.replace(/\$(\d+)/g, (_, i) => match[Number(i)] || '');
|
|
212
|
+
}
|
|
213
|
+
return args;
|
|
214
|
+
}
|
|
215
|
+
// Simple mode: pass URL as a single param
|
|
216
|
+
const urlParam = fetchTool.urlParam || 'url';
|
|
217
|
+
return { [urlParam]: url };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Extract content from MCP tool response text.
|
|
221
|
+
* If contentExtract is configured (e.g. "data.body"), parse JSON and traverse path.
|
|
222
|
+
* Falls back to raw text if extraction fails.
|
|
223
|
+
*/
|
|
224
|
+
function extractContent(rawText, contentExtract) {
|
|
225
|
+
if (!contentExtract)
|
|
226
|
+
return rawText;
|
|
227
|
+
try {
|
|
228
|
+
const json = JSON.parse(rawText);
|
|
229
|
+
const fields = contentExtract.split('.');
|
|
230
|
+
let value = json;
|
|
231
|
+
for (const field of fields) {
|
|
232
|
+
if (!isRecord(value)) {
|
|
233
|
+
value = undefined;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
value = value[field];
|
|
237
|
+
}
|
|
238
|
+
if (typeof value === 'string' && value.length > 0)
|
|
239
|
+
return value;
|
|
240
|
+
if (value != null && typeof value === 'object')
|
|
241
|
+
return JSON.stringify(value);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
}
|
|
245
|
+
return rawText;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Start an MCP server and return a connected Client.
|
|
249
|
+
*/
|
|
250
|
+
async function getOrStartClient(serverName, serverDef) {
|
|
251
|
+
if (activeClients.has(serverName))
|
|
252
|
+
return activeClients.get(serverName);
|
|
253
|
+
const { command, args = [], env = {} } = serverDef;
|
|
254
|
+
const transport = new StdioClientTransport({
|
|
255
|
+
command,
|
|
256
|
+
args,
|
|
257
|
+
env: { ...process.env, ...env },
|
|
258
|
+
});
|
|
259
|
+
const client = new Client({ name: `omk-${serverName}`, version: '1.0.0' }, { capabilities: {} });
|
|
260
|
+
await client.connect(transport);
|
|
261
|
+
activeClients.set(serverName, client);
|
|
262
|
+
return client;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Fetch a batch of URLs from a single MCP server.
|
|
266
|
+
*/
|
|
267
|
+
async function fetchFromServer(serverName, serverDef, urls, resultMap) {
|
|
268
|
+
let client;
|
|
269
|
+
try {
|
|
270
|
+
client = await getOrStartClient(serverName, serverDef);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
const msg = `MCP server "${serverName}" 启动失败: ${getErrorMessage(err)}`;
|
|
274
|
+
for (const url of urls) {
|
|
275
|
+
resultMap.set(url, { ok: false, error: msg });
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const { fetchTool } = serverDef;
|
|
280
|
+
const toolName = fetchTool.name;
|
|
281
|
+
const promises = urls.map(async (url) => {
|
|
282
|
+
try {
|
|
283
|
+
const toolArgs = buildToolArgs(fetchTool, url);
|
|
284
|
+
if (!toolArgs) {
|
|
285
|
+
resultMap.set(url, { ok: false, error: `URL 不匹配 urlTransform 正则: ${fetchTool.urlTransform?.regex}` });
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const result = await client.callTool({ name: toolName, arguments: toolArgs }, undefined, { timeout: MCP_CALL_TIMEOUT_MS });
|
|
289
|
+
const textParts = (asToolCallResult(result).content ?? [])
|
|
290
|
+
.filter((item) => item.type === 'text' && typeof item.text === 'string')
|
|
291
|
+
.map((item) => item.text);
|
|
292
|
+
if (textParts.length === 0) {
|
|
293
|
+
resultMap.set(url, { ok: false, error: 'MCP tool 返回了空内容' });
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
const rawContent = textParts.join('\n').trim();
|
|
297
|
+
const content = extractContent(rawContent, fetchTool.contentExtract);
|
|
298
|
+
resultMap.set(url, { ok: true, content });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
resultMap.set(url, { ok: false, error: `tool "${toolName}" 调用失败: ${getErrorMessage(err)}` });
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
await Promise.allSettled(promises);
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=mcp-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-resolver.js","sourceRoot":"","sources":["../../../src/inputs/mcp-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Artifact } from '../types.js';
|
|
2
|
+
export declare function discoverVariants(skillDir: string): string[];
|
|
3
|
+
export declare function discoverEachSkills(skillDir: string): Array<{
|
|
4
|
+
name: string;
|
|
5
|
+
skillPath: string;
|
|
6
|
+
samplesPath: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function loadSkills(skillDir: string, variants: string[]): Record<string, string | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Parse variant expression, extracting optional cwd suffix.
|
|
11
|
+
* Format: "name@/path/to/cwd" or just "name"
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseVariantCwd(variant: string): {
|
|
14
|
+
name: string;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function resolveArtifacts(skillDir: string, variants: string[]): Artifact[];
|
|
18
|
+
//# sourceMappingURL=skill-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../../src/inputs/skill-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0C5C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB3D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAuCpH;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAE9F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAI/E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CA2GjF"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { resolve, join, relative } from 'node:path';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
function parseFrontmatterPreflight(content) {
|
|
5
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
6
|
+
if (!match)
|
|
7
|
+
return undefined;
|
|
8
|
+
const frontmatter = match[1];
|
|
9
|
+
// 解析 preflight 列表:支持 YAML 数组格式
|
|
10
|
+
// preflight:
|
|
11
|
+
// - cmd1
|
|
12
|
+
// - cmd2
|
|
13
|
+
const preflightMatch = frontmatter.match(/^preflight:\s*\r?\n((?:\s+-\s+.+\r?\n?)+)/m);
|
|
14
|
+
if (preflightMatch) {
|
|
15
|
+
const items = preflightMatch[1].match(/^\s+-\s+(.+)$/gm);
|
|
16
|
+
if (items)
|
|
17
|
+
return items.map(line => line.replace(/^\s+-\s+/, '').trim()).filter(Boolean);
|
|
18
|
+
}
|
|
19
|
+
// 单行格式:preflight: ["cmd1", "cmd2"]
|
|
20
|
+
const inlineMatch = frontmatter.match(/^preflight:\s*\[([^\]]+)\]/m);
|
|
21
|
+
if (inlineMatch) {
|
|
22
|
+
return inlineMatch[1].split(',').map(s => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
function buildMetadata(content) {
|
|
27
|
+
const preflight = parseFrontmatterPreflight(content);
|
|
28
|
+
if (!preflight || preflight.length === 0)
|
|
29
|
+
return undefined;
|
|
30
|
+
return { preflight };
|
|
31
|
+
}
|
|
32
|
+
function gitShowFile(ref, filePath) {
|
|
33
|
+
try {
|
|
34
|
+
return execFileSync('git', ['show', `${ref}:${filePath}`], { encoding: 'utf-8' }).trim();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getGitRelativePath(absolutePath) {
|
|
41
|
+
const gitRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf-8' }).trim();
|
|
42
|
+
return relative(gitRoot, absolutePath);
|
|
43
|
+
}
|
|
44
|
+
export function discoverVariants(skillDir) {
|
|
45
|
+
if (!existsSync(skillDir))
|
|
46
|
+
return [];
|
|
47
|
+
const entries = readdirSync(skillDir);
|
|
48
|
+
const variants = [];
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
if (entry.endsWith('.md')) {
|
|
51
|
+
variants.push(entry.slice(0, -3));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const entryPath = join(skillDir, entry);
|
|
55
|
+
const skillMd = join(entryPath, 'SKILL.md');
|
|
56
|
+
if (statSync(entryPath).isDirectory() && existsSync(skillMd)) {
|
|
57
|
+
variants.push(entry);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
variants.sort();
|
|
61
|
+
if (variants.length === 1) {
|
|
62
|
+
variants.unshift('baseline');
|
|
63
|
+
}
|
|
64
|
+
return variants;
|
|
65
|
+
}
|
|
66
|
+
export function discoverEachSkills(skillDir) {
|
|
67
|
+
if (!existsSync(skillDir))
|
|
68
|
+
return [];
|
|
69
|
+
const entries = readdirSync(skillDir);
|
|
70
|
+
const skills = [];
|
|
71
|
+
const warned = [];
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
const entryPath = join(skillDir, entry);
|
|
74
|
+
const mdMatch = entry.endsWith('.md') && !entry.endsWith('.eval-samples.json');
|
|
75
|
+
if (mdMatch) {
|
|
76
|
+
const name = entry.slice(0, -3);
|
|
77
|
+
const samplesPath = join(skillDir, `${name}.eval-samples.json`);
|
|
78
|
+
if (existsSync(samplesPath)) {
|
|
79
|
+
skills.push({ name, skillPath: join(skillDir, entry), samplesPath });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
warned.push(name);
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (statSync(entryPath).isDirectory()) {
|
|
87
|
+
const skillMd = join(entryPath, 'SKILL.md');
|
|
88
|
+
const samplesPath = join(entryPath, 'eval-samples.json');
|
|
89
|
+
if (existsSync(skillMd) && existsSync(samplesPath)) {
|
|
90
|
+
skills.push({ name: entry, skillPath: skillMd, samplesPath });
|
|
91
|
+
}
|
|
92
|
+
else if (existsSync(skillMd)) {
|
|
93
|
+
warned.push(entry);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const name of warned) {
|
|
98
|
+
process.stderr.write(`⚠️ 跳过 ${name}:未找到配对的 eval-samples\n`);
|
|
99
|
+
}
|
|
100
|
+
skills.sort((a, b) => a.name.localeCompare(b.name));
|
|
101
|
+
return skills;
|
|
102
|
+
}
|
|
103
|
+
export function loadSkills(skillDir, variants) {
|
|
104
|
+
return Object.fromEntries(resolveArtifacts(skillDir, variants).map((artifact) => [artifact.name, artifact.content]));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Parse variant expression, extracting optional cwd suffix.
|
|
108
|
+
* Format: "name@/path/to/cwd" or just "name"
|
|
109
|
+
*/
|
|
110
|
+
export function parseVariantCwd(variant) {
|
|
111
|
+
const atIdx = variant.indexOf('@');
|
|
112
|
+
if (atIdx === -1)
|
|
113
|
+
return { name: variant };
|
|
114
|
+
return { name: variant.slice(0, atIdx), cwd: variant.slice(atIdx + 1) };
|
|
115
|
+
}
|
|
116
|
+
export function resolveArtifacts(skillDir, variants) {
|
|
117
|
+
const artifacts = [];
|
|
118
|
+
let gitRelDir = null;
|
|
119
|
+
for (const rawVariant of variants) {
|
|
120
|
+
const { name: variantName, cwd: variantCwd } = parseVariantCwd(rawVariant);
|
|
121
|
+
if (variantName === 'baseline' && variantCwd) {
|
|
122
|
+
throw new Error('baseline 不能绑定 cwd。若要表达项目级 runtime context,请使用自定义标签,例如 project-env@/path/to/project');
|
|
123
|
+
}
|
|
124
|
+
if (variantName === 'baseline') {
|
|
125
|
+
artifacts.push({
|
|
126
|
+
name: variantName,
|
|
127
|
+
kind: 'baseline',
|
|
128
|
+
source: 'baseline',
|
|
129
|
+
content: null,
|
|
130
|
+
cwd: variantCwd,
|
|
131
|
+
});
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (variantName.startsWith('git:')) {
|
|
135
|
+
const parts = variantName.slice(4).split(':');
|
|
136
|
+
let ref;
|
|
137
|
+
let name;
|
|
138
|
+
if (parts.length === 1) {
|
|
139
|
+
ref = 'HEAD';
|
|
140
|
+
name = parts[0];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
ref = parts[0];
|
|
144
|
+
name = parts.slice(1).join(':');
|
|
145
|
+
}
|
|
146
|
+
if (!gitRelDir)
|
|
147
|
+
gitRelDir = getGitRelativePath(skillDir);
|
|
148
|
+
const content = gitShowFile(ref, join(gitRelDir, `${name}.md`))
|
|
149
|
+
|| gitShowFile(ref, join(gitRelDir, name, 'SKILL.md'));
|
|
150
|
+
if (!content) {
|
|
151
|
+
throw new Error(`skill 在 git ${ref} 中未找到: ${name}.md 或 ${name}/SKILL.md`);
|
|
152
|
+
}
|
|
153
|
+
artifacts.push({
|
|
154
|
+
name: variantName,
|
|
155
|
+
kind: 'skill',
|
|
156
|
+
source: 'git',
|
|
157
|
+
content,
|
|
158
|
+
locator: name,
|
|
159
|
+
ref,
|
|
160
|
+
cwd: variantCwd,
|
|
161
|
+
});
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (variantName.includes('/')) {
|
|
165
|
+
const filePath = resolve(variantName);
|
|
166
|
+
if (!existsSync(filePath)) {
|
|
167
|
+
throw new Error(`skill 文件未找到: ${filePath}`);
|
|
168
|
+
}
|
|
169
|
+
const content = readFileSync(filePath, 'utf-8').trim();
|
|
170
|
+
artifacts.push({
|
|
171
|
+
name: variantName,
|
|
172
|
+
kind: 'skill',
|
|
173
|
+
source: 'file-path',
|
|
174
|
+
content,
|
|
175
|
+
locator: filePath,
|
|
176
|
+
cwd: variantCwd,
|
|
177
|
+
metadata: buildMetadata(content),
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const mdPath = join(skillDir, `${variantName}.md`);
|
|
182
|
+
const dirSkillPath = join(skillDir, variantName, 'SKILL.md');
|
|
183
|
+
if (existsSync(mdPath)) {
|
|
184
|
+
const content = readFileSync(mdPath, 'utf-8').trim();
|
|
185
|
+
artifacts.push({
|
|
186
|
+
name: variantName,
|
|
187
|
+
kind: 'skill',
|
|
188
|
+
source: 'variant-name',
|
|
189
|
+
content,
|
|
190
|
+
locator: mdPath,
|
|
191
|
+
cwd: variantCwd,
|
|
192
|
+
metadata: buildMetadata(content),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (existsSync(dirSkillPath)) {
|
|
196
|
+
const content = readFileSync(dirSkillPath, 'utf-8').trim();
|
|
197
|
+
artifacts.push({
|
|
198
|
+
name: variantName,
|
|
199
|
+
kind: 'skill',
|
|
200
|
+
source: 'variant-name',
|
|
201
|
+
content,
|
|
202
|
+
locator: dirSkillPath,
|
|
203
|
+
cwd: variantCwd,
|
|
204
|
+
metadata: buildMetadata(content),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else if (variantCwd) {
|
|
208
|
+
artifacts.push({
|
|
209
|
+
name: variantName,
|
|
210
|
+
kind: 'baseline',
|
|
211
|
+
source: 'custom',
|
|
212
|
+
content: null,
|
|
213
|
+
cwd: variantCwd,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
throw new Error(`skill 未找到: ${mdPath} 或 ${dirSkillPath}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return artifacts;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=skill-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../../src/inputs/skill-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL content fetcher for eval-samples.
|
|
3
|
+
*
|
|
4
|
+
* Scans sample prompts/contexts for URLs, fetches their content,
|
|
5
|
+
* and inlines the text back into the sample fields.
|
|
6
|
+
*
|
|
7
|
+
* If a URL requires authentication, ensure the CLI environment can access it
|
|
8
|
+
* (e.g., via VPN, proxy, cookies) before running the evaluation.
|
|
9
|
+
*/
|
|
10
|
+
import type { Sample } from '../types.js';
|
|
11
|
+
export declare function isPlaceholderUrl(url: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve all URLs found in sample prompts and contexts.
|
|
14
|
+
* Mutates samples in-place: each URL is replaced with URL + fetched content.
|
|
15
|
+
*
|
|
16
|
+
* @param skipUrls - URLs already resolved (e.g. by MCP), will be skipped
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveUrls(samples: Sample[], skipUrls?: Set<string>): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=url-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../../src/inputs/url-fetcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAW1C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAqBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE1F"}
|