@yunzai-ng/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +51 -0
- package/dist/adapter/accounts.d.ts +174 -0
- package/dist/adapter/accounts.d.ts.map +1 -0
- package/dist/adapter/accounts.js +653 -0
- package/dist/adapter/accounts.js.map +1 -0
- package/dist/adapter/bots.d.ts +142 -0
- package/dist/adapter/bots.d.ts.map +1 -0
- package/dist/adapter/bots.js +454 -0
- package/dist/adapter/bots.js.map +1 -0
- package/dist/adapter/host.d.ts +114 -0
- package/dist/adapter/host.d.ts.map +1 -0
- package/dist/adapter/host.js +90 -0
- package/dist/adapter/host.js.map +1 -0
- package/dist/adapter/login.d.ts +174 -0
- package/dist/adapter/login.d.ts.map +1 -0
- package/dist/adapter/login.js +345 -0
- package/dist/adapter/login.js.map +1 -0
- package/dist/adapter/registry.d.ts +102 -0
- package/dist/adapter/registry.d.ts.map +1 -0
- package/dist/adapter/registry.js +150 -0
- package/dist/adapter/registry.js.map +1 -0
- package/dist/config/core-config.d.ts +151 -0
- package/dist/config/core-config.d.ts.map +1 -0
- package/dist/config/core-config.js +338 -0
- package/dist/config/core-config.js.map +1 -0
- package/dist/config/schema.d.ts +449 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +871 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +184 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +428 -0
- package/dist/config/store.js.map +1 -0
- package/dist/config/yaml.d.ts +23 -0
- package/dist/config/yaml.d.ts.map +1 -0
- package/dist/config/yaml.js +108 -0
- package/dist/config/yaml.js.map +1 -0
- package/dist/http/client.d.ts +82 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +658 -0
- package/dist/http/client.js.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/app.d.ts +244 -0
- package/dist/kernel/app.d.ts.map +1 -0
- package/dist/kernel/app.js +654 -0
- package/dist/kernel/app.js.map +1 -0
- package/dist/kernel/kv-sink.d.ts +34 -0
- package/dist/kernel/kv-sink.d.ts.map +1 -0
- package/dist/kernel/kv-sink.js +25 -0
- package/dist/kernel/kv-sink.js.map +1 -0
- package/dist/kernel/policy.d.ts +77 -0
- package/dist/kernel/policy.d.ts.map +1 -0
- package/dist/kernel/policy.js +99 -0
- package/dist/kernel/policy.js.map +1 -0
- package/dist/kernel/runtime.d.ts +117 -0
- package/dist/kernel/runtime.d.ts.map +1 -0
- package/dist/kernel/runtime.js +197 -0
- package/dist/kernel/runtime.js.map +1 -0
- package/dist/kernel/sql-sink.d.ts +36 -0
- package/dist/kernel/sql-sink.d.ts.map +1 -0
- package/dist/kernel/sql-sink.js +114 -0
- package/dist/kernel/sql-sink.js.map +1 -0
- package/dist/logger/format.d.ts +67 -0
- package/dist/logger/format.d.ts.map +1 -0
- package/dist/logger/format.js +218 -0
- package/dist/logger/format.js.map +1 -0
- package/dist/logger/index.d.ts +97 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +363 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/rotate.d.ts +47 -0
- package/dist/logger/rotate.d.ts.map +1 -0
- package/dist/logger/rotate.js +242 -0
- package/dist/logger/rotate.js.map +1 -0
- package/dist/message/segment.d.ts +255 -0
- package/dist/message/segment.d.ts.map +1 -0
- package/dist/message/segment.js +510 -0
- package/dist/message/segment.js.map +1 -0
- package/dist/message/split.d.ts +34 -0
- package/dist/message/split.d.ts.map +1 -0
- package/dist/message/split.js +79 -0
- package/dist/message/split.js.map +1 -0
- package/dist/message/target.d.ts +29 -0
- package/dist/message/target.d.ts.map +1 -0
- package/dist/message/target.js +34 -0
- package/dist/message/target.js.map +1 -0
- package/dist/pipeline/cooldown.d.ts +84 -0
- package/dist/pipeline/cooldown.d.ts.map +1 -0
- package/dist/pipeline/cooldown.js +94 -0
- package/dist/pipeline/cooldown.js.map +1 -0
- package/dist/pipeline/dispatch.d.ts +98 -0
- package/dist/pipeline/dispatch.d.ts.map +1 -0
- package/dist/pipeline/dispatch.js +323 -0
- package/dist/pipeline/dispatch.js.map +1 -0
- package/dist/pipeline/event.d.ts +130 -0
- package/dist/pipeline/event.d.ts.map +1 -0
- package/dist/pipeline/event.js +538 -0
- package/dist/pipeline/event.js.map +1 -0
- package/dist/pipeline/middleware.d.ts +63 -0
- package/dist/pipeline/middleware.d.ts.map +1 -0
- package/dist/pipeline/middleware.js +174 -0
- package/dist/pipeline/middleware.js.map +1 -0
- package/dist/pipeline/prompt.d.ts +80 -0
- package/dist/pipeline/prompt.d.ts.map +1 -0
- package/dist/pipeline/prompt.js +155 -0
- package/dist/pipeline/prompt.js.map +1 -0
- package/dist/pipeline/router.d.ts +98 -0
- package/dist/pipeline/router.d.ts.map +1 -0
- package/dist/pipeline/router.js +489 -0
- package/dist/pipeline/router.js.map +1 -0
- package/dist/platform/detect.d.ts +24 -0
- package/dist/platform/detect.d.ts.map +1 -0
- package/dist/platform/detect.js +178 -0
- package/dist/platform/detect.js.map +1 -0
- package/dist/platform/paths.d.ts +38 -0
- package/dist/platform/paths.d.ts.map +1 -0
- package/dist/platform/paths.js +129 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/system.d.ts +71 -0
- package/dist/platform/system.d.ts.map +1 -0
- package/dist/platform/system.js +242 -0
- package/dist/platform/system.js.map +1 -0
- package/dist/plugin/context.d.ts +92 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +573 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/define.d.ts +92 -0
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/plugin/define.js +82 -0
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/discover.d.ts +106 -0
- package/dist/plugin/discover.d.ts.map +1 -0
- package/dist/plugin/discover.js +254 -0
- package/dist/plugin/discover.js.map +1 -0
- package/dist/plugin/events.d.ts +109 -0
- package/dist/plugin/events.d.ts.map +1 -0
- package/dist/plugin/events.js +209 -0
- package/dist/plugin/events.js.map +1 -0
- package/dist/plugin/hooks.d.ts +266 -0
- package/dist/plugin/hooks.d.ts.map +1 -0
- package/dist/plugin/hooks.js +84 -0
- package/dist/plugin/hooks.js.map +1 -0
- package/dist/plugin/host.d.ts +160 -0
- package/dist/plugin/host.d.ts.map +1 -0
- package/dist/plugin/host.js +546 -0
- package/dist/plugin/host.js.map +1 -0
- package/dist/plugin/market.d.ts +264 -0
- package/dist/plugin/market.d.ts.map +1 -0
- package/dist/plugin/market.js +700 -0
- package/dist/plugin/market.js.map +1 -0
- package/dist/plugin/services.d.ts +116 -0
- package/dist/plugin/services.d.ts.map +1 -0
- package/dist/plugin/services.js +213 -0
- package/dist/plugin/services.js.map +1 -0
- package/dist/plugin/tar.d.ts +65 -0
- package/dist/plugin/tar.d.ts.map +1 -0
- package/dist/plugin/tar.js +277 -0
- package/dist/plugin/tar.js.map +1 -0
- package/dist/render/registry.d.ts +127 -0
- package/dist/render/registry.d.ts.map +1 -0
- package/dist/render/registry.js +306 -0
- package/dist/render/registry.js.map +1 -0
- package/dist/scheduler/index.d.ts +67 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +279 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/server/api.d.ts +179 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +602 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/auth.d.ts +83 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +178 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/browse.d.ts +60 -0
- package/dist/server/browse.d.ts.map +1 -0
- package/dist/server/browse.js +187 -0
- package/dist/server/browse.js.map +1 -0
- package/dist/server/files.d.ts +27 -0
- package/dist/server/files.d.ts.map +1 -0
- package/dist/server/files.js +76 -0
- package/dist/server/files.js.map +1 -0
- package/dist/server/index.d.ts +189 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1123 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/table.d.ts +105 -0
- package/dist/server/table.d.ts.map +1 -0
- package/dist/server/table.js +289 -0
- package/dist/server/table.js.map +1 -0
- package/dist/store/index.d.ts +50 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +120 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/json.d.ts +73 -0
- package/dist/store/json.d.ts.map +1 -0
- package/dist/store/json.js +174 -0
- package/dist/store/json.js.map +1 -0
- package/dist/store/kv.d.ts +126 -0
- package/dist/store/kv.d.ts.map +1 -0
- package/dist/store/kv.js +232 -0
- package/dist/store/kv.js.map +1 -0
- package/dist/store/level.d.ts +103 -0
- package/dist/store/level.d.ts.map +1 -0
- package/dist/store/level.js +119 -0
- package/dist/store/level.js.map +1 -0
- package/dist/store/memory.d.ts +61 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +94 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/sql.d.ts +142 -0
- package/dist/store/sql.d.ts.map +1 -0
- package/dist/store/sql.js +246 -0
- package/dist/store/sql.js.map +1 -0
- package/dist/testing/fake.d.ts +109 -0
- package/dist/testing/fake.d.ts.map +1 -0
- package/dist/testing/fake.js +196 -0
- package/dist/testing/fake.js.map +1 -0
- package/dist/testing/index.d.ts +16 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +16 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-adapter.d.ts +205 -0
- package/dist/testing/mock-adapter.d.ts.map +1 -0
- package/dist/testing/mock-adapter.js +309 -0
- package/dist/testing/mock-adapter.js.map +1 -0
- package/dist/util/deep.d.ts +108 -0
- package/dist/util/deep.d.ts.map +1 -0
- package/dist/util/deep.js +275 -0
- package/dist/util/deep.js.map +1 -0
- package/dist/util/defer.d.ts +107 -0
- package/dist/util/defer.d.ts.map +1 -0
- package/dist/util/defer.js +163 -0
- package/dist/util/defer.js.map +1 -0
- package/dist/util/dispose.d.ts +88 -0
- package/dist/util/dispose.d.ts.map +1 -0
- package/dist/util/dispose.js +143 -0
- package/dist/util/dispose.js.map +1 -0
- package/dist/util/duration.d.ts +28 -0
- package/dist/util/duration.d.ts.map +1 -0
- package/dist/util/duration.js +77 -0
- package/dist/util/duration.js.map +1 -0
- package/dist/util/fs.d.ts +110 -0
- package/dist/util/fs.d.ts.map +1 -0
- package/dist/util/fs.js +269 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/id.d.ts +49 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +87 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/lru.d.ts +74 -0
- package/dist/util/lru.d.ts.map +1 -0
- package/dist/util/lru.js +156 -0
- package/dist/util/lru.js.map +1 -0
- package/dist/util/queue.d.ts +64 -0
- package/dist/util/queue.d.ts.map +1 -0
- package/dist/util/queue.js +147 -0
- package/dist/util/queue.js.map +1 -0
- package/dist/util/text.d.ts +86 -0
- package/dist/util/text.d.ts.map +1 -0
- package/dist/util/text.js +182 -0
- package/dist/util/text.js.map +1 -0
- package/package.json +44 -0
- package/src/adapter/accounts.ts +758 -0
- package/src/adapter/bots.ts +582 -0
- package/src/adapter/host.ts +224 -0
- package/src/adapter/login.ts +481 -0
- package/src/adapter/registry.ts +202 -0
- package/src/config/core-config.test.ts +60 -0
- package/src/config/core-config.ts +401 -0
- package/src/config/schema.test.ts +179 -0
- package/src/config/schema.ts +1036 -0
- package/src/config/store.test.ts +245 -0
- package/src/config/store.ts +506 -0
- package/src/config/yaml.ts +119 -0
- package/src/http/client.test.ts +568 -0
- package/src/http/client.ts +777 -0
- package/src/index.ts +106 -0
- package/src/kernel/app.test.ts +267 -0
- package/src/kernel/app.ts +843 -0
- package/src/kernel/kv-sink.ts +58 -0
- package/src/kernel/policy.ts +120 -0
- package/src/kernel/runtime.test.ts +542 -0
- package/src/kernel/runtime.ts +307 -0
- package/src/kernel/sql-sink.ts +154 -0
- package/src/logger/format.ts +259 -0
- package/src/logger/index.ts +427 -0
- package/src/logger/rotate.ts +265 -0
- package/src/message/segment.test.ts +335 -0
- package/src/message/segment.ts +569 -0
- package/src/message/split.ts +97 -0
- package/src/message/target.ts +48 -0
- package/src/pipeline/cooldown.ts +136 -0
- package/src/pipeline/dispatch.ts +419 -0
- package/src/pipeline/event.ts +735 -0
- package/src/pipeline/middleware.test.ts +426 -0
- package/src/pipeline/middleware.ts +199 -0
- package/src/pipeline/prompt.ts +212 -0
- package/src/pipeline/router.test.ts +432 -0
- package/src/pipeline/router.ts +575 -0
- package/src/platform/detect.ts +178 -0
- package/src/platform/paths.ts +147 -0
- package/src/platform/system.test.ts +102 -0
- package/src/platform/system.ts +289 -0
- package/src/plugin/context.test.ts +459 -0
- package/src/plugin/context.ts +757 -0
- package/src/plugin/define.test.ts +120 -0
- package/src/plugin/define.ts +142 -0
- package/src/plugin/discover.test.ts +253 -0
- package/src/plugin/discover.ts +353 -0
- package/src/plugin/events.test.ts +162 -0
- package/src/plugin/events.ts +266 -0
- package/src/plugin/hooks.ts +373 -0
- package/src/plugin/host.test.ts +696 -0
- package/src/plugin/host.ts +738 -0
- package/src/plugin/market.test.ts +781 -0
- package/src/plugin/market.ts +870 -0
- package/src/plugin/services.test.ts +135 -0
- package/src/plugin/services.ts +261 -0
- package/src/plugin/tar.test.ts +158 -0
- package/src/plugin/tar.ts +309 -0
- package/src/render/registry.test.ts +127 -0
- package/src/render/registry.ts +439 -0
- package/src/scheduler/index.ts +357 -0
- package/src/server/api.test.ts +802 -0
- package/src/server/api.ts +869 -0
- package/src/server/auth.ts +201 -0
- package/src/server/browse.test.ts +193 -0
- package/src/server/browse.ts +240 -0
- package/src/server/files.ts +97 -0
- package/src/server/index.test.ts +566 -0
- package/src/server/index.ts +1386 -0
- package/src/server/table.ts +351 -0
- package/src/store/index.ts +156 -0
- package/src/store/json.ts +198 -0
- package/src/store/kv.test.ts +307 -0
- package/src/store/kv.ts +256 -0
- package/src/store/level.ts +167 -0
- package/src/store/memory.ts +109 -0
- package/src/store/sql.test.ts +204 -0
- package/src/store/sql.ts +324 -0
- package/src/testing/fake.ts +297 -0
- package/src/testing/index.ts +15 -0
- package/src/testing/mock-adapter.ts +588 -0
- package/src/util/deep.ts +272 -0
- package/src/util/defer.ts +211 -0
- package/src/util/dispose.ts +169 -0
- package/src/util/duration.ts +82 -0
- package/src/util/fs.ts +279 -0
- package/src/util/id.ts +94 -0
- package/src/util/lru.ts +185 -0
- package/src/util/queue.ts +167 -0
- package/src/util/text.ts +189 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模块职责:探测运行环境(操作系统族、Termux、容器、内存档位、资源占用)
|
|
3
|
+
* 依赖方向:仅依赖 node 内置模块与类型包
|
|
4
|
+
* 生命周期:`detectPlatform()` 结果在进程内不变,缓存一份
|
|
5
|
+
* 注意事项:Termux 上的 Node 通常把 `process.platform` 报成 `"linux"`,
|
|
6
|
+
* 单看它会把安卓当普通 Linux,进而按桌面策略去找 Chromium、
|
|
7
|
+
* 按大内存开并发 —— 这是安卓端最常见的 OOM 原因。
|
|
8
|
+
* 所以这里做多重取证:环境变量 PREFIX / TERMUX_VERSION、
|
|
9
|
+
* `/data/data/com.termux` 目录、`/system/build.prop`。
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
12
|
+
import { arch, cpus, platform, totalmem } from "node:os";
|
|
13
|
+
/** 低内存判定阈值:2GB */
|
|
14
|
+
const LOW_MEMORY_BYTES = 2 * 1024 * 1024 * 1024;
|
|
15
|
+
/** 探测结果缓存 */
|
|
16
|
+
let cached;
|
|
17
|
+
/**
|
|
18
|
+
* 是否运行在 Termux(安卓)里
|
|
19
|
+
* @returns 是否为 Termux 环境
|
|
20
|
+
*/
|
|
21
|
+
function detectTermux() {
|
|
22
|
+
if (process.env.TERMUX_VERSION)
|
|
23
|
+
return true;
|
|
24
|
+
const prefix = process.env.PREFIX ?? "";
|
|
25
|
+
if (prefix.includes("com.termux"))
|
|
26
|
+
return true;
|
|
27
|
+
if (existsSync("/data/data/com.termux/files/usr"))
|
|
28
|
+
return true;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 是否运行在安卓上(含非 Termux 的其他安卓运行环境)
|
|
33
|
+
* @returns 是否为安卓
|
|
34
|
+
*/
|
|
35
|
+
function detectAndroid() {
|
|
36
|
+
if (platform() === "android")
|
|
37
|
+
return true;
|
|
38
|
+
if (detectTermux())
|
|
39
|
+
return true;
|
|
40
|
+
// 非 Termux 的安卓容器:靠系统属性文件判断
|
|
41
|
+
return existsSync("/system/build.prop") && existsSync("/system/bin/app_process");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 是否运行在容器里
|
|
45
|
+
*
|
|
46
|
+
* 容器内可用内存往往远小于 `os.totalmem()` 报告的宿主机内存,
|
|
47
|
+
* 日志和并发策略需要知道这件事。
|
|
48
|
+
* @returns 是否为容器环境
|
|
49
|
+
*/
|
|
50
|
+
function detectContainer() {
|
|
51
|
+
if (existsSync("/.dockerenv"))
|
|
52
|
+
return true;
|
|
53
|
+
if (process.env.KUBERNETES_SERVICE_HOST)
|
|
54
|
+
return true;
|
|
55
|
+
try {
|
|
56
|
+
const cgroup = readFileSync("/proc/1/cgroup", "utf8");
|
|
57
|
+
return /docker|kubepods|containerd|lxc/.test(cgroup);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 判定操作系统族
|
|
65
|
+
* @returns 操作系统族
|
|
66
|
+
*/
|
|
67
|
+
function detectOs() {
|
|
68
|
+
if (detectAndroid())
|
|
69
|
+
return "android";
|
|
70
|
+
switch (platform()) {
|
|
71
|
+
case "win32":
|
|
72
|
+
return "windows";
|
|
73
|
+
case "darwin":
|
|
74
|
+
return "macos";
|
|
75
|
+
case "linux":
|
|
76
|
+
return "linux";
|
|
77
|
+
default:
|
|
78
|
+
return "unknown";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 读取 cgroup v2/v1 的内存上限
|
|
83
|
+
*
|
|
84
|
+
* 容器里 `os.totalmem()` 给的是宿主机内存,会让"低内存档位"判断失效。
|
|
85
|
+
* @returns 字节数;读不到时 undefined
|
|
86
|
+
*/
|
|
87
|
+
function readCgroupMemoryLimit() {
|
|
88
|
+
const candidates = ["/sys/fs/cgroup/memory.max", "/sys/fs/cgroup/memory/memory.limit_in_bytes"];
|
|
89
|
+
for (const file of candidates) {
|
|
90
|
+
try {
|
|
91
|
+
const text = readFileSync(file, "utf8").trim();
|
|
92
|
+
if (text === "max")
|
|
93
|
+
continue;
|
|
94
|
+
const value = Number(text);
|
|
95
|
+
// cgroup v1 未设限时是一个接近 2^63 的巨大数,直接忽略
|
|
96
|
+
if (Number.isFinite(value) && value > 0 && value < Number.MAX_SAFE_INTEGER)
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 探测运行环境
|
|
107
|
+
* @returns 环境信息(进程内缓存,多次调用返回同一对象)
|
|
108
|
+
*/
|
|
109
|
+
export function detectPlatform() {
|
|
110
|
+
if (cached)
|
|
111
|
+
return cached;
|
|
112
|
+
const isContainer = detectContainer();
|
|
113
|
+
const hostMemory = totalmem();
|
|
114
|
+
const limited = readCgroupMemoryLimit();
|
|
115
|
+
const totalMemory = limited !== undefined ? Math.min(hostMemory, limited) : hostMemory;
|
|
116
|
+
cached = Object.freeze({
|
|
117
|
+
os: detectOs(),
|
|
118
|
+
arch: arch(),
|
|
119
|
+
isTermux: detectTermux(),
|
|
120
|
+
isContainer,
|
|
121
|
+
nodeVersion: process.versions.node,
|
|
122
|
+
cpus: Math.max(1, cpus().length),
|
|
123
|
+
totalMemory,
|
|
124
|
+
lowMemory: totalMemory > 0 && totalMemory < LOW_MEMORY_BYTES
|
|
125
|
+
});
|
|
126
|
+
return cached;
|
|
127
|
+
}
|
|
128
|
+
/** 上一次 CPU 采样点 */
|
|
129
|
+
let lastCpuSample;
|
|
130
|
+
/**
|
|
131
|
+
* 采样进程资源占用
|
|
132
|
+
*
|
|
133
|
+
* `cpu` 是**两次调用之间**的平均占用率,因此第一次调用必然返回 0。
|
|
134
|
+
* WebUI 的资源曲线按固定间隔轮询即可。
|
|
135
|
+
* @returns 资源占用快照
|
|
136
|
+
*/
|
|
137
|
+
export function sampleUsage() {
|
|
138
|
+
const mem = process.memoryUsage();
|
|
139
|
+
const now = process.hrtime.bigint();
|
|
140
|
+
const usage = process.cpuUsage();
|
|
141
|
+
let cpu = 0;
|
|
142
|
+
if (lastCpuSample) {
|
|
143
|
+
const elapsedUs = Number(now - lastCpuSample.time) / 1000;
|
|
144
|
+
if (elapsedUs > 0) {
|
|
145
|
+
const usedUs = usage.user - lastCpuSample.usage.user + (usage.system - lastCpuSample.usage.system);
|
|
146
|
+
// 除以核心数,让多核机器上的数值仍落在 0~1
|
|
147
|
+
cpu = Math.min(1, Math.max(0, usedUs / elapsedUs / detectPlatform().cpus));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
lastCpuSample = { time: now, usage };
|
|
151
|
+
return {
|
|
152
|
+
rss: mem.rss,
|
|
153
|
+
heapUsed: mem.heapUsed,
|
|
154
|
+
heapTotal: mem.heapTotal,
|
|
155
|
+
external: mem.external + (mem.arrayBuffers ?? 0),
|
|
156
|
+
uptime: Math.round(process.uptime()),
|
|
157
|
+
cpu: Number(cpu.toFixed(4))
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 按内存档位给出建议的并发上限
|
|
162
|
+
*
|
|
163
|
+
* 渲染器、图片下载这类"每个任务几十 MB"的操作用它定并发,
|
|
164
|
+
* 而不是各自拍一个魔数。
|
|
165
|
+
* @param kind 任务类型:`render` 每任务约 80MB,`io` 约 2MB
|
|
166
|
+
* @returns 建议并发数,至少 1
|
|
167
|
+
*/
|
|
168
|
+
export function suggestConcurrency(kind) {
|
|
169
|
+
const info = detectPlatform();
|
|
170
|
+
if (kind === "io")
|
|
171
|
+
return info.lowMemory ? 4 : Math.min(16, info.cpus * 2);
|
|
172
|
+
// 渲染:低内存设备强制串行,避免 Chromium 多标签把内存打满
|
|
173
|
+
if (info.lowMemory)
|
|
174
|
+
return 1;
|
|
175
|
+
const byMemory = Math.floor(info.totalMemory / (1024 * 1024 * 1024));
|
|
176
|
+
return Math.max(1, Math.min(4, Math.min(byMemory - 1, info.cpus)));
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/platform/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RuntimePaths } from "@yunzai-ng/types";
|
|
2
|
+
/** 解析目录布局的参数 */
|
|
3
|
+
export interface ResolvePathsOptions {
|
|
4
|
+
/** 显式指定数据根目录;相对路径按 `process.cwd()` 解析 */
|
|
5
|
+
home?: string;
|
|
6
|
+
/** 内核包所在目录;缺省由 `import.meta.url` 推导 */
|
|
7
|
+
runtime?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 解析目录布局
|
|
11
|
+
*
|
|
12
|
+
* 只做路径计算,不创建目录 —— 便于测试与 `yzng doctor` 之类"只想看看
|
|
13
|
+
* 路径解析成什么"的场景。创建请调用 `ensurePaths`。
|
|
14
|
+
* @param opts 解析参数
|
|
15
|
+
* @returns 目录布局(全为绝对路径)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolvePaths(opts?: ResolvePathsOptions): RuntimePaths;
|
|
18
|
+
/**
|
|
19
|
+
* 创建目录布局里的所有目录
|
|
20
|
+
*
|
|
21
|
+
* `runtime` 不创建(它是安装目录,理应已存在且可能只读)。
|
|
22
|
+
* @param paths 目录布局
|
|
23
|
+
* @returns 传入的布局本身,便于链式使用
|
|
24
|
+
* @throws 目录无法创建时抛出(磁盘只读、权限不足),此时应终止启动
|
|
25
|
+
*/
|
|
26
|
+
export declare function ensurePaths(paths: RuntimePaths): Promise<RuntimePaths>;
|
|
27
|
+
/**
|
|
28
|
+
* 在临时目录下生成一个带前缀的路径
|
|
29
|
+
*
|
|
30
|
+
* 用完请自行删除;`temp` 目录也会在启动时按保留期清理。
|
|
31
|
+
* @param paths 目录布局
|
|
32
|
+
* @param prefix 文件名前缀
|
|
33
|
+
* @param ext 扩展名(含点),如 `".png"`
|
|
34
|
+
* @param unique 唯一后缀,通常传 `randomId()`
|
|
35
|
+
* @returns 临时文件绝对路径
|
|
36
|
+
*/
|
|
37
|
+
export declare function tempFile(paths: RuntimePaths, prefix: string, ext: string, unique: string): string;
|
|
38
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/platform/paths.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAapD,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAoDD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,YAAY,CAgBzE;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAW5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjG"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模块职责:确定并创建运行时目录布局
|
|
3
|
+
* 依赖方向:依赖 util/fs、platform/detect
|
|
4
|
+
* 生命周期:启动时解析一次,之后只读
|
|
5
|
+
* 注意事项:全程不使用 `process.cwd()` —— 以 Windows 服务、开机自启或 pm2 启动时
|
|
6
|
+
* 工作目录并非项目目录。启动时把八个目录一次性定死成绝对路径,
|
|
7
|
+
* 其余模块只准通过 `app.paths` 取。
|
|
8
|
+
*
|
|
9
|
+
* 优先级:显式参数 > `YZNG_HOME` 环境变量 > 便携模式标记 > 系统默认位置。
|
|
10
|
+
* 便携模式(安装目录下有 `.portable` 文件)让 ZIP 解压即用、
|
|
11
|
+
* 换机拷走整个文件夹就能迁移 —— Windows 用户最常见的诉求。
|
|
12
|
+
*/
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { existsSync } from "node:fs";
|
|
17
|
+
import { ensureDir } from "../util/fs.js";
|
|
18
|
+
import { detectPlatform } from "./detect.js";
|
|
19
|
+
/** 便携模式标记文件名 */
|
|
20
|
+
const PORTABLE_MARKER = ".portable";
|
|
21
|
+
/** 应用目录名(系统默认位置下使用) */
|
|
22
|
+
const APP_DIR_NAME = "YunzaiNG";
|
|
23
|
+
/** 类 Unix 系统下的隐藏目录名 */
|
|
24
|
+
const APP_DIR_NAME_UNIX = ".yunzai-ng";
|
|
25
|
+
/**
|
|
26
|
+
* 推导内核自身所在目录
|
|
27
|
+
*
|
|
28
|
+
* 编译后本文件位于 `<pkg>/dist/platform/paths.js`,上溯两级即包根。
|
|
29
|
+
* @returns 内核包根目录的绝对路径
|
|
30
|
+
*/
|
|
31
|
+
function detectRuntimeDir() {
|
|
32
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
return resolve(here, "..", "..");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 寻找便携模式标记
|
|
37
|
+
*
|
|
38
|
+
* 依次检查工作目录、内核包上两级(`node_modules/@yunzai-ng/core` → 安装根)。
|
|
39
|
+
* @param runtimeDir 内核包目录
|
|
40
|
+
* @returns 命中的便携根目录;未命中时 undefined
|
|
41
|
+
*/
|
|
42
|
+
function findPortableRoot(runtimeDir) {
|
|
43
|
+
const candidates = [process.cwd(), resolve(runtimeDir, "..", "..", ".."), resolve(runtimeDir, "..", "..")];
|
|
44
|
+
for (const dir of candidates) {
|
|
45
|
+
if (existsSync(join(dir, PORTABLE_MARKER)))
|
|
46
|
+
return dir;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 系统默认的数据根目录
|
|
52
|
+
* @returns 绝对路径
|
|
53
|
+
*/
|
|
54
|
+
function defaultHome() {
|
|
55
|
+
const info = detectPlatform();
|
|
56
|
+
const home = homedir();
|
|
57
|
+
if (info.os === "windows") {
|
|
58
|
+
const base = process.env.LOCALAPPDATA ?? process.env.APPDATA ?? join(home, "AppData", "Local");
|
|
59
|
+
return join(base, APP_DIR_NAME);
|
|
60
|
+
}
|
|
61
|
+
if (info.os === "macos") {
|
|
62
|
+
return join(home, "Library", "Application Support", APP_DIR_NAME);
|
|
63
|
+
}
|
|
64
|
+
if (info.os === "android") {
|
|
65
|
+
// Termux 的 $HOME 已经在应用私有目录里,再套 XDG 只会加深路径
|
|
66
|
+
return join(home, APP_DIR_NAME_UNIX);
|
|
67
|
+
}
|
|
68
|
+
const xdg = process.env.XDG_DATA_HOME;
|
|
69
|
+
if (xdg && isAbsolute(xdg))
|
|
70
|
+
return join(xdg, "yunzai-ng");
|
|
71
|
+
return join(home, APP_DIR_NAME_UNIX);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 解析目录布局
|
|
75
|
+
*
|
|
76
|
+
* 只做路径计算,不创建目录 —— 便于测试与 `yzng doctor` 之类"只想看看
|
|
77
|
+
* 路径解析成什么"的场景。创建请调用 `ensurePaths`。
|
|
78
|
+
* @param opts 解析参数
|
|
79
|
+
* @returns 目录布局(全为绝对路径)
|
|
80
|
+
*/
|
|
81
|
+
export function resolvePaths(opts = {}) {
|
|
82
|
+
const runtime = opts.runtime ? resolve(opts.runtime) : detectRuntimeDir();
|
|
83
|
+
const explicit = opts.home ?? process.env.YZNG_HOME;
|
|
84
|
+
const home = explicit ? resolve(process.cwd(), explicit) : (findPortableRoot(runtime) ?? defaultHome());
|
|
85
|
+
return Object.freeze({
|
|
86
|
+
home,
|
|
87
|
+
config: join(home, "config"),
|
|
88
|
+
data: join(home, "data"),
|
|
89
|
+
logs: join(home, "logs"),
|
|
90
|
+
temp: join(home, "temp"),
|
|
91
|
+
plugins: join(home, "plugins"),
|
|
92
|
+
cache: join(home, "cache"),
|
|
93
|
+
runtime
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 创建目录布局里的所有目录
|
|
98
|
+
*
|
|
99
|
+
* `runtime` 不创建(它是安装目录,理应已存在且可能只读)。
|
|
100
|
+
* @param paths 目录布局
|
|
101
|
+
* @returns 传入的布局本身,便于链式使用
|
|
102
|
+
* @throws 目录无法创建时抛出(磁盘只读、权限不足),此时应终止启动
|
|
103
|
+
*/
|
|
104
|
+
export async function ensurePaths(paths) {
|
|
105
|
+
await Promise.all([
|
|
106
|
+
ensureDir(paths.home),
|
|
107
|
+
ensureDir(paths.config),
|
|
108
|
+
ensureDir(paths.data),
|
|
109
|
+
ensureDir(paths.logs),
|
|
110
|
+
ensureDir(paths.temp),
|
|
111
|
+
ensureDir(paths.plugins),
|
|
112
|
+
ensureDir(paths.cache)
|
|
113
|
+
]);
|
|
114
|
+
return paths;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 在临时目录下生成一个带前缀的路径
|
|
118
|
+
*
|
|
119
|
+
* 用完请自行删除;`temp` 目录也会在启动时按保留期清理。
|
|
120
|
+
* @param paths 目录布局
|
|
121
|
+
* @param prefix 文件名前缀
|
|
122
|
+
* @param ext 扩展名(含点),如 `".png"`
|
|
123
|
+
* @param unique 唯一后缀,通常传 `randomId()`
|
|
124
|
+
* @returns 临时文件绝对路径
|
|
125
|
+
*/
|
|
126
|
+
export function tempFile(paths, prefix, ext, unique) {
|
|
127
|
+
return join(paths.temp, `${prefix}-${unique}${ext}`);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/platform/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** 一个分区的占用 */
|
|
2
|
+
export interface DiskInfo {
|
|
3
|
+
/** 挂载点;Windows 上形如 `C:\` */
|
|
4
|
+
readonly mount: string;
|
|
5
|
+
/** 总容量(字节) */
|
|
6
|
+
readonly total: number;
|
|
7
|
+
/** 可用容量(字节),取非特权用户可用的那个数 */
|
|
8
|
+
readonly free: number;
|
|
9
|
+
/** 已用容量(字节),即 `total - free` */
|
|
10
|
+
readonly used: number;
|
|
11
|
+
}
|
|
12
|
+
/** 一块显卡 */
|
|
13
|
+
export interface GpuInfo {
|
|
14
|
+
/** 型号名 */
|
|
15
|
+
readonly name: string;
|
|
16
|
+
/** 占用率(0-1);nvidia-smi 未给出时不出现 */
|
|
17
|
+
readonly load?: number;
|
|
18
|
+
/** 显存已用(字节) */
|
|
19
|
+
readonly memoryUsed?: number;
|
|
20
|
+
/** 显存总量(字节) */
|
|
21
|
+
readonly memoryTotal?: number;
|
|
22
|
+
}
|
|
23
|
+
/** `GET /api/system` 的响应 */
|
|
24
|
+
export interface SystemInfo {
|
|
25
|
+
/** 各分区占用;一个都探不到时为空数组 */
|
|
26
|
+
readonly disks: readonly DiskInfo[];
|
|
27
|
+
/**
|
|
28
|
+
* 各显卡
|
|
29
|
+
*
|
|
30
|
+
* **测不到时本字段不出现**,与「有 0 块显卡」相区分,见文件头第 3 条。
|
|
31
|
+
*/
|
|
32
|
+
readonly gpus?: readonly GpuInfo[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 列举现有的盘符
|
|
36
|
+
*
|
|
37
|
+
* Node 没有列举盘符的 API,只能逐个字母试。`access` 而非 `statfs`:后者在未插盘的
|
|
38
|
+
* 读卡器上会等到超时,前者只问「能不能访问」。
|
|
39
|
+
* @returns 形如 `C:\` 的盘根数组,按字母升序
|
|
40
|
+
*/
|
|
41
|
+
export declare function listDriveRoots(): Promise<string[]>;
|
|
42
|
+
/**
|
|
43
|
+
* 探测各分区占用
|
|
44
|
+
* @returns 各分区;一个都探不到时为空数组
|
|
45
|
+
*/
|
|
46
|
+
export declare function probeDisks(): Promise<DiskInfo[]>;
|
|
47
|
+
/**
|
|
48
|
+
* 解析 nvidia-smi 的 CSV 输出
|
|
49
|
+
*
|
|
50
|
+
* 取不到的字段 nvidia-smi 会写 `[N/A]`(如虚拟化环境下的占用率),此时该字段
|
|
51
|
+
* **不出现**而不是记 0 —— 理由同文件头第 3 条。
|
|
52
|
+
* @param raw 标准输出
|
|
53
|
+
* @returns 各显卡;一行都解不出时为空数组
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseNvidiaSmi(raw: string): GpuInfo[];
|
|
56
|
+
/**
|
|
57
|
+
* 探测显卡
|
|
58
|
+
* @returns 各显卡;测不到时 undefined(与「有 0 块」相区分)
|
|
59
|
+
*/
|
|
60
|
+
export declare function probeGpus(): Promise<GpuInfo[] | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* 采一份系统快照
|
|
63
|
+
*
|
|
64
|
+
* 磁盘与显卡并发探测:两者互不相关,串行只是把 nvidia-smi 的耗时加到磁盘上。
|
|
65
|
+
* @param force 是否绕过缓存,仅测试用
|
|
66
|
+
* @returns 系统快照
|
|
67
|
+
*/
|
|
68
|
+
export declare function sampleSystem(force?: boolean): Promise<SystemInfo>;
|
|
69
|
+
/** 清掉缓存与「没有 nvidia-smi」的记忆,仅测试用 */
|
|
70
|
+
export declare function resetSystemCache(): void;
|
|
71
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/platform/system.ts"],"names":[],"mappings":"AAmDA,cAAc;AACd,MAAM,WAAW,QAAQ;IACvB,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,cAAc;IACd,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,WAAW;AACX,MAAM,WAAW,OAAO;IACtB,UAAU;IACV,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe;IACf,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,eAAe;IACf,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,4BAA4B;AAC5B,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IACnC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;CACnC;AAQD;;;;;;GAMG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAYxD;AAqED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAItD;AA2BD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CA6BrD;AAED;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,CAMhE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAQrE;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|