jimeng-cli 0.2.0 → 0.2.1
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/dist/{chunk-JZY62VNI.js → chunk-3SUCLOAC.js} +143 -203
- package/dist/chunk-3SUCLOAC.js.map +1 -0
- package/dist/cli/index.cjs +146 -204
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/mcp/index.cjs +136 -198
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-JZY62VNI.js.map +0 -1
package/dist/cli/index.cjs
CHANGED
|
@@ -25,11 +25,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
// src/cli/app.ts
|
|
26
26
|
var import_node_process = __toESM(require("process"), 1);
|
|
27
27
|
|
|
28
|
-
// src/lib/configs/
|
|
29
|
-
var
|
|
30
|
-
var
|
|
28
|
+
// src/lib/configs/system-config.ts
|
|
29
|
+
var import_path2 = __toESM(require("path"), 1);
|
|
30
|
+
var import_fs_extra2 = __toESM(require("fs-extra"), 1);
|
|
31
31
|
var import_yaml = __toESM(require("yaml"), 1);
|
|
32
|
-
var
|
|
32
|
+
var import_lodash2 = __toESM(require("lodash"), 1);
|
|
33
33
|
|
|
34
34
|
// src/lib/environment.ts
|
|
35
35
|
var import_path = __toESM(require("path"), 1);
|
|
@@ -45,12 +45,6 @@ var Environment = class {
|
|
|
45
45
|
envVars;
|
|
46
46
|
/** 环境名称 */
|
|
47
47
|
env;
|
|
48
|
-
/** 服务名称 */
|
|
49
|
-
name;
|
|
50
|
-
/** 服务地址 */
|
|
51
|
-
host;
|
|
52
|
-
/** 服务端口 */
|
|
53
|
-
port;
|
|
54
48
|
/** 包参数 */
|
|
55
49
|
package;
|
|
56
50
|
constructor(options = {}) {
|
|
@@ -58,9 +52,6 @@ var Environment = class {
|
|
|
58
52
|
this.cmdArgs = cmdArgs2;
|
|
59
53
|
this.envVars = envVars2;
|
|
60
54
|
this.env = import_lodash.default.defaultTo(cmdArgs2.env || envVars2.SERVER_ENV, "dev");
|
|
61
|
-
this.name = cmdArgs2.name || envVars2.SERVER_NAME || void 0;
|
|
62
|
-
this.host = cmdArgs2.host || envVars2.SERVER_HOST || void 0;
|
|
63
|
-
this.port = Number(cmdArgs2.port || envVars2.SERVER_PORT) ? Number(cmdArgs2.port || envVars2.SERVER_PORT) : void 0;
|
|
64
55
|
this.package = _package;
|
|
65
56
|
}
|
|
66
57
|
};
|
|
@@ -70,20 +61,98 @@ var environment_default = new Environment({
|
|
|
70
61
|
package: JSON.parse(import_fs_extra.default.readFileSync(import_path.default.join(import_path.default.resolve(), "package.json")).toString())
|
|
71
62
|
});
|
|
72
63
|
|
|
64
|
+
// src/lib/configs/system-config.ts
|
|
65
|
+
var CONFIG_PATH = import_path2.default.join(import_path2.default.resolve(), "configs/", environment_default.env, "/system.yml");
|
|
66
|
+
var SystemConfig = class _SystemConfig {
|
|
67
|
+
/** 是否开启请求日志 */
|
|
68
|
+
requestLog;
|
|
69
|
+
/** 临时目录路径 */
|
|
70
|
+
tmpDir;
|
|
71
|
+
/** 日志目录路径 */
|
|
72
|
+
logDir;
|
|
73
|
+
/** 日志写入间隔(毫秒) */
|
|
74
|
+
logWriteInterval;
|
|
75
|
+
/** 日志文件有效期(毫秒) */
|
|
76
|
+
logFileExpires;
|
|
77
|
+
/** 临时文件有效期(毫秒) */
|
|
78
|
+
tmpFileExpires;
|
|
79
|
+
/** 请求体配置 */
|
|
80
|
+
requestBody;
|
|
81
|
+
/** 是否调试模式 */
|
|
82
|
+
debug;
|
|
83
|
+
/** 日志级别 */
|
|
84
|
+
log_level;
|
|
85
|
+
constructor(options) {
|
|
86
|
+
const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
|
|
87
|
+
this.requestLog = import_lodash2.default.defaultTo(requestLog, false);
|
|
88
|
+
this.tmpDir = import_lodash2.default.defaultTo(tmpDir, "./tmp");
|
|
89
|
+
this.logDir = import_lodash2.default.defaultTo(logDir, "./logs");
|
|
90
|
+
this.logWriteInterval = import_lodash2.default.defaultTo(logWriteInterval, 200);
|
|
91
|
+
this.logFileExpires = import_lodash2.default.defaultTo(logFileExpires, 262656e4);
|
|
92
|
+
this.tmpFileExpires = import_lodash2.default.defaultTo(tmpFileExpires, 864e5);
|
|
93
|
+
this.requestBody = Object.assign(requestBody || {}, {
|
|
94
|
+
enableTypes: ["form", "text", "xml"],
|
|
95
|
+
// 移除 json,由自定义中间件处理
|
|
96
|
+
encoding: "utf-8",
|
|
97
|
+
formLimit: "100mb",
|
|
98
|
+
jsonLimit: "100mb",
|
|
99
|
+
textLimit: "100mb",
|
|
100
|
+
xmlLimit: "100mb",
|
|
101
|
+
formidable: {
|
|
102
|
+
maxFileSize: "100mb"
|
|
103
|
+
},
|
|
104
|
+
multipart: true,
|
|
105
|
+
parsedMethods: ["POST", "PUT", "PATCH"]
|
|
106
|
+
});
|
|
107
|
+
this.debug = import_lodash2.default.defaultTo(debug, true);
|
|
108
|
+
this.log_level = import_lodash2.default.defaultTo(log_level, "info");
|
|
109
|
+
}
|
|
110
|
+
get rootDirPath() {
|
|
111
|
+
return import_path2.default.resolve();
|
|
112
|
+
}
|
|
113
|
+
get tmpDirPath() {
|
|
114
|
+
return import_path2.default.resolve(this.tmpDir);
|
|
115
|
+
}
|
|
116
|
+
get logDirPath() {
|
|
117
|
+
return import_path2.default.resolve(this.logDir);
|
|
118
|
+
}
|
|
119
|
+
static load() {
|
|
120
|
+
if (!import_fs_extra2.default.pathExistsSync(CONFIG_PATH)) return new _SystemConfig();
|
|
121
|
+
const data = import_yaml.default.parse(import_fs_extra2.default.readFileSync(CONFIG_PATH).toString());
|
|
122
|
+
return new _SystemConfig(data);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
var system_config_default = SystemConfig.load();
|
|
126
|
+
|
|
127
|
+
// src/lib/config.ts
|
|
128
|
+
var Config = class {
|
|
129
|
+
/** 系统配置 */
|
|
130
|
+
system = system_config_default;
|
|
131
|
+
};
|
|
132
|
+
var config_default = new Config();
|
|
133
|
+
|
|
134
|
+
// src/lib/logger.ts
|
|
135
|
+
var import_path4 = __toESM(require("path"), 1);
|
|
136
|
+
var import_util = __toESM(require("util"), 1);
|
|
137
|
+
var import_colors2 = require("colors");
|
|
138
|
+
var import_lodash4 = __toESM(require("lodash"), 1);
|
|
139
|
+
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
140
|
+
var import_date_fns2 = require("date-fns");
|
|
141
|
+
|
|
73
142
|
// src/lib/util.ts
|
|
74
143
|
var import_os = __toESM(require("os"), 1);
|
|
75
|
-
var
|
|
144
|
+
var import_path3 = __toESM(require("path"), 1);
|
|
76
145
|
var import_crypto = __toESM(require("crypto"), 1);
|
|
77
146
|
var import_stream = require("stream");
|
|
78
147
|
var import_colors = require("colors");
|
|
79
148
|
var import_mime = __toESM(require("mime"), 1);
|
|
80
149
|
var import_axios = __toESM(require("axios"), 1);
|
|
81
|
-
var
|
|
150
|
+
var import_fs_extra3 = __toESM(require("fs-extra"), 1);
|
|
82
151
|
var import_uuid = require("uuid");
|
|
83
152
|
var import_date_fns = require("date-fns");
|
|
84
153
|
var import_crc_32 = __toESM(require("crc-32"), 1);
|
|
85
154
|
var import_randomstring = __toESM(require("randomstring"), 1);
|
|
86
|
-
var
|
|
155
|
+
var import_lodash3 = __toESM(require("lodash"), 1);
|
|
87
156
|
var import_cron = require("cron");
|
|
88
157
|
|
|
89
158
|
// src/lib/http-status-codes.ts
|
|
@@ -200,7 +269,7 @@ var http_status_codes_default = {
|
|
|
200
269
|
var autoIdMap = /* @__PURE__ */ new Map();
|
|
201
270
|
var util = {
|
|
202
271
|
is2DArrays(value) {
|
|
203
|
-
return
|
|
272
|
+
return import_lodash3.default.isArray(value) && (!value[0] || import_lodash3.default.isArray(value[0]) && import_lodash3.default.isArray(value[value.length - 1]));
|
|
204
273
|
},
|
|
205
274
|
uuid: (separator = true) => separator ? (0, import_uuid.v4)() : (0, import_uuid.v4)().replace(/\-/g, ""),
|
|
206
275
|
autoId: (prefix = "") => {
|
|
@@ -210,8 +279,8 @@ var util = {
|
|
|
210
279
|
return `${prefix}${index || 1}`;
|
|
211
280
|
},
|
|
212
281
|
ignoreJSONParse(value) {
|
|
213
|
-
const result =
|
|
214
|
-
if (
|
|
282
|
+
const result = import_lodash3.default.attempt(() => JSON.parse(value));
|
|
283
|
+
if (import_lodash3.default.isError(result)) return null;
|
|
215
284
|
return result;
|
|
216
285
|
},
|
|
217
286
|
generateRandomString(options) {
|
|
@@ -226,11 +295,11 @@ var util = {
|
|
|
226
295
|
return extension;
|
|
227
296
|
},
|
|
228
297
|
extractURLExtension(value) {
|
|
229
|
-
const extname =
|
|
298
|
+
const extname = import_path3.default.extname(new URL(value).pathname);
|
|
230
299
|
return extname.substring(1).toLowerCase();
|
|
231
300
|
},
|
|
232
301
|
createCronJob(cronPatterns, callback) {
|
|
233
|
-
if (!
|
|
302
|
+
if (!import_lodash3.default.isFunction(callback))
|
|
234
303
|
throw new Error("callback must be an Function");
|
|
235
304
|
return new import_cron.CronJob(
|
|
236
305
|
cronPatterns,
|
|
@@ -283,14 +352,14 @@ retry: ${retry || 3e3}
|
|
|
283
352
|
return import_os.default.platform() !== "win32";
|
|
284
353
|
},
|
|
285
354
|
isIPAddress(value) {
|
|
286
|
-
return
|
|
355
|
+
return import_lodash3.default.isString(value) && (/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/.test(
|
|
287
356
|
value
|
|
288
357
|
) || /\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*/.test(
|
|
289
358
|
value
|
|
290
359
|
));
|
|
291
360
|
},
|
|
292
361
|
isPort(value) {
|
|
293
|
-
return
|
|
362
|
+
return import_lodash3.default.isNumber(value) && value > 0 && value < 65536;
|
|
294
363
|
},
|
|
295
364
|
isReadStream(value) {
|
|
296
365
|
return value && (value instanceof import_stream.Readable || "readable" in value || value.readable);
|
|
@@ -299,16 +368,16 @@ retry: ${retry || 3e3}
|
|
|
299
368
|
return value && (value instanceof import_stream.Writable || "writable" in value || value.writable);
|
|
300
369
|
},
|
|
301
370
|
isHttpStatusCode(value) {
|
|
302
|
-
return
|
|
371
|
+
return import_lodash3.default.isNumber(value) && Object.values(http_status_codes_default).includes(value);
|
|
303
372
|
},
|
|
304
373
|
isURL(value) {
|
|
305
|
-
return !
|
|
374
|
+
return !import_lodash3.default.isUndefined(value) && /^(http|https)/.test(value);
|
|
306
375
|
},
|
|
307
376
|
isSrc(value) {
|
|
308
|
-
return !
|
|
377
|
+
return !import_lodash3.default.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value);
|
|
309
378
|
},
|
|
310
379
|
isBASE64(value) {
|
|
311
|
-
return !
|
|
380
|
+
return !import_lodash3.default.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
|
|
312
381
|
},
|
|
313
382
|
isBASE64Data(value) {
|
|
314
383
|
return /^data:/.test(value);
|
|
@@ -325,7 +394,7 @@ retry: ${retry || 3e3}
|
|
|
325
394
|
return /^(base64|json):/.test(value);
|
|
326
395
|
},
|
|
327
396
|
isStringNumber(value) {
|
|
328
|
-
return
|
|
397
|
+
return import_lodash3.default.isFinite(Number(value));
|
|
329
398
|
},
|
|
330
399
|
isUnixTimestamp(value) {
|
|
331
400
|
return /^[0-9]{10}$/.test(`${value}`);
|
|
@@ -343,7 +412,7 @@ retry: ${retry || 3e3}
|
|
|
343
412
|
},
|
|
344
413
|
async isAPNG(filePath) {
|
|
345
414
|
let head;
|
|
346
|
-
const readStream =
|
|
415
|
+
const readStream = import_fs_extra3.default.createReadStream(filePath, { start: 37, end: 40 });
|
|
347
416
|
const readPromise = new Promise((resolve, reject) => {
|
|
348
417
|
readStream.once("end", resolve);
|
|
349
418
|
readStream.once("error", reject);
|
|
@@ -365,7 +434,7 @@ retry: ${retry || 3e3}
|
|
|
365
434
|
return url;
|
|
366
435
|
},
|
|
367
436
|
millisecondsToHmss(milliseconds) {
|
|
368
|
-
if (
|
|
437
|
+
if (import_lodash3.default.isString(milliseconds)) return milliseconds;
|
|
369
438
|
milliseconds = parseInt(milliseconds);
|
|
370
439
|
const sec = Math.floor(milliseconds / 1e3);
|
|
371
440
|
const hours = Math.floor(sec / 3600);
|
|
@@ -393,10 +462,10 @@ retry: ${retry || 3e3}
|
|
|
393
462
|
return import_crypto.default.createHash("md5").update(value).digest("hex");
|
|
394
463
|
},
|
|
395
464
|
crc32(value) {
|
|
396
|
-
return
|
|
465
|
+
return import_lodash3.default.isBuffer(value) ? import_crc_32.default.buf(value) : import_crc_32.default.str(value);
|
|
397
466
|
},
|
|
398
467
|
arrayParse(value) {
|
|
399
|
-
return
|
|
468
|
+
return import_lodash3.default.isArray(value) ? value : [value];
|
|
400
469
|
},
|
|
401
470
|
booleanParse(value) {
|
|
402
471
|
return value === "true" || value === true ? true : false;
|
|
@@ -437,141 +506,14 @@ retry: ${retry || 3e3}
|
|
|
437
506
|
};
|
|
438
507
|
var util_default = util;
|
|
439
508
|
|
|
440
|
-
// src/lib/configs/service-config.ts
|
|
441
|
-
var CONFIG_PATH = import_path3.default.join(import_path3.default.resolve(), "configs/", environment_default.env, "/service.yml");
|
|
442
|
-
var ServiceConfig = class _ServiceConfig {
|
|
443
|
-
/** 服务名称 */
|
|
444
|
-
name;
|
|
445
|
-
/** @type {string} 服务绑定主机地址 */
|
|
446
|
-
host;
|
|
447
|
-
/** @type {number} 服务绑定端口 */
|
|
448
|
-
port;
|
|
449
|
-
/** @type {string} 服务路由前缀 */
|
|
450
|
-
urlPrefix;
|
|
451
|
-
/** @type {string} 服务绑定地址(外部访问地址) */
|
|
452
|
-
bindAddress;
|
|
453
|
-
constructor(options) {
|
|
454
|
-
const { name, host, port, urlPrefix, bindAddress } = options || {};
|
|
455
|
-
this.name = import_lodash3.default.defaultTo(name, "jimeng-cli");
|
|
456
|
-
this.host = import_lodash3.default.defaultTo(host, "0.0.0.0");
|
|
457
|
-
this.port = import_lodash3.default.defaultTo(port, 5566);
|
|
458
|
-
this.urlPrefix = import_lodash3.default.defaultTo(urlPrefix, "");
|
|
459
|
-
this.bindAddress = bindAddress;
|
|
460
|
-
}
|
|
461
|
-
get addressHost() {
|
|
462
|
-
if (this.bindAddress) return this.bindAddress;
|
|
463
|
-
const ipAddresses = util_default.getIPAddressesByIPv4();
|
|
464
|
-
for (let ipAddress of ipAddresses) {
|
|
465
|
-
if (ipAddress === this.host)
|
|
466
|
-
return ipAddress;
|
|
467
|
-
}
|
|
468
|
-
return ipAddresses[0] || "127.0.0.1";
|
|
469
|
-
}
|
|
470
|
-
get address() {
|
|
471
|
-
return `${this.addressHost}:${this.port}`;
|
|
472
|
-
}
|
|
473
|
-
get pageDirUrl() {
|
|
474
|
-
return `http://127.0.0.1:${this.port}/page`;
|
|
475
|
-
}
|
|
476
|
-
static load() {
|
|
477
|
-
const external = import_lodash3.default.pickBy(environment_default, (v, k) => ["name", "host", "port"].includes(k) && !import_lodash3.default.isUndefined(v));
|
|
478
|
-
if (!import_fs_extra3.default.pathExistsSync(CONFIG_PATH)) return new _ServiceConfig(external);
|
|
479
|
-
const data = import_yaml.default.parse(import_fs_extra3.default.readFileSync(CONFIG_PATH).toString());
|
|
480
|
-
return new _ServiceConfig({ ...data, ...external });
|
|
481
|
-
}
|
|
482
|
-
};
|
|
483
|
-
var service_config_default = ServiceConfig.load();
|
|
484
|
-
|
|
485
|
-
// src/lib/configs/system-config.ts
|
|
486
|
-
var import_path4 = __toESM(require("path"), 1);
|
|
487
|
-
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
488
|
-
var import_yaml2 = __toESM(require("yaml"), 1);
|
|
489
|
-
var import_lodash4 = __toESM(require("lodash"), 1);
|
|
490
|
-
var CONFIG_PATH2 = import_path4.default.join(import_path4.default.resolve(), "configs/", environment_default.env, "/system.yml");
|
|
491
|
-
var SystemConfig = class _SystemConfig {
|
|
492
|
-
/** 是否开启请求日志 */
|
|
493
|
-
requestLog;
|
|
494
|
-
/** 临时目录路径 */
|
|
495
|
-
tmpDir;
|
|
496
|
-
/** 日志目录路径 */
|
|
497
|
-
logDir;
|
|
498
|
-
/** 日志写入间隔(毫秒) */
|
|
499
|
-
logWriteInterval;
|
|
500
|
-
/** 日志文件有效期(毫秒) */
|
|
501
|
-
logFileExpires;
|
|
502
|
-
/** 临时文件有效期(毫秒) */
|
|
503
|
-
tmpFileExpires;
|
|
504
|
-
/** 请求体配置 */
|
|
505
|
-
requestBody;
|
|
506
|
-
/** 是否调试模式 */
|
|
507
|
-
debug;
|
|
508
|
-
/** 日志级别 */
|
|
509
|
-
log_level;
|
|
510
|
-
constructor(options) {
|
|
511
|
-
const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
|
|
512
|
-
this.requestLog = import_lodash4.default.defaultTo(requestLog, false);
|
|
513
|
-
this.tmpDir = import_lodash4.default.defaultTo(tmpDir, "./tmp");
|
|
514
|
-
this.logDir = import_lodash4.default.defaultTo(logDir, "./logs");
|
|
515
|
-
this.logWriteInterval = import_lodash4.default.defaultTo(logWriteInterval, 200);
|
|
516
|
-
this.logFileExpires = import_lodash4.default.defaultTo(logFileExpires, 262656e4);
|
|
517
|
-
this.tmpFileExpires = import_lodash4.default.defaultTo(tmpFileExpires, 864e5);
|
|
518
|
-
this.requestBody = Object.assign(requestBody || {}, {
|
|
519
|
-
enableTypes: ["form", "text", "xml"],
|
|
520
|
-
// 移除 json,由自定义中间件处理
|
|
521
|
-
encoding: "utf-8",
|
|
522
|
-
formLimit: "100mb",
|
|
523
|
-
jsonLimit: "100mb",
|
|
524
|
-
textLimit: "100mb",
|
|
525
|
-
xmlLimit: "100mb",
|
|
526
|
-
formidable: {
|
|
527
|
-
maxFileSize: "100mb"
|
|
528
|
-
},
|
|
529
|
-
multipart: true,
|
|
530
|
-
parsedMethods: ["POST", "PUT", "PATCH"]
|
|
531
|
-
});
|
|
532
|
-
this.debug = import_lodash4.default.defaultTo(debug, true);
|
|
533
|
-
this.log_level = import_lodash4.default.defaultTo(log_level, "info");
|
|
534
|
-
}
|
|
535
|
-
get rootDirPath() {
|
|
536
|
-
return import_path4.default.resolve();
|
|
537
|
-
}
|
|
538
|
-
get tmpDirPath() {
|
|
539
|
-
return import_path4.default.resolve(this.tmpDir);
|
|
540
|
-
}
|
|
541
|
-
get logDirPath() {
|
|
542
|
-
return import_path4.default.resolve(this.logDir);
|
|
543
|
-
}
|
|
544
|
-
static load() {
|
|
545
|
-
if (!import_fs_extra4.default.pathExistsSync(CONFIG_PATH2)) return new _SystemConfig();
|
|
546
|
-
const data = import_yaml2.default.parse(import_fs_extra4.default.readFileSync(CONFIG_PATH2).toString());
|
|
547
|
-
return new _SystemConfig(data);
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
var system_config_default = SystemConfig.load();
|
|
551
|
-
|
|
552
|
-
// src/lib/config.ts
|
|
553
|
-
var Config = class {
|
|
554
|
-
/** 服务配置 */
|
|
555
|
-
service = service_config_default;
|
|
556
|
-
/** 系统配置 */
|
|
557
|
-
system = system_config_default;
|
|
558
|
-
};
|
|
559
|
-
var config_default = new Config();
|
|
560
|
-
|
|
561
509
|
// src/lib/logger.ts
|
|
562
|
-
var import_path5 = __toESM(require("path"), 1);
|
|
563
|
-
var import_util2 = __toESM(require("util"), 1);
|
|
564
|
-
var import_colors2 = require("colors");
|
|
565
|
-
var import_lodash5 = __toESM(require("lodash"), 1);
|
|
566
|
-
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
567
|
-
var import_date_fns2 = require("date-fns");
|
|
568
510
|
var isVercelEnv = process.env.VERCEL;
|
|
569
511
|
var isCliSilentLogs = () => process.env.JIMENG_CLI_SILENT_LOGS === "true";
|
|
570
512
|
var LogWriter = class {
|
|
571
513
|
#buffers = [];
|
|
572
514
|
#timer = null;
|
|
573
515
|
constructor() {
|
|
574
|
-
!isVercelEnv &&
|
|
516
|
+
!isVercelEnv && import_fs_extra4.default.ensureDirSync(config_default.system.logDirPath);
|
|
575
517
|
!isVercelEnv && this.work();
|
|
576
518
|
}
|
|
577
519
|
push(content) {
|
|
@@ -579,14 +521,14 @@ var LogWriter = class {
|
|
|
579
521
|
this.#buffers.push(buffer);
|
|
580
522
|
}
|
|
581
523
|
writeSync(buffer) {
|
|
582
|
-
!isVercelEnv &&
|
|
524
|
+
!isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
|
|
583
525
|
}
|
|
584
526
|
async write(buffer) {
|
|
585
|
-
!isVercelEnv && await
|
|
527
|
+
!isVercelEnv && await import_fs_extra4.default.appendFile(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
|
|
586
528
|
}
|
|
587
529
|
flush() {
|
|
588
530
|
if (!this.#buffers.length) return;
|
|
589
|
-
!isVercelEnv &&
|
|
531
|
+
!isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), Buffer.concat(this.#buffers));
|
|
590
532
|
this.#buffers = [];
|
|
591
533
|
}
|
|
592
534
|
destroy() {
|
|
@@ -615,7 +557,7 @@ var LogText = class {
|
|
|
615
557
|
time = /* @__PURE__ */ new Date();
|
|
616
558
|
constructor(level, ...params) {
|
|
617
559
|
this.level = level;
|
|
618
|
-
this.text =
|
|
560
|
+
this.text = import_util.default.format.apply(null, params);
|
|
619
561
|
this.source = this.#getStackTopCodeInfo();
|
|
620
562
|
}
|
|
621
563
|
#getStackTopCodeInfo() {
|
|
@@ -625,7 +567,7 @@ var LogText = class {
|
|
|
625
567
|
if (!text)
|
|
626
568
|
return unknownInfo;
|
|
627
569
|
const match = text.match(/at (.+) \((.+)\)/) || text.match(/at (.+)/);
|
|
628
|
-
if (!match || !
|
|
570
|
+
if (!match || !import_lodash4.default.isString(match[2] || match[1]))
|
|
629
571
|
return unknownInfo;
|
|
630
572
|
const temp = match[2] || match[1];
|
|
631
573
|
const _match = temp.match(/([a-zA-Z0-9_\-\.]+)\:(\d+)\:(\d+)$/);
|
|
@@ -728,14 +670,14 @@ var Logger = class _Logger {
|
|
|
728
670
|
var logger_default = new Logger();
|
|
729
671
|
|
|
730
672
|
// src/lib/session-pool.ts
|
|
731
|
-
var
|
|
732
|
-
var
|
|
733
|
-
var
|
|
673
|
+
var import_path5 = __toESM(require("path"), 1);
|
|
674
|
+
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
675
|
+
var import_lodash7 = __toESM(require("lodash"), 1);
|
|
734
676
|
|
|
735
677
|
// src/api/controllers/core.ts
|
|
736
678
|
var import_node_net = __toESM(require("net"), 1);
|
|
737
679
|
var import_promises = __toESM(require("dns/promises"), 1);
|
|
738
|
-
var
|
|
680
|
+
var import_lodash6 = __toESM(require("lodash"), 1);
|
|
739
681
|
var import_mime2 = __toESM(require("mime"), 1);
|
|
740
682
|
var import_axios2 = __toESM(require("axios"), 1);
|
|
741
683
|
var import_https_proxy_agent = require("https-proxy-agent");
|
|
@@ -743,7 +685,7 @@ var import_socks_proxy_agent = require("socks-proxy-agent");
|
|
|
743
685
|
|
|
744
686
|
// src/lib/exceptions/Exception.ts
|
|
745
687
|
var import_assert = __toESM(require("assert"), 1);
|
|
746
|
-
var
|
|
688
|
+
var import_lodash5 = __toESM(require("lodash"), 1);
|
|
747
689
|
var Exception = class extends Error {
|
|
748
690
|
/** 错误码 */
|
|
749
691
|
errcode;
|
|
@@ -760,10 +702,10 @@ var Exception = class extends Error {
|
|
|
760
702
|
* @param _errmsg 异常消息
|
|
761
703
|
*/
|
|
762
704
|
constructor(exception, _errmsg) {
|
|
763
|
-
(0, import_assert.default)(
|
|
705
|
+
(0, import_assert.default)(import_lodash5.default.isArray(exception), "Exception must be Array");
|
|
764
706
|
const [errcode, errmsg] = exception;
|
|
765
|
-
(0, import_assert.default)(
|
|
766
|
-
(0, import_assert.default)(
|
|
707
|
+
(0, import_assert.default)(import_lodash5.default.isFinite(errcode), "Exception errcode invalid");
|
|
708
|
+
(0, import_assert.default)(import_lodash5.default.isString(errmsg), "Exception errmsg invalid");
|
|
767
709
|
super(_errmsg || errmsg);
|
|
768
710
|
this.errcode = errcode;
|
|
769
711
|
this.errmsg = _errmsg || errmsg;
|
|
@@ -777,7 +719,7 @@ var Exception = class extends Error {
|
|
|
777
719
|
return this;
|
|
778
720
|
}
|
|
779
721
|
setData(value) {
|
|
780
|
-
this.data =
|
|
722
|
+
this.data = import_lodash5.default.defaultTo(value, null);
|
|
781
723
|
return this;
|
|
782
724
|
}
|
|
783
725
|
};
|
|
@@ -1168,7 +1110,7 @@ async function acquireToken(refreshToken) {
|
|
|
1168
1110
|
}
|
|
1169
1111
|
var REGION_PREFIX_PATTERN = /^(us|hk|jp|sg)-/i;
|
|
1170
1112
|
function parseRegionCode(value) {
|
|
1171
|
-
if (!
|
|
1113
|
+
if (!import_lodash6.default.isString(value)) return null;
|
|
1172
1114
|
const normalized = value.trim().toLowerCase();
|
|
1173
1115
|
if (normalized === "cn" || normalized === "us" || normalized === "hk" || normalized === "jp" || normalized === "sg") {
|
|
1174
1116
|
return normalized;
|
|
@@ -1369,7 +1311,7 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
|
|
|
1369
1311
|
// 增加超时时间到45秒
|
|
1370
1312
|
validateStatus: () => true,
|
|
1371
1313
|
// 允许任何状态码
|
|
1372
|
-
...
|
|
1314
|
+
...import_lodash6.default.omit(options, "params", "headers"),
|
|
1373
1315
|
...proxyAgent ? { httpAgent: proxyAgent, httpsAgent: proxyAgent, proxy: false } : {}
|
|
1374
1316
|
});
|
|
1375
1317
|
logger_default.info(`\u54CD\u5E94\u72B6\u6001: ${response.status} ${response.statusText}`);
|
|
@@ -1456,7 +1398,7 @@ async function checkImageContent(imageUri, refreshToken, regionInfo) {
|
|
|
1456
1398
|
}
|
|
1457
1399
|
function checkResult(result) {
|
|
1458
1400
|
const { ret, errmsg, data } = result.data;
|
|
1459
|
-
if (!
|
|
1401
|
+
if (!import_lodash6.default.isFinite(Number(ret))) return result.data;
|
|
1460
1402
|
if (ret === "0") return data;
|
|
1461
1403
|
JimengErrorHandler.handleApiResponse(result.data, {
|
|
1462
1404
|
context: "\u5373\u68A6API\u8BF7\u6C42",
|
|
@@ -1502,7 +1444,7 @@ var TokenPool = class {
|
|
|
1502
1444
|
roundRobinCursor = 0;
|
|
1503
1445
|
constructor() {
|
|
1504
1446
|
this.enabled = process.env.TOKEN_POOL_ENABLED !== "false";
|
|
1505
|
-
this.filePath =
|
|
1447
|
+
this.filePath = import_path5.default.resolve(
|
|
1506
1448
|
process.env.TOKEN_POOL_FILE || "configs/token-pool.json"
|
|
1507
1449
|
);
|
|
1508
1450
|
this.healthCheckIntervalMs = Number(
|
|
@@ -1574,7 +1516,7 @@ var TokenPool = class {
|
|
|
1574
1516
|
return this.pickTokenFromAuthorizationDetailed(authorization).token;
|
|
1575
1517
|
}
|
|
1576
1518
|
pickTokenFromAuthorizationDetailed(authorization) {
|
|
1577
|
-
if (
|
|
1519
|
+
if (import_lodash7.default.isString(authorization)) {
|
|
1578
1520
|
if (authorization.trim().length === 0) return { token: this.pickToken(), error: null };
|
|
1579
1521
|
if (!/^Bearer\s+/i.test(authorization)) {
|
|
1580
1522
|
return { token: null, error: "invalid_authorization_format" };
|
|
@@ -1583,7 +1525,7 @@ var TokenPool = class {
|
|
|
1583
1525
|
if (tokens.length === 0) {
|
|
1584
1526
|
return { token: null, error: "empty_authorization_tokens" };
|
|
1585
1527
|
}
|
|
1586
|
-
return { token:
|
|
1528
|
+
return { token: import_lodash7.default.sample(tokens) || null, error: null };
|
|
1587
1529
|
}
|
|
1588
1530
|
return { token: this.pickToken(), error: null };
|
|
1589
1531
|
}
|
|
@@ -1596,7 +1538,7 @@ var TokenPool = class {
|
|
|
1596
1538
|
this.roundRobinCursor++;
|
|
1597
1539
|
return token;
|
|
1598
1540
|
}
|
|
1599
|
-
return
|
|
1541
|
+
return import_lodash7.default.sample(tokens) || null;
|
|
1600
1542
|
}
|
|
1601
1543
|
pickTokenForRequest({
|
|
1602
1544
|
authorization,
|
|
@@ -1606,7 +1548,7 @@ var TokenPool = class {
|
|
|
1606
1548
|
xRegion
|
|
1607
1549
|
}) {
|
|
1608
1550
|
const xRegionCode = parseRegionCode(xRegion);
|
|
1609
|
-
if (
|
|
1551
|
+
if (import_lodash7.default.isString(xRegion) && xRegion.trim().length > 0 && !xRegionCode) {
|
|
1610
1552
|
return { token: null, region: null, error: "unsupported_region", reason: "X-Region \u4EC5\u652F\u6301 cn/us/hk/jp/sg" };
|
|
1611
1553
|
}
|
|
1612
1554
|
const authParseResult = this.parseAuthorizationTokens(authorization);
|
|
@@ -1803,14 +1745,14 @@ var TokenPool = class {
|
|
|
1803
1745
|
if (typeof this.healthCheckTimer.unref === "function") this.healthCheckTimer.unref();
|
|
1804
1746
|
}
|
|
1805
1747
|
async loadFromDisk() {
|
|
1806
|
-
await
|
|
1807
|
-
if (!await
|
|
1748
|
+
await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
|
|
1749
|
+
if (!await import_fs_extra5.default.pathExists(this.filePath)) {
|
|
1808
1750
|
await this.persistToDisk();
|
|
1809
1751
|
return;
|
|
1810
1752
|
}
|
|
1811
1753
|
let data = null;
|
|
1812
1754
|
try {
|
|
1813
|
-
data = await
|
|
1755
|
+
data = await import_fs_extra5.default.readJson(this.filePath);
|
|
1814
1756
|
} catch (err) {
|
|
1815
1757
|
logger_default.warn(`Token pool file parse failed, fallback to empty: ${(err == null ? void 0 : err.message) || String(err)}`);
|
|
1816
1758
|
data = null;
|
|
@@ -1825,10 +1767,10 @@ var TokenPool = class {
|
|
|
1825
1767
|
token,
|
|
1826
1768
|
region: parsedRegion || void 0,
|
|
1827
1769
|
enabled: raw.enabled !== false,
|
|
1828
|
-
live:
|
|
1829
|
-
lastCheckedAt:
|
|
1830
|
-
lastError:
|
|
1831
|
-
lastCredit:
|
|
1770
|
+
live: import_lodash7.default.isBoolean(raw.live) ? raw.live : void 0,
|
|
1771
|
+
lastCheckedAt: import_lodash7.default.isFinite(Number(raw.lastCheckedAt)) ? Number(raw.lastCheckedAt) : void 0,
|
|
1772
|
+
lastError: import_lodash7.default.isString(raw.lastError) ? raw.lastError : void 0,
|
|
1773
|
+
lastCredit: import_lodash7.default.isFinite(Number(raw.lastCredit)) ? Number(raw.lastCredit) : void 0,
|
|
1832
1774
|
consecutiveFailures: Math.max(0, Number(raw.consecutiveFailures) || 0),
|
|
1833
1775
|
allowedModels: this.normalizeStringArray(raw.allowedModels),
|
|
1834
1776
|
capabilityTags: this.normalizeStringArray(raw.capabilityTags),
|
|
@@ -1839,19 +1781,19 @@ var TokenPool = class {
|
|
|
1839
1781
|
for (const [token, item] of nextMap.entries()) this.entryMap.set(token, item);
|
|
1840
1782
|
}
|
|
1841
1783
|
async persistToDisk() {
|
|
1842
|
-
await
|
|
1784
|
+
await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
|
|
1843
1785
|
const payload = {
|
|
1844
1786
|
updatedAt: Date.now(),
|
|
1845
1787
|
tokens: this.getEntries(false)
|
|
1846
1788
|
};
|
|
1847
|
-
await
|
|
1789
|
+
await import_fs_extra5.default.writeJson(this.filePath, payload, { spaces: 2 });
|
|
1848
1790
|
}
|
|
1849
1791
|
maskToken(token) {
|
|
1850
1792
|
if (token.length <= 10) return "***";
|
|
1851
1793
|
return `${token.slice(0, 4)}...${token.slice(-4)}`;
|
|
1852
1794
|
}
|
|
1853
1795
|
parseAuthorizationTokens(authorization) {
|
|
1854
|
-
if (!
|
|
1796
|
+
if (!import_lodash7.default.isString(authorization) || authorization.trim().length === 0) {
|
|
1855
1797
|
return { tokens: [], error: null };
|
|
1856
1798
|
}
|
|
1857
1799
|
if (!/^Bearer\s+/i.test(authorization)) {
|
|
@@ -1864,7 +1806,7 @@ var TokenPool = class {
|
|
|
1864
1806
|
normalizeAddTokens(rawTokens, defaultRegion) {
|
|
1865
1807
|
const normalized = [];
|
|
1866
1808
|
for (const item of rawTokens) {
|
|
1867
|
-
if (
|
|
1809
|
+
if (import_lodash7.default.isString(item)) {
|
|
1868
1810
|
const token2 = item.trim();
|
|
1869
1811
|
if (!token2) continue;
|
|
1870
1812
|
if (!defaultRegion) {
|
|
@@ -1902,7 +1844,7 @@ var TokenPool = class {
|
|
|
1902
1844
|
imageModels: this.normalizeStringArray(data.imageModels),
|
|
1903
1845
|
videoModels: this.normalizeStringArray(data.videoModels),
|
|
1904
1846
|
capabilityTags: this.normalizeStringArray(data.capabilityTags),
|
|
1905
|
-
updatedAt:
|
|
1847
|
+
updatedAt: import_lodash7.default.isFinite(Number(data.updatedAt)) ? Number(data.updatedAt) : void 0
|
|
1906
1848
|
};
|
|
1907
1849
|
if (!dynamic.imageModels && !dynamic.videoModels && !dynamic.capabilityTags && !dynamic.updatedAt) {
|
|
1908
1850
|
return void 0;
|
|
@@ -1947,7 +1889,7 @@ var TokenPool = class {
|
|
|
1947
1889
|
this.roundRobinCursor++;
|
|
1948
1890
|
return item;
|
|
1949
1891
|
}
|
|
1950
|
-
return
|
|
1892
|
+
return import_lodash7.default.sample(candidates) || candidates[0];
|
|
1951
1893
|
}
|
|
1952
1894
|
matchesModelAndCapabilities(candidate, requestedModel, taskType, requiredCapabilityTags) {
|
|
1953
1895
|
var _a, _b, _c, _d;
|
|
@@ -3284,9 +3226,9 @@ var RegionUtils = class {
|
|
|
3284
3226
|
/**
|
|
3285
3227
|
* 获取Referer路径
|
|
3286
3228
|
*/
|
|
3287
|
-
static getRefererPath(regionInfo,
|
|
3229
|
+
static getRefererPath(regionInfo, path9 = "/ai-tool/generate") {
|
|
3288
3230
|
const origin = this.getOrigin(regionInfo);
|
|
3289
|
-
return `${origin}${
|
|
3231
|
+
return `${origin}${path9}`;
|
|
3290
3232
|
}
|
|
3291
3233
|
};
|
|
3292
3234
|
|
|
@@ -3829,7 +3771,7 @@ function buildBlendAbilityList(uploadedImageIds, strength) {
|
|
|
3829
3771
|
}));
|
|
3830
3772
|
}
|
|
3831
3773
|
function buildPromptPlaceholderList(count) {
|
|
3832
|
-
return Array.from({ length: count }, (
|
|
3774
|
+
return Array.from({ length: count }, (_8, index) => ({
|
|
3833
3775
|
type: "",
|
|
3834
3776
|
id: util_default.uuid(),
|
|
3835
3777
|
ability_index: index
|
|
@@ -4329,7 +4271,7 @@ async function generateJimeng4xMultiImages(_model, prompt, {
|
|
|
4329
4271
|
}
|
|
4330
4272
|
|
|
4331
4273
|
// src/api/controllers/videos.ts
|
|
4332
|
-
var
|
|
4274
|
+
var import_fs_extra6 = __toESM(require("fs-extra"), 1);
|
|
4333
4275
|
var import_axios5 = __toESM(require("axios"), 1);
|
|
4334
4276
|
|
|
4335
4277
|
// src/lib/video-uploader.ts
|
|
@@ -4621,7 +4563,7 @@ function getVideoBenefitType(model) {
|
|
|
4621
4563
|
async function uploadImageFromFile(file, refreshToken, regionInfo) {
|
|
4622
4564
|
try {
|
|
4623
4565
|
logger_default.info(`\u5F00\u59CB\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247: ${file.originalFilename} (\u8DEF\u5F84: ${file.filepath})`);
|
|
4624
|
-
const imageBuffer = await
|
|
4566
|
+
const imageBuffer = await import_fs_extra6.default.readFile(file.filepath);
|
|
4625
4567
|
return await uploadImageBuffer(imageBuffer, refreshToken, regionInfo);
|
|
4626
4568
|
} catch (error) {
|
|
4627
4569
|
logger_default.error(`\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247\u5931\u8D25: ${error.message}`);
|
|
@@ -4832,7 +4774,7 @@ async function generateVideo(_model, prompt, {
|
|
|
4832
4774
|
throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
|
|
4833
4775
|
}
|
|
4834
4776
|
if (imageFile) {
|
|
4835
|
-
const buf = await
|
|
4777
|
+
const buf = await import_fs_extra6.default.readFile(imageFile.filepath);
|
|
4836
4778
|
imgResult = await uploadImageBuffer(buf, refreshToken, regionInfo);
|
|
4837
4779
|
await checkImageContent(imgResult.uri, refreshToken, regionInfo);
|
|
4838
4780
|
const entry = {
|
|
@@ -4909,7 +4851,7 @@ async function generateVideo(_model, prompt, {
|
|
|
4909
4851
|
throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
|
|
4910
4852
|
}
|
|
4911
4853
|
if (videoFile) {
|
|
4912
|
-
const buf = await
|
|
4854
|
+
const buf = await import_fs_extra6.default.readFile(videoFile.filepath);
|
|
4913
4855
|
vResult = await uploadVideoBuffer(buf, refreshToken, regionInfo);
|
|
4914
4856
|
totalVideoDuration += vResult.videoMeta.duration;
|
|
4915
4857
|
const entry = {
|
|
@@ -5412,8 +5354,8 @@ async function generateVideo(_model, prompt, {
|
|
|
5412
5354
|
|
|
5413
5355
|
// src/cli/video-input.ts
|
|
5414
5356
|
var import_node_path2 = __toESM(require("path"), 1);
|
|
5415
|
-
var VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (
|
|
5416
|
-
var VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (
|
|
5357
|
+
var VIDEO_OMNI_IMAGE_SLOT_KEYS = Array.from({ length: 9 }, (_8, i) => `image-file-${i + 1}`);
|
|
5358
|
+
var VIDEO_OMNI_VIDEO_SLOT_KEYS = Array.from({ length: 3 }, (_8, i) => `video-file-${i + 1}`);
|
|
5417
5359
|
var VIDEO_SUPPORTED_MODES = [
|
|
5418
5360
|
"text_to_video",
|
|
5419
5361
|
"image_to_video",
|