media-analysis-mcp 2.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/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/bailian.js +320 -0
- package/dist/bailian.js.map +1 -0
- package/dist/bytes.js +20 -0
- package/dist/bytes.js.map +1 -0
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-lookup.js +271 -0
- package/dist/config-lookup.js.map +1 -0
- package/dist/config.js +212 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.js +206 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.js +387 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/media.js +585 -0
- package/dist/media.js.map +1 -0
- package/dist/mpeg-audio.js +226 -0
- package/dist/mpeg-audio.js.map +1 -0
- package/dist/provider-error.js +73 -0
- package/dist/provider-error.js.map +1 -0
- package/dist/sanitize.js +103 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/server.js +290 -0
- package/dist/server.js.map +1 -0
- package/dist/sse.js +327 -0
- package/dist/sse.js.map +1 -0
- package/dist/upload-cache.js +146 -0
- package/dist/upload-cache.js.map +1 -0
- package/dist/upload.js +368 -0
- package/dist/upload.js.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +73 -0
- package/scripts/prepare.mjs +43 -0
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
5
|
+
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
6
|
+
import { DEFAULT_BASE_URL, DEFAULT_MODEL, DEFAULT_UPLOAD_URL, LEGACY_MEDIA_VARS, legacyMediaVarWarning, loadConfig, parseOnOffToken, readMediaAllowedRoots, } from "./config.js";
|
|
7
|
+
import { inspectConfig, lookupConfigValue, } from "./config-lookup.js";
|
|
8
|
+
import { looksSensitive } from "./errors.js";
|
|
9
|
+
import { TOOL_NAME, createServer } from "./server.js";
|
|
10
|
+
import { formatPackageBanner, PACKAGE_VERSION } from "./version.js";
|
|
11
|
+
const MIN_NODE_MAJOR = 22;
|
|
12
|
+
const PRINTABLE_MODEL_ID = /^qwen[0-9a-z._-]{0,63}$/i;
|
|
13
|
+
/**
|
|
14
|
+
* The doctor echoes the model id only when it looks like a Qwen model id and is not
|
|
15
|
+
* sensitive: a stray secret pasted into QWEN_MODEL must not come back in the report.
|
|
16
|
+
*/
|
|
17
|
+
function printableModelId(raw) {
|
|
18
|
+
if (raw === undefined) {
|
|
19
|
+
return DEFAULT_MODEL;
|
|
20
|
+
}
|
|
21
|
+
const trimmed = raw.trim();
|
|
22
|
+
if (trimmed.length === 0 || !PRINTABLE_MODEL_ID.test(trimmed) || looksSensitive(trimmed)) {
|
|
23
|
+
return "<redacted>";
|
|
24
|
+
}
|
|
25
|
+
return trimmed;
|
|
26
|
+
}
|
|
27
|
+
function httpsEndpointOk(raw, fallback) {
|
|
28
|
+
const value = raw === undefined || raw.trim() === "" ? fallback : raw.trim();
|
|
29
|
+
try {
|
|
30
|
+
const parsed = new URL(value);
|
|
31
|
+
return parsed.protocol === "https:" && parsed.username === "" && parsed.password === "";
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function readGitCommit(cwd) {
|
|
38
|
+
const fromEnv = process.env.ANALYZE_VIDEO_GIT_COMMIT?.trim();
|
|
39
|
+
if (fromEnv !== undefined && fromEnv.length > 0) {
|
|
40
|
+
return fromEnv;
|
|
41
|
+
}
|
|
42
|
+
if (!existsSync(join(cwd, ".git"))) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const result = spawnSync("git", ["rev-parse", "--short", "HEAD"], {
|
|
46
|
+
cwd,
|
|
47
|
+
encoding: "utf8",
|
|
48
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
49
|
+
timeout: 3_000,
|
|
50
|
+
});
|
|
51
|
+
if (result.status !== 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const sha = result.stdout.trim();
|
|
55
|
+
return sha.length > 0 ? sha : undefined;
|
|
56
|
+
}
|
|
57
|
+
function nodeMajor(version) {
|
|
58
|
+
const match = /^v(\d+)/.exec(version);
|
|
59
|
+
const raw = match?.[1];
|
|
60
|
+
return raw === undefined ? 0 : Number(raw);
|
|
61
|
+
}
|
|
62
|
+
export async function runDoctor(cwd = process.cwd(), lookup) {
|
|
63
|
+
const warnings = [];
|
|
64
|
+
const nodeVersion = process.version;
|
|
65
|
+
const supported = nodeMajor(nodeVersion) >= MIN_NODE_MAJOR;
|
|
66
|
+
if (!supported) {
|
|
67
|
+
warnings.push("Node.js 22+ is required");
|
|
68
|
+
}
|
|
69
|
+
const inspection = inspectConfig(lookup);
|
|
70
|
+
const keyConfigured = inspection.api_key.configured;
|
|
71
|
+
if (!keyConfigured) {
|
|
72
|
+
warnings.push("DASHSCOPE_API_KEY is not set");
|
|
73
|
+
}
|
|
74
|
+
const modelResolved = lookupConfigValue("QWEN_MODEL", lookup);
|
|
75
|
+
const anyLocalFileResolved = lookupConfigValue("MEDIA_ALLOW_ANY_LOCAL_FILE", lookup);
|
|
76
|
+
const anyLocalFileRaw = anyLocalFileResolved.value;
|
|
77
|
+
const anyLocalFileToggle = anyLocalFileRaw === undefined ? undefined : parseOnOffToken(anyLocalFileRaw);
|
|
78
|
+
const anyLocalFileOn = anyLocalFileToggle === true;
|
|
79
|
+
for (const name of LEGACY_MEDIA_VARS) {
|
|
80
|
+
if (lookupConfigValue(name, lookup).value !== undefined) {
|
|
81
|
+
const warning = legacyMediaVarWarning(name);
|
|
82
|
+
if (warning !== undefined) {
|
|
83
|
+
warnings.push(warning);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
let rootsCount = 0;
|
|
88
|
+
let rootsValid = true;
|
|
89
|
+
const rootsConfigured = inspection.allowed_roots.configured;
|
|
90
|
+
if (rootsConfigured) {
|
|
91
|
+
if (anyLocalFileOn) {
|
|
92
|
+
// With the any-path switch on the allowlist is unused, so unusable entries are
|
|
93
|
+
// dropped instead of failing the install; report them rather than hiding them.
|
|
94
|
+
rootsCount = readMediaAllowedRoots(lookup, true).length;
|
|
95
|
+
let ignored;
|
|
96
|
+
try {
|
|
97
|
+
ignored = readMediaAllowedRoots(lookup).length !== rootsCount;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
ignored = true;
|
|
101
|
+
}
|
|
102
|
+
if (ignored) {
|
|
103
|
+
warnings.push("MEDIA_ALLOWED_ROOTS has entries that are not usable directories; they are ignored while MEDIA_ALLOW_ANY_LOCAL_FILE is on");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
try {
|
|
108
|
+
rootsCount = readMediaAllowedRoots(lookup).length;
|
|
109
|
+
rootsValid = rootsCount > 0;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
rootsValid = false;
|
|
113
|
+
warnings.push("MEDIA_ALLOWED_ROOTS could not be parsed");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (anyLocalFileRaw !== undefined && anyLocalFileToggle === undefined) {
|
|
118
|
+
warnings.push("MEDIA_ALLOW_ANY_LOCAL_FILE must be on or off");
|
|
119
|
+
}
|
|
120
|
+
else if (anyLocalFileOn) {
|
|
121
|
+
warnings.push("MEDIA_ALLOW_ANY_LOCAL_FILE is on: any local MP4/MOV/MP3 path an Agent names is uploaded, including files the user never picked");
|
|
122
|
+
}
|
|
123
|
+
else if (!rootsConfigured) {
|
|
124
|
+
warnings.push("MEDIA_ALLOWED_ROOTS is unset; local media files will be refused");
|
|
125
|
+
}
|
|
126
|
+
const baseOk = httpsEndpointOk(lookupConfigValue("DASHSCOPE_BASE_URL", lookup).value, DEFAULT_BASE_URL);
|
|
127
|
+
const uploadOk = httpsEndpointOk(lookupConfigValue("DASHSCOPE_UPLOAD_URL", lookup).value, DEFAULT_UPLOAD_URL);
|
|
128
|
+
if (!baseOk) {
|
|
129
|
+
warnings.push("DASHSCOPE_BASE_URL must be HTTPS");
|
|
130
|
+
}
|
|
131
|
+
if (!uploadOk) {
|
|
132
|
+
warnings.push("DASHSCOPE_UPLOAD_URL must be HTTPS");
|
|
133
|
+
}
|
|
134
|
+
let registered;
|
|
135
|
+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
136
|
+
const mcp = createServer();
|
|
137
|
+
const client = new Client({ name: "media-analysis-doctor", version: PACKAGE_VERSION });
|
|
138
|
+
try {
|
|
139
|
+
await mcp.connect(serverTransport);
|
|
140
|
+
await client.connect(clientTransport);
|
|
141
|
+
const listed = await client.listTools();
|
|
142
|
+
registered = listed.tools.length === 1 && listed.tools[0]?.name === TOOL_NAME;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
registered = false;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await client.close().catch(() => undefined);
|
|
149
|
+
await mcp.close().catch(() => undefined);
|
|
150
|
+
}
|
|
151
|
+
if (!registered) {
|
|
152
|
+
warnings.push(`${TOOL_NAME} was not registered`);
|
|
153
|
+
}
|
|
154
|
+
let runtimeOk = true;
|
|
155
|
+
if (keyConfigured) {
|
|
156
|
+
try {
|
|
157
|
+
loadConfig(lookup);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
runtimeOk = false;
|
|
161
|
+
warnings.push("runtime config could not be loaded");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const git = readGitCommit(cwd);
|
|
165
|
+
const ok = supported && keyConfigured && runtimeOk && baseOk && uploadOk && registered && rootsValid;
|
|
166
|
+
return {
|
|
167
|
+
ok,
|
|
168
|
+
version: PACKAGE_VERSION,
|
|
169
|
+
git,
|
|
170
|
+
banner: formatPackageBanner(git),
|
|
171
|
+
node: { version: nodeVersion, supported },
|
|
172
|
+
api_key: { configured: keyConfigured, source: inspection.api_key.source },
|
|
173
|
+
model: { id: printableModelId(modelResolved.value), source: modelResolved.source },
|
|
174
|
+
allowed_roots: {
|
|
175
|
+
configured: rootsConfigured,
|
|
176
|
+
source: inspection.allowed_roots.source,
|
|
177
|
+
count: rootsCount,
|
|
178
|
+
valid: rootsValid,
|
|
179
|
+
},
|
|
180
|
+
local_media_policy: {
|
|
181
|
+
mode: anyLocalFileOn ? "any_local_file" : "allowed_roots",
|
|
182
|
+
source: anyLocalFileResolved.source,
|
|
183
|
+
},
|
|
184
|
+
endpoints: { base_url_ok: baseOk, upload_url_ok: uploadOk },
|
|
185
|
+
handshake: { tool: TOOL_NAME, registered },
|
|
186
|
+
warnings,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
export function formatDoctorText(report) {
|
|
190
|
+
const lines = [
|
|
191
|
+
report.banner,
|
|
192
|
+
`ok=${report.ok ? "true" : "false"}`,
|
|
193
|
+
`node=${report.node.version} supported=${String(report.node.supported)}`,
|
|
194
|
+
`api_key.configured=${String(report.api_key.configured)} source=${report.api_key.source}`,
|
|
195
|
+
`model.id=${report.model.id} source=${report.model.source}`,
|
|
196
|
+
`allowed_roots.configured=${String(report.allowed_roots.configured)} source=${report.allowed_roots.source} count=${String(report.allowed_roots.count)} valid=${String(report.allowed_roots.valid)}`,
|
|
197
|
+
`local_media_policy.mode=${report.local_media_policy.mode} source=${report.local_media_policy.source}`,
|
|
198
|
+
`endpoints.base_url_ok=${String(report.endpoints.base_url_ok)} upload_url_ok=${String(report.endpoints.upload_url_ok)}`,
|
|
199
|
+
`handshake.registered=${String(report.handshake.registered)}`,
|
|
200
|
+
];
|
|
201
|
+
for (const warning of report.warnings) {
|
|
202
|
+
lines.push(`warning=${warning}`);
|
|
203
|
+
}
|
|
204
|
+
return `${lines.join("\n")}\n`;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
export const AGENT_ERROR_CODES = [
|
|
2
|
+
"INVALID_MEDIA_INPUT",
|
|
3
|
+
"MEDIA_PATH_NOT_ALLOWED",
|
|
4
|
+
"MEDIA_NOT_FOUND",
|
|
5
|
+
"UNSUPPORTED_MEDIA",
|
|
6
|
+
"UNSUPPORTED_MEDIA_CODEC",
|
|
7
|
+
"MEDIA_FILE_TOO_LARGE",
|
|
8
|
+
"MEDIA_TOO_LONG",
|
|
9
|
+
"UPLOAD_POLICY_FAILED",
|
|
10
|
+
"MEDIA_UPLOAD_FAILED",
|
|
11
|
+
"MEDIA_ANALYSIS_BUSY",
|
|
12
|
+
"PROVIDER_RATE_LIMITED",
|
|
13
|
+
"PROVIDER_TIMEOUT",
|
|
14
|
+
"PROVIDER_UNAVAILABLE",
|
|
15
|
+
"PROVIDER_RESPONSE_INVALID",
|
|
16
|
+
"PROVIDER_CONTENT_REJECTED",
|
|
17
|
+
"MEDIA_MODEL_UNSUPPORTED",
|
|
18
|
+
"MEDIA_ANALYSIS_FAILED",
|
|
19
|
+
"MEDIA_ANALYSIS_CANCELLED",
|
|
20
|
+
"PROVIDER_UNAUTHORIZED",
|
|
21
|
+
"CONFIG_MISSING",
|
|
22
|
+
];
|
|
23
|
+
const AGENT_TEXT = {
|
|
24
|
+
INVALID_MEDIA_INPUT: "媒体输入无效。",
|
|
25
|
+
MEDIA_PATH_NOT_ALLOWED: "本地路径不在允许的目录内。请把目录写入 MEDIA_ALLOWED_ROOTS、由安装者开启 MEDIA_ALLOW_ANY_LOCAL_FILE,或改用公开 HTTPS。",
|
|
26
|
+
MEDIA_NOT_FOUND: "找不到或无法读取该媒体文件。",
|
|
27
|
+
UNSUPPORTED_MEDIA: "只支持 MP4、MOV 视频或 MP3 音频文件。",
|
|
28
|
+
UNSUPPORTED_MEDIA_CODEC: "这个文件的编码组合不受支持。视频请导出视频轨为 H.264 或 H.265、音频轨为 AAC 的 MP4 或 MOV;音频请提供 MPEG Layer III(MP3)。",
|
|
29
|
+
MEDIA_FILE_TOO_LARGE: "媒体超过本地允许上限。请压缩、切段,或改用公开 HTTPS。",
|
|
30
|
+
MEDIA_TOO_LONG: "媒体时长超过 1 小时上限。请切成不超过 1 小时的片段后再试。",
|
|
31
|
+
UPLOAD_POLICY_FAILED: "无法取得上传凭证。",
|
|
32
|
+
MEDIA_UPLOAD_FAILED: "本地上传失败,原因请以诊断字段为准;没有诊断时原因未知。不要直接重复上传同一文件。请先检查上传诊断与安装配置;改用公开 HTTPS 前须确认媒体适合公开访问。",
|
|
33
|
+
MEDIA_ANALYSIS_BUSY: "已有一个媒体任务正在处理。",
|
|
34
|
+
PROVIDER_RATE_LIMITED: "服务繁忙,请稍后重试。",
|
|
35
|
+
PROVIDER_TIMEOUT: "媒体分析超时。",
|
|
36
|
+
PROVIDER_UNAVAILABLE: "分析服务暂时不可用。",
|
|
37
|
+
PROVIDER_RESPONSE_INVALID: "分析服务返回了无效结果。",
|
|
38
|
+
PROVIDER_CONTENT_REJECTED: "服务商内容检查拦截了本次分析;不能据此判定媒体违规。若有 Request ID,可向服务商核实;不要直接重复上传同一媒体。",
|
|
39
|
+
MEDIA_MODEL_UNSUPPORTED: "当前安装选择的模型不支持这种媒体输入。请让安装者改用支持该媒体类型的模型,再重试;本次没有产生可用的分析结果。",
|
|
40
|
+
MEDIA_ANALYSIS_FAILED: "媒体分析失败。",
|
|
41
|
+
MEDIA_ANALYSIS_CANCELLED: "本次媒体分析已取消。",
|
|
42
|
+
PROVIDER_UNAUTHORIZED: "服务商拒绝了本次请求(401/403)。请检查 API Key、接口地址,以及所选模型是否已在该账号开通(模型未开通时服务商同样返回 403)。",
|
|
43
|
+
CONFIG_MISSING: "配置不完整。请检查 API Key、接口地址和允许目录,或运行 media-analysis-mcp --doctor --json。",
|
|
44
|
+
};
|
|
45
|
+
export const CONFIG_MISSING_SUGGESTION = "请在 MCP server 的 env 配置、--config 文件、用户配置文件或宿主进程环境中提供该变量";
|
|
46
|
+
const RETRYABLE = {
|
|
47
|
+
INVALID_MEDIA_INPUT: false,
|
|
48
|
+
MEDIA_PATH_NOT_ALLOWED: false,
|
|
49
|
+
MEDIA_NOT_FOUND: false,
|
|
50
|
+
UNSUPPORTED_MEDIA: false,
|
|
51
|
+
UNSUPPORTED_MEDIA_CODEC: false,
|
|
52
|
+
MEDIA_FILE_TOO_LARGE: false,
|
|
53
|
+
MEDIA_TOO_LONG: false,
|
|
54
|
+
UPLOAD_POLICY_FAILED: true,
|
|
55
|
+
MEDIA_UPLOAD_FAILED: false,
|
|
56
|
+
MEDIA_ANALYSIS_BUSY: true,
|
|
57
|
+
PROVIDER_RATE_LIMITED: true,
|
|
58
|
+
PROVIDER_TIMEOUT: true,
|
|
59
|
+
PROVIDER_UNAVAILABLE: true,
|
|
60
|
+
PROVIDER_RESPONSE_INVALID: true,
|
|
61
|
+
PROVIDER_CONTENT_REJECTED: false,
|
|
62
|
+
MEDIA_MODEL_UNSUPPORTED: false,
|
|
63
|
+
MEDIA_ANALYSIS_FAILED: false,
|
|
64
|
+
MEDIA_ANALYSIS_CANCELLED: false,
|
|
65
|
+
PROVIDER_UNAUTHORIZED: false,
|
|
66
|
+
CONFIG_MISSING: false,
|
|
67
|
+
};
|
|
68
|
+
const DIAGNOSTIC_KEYS = new Set([
|
|
69
|
+
"http_status",
|
|
70
|
+
"request_id",
|
|
71
|
+
"elapsed_ms",
|
|
72
|
+
"input_kind",
|
|
73
|
+
"size_bytes",
|
|
74
|
+
"retry_count",
|
|
75
|
+
"received_sse_events",
|
|
76
|
+
"parse_reason",
|
|
77
|
+
"error_code",
|
|
78
|
+
"inspection_side",
|
|
79
|
+
"event_shape",
|
|
80
|
+
"field",
|
|
81
|
+
"codec",
|
|
82
|
+
"prompt_tokens",
|
|
83
|
+
"completion_tokens",
|
|
84
|
+
"total_tokens",
|
|
85
|
+
]);
|
|
86
|
+
/**
|
|
87
|
+
* Values checked by shape instead of looksSensitive: `field` carries our own
|
|
88
|
+
* policy-schema field names, and names like `data.signature` are not secrets;
|
|
89
|
+
* `codec` is a four-character sample-format code such as `ap4h`, or an MPEG
|
|
90
|
+
* layer token such as `mpeg1-layer3`.
|
|
91
|
+
*/
|
|
92
|
+
const DIAGNOSTIC_VALUE_PATTERNS = {
|
|
93
|
+
request_id: /^[A-Za-z0-9_-]{1,128}$/,
|
|
94
|
+
field: /^[a-z][a-z0-9_]*(\.[a-z0-9_]+){0,2}$/,
|
|
95
|
+
codec: /^[A-Za-z0-9._-]{1,16}$/,
|
|
96
|
+
inspection_side: /^(?:input|output|unknown)$/,
|
|
97
|
+
input_kind: /^[a-z0-9_]{1,32}$/,
|
|
98
|
+
};
|
|
99
|
+
export function looksSensitive(value) {
|
|
100
|
+
if (value.includes("oss://"))
|
|
101
|
+
return true;
|
|
102
|
+
if (/sk-[A-Za-z0-9_-]+/.test(value))
|
|
103
|
+
return true;
|
|
104
|
+
if (/(policy|signature|accesskey|authorization)/i.test(value))
|
|
105
|
+
return true;
|
|
106
|
+
if (/^[A-Za-z]:[\\/]/.test(value))
|
|
107
|
+
return true;
|
|
108
|
+
if (value.startsWith("\\\\") || value.startsWith("/"))
|
|
109
|
+
return true;
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
function sanitizeDiagnostic(input) {
|
|
113
|
+
const out = {};
|
|
114
|
+
if (input === undefined) {
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
for (const [key, value] of Object.entries(input)) {
|
|
118
|
+
if (!DIAGNOSTIC_KEYS.has(key)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (typeof value === "string") {
|
|
122
|
+
const pattern = DIAGNOSTIC_VALUE_PATTERNS[key];
|
|
123
|
+
if (pattern !== undefined) {
|
|
124
|
+
if (pattern.test(value) && (key !== "request_id" || !looksSensitive(value))) {
|
|
125
|
+
out[key] = value;
|
|
126
|
+
}
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (!looksSensitive(value)) {
|
|
130
|
+
out[key] = value;
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
135
|
+
out[key] = value;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
export class ConfigError extends Error {
|
|
141
|
+
name = "ConfigError";
|
|
142
|
+
missing;
|
|
143
|
+
suggestion;
|
|
144
|
+
constructor(message, init = {}) {
|
|
145
|
+
super(message);
|
|
146
|
+
this.missing = init.missing ?? [];
|
|
147
|
+
this.suggestion = init.suggestion;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function configMissingMessage(missing, suggestion) {
|
|
151
|
+
if (missing.length === 0) {
|
|
152
|
+
return `CONFIG_MISSING: ${AGENT_TEXT.CONFIG_MISSING}`;
|
|
153
|
+
}
|
|
154
|
+
const hint = suggestion ?? CONFIG_MISSING_SUGGESTION;
|
|
155
|
+
return `CONFIG_MISSING: 缺少 ${missing.join("、")}。${hint}`;
|
|
156
|
+
}
|
|
157
|
+
const UPLOAD_POLICY_REASONS = new Set([
|
|
158
|
+
"request_failed",
|
|
159
|
+
"http_error",
|
|
160
|
+
"invalid_json",
|
|
161
|
+
"shape_mismatch",
|
|
162
|
+
"field_type_mismatch",
|
|
163
|
+
"upload_host_invalid",
|
|
164
|
+
]);
|
|
165
|
+
const DIAGNOSTIC_FIELD_PATTERN = /^[a-z][a-z0-9_]*(\.[a-z0-9_]+){0,2}$/;
|
|
166
|
+
function uploadFailureMessage(diagnostic, httpStatus) {
|
|
167
|
+
const base = `MEDIA_UPLOAD_FAILED: ${AGENT_TEXT.MEDIA_UPLOAD_FAILED}`;
|
|
168
|
+
const reason = diagnostic?.parse_reason;
|
|
169
|
+
if (typeof reason !== "string" ||
|
|
170
|
+
!["request_failed", "file_read_failed", "upload_timeout", "cancelled", "http_error"].includes(reason))
|
|
171
|
+
return base;
|
|
172
|
+
const parts = [reason];
|
|
173
|
+
if (httpStatus !== undefined)
|
|
174
|
+
parts.push(`http_status=${String(httpStatus)}`);
|
|
175
|
+
return `${base}(原因:${parts.join(", ")})`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Upload-policy failures are otherwise indistinguishable, and hosts do not always
|
|
179
|
+
* relay structured content, so the stable reason (never credential material) also
|
|
180
|
+
* goes into the Agent-visible text.
|
|
181
|
+
*/
|
|
182
|
+
function uploadPolicyMessage(diagnostic, httpStatus) {
|
|
183
|
+
const base = `UPLOAD_POLICY_FAILED: ${AGENT_TEXT.UPLOAD_POLICY_FAILED}`;
|
|
184
|
+
const rawReason = diagnostic?.parse_reason;
|
|
185
|
+
if (typeof rawReason !== "string" || !UPLOAD_POLICY_REASONS.has(rawReason)) {
|
|
186
|
+
return base;
|
|
187
|
+
}
|
|
188
|
+
const parts = [rawReason];
|
|
189
|
+
if (httpStatus !== undefined) {
|
|
190
|
+
parts.push(`http_status=${String(httpStatus)}`);
|
|
191
|
+
}
|
|
192
|
+
const rawField = diagnostic?.field;
|
|
193
|
+
if (typeof rawField === "string" && DIAGNOSTIC_FIELD_PATTERN.test(rawField)) {
|
|
194
|
+
parts.push(`field=${rawField}`);
|
|
195
|
+
}
|
|
196
|
+
return `${base}(原因:${parts.join(", ")})`;
|
|
197
|
+
}
|
|
198
|
+
const PCM_CODECS = /^(?:ipcm|lpcm|sowt|twos)$/i;
|
|
199
|
+
const PCM_AUDIO_HINT = "若视频轨已是 H.264/H.265,可只把 PCM 音频转为 AAC:ffmpeg -i input.mov -map 0:v:0 -map 0:a:0? -c:v copy -c:a aac -b:a 192k -movflags +faststart output.mp4";
|
|
200
|
+
/** Names the refused sample-format code so the user knows what to re-export. */
|
|
201
|
+
function codecMessage(diagnostic) {
|
|
202
|
+
const base = `UNSUPPORTED_MEDIA_CODEC: ${AGENT_TEXT.UNSUPPORTED_MEDIA_CODEC}`;
|
|
203
|
+
const rawCodec = diagnostic?.codec;
|
|
204
|
+
const codecPattern = DIAGNOSTIC_VALUE_PATTERNS.codec;
|
|
205
|
+
if (typeof rawCodec !== "string" || codecPattern === undefined || !codecPattern.test(rawCodec)) {
|
|
206
|
+
return base;
|
|
207
|
+
}
|
|
208
|
+
if (PCM_CODECS.test(rawCodec)) {
|
|
209
|
+
return `${base}(检测到的编码:${rawCodec};${PCM_AUDIO_HINT})`;
|
|
210
|
+
}
|
|
211
|
+
return `${base}(检测到的编码:${rawCodec})`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* A remote `.mp3` URL is refused as unsupported remote audio rather than routed
|
|
215
|
+
* to the video protocol: this server never fetches the URL, so its real type
|
|
216
|
+
* cannot be verified, and a suffix is not proof.
|
|
217
|
+
*/
|
|
218
|
+
function unsupportedMediaMessage(diagnostic) {
|
|
219
|
+
const base = `UNSUPPORTED_MEDIA: ${AGENT_TEXT.UNSUPPORTED_MEDIA}`;
|
|
220
|
+
if (diagnostic?.input_kind === "remote_audio") {
|
|
221
|
+
return `${base}(远端 HTTPS 音频 URL 暂不支持:本机不抓取远端内容,URL 后缀不能证明其类型。请提供本地 MP3 路径,或改用公开 HTTPS 视频。)`;
|
|
222
|
+
}
|
|
223
|
+
if (diagnostic?.input_kind === "ftyp_container") {
|
|
224
|
+
return `${base}(文件内容其实是 MP4/MOV 容器(ftyp),不是 MPEG 音频:请改用与内容相符的 .mp4/.mov 扩展名,或提供真正的 MP3。)`;
|
|
225
|
+
}
|
|
226
|
+
return base;
|
|
227
|
+
}
|
|
228
|
+
export class MediaError extends Error {
|
|
229
|
+
code;
|
|
230
|
+
stage;
|
|
231
|
+
retryable;
|
|
232
|
+
httpStatus;
|
|
233
|
+
requestId;
|
|
234
|
+
diagnostic;
|
|
235
|
+
missing;
|
|
236
|
+
suggestion;
|
|
237
|
+
constructor(init) {
|
|
238
|
+
const missing = (init.missing ?? []).filter((name) => /^[A-Z][A-Z0-9_]*$/.test(name));
|
|
239
|
+
const suggestion = init.suggestion !== undefined && !looksSensitive(init.suggestion)
|
|
240
|
+
? init.suggestion
|
|
241
|
+
: undefined;
|
|
242
|
+
super(init.code === "CONFIG_MISSING"
|
|
243
|
+
? configMissingMessage(missing, suggestion)
|
|
244
|
+
: init.code === "UPLOAD_POLICY_FAILED"
|
|
245
|
+
? uploadPolicyMessage(init.diagnostic, init.httpStatus)
|
|
246
|
+
: init.code === "MEDIA_UPLOAD_FAILED"
|
|
247
|
+
? uploadFailureMessage(init.diagnostic, init.httpStatus)
|
|
248
|
+
: init.code === "UNSUPPORTED_MEDIA_CODEC"
|
|
249
|
+
? codecMessage(init.diagnostic)
|
|
250
|
+
: init.code === "UNSUPPORTED_MEDIA"
|
|
251
|
+
? unsupportedMediaMessage(init.diagnostic)
|
|
252
|
+
: `${init.code}: ${AGENT_TEXT[init.code]}`);
|
|
253
|
+
this.name = "MediaError";
|
|
254
|
+
this.code = init.code;
|
|
255
|
+
this.stage = init.stage;
|
|
256
|
+
this.retryable = init.retryable ?? RETRYABLE[init.code];
|
|
257
|
+
this.httpStatus = init.httpStatus;
|
|
258
|
+
this.requestId =
|
|
259
|
+
init.requestId !== undefined &&
|
|
260
|
+
DIAGNOSTIC_VALUE_PATTERNS.request_id?.test(init.requestId) &&
|
|
261
|
+
!looksSensitive(init.requestId)
|
|
262
|
+
? init.requestId
|
|
263
|
+
: undefined;
|
|
264
|
+
this.diagnostic = sanitizeDiagnostic(init.diagnostic);
|
|
265
|
+
this.missing = missing;
|
|
266
|
+
this.suggestion = suggestion;
|
|
267
|
+
}
|
|
268
|
+
agentMessage() {
|
|
269
|
+
return this.message;
|
|
270
|
+
}
|
|
271
|
+
toJSON() {
|
|
272
|
+
return {
|
|
273
|
+
code: this.code,
|
|
274
|
+
stage: this.stage,
|
|
275
|
+
retryable: this.retryable,
|
|
276
|
+
http_status: this.httpStatus,
|
|
277
|
+
request_id: this.requestId,
|
|
278
|
+
...this.diagnostic,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
export function agentErrorStructured(err) {
|
|
283
|
+
if (err instanceof MediaError) {
|
|
284
|
+
const body = {
|
|
285
|
+
ok: false,
|
|
286
|
+
code: err.code,
|
|
287
|
+
stage: err.stage,
|
|
288
|
+
retryable: err.retryable,
|
|
289
|
+
};
|
|
290
|
+
if (err.httpStatus !== undefined) {
|
|
291
|
+
body.http_status = err.httpStatus;
|
|
292
|
+
}
|
|
293
|
+
if (err.requestId !== undefined) {
|
|
294
|
+
body.request_id = err.requestId;
|
|
295
|
+
}
|
|
296
|
+
if (Object.keys(err.diagnostic).length > 0) {
|
|
297
|
+
body.diagnostics = err.diagnostic;
|
|
298
|
+
}
|
|
299
|
+
if (err.code === "CONFIG_MISSING") {
|
|
300
|
+
if (err.missing.length > 0) {
|
|
301
|
+
body.missing = err.missing;
|
|
302
|
+
}
|
|
303
|
+
if (err.suggestion !== undefined) {
|
|
304
|
+
body.suggestion = err.suggestion;
|
|
305
|
+
}
|
|
306
|
+
const names = err.missing;
|
|
307
|
+
body.error = {
|
|
308
|
+
code: "CONFIG_MISSING",
|
|
309
|
+
message: names.length > 0 ? `缺少 ${names.join("、")}` : AGENT_TEXT.CONFIG_MISSING,
|
|
310
|
+
missing: names,
|
|
311
|
+
suggestion: err.suggestion ?? CONFIG_MISSING_SUGGESTION,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return body;
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
ok: false,
|
|
318
|
+
code: "MEDIA_ANALYSIS_FAILED",
|
|
319
|
+
stage: "failed",
|
|
320
|
+
retryable: false,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
export function agentErrorStructuredContent(err) {
|
|
324
|
+
const body = agentErrorStructured(err);
|
|
325
|
+
const out = {
|
|
326
|
+
ok: body.ok,
|
|
327
|
+
code: body.code,
|
|
328
|
+
stage: body.stage,
|
|
329
|
+
retryable: body.retryable,
|
|
330
|
+
};
|
|
331
|
+
if (body.http_status !== undefined) {
|
|
332
|
+
out.http_status = body.http_status;
|
|
333
|
+
}
|
|
334
|
+
if (body.request_id !== undefined) {
|
|
335
|
+
out.request_id = body.request_id;
|
|
336
|
+
}
|
|
337
|
+
if (body.diagnostics !== undefined) {
|
|
338
|
+
out.diagnostics = body.diagnostics;
|
|
339
|
+
}
|
|
340
|
+
if (body.missing !== undefined) {
|
|
341
|
+
out.missing = body.missing;
|
|
342
|
+
}
|
|
343
|
+
if (body.suggestion !== undefined) {
|
|
344
|
+
out.suggestion = body.suggestion;
|
|
345
|
+
}
|
|
346
|
+
if (body.error !== undefined) {
|
|
347
|
+
out.error = body.error;
|
|
348
|
+
}
|
|
349
|
+
return out;
|
|
350
|
+
}
|
|
351
|
+
export function configToMediaError(err) {
|
|
352
|
+
if (err instanceof MediaError) {
|
|
353
|
+
return err;
|
|
354
|
+
}
|
|
355
|
+
if (err instanceof ConfigError) {
|
|
356
|
+
return new MediaError({
|
|
357
|
+
code: "CONFIG_MISSING",
|
|
358
|
+
stage: "received",
|
|
359
|
+
missing: err.missing,
|
|
360
|
+
suggestion: err.suggestion ?? CONFIG_MISSING_SUGGESTION,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
return new MediaError({ code: "MEDIA_ANALYSIS_FAILED", stage: "failed" });
|
|
364
|
+
}
|
|
365
|
+
export function agentErrorText(err) {
|
|
366
|
+
if (err instanceof MediaError) {
|
|
367
|
+
return err.agentMessage();
|
|
368
|
+
}
|
|
369
|
+
if (err instanceof ConfigError) {
|
|
370
|
+
return configToMediaError(err).agentMessage();
|
|
371
|
+
}
|
|
372
|
+
return `MEDIA_ANALYSIS_FAILED: ${AGENT_TEXT.MEDIA_ANALYSIS_FAILED}`;
|
|
373
|
+
}
|
|
374
|
+
/** stderr for process startup. Config mistakes stay readable; secrets still drop. */
|
|
375
|
+
export function startupErrorText(err) {
|
|
376
|
+
if (err instanceof MediaError) {
|
|
377
|
+
return err.agentMessage();
|
|
378
|
+
}
|
|
379
|
+
if (err instanceof ConfigError) {
|
|
380
|
+
const message = err.message.replace(/\s+/g, " ").trim();
|
|
381
|
+
if (message !== "" && !looksSensitive(message)) {
|
|
382
|
+
return message;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return agentErrorText(err);
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|