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
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { ConfigError } from "./errors.js";
|
|
6
|
+
export const CONFIG_SOURCES = [
|
|
7
|
+
"cli_file",
|
|
8
|
+
"process.env",
|
|
9
|
+
"user_file",
|
|
10
|
+
"windows_user_env",
|
|
11
|
+
"unset",
|
|
12
|
+
];
|
|
13
|
+
const ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
14
|
+
const WINDOWS_ENV_NAME = /^[A-Z][A-Z0-9_]*$/;
|
|
15
|
+
/**
|
|
16
|
+
* Names the Windows user environment may supply when no MCP env, --config file or
|
|
17
|
+
* user config file sets them. The legacy media names are included so --doctor can
|
|
18
|
+
* report that they no longer take effect; they are never read for authorization.
|
|
19
|
+
* MEDIA_ALLOW_ANY_LOCAL_FILE and QWEN_ALLOW_ANY_LOCAL_VIDEO stay out on purpose:
|
|
20
|
+
* a switch that turns any path into an upload authorization must be set explicitly.
|
|
21
|
+
*/
|
|
22
|
+
const WINDOWS_FALLBACK_NAMES = [
|
|
23
|
+
"DASHSCOPE_API_KEY",
|
|
24
|
+
"MEDIA_ALLOWED_ROOTS",
|
|
25
|
+
"MEDIA_MAX_LOCAL_MEDIA_MB",
|
|
26
|
+
"QWEN_MODEL",
|
|
27
|
+
"DASHSCOPE_BASE_URL",
|
|
28
|
+
"DASHSCOPE_UPLOAD_URL",
|
|
29
|
+
"QWEN_ALLOWED_ROOTS",
|
|
30
|
+
"QWEN_MAX_LOCAL_VIDEO_MB",
|
|
31
|
+
"QWEN_AUDIO_SILENCE_CHECK",
|
|
32
|
+
];
|
|
33
|
+
let windowsUserEnvCache;
|
|
34
|
+
let cliConfigPath;
|
|
35
|
+
export function setCliConfigPath(path) {
|
|
36
|
+
cliConfigPath = path;
|
|
37
|
+
}
|
|
38
|
+
export function getCliConfigPath() {
|
|
39
|
+
return cliConfigPath;
|
|
40
|
+
}
|
|
41
|
+
export function defaultUserConfigPath(home = homedir()) {
|
|
42
|
+
return resolve(home, ".media-analysis-mcp", "config.env");
|
|
43
|
+
}
|
|
44
|
+
export function parseEnvFile(contents) {
|
|
45
|
+
const out = {};
|
|
46
|
+
const text = contents.replace(/^\uFEFF/, "");
|
|
47
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
48
|
+
const line = rawLine.trim();
|
|
49
|
+
if (line.length === 0 || line.startsWith("#")) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const exported = line.startsWith("export ") ? line.slice("export ".length).trim() : line;
|
|
53
|
+
const eq = exported.indexOf("=");
|
|
54
|
+
if (eq <= 0) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const key = exported.slice(0, eq).trim();
|
|
58
|
+
if (!ENV_NAME.test(key)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
let value = exported.slice(eq + 1).trim();
|
|
62
|
+
if ((value.startsWith('"') && value.endsWith('"') && value.length >= 2) ||
|
|
63
|
+
(value.startsWith("'") && value.endsWith("'") && value.length >= 2)) {
|
|
64
|
+
value = value.slice(1, -1);
|
|
65
|
+
}
|
|
66
|
+
out[key] = value;
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
export function presentEnvValue(raw) {
|
|
71
|
+
if (raw === undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const trimmed = raw.trim();
|
|
75
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
76
|
+
}
|
|
77
|
+
function silentFallbacksEnabled(options, env) {
|
|
78
|
+
if (options?.enableSilentFallbacks !== undefined) {
|
|
79
|
+
return options.enableSilentFallbacks;
|
|
80
|
+
}
|
|
81
|
+
return presentEnvValue(env.QWEN_DISABLE_CONFIG_FALLBACKS) !== "1";
|
|
82
|
+
}
|
|
83
|
+
function fileExists(path, options) {
|
|
84
|
+
return options?.fileExists !== undefined ? options.fileExists(path) : existsSync(path);
|
|
85
|
+
}
|
|
86
|
+
function readFile(path, options) {
|
|
87
|
+
return options?.readFile !== undefined ? options.readFile(path) : readFileSync(path, "utf8");
|
|
88
|
+
}
|
|
89
|
+
function loadEnvFile(path, options) {
|
|
90
|
+
if (path === undefined) {
|
|
91
|
+
return { values: {}, error: undefined };
|
|
92
|
+
}
|
|
93
|
+
if (!fileExists(path, options)) {
|
|
94
|
+
return { values: {}, error: "missing" };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
return { values: parseEnvFile(readFile(path, options)), error: undefined };
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return { values: {}, error: "unreadable" };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function readWindowsUserEnvironment(name) {
|
|
104
|
+
if (process.platform !== "win32" || !WINDOWS_ENV_NAME.test(name)) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const result = spawnSync("powershell.exe", [
|
|
109
|
+
"-NoProfile",
|
|
110
|
+
"-NonInteractive",
|
|
111
|
+
"-Command",
|
|
112
|
+
`[Environment]::GetEnvironmentVariable(${JSON.stringify(name)},'User')`,
|
|
113
|
+
], { encoding: "utf8", timeout: 5_000, windowsHide: true });
|
|
114
|
+
if (result.status !== 0) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const value = result.stdout.replace(/^\uFEFF/, "").trim();
|
|
118
|
+
if (value.length === 0 || value.includes("Exception")) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function readWindowsUserEnvironmentBatch() {
|
|
128
|
+
if (process.platform !== "win32")
|
|
129
|
+
return {};
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
if (windowsUserEnvCache !== undefined && now - windowsUserEnvCache.readAt < 15_000) {
|
|
132
|
+
return windowsUserEnvCache.values;
|
|
133
|
+
}
|
|
134
|
+
const names = WINDOWS_FALLBACK_NAMES.map((name) => JSON.stringify(name)).join(",");
|
|
135
|
+
const script = `$result=@{}; foreach($name in @(${names})) { $value=[Environment]::GetEnvironmentVariable($name,'User'); if ($null -ne $value) { $result[$name]=$value } }; ConvertTo-Json -Compress -InputObject $result`;
|
|
136
|
+
const values = {};
|
|
137
|
+
try {
|
|
138
|
+
const result = spawnSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], {
|
|
139
|
+
encoding: "utf8",
|
|
140
|
+
timeout: 5_000,
|
|
141
|
+
windowsHide: true,
|
|
142
|
+
});
|
|
143
|
+
if (result.status === 0) {
|
|
144
|
+
const parsed = JSON.parse(result.stdout.replace(/^\uFEFF/, "").trim());
|
|
145
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
|
|
146
|
+
for (const name of WINDOWS_FALLBACK_NAMES) {
|
|
147
|
+
const value = parsed[name];
|
|
148
|
+
if (typeof value === "string")
|
|
149
|
+
values[name] = value;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Windows user environment is an optional fallback.
|
|
156
|
+
}
|
|
157
|
+
windowsUserEnvCache = { readAt: Date.now(), values };
|
|
158
|
+
return values;
|
|
159
|
+
}
|
|
160
|
+
function windowsReader(options, silent) {
|
|
161
|
+
if (!silent) {
|
|
162
|
+
return () => undefined;
|
|
163
|
+
}
|
|
164
|
+
if (options !== undefined && Object.hasOwn(options, "readWindowsUserEnv")) {
|
|
165
|
+
return options.readWindowsUserEnv ?? (() => undefined);
|
|
166
|
+
}
|
|
167
|
+
return readWindowsUserEnvironment;
|
|
168
|
+
}
|
|
169
|
+
function explicitConfigPath(options, env) {
|
|
170
|
+
const fromOptions = presentEnvValue(options?.cliFilePath);
|
|
171
|
+
if (fromOptions !== undefined) {
|
|
172
|
+
return resolve(fromOptions);
|
|
173
|
+
}
|
|
174
|
+
if (cliConfigPath !== undefined && cliConfigPath.trim() !== "") {
|
|
175
|
+
return resolve(cliConfigPath);
|
|
176
|
+
}
|
|
177
|
+
const fromEnv = presentEnvValue(env.QWEN_CONFIG_FILE);
|
|
178
|
+
return fromEnv !== undefined ? resolve(fromEnv) : undefined;
|
|
179
|
+
}
|
|
180
|
+
function buildLayers(options) {
|
|
181
|
+
const env = options?.env ?? process.env;
|
|
182
|
+
const silent = silentFallbacksEnabled(options, env);
|
|
183
|
+
const cliPath = explicitConfigPath(options, env);
|
|
184
|
+
const cliLoaded = loadEnvFile(cliPath, options);
|
|
185
|
+
const userPath = options?.userFilePath !== undefined
|
|
186
|
+
? options.userFilePath
|
|
187
|
+
: silent
|
|
188
|
+
? defaultUserConfigPath(options?.homedir)
|
|
189
|
+
: undefined;
|
|
190
|
+
const userLoaded = loadEnvFile(userPath, options);
|
|
191
|
+
const windowsValues = {};
|
|
192
|
+
if (silent) {
|
|
193
|
+
if (options === undefined || !Object.hasOwn(options, "readWindowsUserEnv")) {
|
|
194
|
+
Object.assign(windowsValues, readWindowsUserEnvironmentBatch());
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
const readWin = windowsReader(options, true);
|
|
198
|
+
for (const name of WINDOWS_FALLBACK_NAMES) {
|
|
199
|
+
const value = presentEnvValue(readWin(name));
|
|
200
|
+
if (value !== undefined)
|
|
201
|
+
windowsValues[name] = value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
env,
|
|
207
|
+
cliValues: cliLoaded.values,
|
|
208
|
+
userValues: userLoaded.values,
|
|
209
|
+
windowsValues,
|
|
210
|
+
cliFileError: cliPath !== undefined ? cliLoaded.error : undefined,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export function lookupConfigValue(name, options) {
|
|
214
|
+
const layers = buildLayers(options);
|
|
215
|
+
return lookupFromLayers(name, layers);
|
|
216
|
+
}
|
|
217
|
+
function lookupFromLayers(name, layers) {
|
|
218
|
+
const fromCli = presentEnvValue(layers.cliValues[name]);
|
|
219
|
+
if (fromCli !== undefined) {
|
|
220
|
+
return { value: fromCli, source: "cli_file" };
|
|
221
|
+
}
|
|
222
|
+
const fromEnv = presentEnvValue(layers.env[name]);
|
|
223
|
+
if (fromEnv !== undefined) {
|
|
224
|
+
return { value: fromEnv, source: "process.env" };
|
|
225
|
+
}
|
|
226
|
+
const fromUser = presentEnvValue(layers.userValues[name]);
|
|
227
|
+
if (fromUser !== undefined) {
|
|
228
|
+
return { value: fromUser, source: "user_file" };
|
|
229
|
+
}
|
|
230
|
+
const fromWindows = presentEnvValue(layers.windowsValues[name]);
|
|
231
|
+
if (fromWindows !== undefined) {
|
|
232
|
+
return { value: fromWindows, source: "windows_user_env" };
|
|
233
|
+
}
|
|
234
|
+
return { value: undefined, source: "unset" };
|
|
235
|
+
}
|
|
236
|
+
export function requireConfigValue(name, options) {
|
|
237
|
+
const layers = buildLayers(options);
|
|
238
|
+
if (layers.cliFileError !== undefined) {
|
|
239
|
+
throw new ConfigError("The --config file could not be read", {
|
|
240
|
+
missing: [name],
|
|
241
|
+
suggestion: "请检查 --config 或 QWEN_CONFIG_FILE 指向的文件是否存在且可读",
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const resolved = lookupFromLayers(name, layers);
|
|
245
|
+
if (resolved.value === undefined) {
|
|
246
|
+
throw new ConfigError(`Missing required environment variable: ${name}. Set it in the MCP server env and restart. Create a Bailian API key: https://bailian.console.aliyun.com/`, {
|
|
247
|
+
missing: [name],
|
|
248
|
+
suggestion: "请在 MCP server 的 env 配置、--config 文件、用户配置文件或宿主进程环境中提供该变量",
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return resolved.value;
|
|
252
|
+
}
|
|
253
|
+
export function inspectConfig(options) {
|
|
254
|
+
const apiKey = lookupConfigValue("DASHSCOPE_API_KEY", options);
|
|
255
|
+
const roots = lookupConfigValue("MEDIA_ALLOWED_ROOTS", options);
|
|
256
|
+
return {
|
|
257
|
+
api_key: {
|
|
258
|
+
configured: apiKey.value !== undefined,
|
|
259
|
+
source: apiKey.source,
|
|
260
|
+
},
|
|
261
|
+
allowed_roots: {
|
|
262
|
+
configured: roots.value !== undefined,
|
|
263
|
+
source: roots.source,
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
export function formatConfigSourceLog(inspection) {
|
|
268
|
+
return (`config api_key.configured=${String(inspection.api_key.configured)} source=${inspection.api_key.source}` +
|
|
269
|
+
` allowed_roots.configured=${String(inspection.allowed_roots.configured)} source=${inspection.allowed_roots.source}`);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=config-lookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-lookup.js","sourceRoot":"","sources":["../src/config-lookup.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { delimiter, isAbsolute, join } from "node:path";
|
|
4
|
+
import { lookupConfigValue, requireConfigValue, } from "./config-lookup.js";
|
|
5
|
+
import { ConfigError } from "./errors.js";
|
|
6
|
+
export const DEFAULT_MODEL = "qwen3.8-omni-flash";
|
|
7
|
+
export const DEFAULT_SERVER_NAME = "Media Analysis MCP";
|
|
8
|
+
const SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
9
|
+
export const DEFAULT_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";
|
|
10
|
+
export const DEFAULT_UPLOAD_URL = "https://dashscope.aliyuncs.com/api/v1/uploads";
|
|
11
|
+
export const DEFAULT_MAX_LOCAL_MEDIA_MB = 1024;
|
|
12
|
+
export const ABSOLUTE_MAX_LOCAL_MEDIA_MB = 1024;
|
|
13
|
+
export const DEFAULT_UPLOAD_TIMEOUT_SECONDS = 900;
|
|
14
|
+
export const DEFAULT_ANALYSIS_TIMEOUT_SECONDS = 900;
|
|
15
|
+
export const DEFAULT_ANALYSIS_RETRIES = 1;
|
|
16
|
+
export const MIN_TIMEOUT_SECONDS = 1;
|
|
17
|
+
export const MAX_TIMEOUT_SECONDS = 3600;
|
|
18
|
+
export const BYTES_PER_MIB = 1024 * 1024;
|
|
19
|
+
/** Replaced by MEDIA_ALLOWED_ROOTS / MEDIA_ALLOW_ANY_LOCAL_FILE / MEDIA_MAX_LOCAL_MEDIA_MB. */
|
|
20
|
+
export const LEGACY_MEDIA_VARS = [
|
|
21
|
+
"QWEN_ALLOWED_ROOTS",
|
|
22
|
+
"QWEN_ALLOW_ANY_LOCAL_VIDEO",
|
|
23
|
+
"QWEN_MAX_LOCAL_VIDEO_MB",
|
|
24
|
+
"QWEN_AUDIO_SILENCE_CHECK",
|
|
25
|
+
];
|
|
26
|
+
const LEGACY_REPLACEMENT = {
|
|
27
|
+
QWEN_ALLOWED_ROOTS: "MEDIA_ALLOWED_ROOTS",
|
|
28
|
+
QWEN_ALLOW_ANY_LOCAL_VIDEO: "MEDIA_ALLOW_ANY_LOCAL_FILE",
|
|
29
|
+
QWEN_MAX_LOCAL_VIDEO_MB: "MEDIA_MAX_LOCAL_MEDIA_MB",
|
|
30
|
+
};
|
|
31
|
+
/** Set by an older install, but the feature itself is gone rather than renamed. */
|
|
32
|
+
const LEGACY_REMOVED = new Set(["QWEN_AUDIO_SILENCE_CHECK"]);
|
|
33
|
+
export function legacyMediaVarWarning(name) {
|
|
34
|
+
const replacement = LEGACY_REPLACEMENT[name];
|
|
35
|
+
if (replacement !== undefined) {
|
|
36
|
+
return `${name} is no longer read; use ${replacement}`;
|
|
37
|
+
}
|
|
38
|
+
return LEGACY_REMOVED.has(name)
|
|
39
|
+
? `${name} was removed with the local silence check and no longer takes effect`
|
|
40
|
+
: undefined;
|
|
41
|
+
}
|
|
42
|
+
function readRaw(name, options) {
|
|
43
|
+
return lookupConfigValue(name, options).value;
|
|
44
|
+
}
|
|
45
|
+
function boundedInt(name, fallback, min, max, options) {
|
|
46
|
+
const raw = readRaw(name, options);
|
|
47
|
+
if (raw === undefined) {
|
|
48
|
+
return fallback;
|
|
49
|
+
}
|
|
50
|
+
const parsed = Number(raw);
|
|
51
|
+
if (!Number.isInteger(parsed) || parsed < min || parsed > max) {
|
|
52
|
+
throw new ConfigError(`${name} must be an integer between ${String(min)} and ${String(max)}`);
|
|
53
|
+
}
|
|
54
|
+
return parsed;
|
|
55
|
+
}
|
|
56
|
+
function zeroOrOne(name, fallback, options) {
|
|
57
|
+
const parsed = boundedInt(name, fallback, 0, 1, options);
|
|
58
|
+
return parsed === 0 ? 0 : 1;
|
|
59
|
+
}
|
|
60
|
+
function httpsUrl(name, fallback, options) {
|
|
61
|
+
const raw = readRaw(name, options);
|
|
62
|
+
const value = raw === undefined ? fallback : raw;
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = new URL(value);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new ConfigError(`${name} must be a valid HTTPS URL`);
|
|
69
|
+
}
|
|
70
|
+
if (parsed.protocol !== "https:" || parsed.username !== "" || parsed.password !== "") {
|
|
71
|
+
throw new ConfigError(`${name} must be a valid HTTPS URL`);
|
|
72
|
+
}
|
|
73
|
+
return `${parsed.origin}${parsed.pathname}${parsed.search}`.replace(/\/+$/, "");
|
|
74
|
+
}
|
|
75
|
+
function parseServerName(options) {
|
|
76
|
+
const raw = readRaw("QWEN_MCP_SERVER_NAME", options);
|
|
77
|
+
if (raw === undefined) {
|
|
78
|
+
return DEFAULT_SERVER_NAME;
|
|
79
|
+
}
|
|
80
|
+
if (!SERVER_NAME_PATTERN.test(raw) || raw.length > 64) {
|
|
81
|
+
throw new ConfigError("QWEN_MCP_SERVER_NAME must be 1-64 characters: letters, digits, dot, underscore, hyphen");
|
|
82
|
+
}
|
|
83
|
+
return raw;
|
|
84
|
+
}
|
|
85
|
+
/** Initialize.name must never crash the MCP handshake. */
|
|
86
|
+
export function readBootstrapServerName() {
|
|
87
|
+
try {
|
|
88
|
+
return parseServerName();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return DEFAULT_SERVER_NAME;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function defaultUploadCachePath() {
|
|
95
|
+
if (process.platform === "win32") {
|
|
96
|
+
const base = process.env.LOCALAPPDATA?.trim() || join(homedir(), "AppData", "Local");
|
|
97
|
+
return join(base, "media-analysis-mcp", "upload-cache.json");
|
|
98
|
+
}
|
|
99
|
+
const xdg = process.env.XDG_CACHE_HOME?.trim();
|
|
100
|
+
const base = xdg !== undefined && xdg.length > 0 ? xdg : join(homedir(), ".cache");
|
|
101
|
+
return join(base, "media-analysis-mcp", "upload-cache.json");
|
|
102
|
+
}
|
|
103
|
+
/** Recognizes the on/off spellings used by the toggle variables; undefined when unrecognized. */
|
|
104
|
+
export function parseOnOffToken(raw) {
|
|
105
|
+
const value = raw.toLowerCase();
|
|
106
|
+
if (value === "off" || value === "0" || value === "false") {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
if (value === "on" || value === "1" || value === "true") {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
function parseToggle(name, fallback, options) {
|
|
115
|
+
const raw = readRaw(name, options);
|
|
116
|
+
if (raw === undefined) {
|
|
117
|
+
return fallback;
|
|
118
|
+
}
|
|
119
|
+
const parsed = parseOnOffToken(raw);
|
|
120
|
+
if (parsed === undefined) {
|
|
121
|
+
throw new ConfigError(`${name} must be on or off`);
|
|
122
|
+
}
|
|
123
|
+
return parsed;
|
|
124
|
+
}
|
|
125
|
+
function parseUploadCache(options) {
|
|
126
|
+
return parseToggle("QWEN_UPLOAD_CACHE", true, options);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Opt-in for uploading any local media path the Agent names, without requiring the
|
|
130
|
+
* file to sit under MEDIA_ALLOWED_ROOTS. Off by default: the path alone is not
|
|
131
|
+
* proof that the user chose the file, so installers must turn this on deliberately.
|
|
132
|
+
* Deliberately absent from the Windows user-environment fallback so it is only ever
|
|
133
|
+
* picked up from an explicit MCP env block, --config file or user config file.
|
|
134
|
+
*/
|
|
135
|
+
function parseAllowAnyLocalFile(options) {
|
|
136
|
+
return parseToggle("MEDIA_ALLOW_ANY_LOCAL_FILE", false, options);
|
|
137
|
+
}
|
|
138
|
+
export function readMediaAllowedRoots(options, lenient = false) {
|
|
139
|
+
return parseAllowedRoots(options, lenient);
|
|
140
|
+
}
|
|
141
|
+
function resolveAllowedRoot(part) {
|
|
142
|
+
if (!isAbsolute(part)) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
if (!statSync(part).isDirectory()) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
return realpathSync(part);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Strict by default: an unusable entry is a configuration error, so a broken
|
|
157
|
+
* allowlist fails closed. With MEDIA_ALLOW_ANY_LOCAL_FILE on the allowlist is not
|
|
158
|
+
* consulted at all, so unusable entries are dropped instead of failing every call
|
|
159
|
+
* (a renamed or deleted media folder used to break the whole tool).
|
|
160
|
+
*/
|
|
161
|
+
function parseAllowedRoots(options, lenient = false) {
|
|
162
|
+
const raw = readRaw("MEDIA_ALLOWED_ROOTS", options) ?? "";
|
|
163
|
+
const parts = raw
|
|
164
|
+
.split(delimiter)
|
|
165
|
+
.map((part) => part.trim())
|
|
166
|
+
.filter((part) => part.length > 0);
|
|
167
|
+
const resolved = [];
|
|
168
|
+
const seen = new Set();
|
|
169
|
+
for (const part of parts) {
|
|
170
|
+
const real = resolveAllowedRoot(part);
|
|
171
|
+
if (real === undefined) {
|
|
172
|
+
if (lenient) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
throw new ConfigError("MEDIA_ALLOWED_ROOTS entries must be absolute existing directories", {
|
|
176
|
+
missing: ["MEDIA_ALLOWED_ROOTS"],
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
const key = process.platform === "win32" ? real.toLowerCase() : real;
|
|
180
|
+
if (seen.has(key)) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
seen.add(key);
|
|
184
|
+
resolved.push(real);
|
|
185
|
+
}
|
|
186
|
+
return resolved;
|
|
187
|
+
}
|
|
188
|
+
function readLegacyMediaVars(options) {
|
|
189
|
+
return LEGACY_MEDIA_VARS.filter((name) => readRaw(name, options) !== undefined);
|
|
190
|
+
}
|
|
191
|
+
export function loadConfig(options) {
|
|
192
|
+
const maxLocalMediaMb = boundedInt("MEDIA_MAX_LOCAL_MEDIA_MB", DEFAULT_MAX_LOCAL_MEDIA_MB, 1, ABSOLUTE_MAX_LOCAL_MEDIA_MB, options);
|
|
193
|
+
const uploadCache = parseUploadCache(options);
|
|
194
|
+
const allowAnyLocalFile = parseAllowAnyLocalFile(options);
|
|
195
|
+
return {
|
|
196
|
+
apiKey: requireConfigValue("DASHSCOPE_API_KEY", options),
|
|
197
|
+
model: readRaw("QWEN_MODEL", options) ?? DEFAULT_MODEL,
|
|
198
|
+
serverName: parseServerName(options),
|
|
199
|
+
baseUrl: httpsUrl("DASHSCOPE_BASE_URL", DEFAULT_BASE_URL, options),
|
|
200
|
+
uploadUrl: httpsUrl("DASHSCOPE_UPLOAD_URL", DEFAULT_UPLOAD_URL, options),
|
|
201
|
+
allowedRoots: parseAllowedRoots(options, allowAnyLocalFile),
|
|
202
|
+
allowAnyLocalFile,
|
|
203
|
+
maxLocalMediaBytes: maxLocalMediaMb * BYTES_PER_MIB,
|
|
204
|
+
uploadTimeoutMs: boundedInt("QWEN_UPLOAD_TIMEOUT", DEFAULT_UPLOAD_TIMEOUT_SECONDS, MIN_TIMEOUT_SECONDS, MAX_TIMEOUT_SECONDS, options) * 1000,
|
|
205
|
+
analysisTimeoutMs: boundedInt("QWEN_ANALYSIS_TIMEOUT", DEFAULT_ANALYSIS_TIMEOUT_SECONDS, MIN_TIMEOUT_SECONDS, MAX_TIMEOUT_SECONDS, options) * 1000,
|
|
206
|
+
analysisRetries: zeroOrOne("QWEN_ANALYSIS_RETRIES", DEFAULT_ANALYSIS_RETRIES, options),
|
|
207
|
+
uploadCache,
|
|
208
|
+
uploadCachePath: uploadCache ? defaultUploadCachePath() : undefined,
|
|
209
|
+
legacyMediaVars: readLegacyMediaVars(options),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|