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.js
CHANGED
package/dist/mcp/index.cjs
CHANGED
|
@@ -65,12 +65,6 @@ var Environment = class {
|
|
|
65
65
|
envVars;
|
|
66
66
|
/** 环境名称 */
|
|
67
67
|
env;
|
|
68
|
-
/** 服务名称 */
|
|
69
|
-
name;
|
|
70
|
-
/** 服务地址 */
|
|
71
|
-
host;
|
|
72
|
-
/** 服务端口 */
|
|
73
|
-
port;
|
|
74
68
|
/** 包参数 */
|
|
75
69
|
package;
|
|
76
70
|
constructor(options = {}) {
|
|
@@ -78,9 +72,6 @@ var Environment = class {
|
|
|
78
72
|
this.cmdArgs = cmdArgs2;
|
|
79
73
|
this.envVars = envVars2;
|
|
80
74
|
this.env = import_lodash.default.defaultTo(cmdArgs2.env || envVars2.SERVER_ENV, "dev");
|
|
81
|
-
this.name = cmdArgs2.name || envVars2.SERVER_NAME || void 0;
|
|
82
|
-
this.host = cmdArgs2.host || envVars2.SERVER_HOST || void 0;
|
|
83
|
-
this.port = Number(cmdArgs2.port || envVars2.SERVER_PORT) ? Number(cmdArgs2.port || envVars2.SERVER_PORT) : void 0;
|
|
84
75
|
this.package = _package;
|
|
85
76
|
}
|
|
86
77
|
};
|
|
@@ -238,7 +229,7 @@ var RESOLUTION_OPTIONS_NANOBANANAPRO_4K = {
|
|
|
238
229
|
// src/api/controllers/core.ts
|
|
239
230
|
var import_node_net = __toESM(require("net"), 1);
|
|
240
231
|
var import_promises = __toESM(require("dns/promises"), 1);
|
|
241
|
-
var
|
|
232
|
+
var import_lodash6 = __toESM(require("lodash"), 1);
|
|
242
233
|
var import_mime2 = __toESM(require("mime"), 1);
|
|
243
234
|
var import_axios2 = __toESM(require("axios"), 1);
|
|
244
235
|
var import_https_proxy_agent = require("https-proxy-agent");
|
|
@@ -313,33 +304,101 @@ var exceptions_default = {
|
|
|
313
304
|
};
|
|
314
305
|
|
|
315
306
|
// src/lib/logger.ts
|
|
316
|
-
var
|
|
317
|
-
var
|
|
307
|
+
var import_path4 = __toESM(require("path"), 1);
|
|
308
|
+
var import_util = __toESM(require("util"), 1);
|
|
318
309
|
var import_colors2 = require("colors");
|
|
319
|
-
var
|
|
320
|
-
var
|
|
310
|
+
var import_lodash5 = __toESM(require("lodash"), 1);
|
|
311
|
+
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
321
312
|
var import_date_fns2 = require("date-fns");
|
|
322
313
|
|
|
323
|
-
// src/lib/configs/
|
|
324
|
-
var
|
|
325
|
-
var
|
|
314
|
+
// src/lib/configs/system-config.ts
|
|
315
|
+
var import_path2 = __toESM(require("path"), 1);
|
|
316
|
+
var import_fs_extra2 = __toESM(require("fs-extra"), 1);
|
|
326
317
|
var import_yaml = __toESM(require("yaml"), 1);
|
|
327
|
-
var
|
|
318
|
+
var import_lodash3 = __toESM(require("lodash"), 1);
|
|
319
|
+
var CONFIG_PATH = import_path2.default.join(import_path2.default.resolve(), "configs/", environment_default.env, "/system.yml");
|
|
320
|
+
var SystemConfig = class _SystemConfig {
|
|
321
|
+
/** 是否开启请求日志 */
|
|
322
|
+
requestLog;
|
|
323
|
+
/** 临时目录路径 */
|
|
324
|
+
tmpDir;
|
|
325
|
+
/** 日志目录路径 */
|
|
326
|
+
logDir;
|
|
327
|
+
/** 日志写入间隔(毫秒) */
|
|
328
|
+
logWriteInterval;
|
|
329
|
+
/** 日志文件有效期(毫秒) */
|
|
330
|
+
logFileExpires;
|
|
331
|
+
/** 临时文件有效期(毫秒) */
|
|
332
|
+
tmpFileExpires;
|
|
333
|
+
/** 请求体配置 */
|
|
334
|
+
requestBody;
|
|
335
|
+
/** 是否调试模式 */
|
|
336
|
+
debug;
|
|
337
|
+
/** 日志级别 */
|
|
338
|
+
log_level;
|
|
339
|
+
constructor(options) {
|
|
340
|
+
const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
|
|
341
|
+
this.requestLog = import_lodash3.default.defaultTo(requestLog, false);
|
|
342
|
+
this.tmpDir = import_lodash3.default.defaultTo(tmpDir, "./tmp");
|
|
343
|
+
this.logDir = import_lodash3.default.defaultTo(logDir, "./logs");
|
|
344
|
+
this.logWriteInterval = import_lodash3.default.defaultTo(logWriteInterval, 200);
|
|
345
|
+
this.logFileExpires = import_lodash3.default.defaultTo(logFileExpires, 262656e4);
|
|
346
|
+
this.tmpFileExpires = import_lodash3.default.defaultTo(tmpFileExpires, 864e5);
|
|
347
|
+
this.requestBody = Object.assign(requestBody || {}, {
|
|
348
|
+
enableTypes: ["form", "text", "xml"],
|
|
349
|
+
// 移除 json,由自定义中间件处理
|
|
350
|
+
encoding: "utf-8",
|
|
351
|
+
formLimit: "100mb",
|
|
352
|
+
jsonLimit: "100mb",
|
|
353
|
+
textLimit: "100mb",
|
|
354
|
+
xmlLimit: "100mb",
|
|
355
|
+
formidable: {
|
|
356
|
+
maxFileSize: "100mb"
|
|
357
|
+
},
|
|
358
|
+
multipart: true,
|
|
359
|
+
parsedMethods: ["POST", "PUT", "PATCH"]
|
|
360
|
+
});
|
|
361
|
+
this.debug = import_lodash3.default.defaultTo(debug, true);
|
|
362
|
+
this.log_level = import_lodash3.default.defaultTo(log_level, "info");
|
|
363
|
+
}
|
|
364
|
+
get rootDirPath() {
|
|
365
|
+
return import_path2.default.resolve();
|
|
366
|
+
}
|
|
367
|
+
get tmpDirPath() {
|
|
368
|
+
return import_path2.default.resolve(this.tmpDir);
|
|
369
|
+
}
|
|
370
|
+
get logDirPath() {
|
|
371
|
+
return import_path2.default.resolve(this.logDir);
|
|
372
|
+
}
|
|
373
|
+
static load() {
|
|
374
|
+
if (!import_fs_extra2.default.pathExistsSync(CONFIG_PATH)) return new _SystemConfig();
|
|
375
|
+
const data = import_yaml.default.parse(import_fs_extra2.default.readFileSync(CONFIG_PATH).toString());
|
|
376
|
+
return new _SystemConfig(data);
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
var system_config_default = SystemConfig.load();
|
|
380
|
+
|
|
381
|
+
// src/lib/config.ts
|
|
382
|
+
var Config = class {
|
|
383
|
+
/** 系统配置 */
|
|
384
|
+
system = system_config_default;
|
|
385
|
+
};
|
|
386
|
+
var config_default = new Config();
|
|
328
387
|
|
|
329
388
|
// src/lib/util.ts
|
|
330
389
|
var import_os = __toESM(require("os"), 1);
|
|
331
|
-
var
|
|
390
|
+
var import_path3 = __toESM(require("path"), 1);
|
|
332
391
|
var import_crypto = __toESM(require("crypto"), 1);
|
|
333
392
|
var import_stream = require("stream");
|
|
334
393
|
var import_colors = require("colors");
|
|
335
394
|
var import_mime = __toESM(require("mime"), 1);
|
|
336
395
|
var import_axios = __toESM(require("axios"), 1);
|
|
337
|
-
var
|
|
396
|
+
var import_fs_extra3 = __toESM(require("fs-extra"), 1);
|
|
338
397
|
var import_uuid = require("uuid");
|
|
339
398
|
var import_date_fns = require("date-fns");
|
|
340
399
|
var import_crc_32 = __toESM(require("crc-32"), 1);
|
|
341
400
|
var import_randomstring = __toESM(require("randomstring"), 1);
|
|
342
|
-
var
|
|
401
|
+
var import_lodash4 = __toESM(require("lodash"), 1);
|
|
343
402
|
var import_cron = require("cron");
|
|
344
403
|
|
|
345
404
|
// src/lib/http-status-codes.ts
|
|
@@ -456,7 +515,7 @@ var http_status_codes_default = {
|
|
|
456
515
|
var autoIdMap = /* @__PURE__ */ new Map();
|
|
457
516
|
var util = {
|
|
458
517
|
is2DArrays(value) {
|
|
459
|
-
return
|
|
518
|
+
return import_lodash4.default.isArray(value) && (!value[0] || import_lodash4.default.isArray(value[0]) && import_lodash4.default.isArray(value[value.length - 1]));
|
|
460
519
|
},
|
|
461
520
|
uuid: (separator = true) => separator ? (0, import_uuid.v4)() : (0, import_uuid.v4)().replace(/\-/g, ""),
|
|
462
521
|
autoId: (prefix = "") => {
|
|
@@ -466,8 +525,8 @@ var util = {
|
|
|
466
525
|
return `${prefix}${index || 1}`;
|
|
467
526
|
},
|
|
468
527
|
ignoreJSONParse(value) {
|
|
469
|
-
const result =
|
|
470
|
-
if (
|
|
528
|
+
const result = import_lodash4.default.attempt(() => JSON.parse(value));
|
|
529
|
+
if (import_lodash4.default.isError(result)) return null;
|
|
471
530
|
return result;
|
|
472
531
|
},
|
|
473
532
|
generateRandomString(options) {
|
|
@@ -482,11 +541,11 @@ var util = {
|
|
|
482
541
|
return extension;
|
|
483
542
|
},
|
|
484
543
|
extractURLExtension(value) {
|
|
485
|
-
const extname =
|
|
544
|
+
const extname = import_path3.default.extname(new URL(value).pathname);
|
|
486
545
|
return extname.substring(1).toLowerCase();
|
|
487
546
|
},
|
|
488
547
|
createCronJob(cronPatterns, callback) {
|
|
489
|
-
if (!
|
|
548
|
+
if (!import_lodash4.default.isFunction(callback))
|
|
490
549
|
throw new Error("callback must be an Function");
|
|
491
550
|
return new import_cron.CronJob(
|
|
492
551
|
cronPatterns,
|
|
@@ -539,14 +598,14 @@ retry: ${retry || 3e3}
|
|
|
539
598
|
return import_os.default.platform() !== "win32";
|
|
540
599
|
},
|
|
541
600
|
isIPAddress(value) {
|
|
542
|
-
return
|
|
601
|
+
return import_lodash4.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(
|
|
543
602
|
value
|
|
544
603
|
) || /\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(
|
|
545
604
|
value
|
|
546
605
|
));
|
|
547
606
|
},
|
|
548
607
|
isPort(value) {
|
|
549
|
-
return
|
|
608
|
+
return import_lodash4.default.isNumber(value) && value > 0 && value < 65536;
|
|
550
609
|
},
|
|
551
610
|
isReadStream(value) {
|
|
552
611
|
return value && (value instanceof import_stream.Readable || "readable" in value || value.readable);
|
|
@@ -555,16 +614,16 @@ retry: ${retry || 3e3}
|
|
|
555
614
|
return value && (value instanceof import_stream.Writable || "writable" in value || value.writable);
|
|
556
615
|
},
|
|
557
616
|
isHttpStatusCode(value) {
|
|
558
|
-
return
|
|
617
|
+
return import_lodash4.default.isNumber(value) && Object.values(http_status_codes_default).includes(value);
|
|
559
618
|
},
|
|
560
619
|
isURL(value) {
|
|
561
|
-
return !
|
|
620
|
+
return !import_lodash4.default.isUndefined(value) && /^(http|https)/.test(value);
|
|
562
621
|
},
|
|
563
622
|
isSrc(value) {
|
|
564
|
-
return !
|
|
623
|
+
return !import_lodash4.default.isUndefined(value) && /^\/.+\.[0-9a-zA-Z]+(\?.+)?$/.test(value);
|
|
565
624
|
},
|
|
566
625
|
isBASE64(value) {
|
|
567
|
-
return !
|
|
626
|
+
return !import_lodash4.default.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
|
|
568
627
|
},
|
|
569
628
|
isBASE64Data(value) {
|
|
570
629
|
return /^data:/.test(value);
|
|
@@ -581,7 +640,7 @@ retry: ${retry || 3e3}
|
|
|
581
640
|
return /^(base64|json):/.test(value);
|
|
582
641
|
},
|
|
583
642
|
isStringNumber(value) {
|
|
584
|
-
return
|
|
643
|
+
return import_lodash4.default.isFinite(Number(value));
|
|
585
644
|
},
|
|
586
645
|
isUnixTimestamp(value) {
|
|
587
646
|
return /^[0-9]{10}$/.test(`${value}`);
|
|
@@ -599,7 +658,7 @@ retry: ${retry || 3e3}
|
|
|
599
658
|
},
|
|
600
659
|
async isAPNG(filePath) {
|
|
601
660
|
let head;
|
|
602
|
-
const readStream =
|
|
661
|
+
const readStream = import_fs_extra3.default.createReadStream(filePath, { start: 37, end: 40 });
|
|
603
662
|
const readPromise = new Promise((resolve, reject) => {
|
|
604
663
|
readStream.once("end", resolve);
|
|
605
664
|
readStream.once("error", reject);
|
|
@@ -621,7 +680,7 @@ retry: ${retry || 3e3}
|
|
|
621
680
|
return url;
|
|
622
681
|
},
|
|
623
682
|
millisecondsToHmss(milliseconds) {
|
|
624
|
-
if (
|
|
683
|
+
if (import_lodash4.default.isString(milliseconds)) return milliseconds;
|
|
625
684
|
milliseconds = parseInt(milliseconds);
|
|
626
685
|
const sec = Math.floor(milliseconds / 1e3);
|
|
627
686
|
const hours = Math.floor(sec / 3600);
|
|
@@ -649,10 +708,10 @@ retry: ${retry || 3e3}
|
|
|
649
708
|
return import_crypto.default.createHash("md5").update(value).digest("hex");
|
|
650
709
|
},
|
|
651
710
|
crc32(value) {
|
|
652
|
-
return
|
|
711
|
+
return import_lodash4.default.isBuffer(value) ? import_crc_32.default.buf(value) : import_crc_32.default.str(value);
|
|
653
712
|
},
|
|
654
713
|
arrayParse(value) {
|
|
655
|
-
return
|
|
714
|
+
return import_lodash4.default.isArray(value) ? value : [value];
|
|
656
715
|
},
|
|
657
716
|
booleanParse(value) {
|
|
658
717
|
return value === "true" || value === true ? true : false;
|
|
@@ -693,127 +752,6 @@ retry: ${retry || 3e3}
|
|
|
693
752
|
};
|
|
694
753
|
var util_default = util;
|
|
695
754
|
|
|
696
|
-
// src/lib/configs/service-config.ts
|
|
697
|
-
var CONFIG_PATH = import_path3.default.join(import_path3.default.resolve(), "configs/", environment_default.env, "/service.yml");
|
|
698
|
-
var ServiceConfig = class _ServiceConfig {
|
|
699
|
-
/** 服务名称 */
|
|
700
|
-
name;
|
|
701
|
-
/** @type {string} 服务绑定主机地址 */
|
|
702
|
-
host;
|
|
703
|
-
/** @type {number} 服务绑定端口 */
|
|
704
|
-
port;
|
|
705
|
-
/** @type {string} 服务路由前缀 */
|
|
706
|
-
urlPrefix;
|
|
707
|
-
/** @type {string} 服务绑定地址(外部访问地址) */
|
|
708
|
-
bindAddress;
|
|
709
|
-
constructor(options) {
|
|
710
|
-
const { name, host, port, urlPrefix, bindAddress } = options || {};
|
|
711
|
-
this.name = import_lodash4.default.defaultTo(name, "jimeng-cli");
|
|
712
|
-
this.host = import_lodash4.default.defaultTo(host, "0.0.0.0");
|
|
713
|
-
this.port = import_lodash4.default.defaultTo(port, 5566);
|
|
714
|
-
this.urlPrefix = import_lodash4.default.defaultTo(urlPrefix, "");
|
|
715
|
-
this.bindAddress = bindAddress;
|
|
716
|
-
}
|
|
717
|
-
get addressHost() {
|
|
718
|
-
if (this.bindAddress) return this.bindAddress;
|
|
719
|
-
const ipAddresses = util_default.getIPAddressesByIPv4();
|
|
720
|
-
for (let ipAddress of ipAddresses) {
|
|
721
|
-
if (ipAddress === this.host)
|
|
722
|
-
return ipAddress;
|
|
723
|
-
}
|
|
724
|
-
return ipAddresses[0] || "127.0.0.1";
|
|
725
|
-
}
|
|
726
|
-
get address() {
|
|
727
|
-
return `${this.addressHost}:${this.port}`;
|
|
728
|
-
}
|
|
729
|
-
get pageDirUrl() {
|
|
730
|
-
return `http://127.0.0.1:${this.port}/page`;
|
|
731
|
-
}
|
|
732
|
-
static load() {
|
|
733
|
-
const external = import_lodash4.default.pickBy(environment_default, (v, k) => ["name", "host", "port"].includes(k) && !import_lodash4.default.isUndefined(v));
|
|
734
|
-
if (!import_fs_extra3.default.pathExistsSync(CONFIG_PATH)) return new _ServiceConfig(external);
|
|
735
|
-
const data = import_yaml.default.parse(import_fs_extra3.default.readFileSync(CONFIG_PATH).toString());
|
|
736
|
-
return new _ServiceConfig({ ...data, ...external });
|
|
737
|
-
}
|
|
738
|
-
};
|
|
739
|
-
var service_config_default = ServiceConfig.load();
|
|
740
|
-
|
|
741
|
-
// src/lib/configs/system-config.ts
|
|
742
|
-
var import_path4 = __toESM(require("path"), 1);
|
|
743
|
-
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
744
|
-
var import_yaml2 = __toESM(require("yaml"), 1);
|
|
745
|
-
var import_lodash5 = __toESM(require("lodash"), 1);
|
|
746
|
-
var CONFIG_PATH2 = import_path4.default.join(import_path4.default.resolve(), "configs/", environment_default.env, "/system.yml");
|
|
747
|
-
var SystemConfig = class _SystemConfig {
|
|
748
|
-
/** 是否开启请求日志 */
|
|
749
|
-
requestLog;
|
|
750
|
-
/** 临时目录路径 */
|
|
751
|
-
tmpDir;
|
|
752
|
-
/** 日志目录路径 */
|
|
753
|
-
logDir;
|
|
754
|
-
/** 日志写入间隔(毫秒) */
|
|
755
|
-
logWriteInterval;
|
|
756
|
-
/** 日志文件有效期(毫秒) */
|
|
757
|
-
logFileExpires;
|
|
758
|
-
/** 临时文件有效期(毫秒) */
|
|
759
|
-
tmpFileExpires;
|
|
760
|
-
/** 请求体配置 */
|
|
761
|
-
requestBody;
|
|
762
|
-
/** 是否调试模式 */
|
|
763
|
-
debug;
|
|
764
|
-
/** 日志级别 */
|
|
765
|
-
log_level;
|
|
766
|
-
constructor(options) {
|
|
767
|
-
const { requestLog, tmpDir, logDir, logWriteInterval, logFileExpires, tmpFileExpires, requestBody, debug, log_level } = options || {};
|
|
768
|
-
this.requestLog = import_lodash5.default.defaultTo(requestLog, false);
|
|
769
|
-
this.tmpDir = import_lodash5.default.defaultTo(tmpDir, "./tmp");
|
|
770
|
-
this.logDir = import_lodash5.default.defaultTo(logDir, "./logs");
|
|
771
|
-
this.logWriteInterval = import_lodash5.default.defaultTo(logWriteInterval, 200);
|
|
772
|
-
this.logFileExpires = import_lodash5.default.defaultTo(logFileExpires, 262656e4);
|
|
773
|
-
this.tmpFileExpires = import_lodash5.default.defaultTo(tmpFileExpires, 864e5);
|
|
774
|
-
this.requestBody = Object.assign(requestBody || {}, {
|
|
775
|
-
enableTypes: ["form", "text", "xml"],
|
|
776
|
-
// 移除 json,由自定义中间件处理
|
|
777
|
-
encoding: "utf-8",
|
|
778
|
-
formLimit: "100mb",
|
|
779
|
-
jsonLimit: "100mb",
|
|
780
|
-
textLimit: "100mb",
|
|
781
|
-
xmlLimit: "100mb",
|
|
782
|
-
formidable: {
|
|
783
|
-
maxFileSize: "100mb"
|
|
784
|
-
},
|
|
785
|
-
multipart: true,
|
|
786
|
-
parsedMethods: ["POST", "PUT", "PATCH"]
|
|
787
|
-
});
|
|
788
|
-
this.debug = import_lodash5.default.defaultTo(debug, true);
|
|
789
|
-
this.log_level = import_lodash5.default.defaultTo(log_level, "info");
|
|
790
|
-
}
|
|
791
|
-
get rootDirPath() {
|
|
792
|
-
return import_path4.default.resolve();
|
|
793
|
-
}
|
|
794
|
-
get tmpDirPath() {
|
|
795
|
-
return import_path4.default.resolve(this.tmpDir);
|
|
796
|
-
}
|
|
797
|
-
get logDirPath() {
|
|
798
|
-
return import_path4.default.resolve(this.logDir);
|
|
799
|
-
}
|
|
800
|
-
static load() {
|
|
801
|
-
if (!import_fs_extra4.default.pathExistsSync(CONFIG_PATH2)) return new _SystemConfig();
|
|
802
|
-
const data = import_yaml2.default.parse(import_fs_extra4.default.readFileSync(CONFIG_PATH2).toString());
|
|
803
|
-
return new _SystemConfig(data);
|
|
804
|
-
}
|
|
805
|
-
};
|
|
806
|
-
var system_config_default = SystemConfig.load();
|
|
807
|
-
|
|
808
|
-
// src/lib/config.ts
|
|
809
|
-
var Config = class {
|
|
810
|
-
/** 服务配置 */
|
|
811
|
-
service = service_config_default;
|
|
812
|
-
/** 系统配置 */
|
|
813
|
-
system = system_config_default;
|
|
814
|
-
};
|
|
815
|
-
var config_default = new Config();
|
|
816
|
-
|
|
817
755
|
// src/lib/logger.ts
|
|
818
756
|
var isVercelEnv = process.env.VERCEL;
|
|
819
757
|
var isCliSilentLogs = () => process.env.JIMENG_CLI_SILENT_LOGS === "true";
|
|
@@ -821,7 +759,7 @@ var LogWriter = class {
|
|
|
821
759
|
#buffers = [];
|
|
822
760
|
#timer = null;
|
|
823
761
|
constructor() {
|
|
824
|
-
!isVercelEnv &&
|
|
762
|
+
!isVercelEnv && import_fs_extra4.default.ensureDirSync(config_default.system.logDirPath);
|
|
825
763
|
!isVercelEnv && this.work();
|
|
826
764
|
}
|
|
827
765
|
push(content) {
|
|
@@ -829,14 +767,14 @@ var LogWriter = class {
|
|
|
829
767
|
this.#buffers.push(buffer);
|
|
830
768
|
}
|
|
831
769
|
writeSync(buffer) {
|
|
832
|
-
!isVercelEnv &&
|
|
770
|
+
!isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
|
|
833
771
|
}
|
|
834
772
|
async write(buffer) {
|
|
835
|
-
!isVercelEnv && await
|
|
773
|
+
!isVercelEnv && await import_fs_extra4.default.appendFile(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), buffer);
|
|
836
774
|
}
|
|
837
775
|
flush() {
|
|
838
776
|
if (!this.#buffers.length) return;
|
|
839
|
-
!isVercelEnv &&
|
|
777
|
+
!isVercelEnv && import_fs_extra4.default.appendFileSync(import_path4.default.join(config_default.system.logDirPath, `/${util_default.getDateString()}.log`), Buffer.concat(this.#buffers));
|
|
840
778
|
this.#buffers = [];
|
|
841
779
|
}
|
|
842
780
|
destroy() {
|
|
@@ -865,7 +803,7 @@ var LogText = class {
|
|
|
865
803
|
time = /* @__PURE__ */ new Date();
|
|
866
804
|
constructor(level, ...params) {
|
|
867
805
|
this.level = level;
|
|
868
|
-
this.text =
|
|
806
|
+
this.text = import_util.default.format.apply(null, params);
|
|
869
807
|
this.source = this.#getStackTopCodeInfo();
|
|
870
808
|
}
|
|
871
809
|
#getStackTopCodeInfo() {
|
|
@@ -875,7 +813,7 @@ var LogText = class {
|
|
|
875
813
|
if (!text)
|
|
876
814
|
return unknownInfo;
|
|
877
815
|
const match = text.match(/at (.+) \((.+)\)/) || text.match(/at (.+)/);
|
|
878
|
-
if (!match || !
|
|
816
|
+
if (!match || !import_lodash5.default.isString(match[2] || match[1]))
|
|
879
817
|
return unknownInfo;
|
|
880
818
|
const temp = match[2] || match[1];
|
|
881
819
|
const _match = temp.match(/([a-zA-Z0-9_\-\.]+)\:(\d+)\:(\d+)$/);
|
|
@@ -1195,7 +1133,7 @@ async function acquireToken(refreshToken) {
|
|
|
1195
1133
|
}
|
|
1196
1134
|
var REGION_PREFIX_PATTERN = /^(us|hk|jp|sg)-/i;
|
|
1197
1135
|
function parseRegionCode(value) {
|
|
1198
|
-
if (!
|
|
1136
|
+
if (!import_lodash6.default.isString(value)) return null;
|
|
1199
1137
|
const normalized = value.trim().toLowerCase();
|
|
1200
1138
|
if (normalized === "cn" || normalized === "us" || normalized === "hk" || normalized === "jp" || normalized === "sg") {
|
|
1201
1139
|
return normalized;
|
|
@@ -1396,7 +1334,7 @@ async function request(method, uri, refreshToken, regionInfo, options = {}) {
|
|
|
1396
1334
|
// 增加超时时间到45秒
|
|
1397
1335
|
validateStatus: () => true,
|
|
1398
1336
|
// 允许任何状态码
|
|
1399
|
-
...
|
|
1337
|
+
...import_lodash6.default.omit(options, "params", "headers"),
|
|
1400
1338
|
...proxyAgent ? { httpAgent: proxyAgent, httpsAgent: proxyAgent, proxy: false } : {}
|
|
1401
1339
|
});
|
|
1402
1340
|
logger_default.info(`\u54CD\u5E94\u72B6\u6001: ${response.status} ${response.statusText}`);
|
|
@@ -1483,7 +1421,7 @@ async function checkImageContent(imageUri, refreshToken, regionInfo) {
|
|
|
1483
1421
|
}
|
|
1484
1422
|
function checkResult(result) {
|
|
1485
1423
|
const { ret, errmsg, data } = result.data;
|
|
1486
|
-
if (!
|
|
1424
|
+
if (!import_lodash6.default.isFinite(Number(ret))) return result.data;
|
|
1487
1425
|
if (ret === "0") return data;
|
|
1488
1426
|
JimengErrorHandler.handleApiResponse(result.data, {
|
|
1489
1427
|
context: "\u5373\u68A6API\u8BF7\u6C42",
|
|
@@ -1747,9 +1685,9 @@ var RegionUtils = class {
|
|
|
1747
1685
|
/**
|
|
1748
1686
|
* 获取Referer路径
|
|
1749
1687
|
*/
|
|
1750
|
-
static getRefererPath(regionInfo,
|
|
1688
|
+
static getRefererPath(regionInfo, path7 = "/ai-tool/generate") {
|
|
1751
1689
|
const origin = this.getOrigin(regionInfo);
|
|
1752
|
-
return `${origin}${
|
|
1690
|
+
return `${origin}${path7}`;
|
|
1753
1691
|
}
|
|
1754
1692
|
};
|
|
1755
1693
|
|
|
@@ -2372,7 +2310,7 @@ function buildBlendAbilityList(uploadedImageIds, strength) {
|
|
|
2372
2310
|
}));
|
|
2373
2311
|
}
|
|
2374
2312
|
function buildPromptPlaceholderList(count) {
|
|
2375
|
-
return Array.from({ length: count }, (
|
|
2313
|
+
return Array.from({ length: count }, (_8, index) => ({
|
|
2376
2314
|
type: "",
|
|
2377
2315
|
id: util_default.uuid(),
|
|
2378
2316
|
ability_index: index
|
|
@@ -2872,9 +2810,9 @@ async function generateJimeng4xMultiImages(_model, prompt, {
|
|
|
2872
2810
|
}
|
|
2873
2811
|
|
|
2874
2812
|
// src/lib/session-pool.ts
|
|
2875
|
-
var
|
|
2876
|
-
var
|
|
2877
|
-
var
|
|
2813
|
+
var import_path5 = __toESM(require("path"), 1);
|
|
2814
|
+
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
2815
|
+
var import_lodash7 = __toESM(require("lodash"), 1);
|
|
2878
2816
|
var DYNAMIC_CAPABILITY_TTL_MS = 30 * 60 * 1e3;
|
|
2879
2817
|
var TokenPool = class {
|
|
2880
2818
|
enabled;
|
|
@@ -2892,7 +2830,7 @@ var TokenPool = class {
|
|
|
2892
2830
|
roundRobinCursor = 0;
|
|
2893
2831
|
constructor() {
|
|
2894
2832
|
this.enabled = process.env.TOKEN_POOL_ENABLED !== "false";
|
|
2895
|
-
this.filePath =
|
|
2833
|
+
this.filePath = import_path5.default.resolve(
|
|
2896
2834
|
process.env.TOKEN_POOL_FILE || "configs/token-pool.json"
|
|
2897
2835
|
);
|
|
2898
2836
|
this.healthCheckIntervalMs = Number(
|
|
@@ -2964,7 +2902,7 @@ var TokenPool = class {
|
|
|
2964
2902
|
return this.pickTokenFromAuthorizationDetailed(authorization).token;
|
|
2965
2903
|
}
|
|
2966
2904
|
pickTokenFromAuthorizationDetailed(authorization) {
|
|
2967
|
-
if (
|
|
2905
|
+
if (import_lodash7.default.isString(authorization)) {
|
|
2968
2906
|
if (authorization.trim().length === 0) return { token: this.pickToken(), error: null };
|
|
2969
2907
|
if (!/^Bearer\s+/i.test(authorization)) {
|
|
2970
2908
|
return { token: null, error: "invalid_authorization_format" };
|
|
@@ -2973,7 +2911,7 @@ var TokenPool = class {
|
|
|
2973
2911
|
if (tokens.length === 0) {
|
|
2974
2912
|
return { token: null, error: "empty_authorization_tokens" };
|
|
2975
2913
|
}
|
|
2976
|
-
return { token:
|
|
2914
|
+
return { token: import_lodash7.default.sample(tokens) || null, error: null };
|
|
2977
2915
|
}
|
|
2978
2916
|
return { token: this.pickToken(), error: null };
|
|
2979
2917
|
}
|
|
@@ -2986,7 +2924,7 @@ var TokenPool = class {
|
|
|
2986
2924
|
this.roundRobinCursor++;
|
|
2987
2925
|
return token;
|
|
2988
2926
|
}
|
|
2989
|
-
return
|
|
2927
|
+
return import_lodash7.default.sample(tokens) || null;
|
|
2990
2928
|
}
|
|
2991
2929
|
pickTokenForRequest({
|
|
2992
2930
|
authorization,
|
|
@@ -2996,7 +2934,7 @@ var TokenPool = class {
|
|
|
2996
2934
|
xRegion
|
|
2997
2935
|
}) {
|
|
2998
2936
|
const xRegionCode = parseRegionCode(xRegion);
|
|
2999
|
-
if (
|
|
2937
|
+
if (import_lodash7.default.isString(xRegion) && xRegion.trim().length > 0 && !xRegionCode) {
|
|
3000
2938
|
return { token: null, region: null, error: "unsupported_region", reason: "X-Region \u4EC5\u652F\u6301 cn/us/hk/jp/sg" };
|
|
3001
2939
|
}
|
|
3002
2940
|
const authParseResult = this.parseAuthorizationTokens(authorization);
|
|
@@ -3193,14 +3131,14 @@ var TokenPool = class {
|
|
|
3193
3131
|
if (typeof this.healthCheckTimer.unref === "function") this.healthCheckTimer.unref();
|
|
3194
3132
|
}
|
|
3195
3133
|
async loadFromDisk() {
|
|
3196
|
-
await
|
|
3197
|
-
if (!await
|
|
3134
|
+
await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
|
|
3135
|
+
if (!await import_fs_extra5.default.pathExists(this.filePath)) {
|
|
3198
3136
|
await this.persistToDisk();
|
|
3199
3137
|
return;
|
|
3200
3138
|
}
|
|
3201
3139
|
let data = null;
|
|
3202
3140
|
try {
|
|
3203
|
-
data = await
|
|
3141
|
+
data = await import_fs_extra5.default.readJson(this.filePath);
|
|
3204
3142
|
} catch (err) {
|
|
3205
3143
|
logger_default.warn(`Token pool file parse failed, fallback to empty: ${(err == null ? void 0 : err.message) || String(err)}`);
|
|
3206
3144
|
data = null;
|
|
@@ -3215,10 +3153,10 @@ var TokenPool = class {
|
|
|
3215
3153
|
token,
|
|
3216
3154
|
region: parsedRegion || void 0,
|
|
3217
3155
|
enabled: raw.enabled !== false,
|
|
3218
|
-
live:
|
|
3219
|
-
lastCheckedAt:
|
|
3220
|
-
lastError:
|
|
3221
|
-
lastCredit:
|
|
3156
|
+
live: import_lodash7.default.isBoolean(raw.live) ? raw.live : void 0,
|
|
3157
|
+
lastCheckedAt: import_lodash7.default.isFinite(Number(raw.lastCheckedAt)) ? Number(raw.lastCheckedAt) : void 0,
|
|
3158
|
+
lastError: import_lodash7.default.isString(raw.lastError) ? raw.lastError : void 0,
|
|
3159
|
+
lastCredit: import_lodash7.default.isFinite(Number(raw.lastCredit)) ? Number(raw.lastCredit) : void 0,
|
|
3222
3160
|
consecutiveFailures: Math.max(0, Number(raw.consecutiveFailures) || 0),
|
|
3223
3161
|
allowedModels: this.normalizeStringArray(raw.allowedModels),
|
|
3224
3162
|
capabilityTags: this.normalizeStringArray(raw.capabilityTags),
|
|
@@ -3229,19 +3167,19 @@ var TokenPool = class {
|
|
|
3229
3167
|
for (const [token, item] of nextMap.entries()) this.entryMap.set(token, item);
|
|
3230
3168
|
}
|
|
3231
3169
|
async persistToDisk() {
|
|
3232
|
-
await
|
|
3170
|
+
await import_fs_extra5.default.ensureDir(import_path5.default.dirname(this.filePath));
|
|
3233
3171
|
const payload = {
|
|
3234
3172
|
updatedAt: Date.now(),
|
|
3235
3173
|
tokens: this.getEntries(false)
|
|
3236
3174
|
};
|
|
3237
|
-
await
|
|
3175
|
+
await import_fs_extra5.default.writeJson(this.filePath, payload, { spaces: 2 });
|
|
3238
3176
|
}
|
|
3239
3177
|
maskToken(token) {
|
|
3240
3178
|
if (token.length <= 10) return "***";
|
|
3241
3179
|
return `${token.slice(0, 4)}...${token.slice(-4)}`;
|
|
3242
3180
|
}
|
|
3243
3181
|
parseAuthorizationTokens(authorization) {
|
|
3244
|
-
if (!
|
|
3182
|
+
if (!import_lodash7.default.isString(authorization) || authorization.trim().length === 0) {
|
|
3245
3183
|
return { tokens: [], error: null };
|
|
3246
3184
|
}
|
|
3247
3185
|
if (!/^Bearer\s+/i.test(authorization)) {
|
|
@@ -3254,7 +3192,7 @@ var TokenPool = class {
|
|
|
3254
3192
|
normalizeAddTokens(rawTokens, defaultRegion) {
|
|
3255
3193
|
const normalized = [];
|
|
3256
3194
|
for (const item of rawTokens) {
|
|
3257
|
-
if (
|
|
3195
|
+
if (import_lodash7.default.isString(item)) {
|
|
3258
3196
|
const token2 = item.trim();
|
|
3259
3197
|
if (!token2) continue;
|
|
3260
3198
|
if (!defaultRegion) {
|
|
@@ -3292,7 +3230,7 @@ var TokenPool = class {
|
|
|
3292
3230
|
imageModels: this.normalizeStringArray(data.imageModels),
|
|
3293
3231
|
videoModels: this.normalizeStringArray(data.videoModels),
|
|
3294
3232
|
capabilityTags: this.normalizeStringArray(data.capabilityTags),
|
|
3295
|
-
updatedAt:
|
|
3233
|
+
updatedAt: import_lodash7.default.isFinite(Number(data.updatedAt)) ? Number(data.updatedAt) : void 0
|
|
3296
3234
|
};
|
|
3297
3235
|
if (!dynamic.imageModels && !dynamic.videoModels && !dynamic.capabilityTags && !dynamic.updatedAt) {
|
|
3298
3236
|
return void 0;
|
|
@@ -3337,7 +3275,7 @@ var TokenPool = class {
|
|
|
3337
3275
|
this.roundRobinCursor++;
|
|
3338
3276
|
return item;
|
|
3339
3277
|
}
|
|
3340
|
-
return
|
|
3278
|
+
return import_lodash7.default.sample(candidates) || candidates[0];
|
|
3341
3279
|
}
|
|
3342
3280
|
matchesModelAndCapabilities(candidate, requestedModel, taskType, requiredCapabilityTags) {
|
|
3343
3281
|
var _a, _b, _c, _d;
|
|
@@ -3717,7 +3655,7 @@ async function waitForTaskResponse(taskId, refreshToken, regionInfo, options = {
|
|
|
3717
3655
|
}
|
|
3718
3656
|
|
|
3719
3657
|
// src/api/controllers/videos.ts
|
|
3720
|
-
var
|
|
3658
|
+
var import_fs_extra6 = __toESM(require("fs-extra"), 1);
|
|
3721
3659
|
var import_axios5 = __toESM(require("axios"), 1);
|
|
3722
3660
|
|
|
3723
3661
|
// src/lib/video-uploader.ts
|
|
@@ -4009,7 +3947,7 @@ function getVideoBenefitType(model) {
|
|
|
4009
3947
|
async function uploadImageFromFile(file, refreshToken, regionInfo) {
|
|
4010
3948
|
try {
|
|
4011
3949
|
logger_default.info(`\u5F00\u59CB\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247: ${file.originalFilename} (\u8DEF\u5F84: ${file.filepath})`);
|
|
4012
|
-
const imageBuffer = await
|
|
3950
|
+
const imageBuffer = await import_fs_extra6.default.readFile(file.filepath);
|
|
4013
3951
|
return await uploadImageBuffer(imageBuffer, refreshToken, regionInfo);
|
|
4014
3952
|
} catch (error) {
|
|
4015
3953
|
logger_default.error(`\u4ECE\u672C\u5730\u6587\u4EF6\u4E0A\u4F20\u89C6\u9891\u56FE\u7247\u5931\u8D25: ${error.message}`);
|
|
@@ -4220,7 +4158,7 @@ async function generateVideo(_model, prompt, {
|
|
|
4220
4158
|
throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
|
|
4221
4159
|
}
|
|
4222
4160
|
if (imageFile) {
|
|
4223
|
-
const buf = await
|
|
4161
|
+
const buf = await import_fs_extra6.default.readFile(imageFile.filepath);
|
|
4224
4162
|
imgResult = await uploadImageBuffer(buf, refreshToken, regionInfo);
|
|
4225
4163
|
await checkImageContent(imgResult.uri, refreshToken, regionInfo);
|
|
4226
4164
|
const entry = {
|
|
@@ -4297,7 +4235,7 @@ async function generateVideo(_model, prompt, {
|
|
|
4297
4235
|
throw new APIException(exceptions_default.API_REQUEST_FAILED, `${fieldName} \u4E0D\u652F\u6301\u91CD\u590D\u4E0A\u4F20\u591A\u4E2A\u6587\u4EF6`);
|
|
4298
4236
|
}
|
|
4299
4237
|
if (videoFile) {
|
|
4300
|
-
const buf = await
|
|
4238
|
+
const buf = await import_fs_extra6.default.readFile(videoFile.filepath);
|
|
4301
4239
|
vResult = await uploadVideoBuffer(buf, refreshToken, regionInfo);
|
|
4302
4240
|
totalVideoDuration += vResult.videoMeta.duration;
|
|
4303
4241
|
const entry = {
|
|
@@ -5069,7 +5007,7 @@ function assertRunConfirm(config, confirm) {
|
|
|
5069
5007
|
var z = __toESM(require("zod"), 1);
|
|
5070
5008
|
function buildIndexedUrlFields(prefix, max) {
|
|
5071
5009
|
return Object.fromEntries(
|
|
5072
|
-
Array.from({ length: max }, (
|
|
5010
|
+
Array.from({ length: max }, (_8, index) => [
|
|
5073
5011
|
`${prefix}_${index + 1}`,
|
|
5074
5012
|
z.string().url().optional()
|
|
5075
5013
|
])
|
|
@@ -5147,8 +5085,8 @@ var generateVideoOmniInputSchema = z.object({
|
|
|
5147
5085
|
confirm: z.string().optional()
|
|
5148
5086
|
}).superRefine((value, ctx) => {
|
|
5149
5087
|
var _a, _b;
|
|
5150
|
-
const imageSlotUrls = Array.from({ length: 9 }, (
|
|
5151
|
-
const videoSlotUrls = Array.from({ length: 3 }, (
|
|
5088
|
+
const imageSlotUrls = Array.from({ length: 9 }, (_8, index) => value[`image_file_${index + 1}`]);
|
|
5089
|
+
const videoSlotUrls = Array.from({ length: 3 }, (_8, index) => value[`video_file_${index + 1}`]);
|
|
5152
5090
|
const imageCount = normalizeUniqueValues(value.image_urls || []).length + (((_a = value.image_files) == null ? void 0 : _a.length) || 0) + normalizeUniqueValues([...value.file_paths || [], ...value.filePaths || []]).length + normalizeUniqueValues(imageSlotUrls.filter((item) => typeof item === "string")).length;
|
|
5153
5091
|
const videoCount = normalizeUniqueValues(value.video_urls || []).length + (((_b = value.video_files) == null ? void 0 : _b.length) || 0) + normalizeUniqueValues(videoSlotUrls.filter((item) => typeof item === "string")).length;
|
|
5154
5092
|
if (imageCount > 9) {
|