feiguazhitou-mcp-cli 0.1.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 +260 -0
- package/USER-GUIDE.md +139 -0
- package/dist/agent-guide.js +278 -0
- package/dist/agent-guide.js.map +1 -0
- package/dist/cli-error.js +30 -0
- package/dist/cli-error.js.map +1 -0
- package/dist/cli.js +952 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.js +42 -0
- package/dist/constants.js.map +1 -0
- package/dist/fs-utils.js +40 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/i18n.js +9 -0
- package/dist/i18n.js.map +1 -0
- package/dist/lease-lock.js +57 -0
- package/dist/lease-lock.js.map +1 -0
- package/dist/mcporter.js +249 -0
- package/dist/mcporter.js.map +1 -0
- package/dist/profile.js +262 -0
- package/dist/profile.js.map +1 -0
- package/dist/refresh.js +180 -0
- package/dist/refresh.js.map +1 -0
- package/dist/schema.js +39 -0
- package/dist/schema.js.map +1 -0
- package/dist/skills.js +139 -0
- package/dist/skills.js.map +1 -0
- package/dist/tool-catalog.js +126 -0
- package/dist/tool-catalog.js.map +1 -0
- package/package.json +42 -0
- package/skills/feiguazhitou-mcp-cli/SKILL.en.md +99 -0
- package/skills/feiguazhitou-mcp-cli/SKILL.md +130 -0
- package/skills/feiguazhitou-mcp-cli/skill.en.json +39 -0
- package/skills/feiguazhitou-mcp-cli/skill.json +39 -0
package/dist/profile.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DEFAULT_ENDPOINT, DEFAULT_TIMEOUT_MS, ENV, MAX_TIMEOUT_MS, defaultDataDirectory } from "./constants.js";
|
|
4
|
+
import { ensureDirectory, readJson, writeJsonAtomic } from "./fs-utils.js";
|
|
5
|
+
import { t } from "./i18n.js";
|
|
6
|
+
export function normalizeProfileName(value) {
|
|
7
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(value)) {
|
|
8
|
+
throw new Error(t("内部存储名称只能使用字母、数字、点、下划线或连字符。", "Internal storage names must use letters, digits, dots, underscores, or hyphens."));
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function profilePaths(profile, dataDirectory = defaultDataDirectory()) {
|
|
13
|
+
const profileDirectory = path.join(path.resolve(dataDirectory), "profiles", normalizeProfileName(profile));
|
|
14
|
+
return {
|
|
15
|
+
baseDirectory: path.resolve(dataDirectory),
|
|
16
|
+
profileDirectory,
|
|
17
|
+
configPath: path.join(profileDirectory, "config.json"),
|
|
18
|
+
credentialsPath: path.join(profileDirectory, "credentials.json"),
|
|
19
|
+
statePath: path.join(profileDirectory, "state.json"),
|
|
20
|
+
generatedDirectory: path.join(profileDirectory, "generated"),
|
|
21
|
+
locksDirectory: path.join(profileDirectory, "locks"),
|
|
22
|
+
mcporterConfigPath: path.join(profileDirectory, "mcporter-runtime-config.json"),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export async function ensureProfileDirectories(paths) {
|
|
26
|
+
await Promise.all([
|
|
27
|
+
ensureDirectory(paths.profileDirectory),
|
|
28
|
+
ensureDirectory(paths.generatedDirectory),
|
|
29
|
+
ensureDirectory(paths.locksDirectory),
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
export async function loadProfileConfig(paths) {
|
|
33
|
+
return await readJson(paths.configPath, {});
|
|
34
|
+
}
|
|
35
|
+
export async function saveProfileConfig(paths, config) {
|
|
36
|
+
await writeJsonAtomic(paths.configPath, config);
|
|
37
|
+
}
|
|
38
|
+
function setHeader(headers, name, value) {
|
|
39
|
+
const existing = Object.keys(headers).find((key) => key.toLowerCase() === name.toLowerCase());
|
|
40
|
+
if (existing) {
|
|
41
|
+
delete headers[existing];
|
|
42
|
+
}
|
|
43
|
+
headers[name] = value;
|
|
44
|
+
}
|
|
45
|
+
function normalizeCredentialHeaders(value) {
|
|
46
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
47
|
+
throw new Error(t("本地凭据文件中的 headers 必须是字符串值的对象。", "The local credential file headers must be an object of string values."));
|
|
48
|
+
}
|
|
49
|
+
const headers = {};
|
|
50
|
+
for (const [name, headerValue] of Object.entries(value)) {
|
|
51
|
+
if (!name.trim() || typeof headerValue !== "string") {
|
|
52
|
+
throw new Error(t("本地凭据文件中的 Header 名和值必须是非空字符串。", "Local credential file header names and values must be non-empty strings."));
|
|
53
|
+
}
|
|
54
|
+
setHeader(headers, name, headerValue);
|
|
55
|
+
}
|
|
56
|
+
return headers;
|
|
57
|
+
}
|
|
58
|
+
export async function loadProfileCredentials(paths) {
|
|
59
|
+
const raw = await readJson(paths.credentialsPath, undefined);
|
|
60
|
+
if (raw === undefined) {
|
|
61
|
+
return { version: 1, headers: {} };
|
|
62
|
+
}
|
|
63
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw) || raw.version !== 1) {
|
|
64
|
+
throw new Error(t("本地凭据文件格式无效。", "The local credential file has an invalid format."));
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
version: 1,
|
|
68
|
+
headers: normalizeCredentialHeaders(raw.headers),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export async function saveProfileCredentials(paths, headers) {
|
|
72
|
+
const credentials = {
|
|
73
|
+
version: 1,
|
|
74
|
+
headers: normalizeCredentialHeaders(headers),
|
|
75
|
+
};
|
|
76
|
+
await writeJsonAtomic(paths.credentialsPath, credentials, { mode: 0o600 });
|
|
77
|
+
return credentials;
|
|
78
|
+
}
|
|
79
|
+
export async function setProfileCredentialHeader(paths, header, value) {
|
|
80
|
+
if (!header.trim()) {
|
|
81
|
+
throw new Error(t("需要提供非空 Header 名。", "A non-empty header name is required."));
|
|
82
|
+
}
|
|
83
|
+
const credentials = await loadProfileCredentials(paths);
|
|
84
|
+
setHeader(credentials.headers, header, value);
|
|
85
|
+
return await saveProfileCredentials(paths, credentials.headers);
|
|
86
|
+
}
|
|
87
|
+
export async function removeProfileCredentialHeader(paths, header) {
|
|
88
|
+
if (!header.trim()) {
|
|
89
|
+
throw new Error(t("需要提供非空 Header 名。", "A non-empty header name is required."));
|
|
90
|
+
}
|
|
91
|
+
const credentials = await loadProfileCredentials(paths);
|
|
92
|
+
const existing = Object.keys(credentials.headers).find((name) => name.toLowerCase() === header.toLowerCase());
|
|
93
|
+
if (!existing) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
delete credentials.headers[existing];
|
|
97
|
+
await saveProfileCredentials(paths, credentials.headers);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
function parseRuntimeHeaders(raw) {
|
|
101
|
+
if (!raw) {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
let parsed;
|
|
105
|
+
try {
|
|
106
|
+
parsed = JSON.parse(raw);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
throw new Error(t(`${ENV.headers} 必须是一个将 HTTP Header 名映射到字符串值的 JSON 对象。`, `${ENV.headers} must be a JSON object of HTTP header names to string values.`));
|
|
110
|
+
}
|
|
111
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
112
|
+
throw new Error(t(`${ENV.headers} 必须是一个将 HTTP Header 名映射到字符串值的 JSON 对象。`, `${ENV.headers} must be a JSON object of HTTP header names to string values.`));
|
|
113
|
+
}
|
|
114
|
+
const headers = {};
|
|
115
|
+
for (const [name, value] of Object.entries(parsed)) {
|
|
116
|
+
if (typeof value !== "string") {
|
|
117
|
+
throw new Error(t(`${ENV.headers} 中 '${name}' 的值必须是字符串。`, `${ENV.headers} value for '${name}' must be a string.`));
|
|
118
|
+
}
|
|
119
|
+
setHeader(headers, name, value);
|
|
120
|
+
}
|
|
121
|
+
return headers;
|
|
122
|
+
}
|
|
123
|
+
function parseAutoApprove(raw) {
|
|
124
|
+
if (!raw) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
let parsed;
|
|
128
|
+
try {
|
|
129
|
+
parsed = JSON.parse(raw);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
throw new Error(t(`${ENV.autoApprove} 必须是由非空 MCP 工具名或生成 command 名组成的 JSON 数组。`, `${ENV.autoApprove} must be a JSON array of non-empty MCP tool or generated command names.`));
|
|
133
|
+
}
|
|
134
|
+
if (!Array.isArray(parsed) || !parsed.every((value) => typeof value === "string" && value.trim())) {
|
|
135
|
+
throw new Error(t(`${ENV.autoApprove} 必须是由非空 MCP 工具名或生成 command 名组成的 JSON 数组。`, `${ENV.autoApprove} must be a JSON array of non-empty MCP tool or generated command names.`));
|
|
136
|
+
}
|
|
137
|
+
return [...new Set(parsed.map((value) => value.trim()))];
|
|
138
|
+
}
|
|
139
|
+
function resolveTimeout(value) {
|
|
140
|
+
const timeout = Number(value ?? DEFAULT_TIMEOUT_MS);
|
|
141
|
+
if (!Number.isInteger(timeout) || timeout <= 0 || timeout > MAX_TIMEOUT_MS) {
|
|
142
|
+
throw new Error(t(`MCP 超时必须是 1 到 ${MAX_TIMEOUT_MS} 毫秒之间的整数。`, `MCP timeout must be an integer between 1 and ${MAX_TIMEOUT_MS} milliseconds.`));
|
|
143
|
+
}
|
|
144
|
+
return timeout;
|
|
145
|
+
}
|
|
146
|
+
function validateEndpoint(value) {
|
|
147
|
+
const url = new URL(value);
|
|
148
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
149
|
+
throw new Error(t("此 PoC 仅支持 http:// 和 https:// MCP endpoint。", "Only http:// and https:// MCP endpoints are supported by this PoC."));
|
|
150
|
+
}
|
|
151
|
+
return url.toString();
|
|
152
|
+
}
|
|
153
|
+
export async function resolveProfile(profile, options = {}) {
|
|
154
|
+
const paths = profilePaths(profile, options.dataDirectory);
|
|
155
|
+
await ensureProfileDirectories(paths);
|
|
156
|
+
const config = await loadProfileConfig(paths);
|
|
157
|
+
const credentials = await loadProfileCredentials(paths);
|
|
158
|
+
const endpoint = validateEndpoint(options.endpoint ?? process.env[ENV.endpoint] ?? config.endpoint ?? DEFAULT_ENDPOINT);
|
|
159
|
+
const headers = { ...credentials.headers };
|
|
160
|
+
for (const [name, reference] of Object.entries(config.headers ?? {})) {
|
|
161
|
+
const rawValue = process.env[reference.env];
|
|
162
|
+
if (!rawValue) {
|
|
163
|
+
throw new Error(t(`Header '${name}' 需要环境变量 ${reference.env}。`, `Header '${name}' requires environment variable ${reference.env}.`));
|
|
164
|
+
}
|
|
165
|
+
setHeader(headers, name, `${reference.prefix ?? ""}${rawValue}`);
|
|
166
|
+
}
|
|
167
|
+
const apiKey = process.env[ENV.apiKey];
|
|
168
|
+
if (apiKey) {
|
|
169
|
+
setHeader(headers, "api_key", apiKey);
|
|
170
|
+
}
|
|
171
|
+
for (const [name, value] of Object.entries(parseRuntimeHeaders(process.env[ENV.headers]))) {
|
|
172
|
+
setHeader(headers, name, value);
|
|
173
|
+
}
|
|
174
|
+
const token = process.env[config.tokenEnv ?? ENV.token];
|
|
175
|
+
if (token && !Object.keys(headers).some((name) => name.toLowerCase() === "authorization")) {
|
|
176
|
+
setHeader(headers, "Authorization", `Bearer ${token}`);
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
profile: normalizeProfileName(profile),
|
|
180
|
+
paths,
|
|
181
|
+
config,
|
|
182
|
+
endpoint,
|
|
183
|
+
timeoutMs: resolveTimeout(process.env[ENV.timeout] ?? config.timeoutMs),
|
|
184
|
+
headers,
|
|
185
|
+
storedCredentialHeaderNames: Object.keys(credentials.headers).sort((left, right) => left.localeCompare(right)),
|
|
186
|
+
autoApprove: parseAutoApprove(process.env[ENV.autoApprove]),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
export function createHeaderBindings(profile, headers) {
|
|
190
|
+
const bindings = {};
|
|
191
|
+
const environment = {};
|
|
192
|
+
for (const name of Object.keys(headers).sort((left, right) => left.localeCompare(right))) {
|
|
193
|
+
const digest = createHash("sha256").update(`${profile}\u0000${name.toLowerCase()}`).digest("hex").slice(0, 20).toUpperCase();
|
|
194
|
+
const variable = `FEIGUAZHITOU_CLI_HEADER_${digest}`;
|
|
195
|
+
bindings[name] = variable;
|
|
196
|
+
environment[variable] = headers[name];
|
|
197
|
+
}
|
|
198
|
+
return { bindings, environment };
|
|
199
|
+
}
|
|
200
|
+
export function headerShapeHash(bindings) {
|
|
201
|
+
const normalized = Object.keys(bindings)
|
|
202
|
+
.map((name) => name.toLowerCase())
|
|
203
|
+
.sort();
|
|
204
|
+
return createHash("sha256").update(JSON.stringify(normalized)).digest("hex").slice(0, 12);
|
|
205
|
+
}
|
|
206
|
+
export async function setProfileEndpoint(paths, endpoint) {
|
|
207
|
+
const config = await loadProfileConfig(paths);
|
|
208
|
+
config.endpoint = validateEndpoint(endpoint);
|
|
209
|
+
await saveProfileConfig(paths, config);
|
|
210
|
+
return config;
|
|
211
|
+
}
|
|
212
|
+
export async function setProfileHeaderEnvironment(paths, header, env) {
|
|
213
|
+
if (!header.trim() || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(env)) {
|
|
214
|
+
throw new Error(t("需要提供 Header 名和环境变量名。", "Header name and environment variable name are required."));
|
|
215
|
+
}
|
|
216
|
+
const config = await loadProfileConfig(paths);
|
|
217
|
+
const headers = { ...(config.headers ?? {}) };
|
|
218
|
+
const existing = Object.keys(headers).find((name) => name.toLowerCase() === header.toLowerCase());
|
|
219
|
+
if (existing) {
|
|
220
|
+
delete headers[existing];
|
|
221
|
+
}
|
|
222
|
+
headers[header] = { env };
|
|
223
|
+
config.headers = headers;
|
|
224
|
+
await saveProfileConfig(paths, config);
|
|
225
|
+
return config;
|
|
226
|
+
}
|
|
227
|
+
export async function removeProfileHeaderEnvironment(paths, header) {
|
|
228
|
+
if (!header.trim()) {
|
|
229
|
+
throw new Error(t("需要提供非空 Header 名。", "A non-empty header name is required."));
|
|
230
|
+
}
|
|
231
|
+
const config = await loadProfileConfig(paths);
|
|
232
|
+
const headers = { ...(config.headers ?? {}) };
|
|
233
|
+
const existing = Object.keys(headers).find((name) => name.toLowerCase() === header.toLowerCase());
|
|
234
|
+
if (!existing) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
delete headers[existing];
|
|
238
|
+
if (Object.keys(headers).length === 0) {
|
|
239
|
+
delete config.headers;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
config.headers = headers;
|
|
243
|
+
}
|
|
244
|
+
await saveProfileConfig(paths, config);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
export async function setProfileTokenEnvironment(paths, env) {
|
|
248
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(env)) {
|
|
249
|
+
throw new Error(t("Token 环境变量名必须是有效的环境变量标识符。", "Token environment variable names must be valid environment identifiers."));
|
|
250
|
+
}
|
|
251
|
+
const config = await loadProfileConfig(paths);
|
|
252
|
+
config.tokenEnv = env;
|
|
253
|
+
await saveProfileConfig(paths, config);
|
|
254
|
+
return config;
|
|
255
|
+
}
|
|
256
|
+
export async function setProfileTimeout(paths, timeout) {
|
|
257
|
+
const config = await loadProfileConfig(paths);
|
|
258
|
+
config.timeoutMs = resolveTimeout(timeout);
|
|
259
|
+
await saveProfileConfig(paths, config);
|
|
260
|
+
return config;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/refresh.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { GENERATED_FAILURE_EXIT_POLICY_VERSION, LAUNCHER_VERSION } from "./constants.js";
|
|
5
|
+
import { exists, readJson, writeJsonAtomic } from "./fs-utils.js";
|
|
6
|
+
import { t } from "./i18n.js";
|
|
7
|
+
import { withProfileLease } from "./lease-lock.js";
|
|
8
|
+
import { discoverWithMcporter, emitMCPorterTemplate, injectFailureExitPolicy, injectRuntimeEndpoint, mcporterDetails, smokeTestGeneratedCli, } from "./mcporter.js";
|
|
9
|
+
import { createHeaderBindings, headerShapeHash } from "./profile.js";
|
|
10
|
+
import { schemaFingerprint } from "./schema.js";
|
|
11
|
+
function stateDefault(profile) {
|
|
12
|
+
return { version: 1, profile: profile.profile };
|
|
13
|
+
}
|
|
14
|
+
function artifactDirectory(profile, artifactId) {
|
|
15
|
+
return path.join(profile.paths.generatedDirectory, artifactId);
|
|
16
|
+
}
|
|
17
|
+
function artifactPaths(profile, artifactId) {
|
|
18
|
+
const directory = artifactDirectory(profile, artifactId);
|
|
19
|
+
return {
|
|
20
|
+
directory,
|
|
21
|
+
source: path.join(directory, "cli.ts"),
|
|
22
|
+
bundle: path.join(directory, "cli.mjs"),
|
|
23
|
+
manifest: path.join(directory, "manifest.json"),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function endpointFingerprint(endpoint) {
|
|
27
|
+
return createHash("sha256").update(endpoint).digest("hex");
|
|
28
|
+
}
|
|
29
|
+
async function artifactIsUsable(profile, artifactId) {
|
|
30
|
+
return Boolean(artifactId && (await exists(artifactPaths(profile, artifactId).bundle)));
|
|
31
|
+
}
|
|
32
|
+
function sameBindingShape(left, right) {
|
|
33
|
+
const normalize = (value) => Object.keys(value)
|
|
34
|
+
.map((name) => name.toLowerCase())
|
|
35
|
+
.sort()
|
|
36
|
+
.join("\u0000");
|
|
37
|
+
return normalize(left) === normalize(right);
|
|
38
|
+
}
|
|
39
|
+
async function readManifest(profile, artifactId) {
|
|
40
|
+
return await readJson(artifactPaths(profile, artifactId).manifest, undefined);
|
|
41
|
+
}
|
|
42
|
+
async function verifyNoSecrets(bundlePath, secrets) {
|
|
43
|
+
const artifact = await readFile(bundlePath, "utf8");
|
|
44
|
+
for (const secret of secrets) {
|
|
45
|
+
if (secret.length >= 4 && artifact.includes(secret)) {
|
|
46
|
+
throw new Error(t("生成的 CLI 包含运行时凭据值;已在激活前中止生成。", "Generated CLI contains a runtime credential value; generation was aborted before activation."));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function refreshProfile(profile, force = false) {
|
|
51
|
+
return await withProfileLease(profile.paths.locksDirectory, async () => {
|
|
52
|
+
const state = await readJson(profile.paths.statePath, stateDefault(profile));
|
|
53
|
+
const bindings = createHeaderBindings(profile.profile, profile.headers);
|
|
54
|
+
let discovery;
|
|
55
|
+
let fingerprint;
|
|
56
|
+
try {
|
|
57
|
+
discovery = await discoverWithMcporter(profile, bindings);
|
|
58
|
+
fingerprint = schemaFingerprint(discovery.tools);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
state.lastCheckedAt = new Date().toISOString();
|
|
63
|
+
state.lastError = message;
|
|
64
|
+
await writeJsonAtomic(profile.paths.statePath, state);
|
|
65
|
+
if (await artifactIsUsable(profile, state.currentArtifactId)) {
|
|
66
|
+
return {
|
|
67
|
+
status: "fallback",
|
|
68
|
+
schemaHash: state.currentSchemaHash ?? "unavailable",
|
|
69
|
+
artifactId: state.currentArtifactId,
|
|
70
|
+
message: t(`schema 发现失败;使用之前的生成 CLI ${state.currentArtifactId}:${message}`, `schema discovery failed; using previous generated CLI ${state.currentArtifactId}: ${message}`),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
throw new Error(t(`Schema 发现失败,且没有可用的旧 CLI:${message}`, `Schema discovery failed and no previous CLI is available: ${message}`));
|
|
74
|
+
}
|
|
75
|
+
const shape = headerShapeHash(bindings.bindings);
|
|
76
|
+
const baseArtifactId = `${fingerprint.hash}-${shape}-t${profile.timeoutMs}-p${GENERATED_FAILURE_EXIT_POLICY_VERSION}`;
|
|
77
|
+
if (!force && (await artifactIsUsable(profile, state.currentArtifactId)) && state.currentSchemaHash === fingerprint.hash) {
|
|
78
|
+
const currentManifest = await readManifest(profile, state.currentArtifactId);
|
|
79
|
+
if (currentManifest.timeoutMs === profile.timeoutMs &&
|
|
80
|
+
currentManifest.failureExitPolicyVersion === GENERATED_FAILURE_EXIT_POLICY_VERSION &&
|
|
81
|
+
sameBindingShape(currentManifest.headerBindings, bindings.bindings)) {
|
|
82
|
+
state.lastCheckedAt = new Date().toISOString();
|
|
83
|
+
state.lastError = undefined;
|
|
84
|
+
await writeJsonAtomic(profile.paths.statePath, state);
|
|
85
|
+
return {
|
|
86
|
+
status: "cached",
|
|
87
|
+
schemaHash: fingerprint.hash,
|
|
88
|
+
artifactId: state.currentArtifactId,
|
|
89
|
+
message: t(`schema 未变化;使用缓存产物 ${state.currentArtifactId}`, `schema unchanged; using cached artifact ${state.currentArtifactId}`),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const artifactId = force ? `${baseArtifactId}-forced-${Date.now()}` : baseArtifactId;
|
|
94
|
+
const finalPaths = artifactPaths(profile, artifactId);
|
|
95
|
+
try {
|
|
96
|
+
if (await exists(finalPaths.bundle)) {
|
|
97
|
+
state.currentArtifactId = artifactId;
|
|
98
|
+
state.currentSchemaHash = fingerprint.hash;
|
|
99
|
+
state.generatedAt = new Date().toISOString();
|
|
100
|
+
state.lastCheckedAt = state.generatedAt;
|
|
101
|
+
state.lastError = undefined;
|
|
102
|
+
await writeJsonAtomic(profile.paths.statePath, state);
|
|
103
|
+
return {
|
|
104
|
+
status: "cached",
|
|
105
|
+
schemaHash: fingerprint.hash,
|
|
106
|
+
artifactId,
|
|
107
|
+
message: t(`复用不可变产物 ${artifactId}`, `reused immutable artifact ${artifactId}`),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const buildingDirectory = path.join(profile.paths.generatedDirectory, `${artifactId}.building-${process.pid}-${randomUUID()}`);
|
|
111
|
+
await mkdir(buildingDirectory, { recursive: true });
|
|
112
|
+
const sourcePath = path.join(buildingDirectory, "cli.ts");
|
|
113
|
+
const bundlePath = path.join(buildingDirectory, "cli.mjs");
|
|
114
|
+
await emitMCPorterTemplate(profile, bindings, sourcePath, bundlePath);
|
|
115
|
+
await injectRuntimeEndpoint(sourcePath, profile.endpoint);
|
|
116
|
+
await injectRuntimeEndpoint(bundlePath, profile.endpoint);
|
|
117
|
+
await injectFailureExitPolicy(sourcePath);
|
|
118
|
+
await injectFailureExitPolicy(bundlePath);
|
|
119
|
+
await verifyNoSecrets(bundlePath, [...Object.values(profile.headers), profile.endpoint]);
|
|
120
|
+
await verifyNoSecrets(sourcePath, [...Object.values(profile.headers), profile.endpoint]);
|
|
121
|
+
await smokeTestGeneratedCli(bundlePath);
|
|
122
|
+
const manifest = {
|
|
123
|
+
launcherVersion: LAUNCHER_VERSION,
|
|
124
|
+
generator: { name: "mcporter", version: mcporterDetails().version, bundler: "rolldown" },
|
|
125
|
+
profile: profile.profile,
|
|
126
|
+
timeoutMs: profile.timeoutMs,
|
|
127
|
+
schemaHash: fingerprint.hash,
|
|
128
|
+
artifactId,
|
|
129
|
+
generatedAt: new Date().toISOString(),
|
|
130
|
+
server: discovery.server,
|
|
131
|
+
endpointFingerprint: endpointFingerprint(profile.endpoint),
|
|
132
|
+
headerBindings: bindings.bindings,
|
|
133
|
+
failureExitPolicyVersion: GENERATED_FAILURE_EXIT_POLICY_VERSION,
|
|
134
|
+
tools: discovery.tools,
|
|
135
|
+
};
|
|
136
|
+
await writeJsonAtomic(path.join(buildingDirectory, "manifest.json"), manifest);
|
|
137
|
+
await rename(buildingDirectory, finalPaths.directory);
|
|
138
|
+
state.currentArtifactId = artifactId;
|
|
139
|
+
state.currentSchemaHash = fingerprint.hash;
|
|
140
|
+
state.generatedAt = manifest.generatedAt;
|
|
141
|
+
state.lastCheckedAt = manifest.generatedAt;
|
|
142
|
+
state.lastError = undefined;
|
|
143
|
+
await writeJsonAtomic(profile.paths.statePath, state);
|
|
144
|
+
return {
|
|
145
|
+
status: "generated",
|
|
146
|
+
schemaHash: fingerprint.hash,
|
|
147
|
+
artifactId,
|
|
148
|
+
message: t(`已生成并激活 ${artifactId}`, `generated and activated ${artifactId}`),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
153
|
+
state.lastCheckedAt = new Date().toISOString();
|
|
154
|
+
state.lastError = message;
|
|
155
|
+
await writeJsonAtomic(profile.paths.statePath, state);
|
|
156
|
+
if (await artifactIsUsable(profile, state.currentArtifactId)) {
|
|
157
|
+
return {
|
|
158
|
+
status: "fallback",
|
|
159
|
+
schemaHash: fingerprint.hash,
|
|
160
|
+
artifactId: state.currentArtifactId,
|
|
161
|
+
message: t(`生成失败;使用之前的生成 CLI ${state.currentArtifactId}:${message}`, `generation failed; using previous generated CLI ${state.currentArtifactId}: ${message}`),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
throw new Error(t(`生成失败,且没有可用的旧 CLI:${message}`, `Generation failed and no previous CLI is available: ${message}`));
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
export async function currentArtifact(profile) {
|
|
169
|
+
const state = await readJson(profile.paths.statePath, stateDefault(profile));
|
|
170
|
+
if (!(await artifactIsUsable(profile, state.currentArtifactId))) {
|
|
171
|
+
return { state };
|
|
172
|
+
}
|
|
173
|
+
const artifactId = state.currentArtifactId;
|
|
174
|
+
return {
|
|
175
|
+
state,
|
|
176
|
+
manifest: await readManifest(profile, artifactId),
|
|
177
|
+
bundle: artifactPaths(profile, artifactId).bundle,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
function normalizeValue(value, property) {
|
|
3
|
+
if (Array.isArray(value)) {
|
|
4
|
+
const normalized = value.map((item) => normalizeValue(item));
|
|
5
|
+
if (property === "required") {
|
|
6
|
+
return normalized.sort((left, right) => stableStringify(left).localeCompare(stableStringify(right)));
|
|
7
|
+
}
|
|
8
|
+
return normalized;
|
|
9
|
+
}
|
|
10
|
+
if (typeof value === "object" && value !== null) {
|
|
11
|
+
return Object.fromEntries(Object.entries(value)
|
|
12
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
13
|
+
.map(([key, child]) => [key, normalizeValue(child, key)]));
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
export function stableStringify(value) {
|
|
18
|
+
return JSON.stringify(normalizeValue(value));
|
|
19
|
+
}
|
|
20
|
+
export function normalizeTools(tools) {
|
|
21
|
+
return tools
|
|
22
|
+
.map((tool) => ({
|
|
23
|
+
name: tool.name,
|
|
24
|
+
title: tool.title ?? null,
|
|
25
|
+
description: tool.description ?? null,
|
|
26
|
+
inputSchema: normalizeValue(tool.inputSchema ?? {}),
|
|
27
|
+
outputSchema: normalizeValue(tool.outputSchema ?? null),
|
|
28
|
+
annotations: normalizeValue(tool.annotations ?? null),
|
|
29
|
+
}))
|
|
30
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
31
|
+
}
|
|
32
|
+
export function schemaFingerprint(tools) {
|
|
33
|
+
const normalized = normalizeTools(tools);
|
|
34
|
+
return {
|
|
35
|
+
hash: createHash("sha256").update(stableStringify(normalized)).digest("hex"),
|
|
36
|
+
normalized,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYzC,SAAS,cAAc,CAAC,KAAc,EAAE,QAAiB;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QACnD,YAAY,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QACvD,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;KACtD,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5E,UAAU;KACX,CAAC;AACJ,CAAC"}
|