@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.
Files changed (357) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +51 -0
  3. package/dist/adapter/accounts.d.ts +174 -0
  4. package/dist/adapter/accounts.d.ts.map +1 -0
  5. package/dist/adapter/accounts.js +653 -0
  6. package/dist/adapter/accounts.js.map +1 -0
  7. package/dist/adapter/bots.d.ts +142 -0
  8. package/dist/adapter/bots.d.ts.map +1 -0
  9. package/dist/adapter/bots.js +454 -0
  10. package/dist/adapter/bots.js.map +1 -0
  11. package/dist/adapter/host.d.ts +114 -0
  12. package/dist/adapter/host.d.ts.map +1 -0
  13. package/dist/adapter/host.js +90 -0
  14. package/dist/adapter/host.js.map +1 -0
  15. package/dist/adapter/login.d.ts +174 -0
  16. package/dist/adapter/login.d.ts.map +1 -0
  17. package/dist/adapter/login.js +345 -0
  18. package/dist/adapter/login.js.map +1 -0
  19. package/dist/adapter/registry.d.ts +102 -0
  20. package/dist/adapter/registry.d.ts.map +1 -0
  21. package/dist/adapter/registry.js +150 -0
  22. package/dist/adapter/registry.js.map +1 -0
  23. package/dist/config/core-config.d.ts +151 -0
  24. package/dist/config/core-config.d.ts.map +1 -0
  25. package/dist/config/core-config.js +338 -0
  26. package/dist/config/core-config.js.map +1 -0
  27. package/dist/config/schema.d.ts +449 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +871 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/config/store.d.ts +184 -0
  32. package/dist/config/store.d.ts.map +1 -0
  33. package/dist/config/store.js +428 -0
  34. package/dist/config/store.js.map +1 -0
  35. package/dist/config/yaml.d.ts +23 -0
  36. package/dist/config/yaml.d.ts.map +1 -0
  37. package/dist/config/yaml.js +108 -0
  38. package/dist/config/yaml.js.map +1 -0
  39. package/dist/http/client.d.ts +82 -0
  40. package/dist/http/client.d.ts.map +1 -0
  41. package/dist/http/client.js +658 -0
  42. package/dist/http/client.js.map +1 -0
  43. package/dist/index.d.ts +77 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +94 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/kernel/app.d.ts +244 -0
  48. package/dist/kernel/app.d.ts.map +1 -0
  49. package/dist/kernel/app.js +654 -0
  50. package/dist/kernel/app.js.map +1 -0
  51. package/dist/kernel/kv-sink.d.ts +34 -0
  52. package/dist/kernel/kv-sink.d.ts.map +1 -0
  53. package/dist/kernel/kv-sink.js +25 -0
  54. package/dist/kernel/kv-sink.js.map +1 -0
  55. package/dist/kernel/policy.d.ts +77 -0
  56. package/dist/kernel/policy.d.ts.map +1 -0
  57. package/dist/kernel/policy.js +99 -0
  58. package/dist/kernel/policy.js.map +1 -0
  59. package/dist/kernel/runtime.d.ts +117 -0
  60. package/dist/kernel/runtime.d.ts.map +1 -0
  61. package/dist/kernel/runtime.js +197 -0
  62. package/dist/kernel/runtime.js.map +1 -0
  63. package/dist/kernel/sql-sink.d.ts +36 -0
  64. package/dist/kernel/sql-sink.d.ts.map +1 -0
  65. package/dist/kernel/sql-sink.js +114 -0
  66. package/dist/kernel/sql-sink.js.map +1 -0
  67. package/dist/logger/format.d.ts +67 -0
  68. package/dist/logger/format.d.ts.map +1 -0
  69. package/dist/logger/format.js +218 -0
  70. package/dist/logger/format.js.map +1 -0
  71. package/dist/logger/index.d.ts +97 -0
  72. package/dist/logger/index.d.ts.map +1 -0
  73. package/dist/logger/index.js +363 -0
  74. package/dist/logger/index.js.map +1 -0
  75. package/dist/logger/rotate.d.ts +47 -0
  76. package/dist/logger/rotate.d.ts.map +1 -0
  77. package/dist/logger/rotate.js +242 -0
  78. package/dist/logger/rotate.js.map +1 -0
  79. package/dist/message/segment.d.ts +255 -0
  80. package/dist/message/segment.d.ts.map +1 -0
  81. package/dist/message/segment.js +510 -0
  82. package/dist/message/segment.js.map +1 -0
  83. package/dist/message/split.d.ts +34 -0
  84. package/dist/message/split.d.ts.map +1 -0
  85. package/dist/message/split.js +79 -0
  86. package/dist/message/split.js.map +1 -0
  87. package/dist/message/target.d.ts +29 -0
  88. package/dist/message/target.d.ts.map +1 -0
  89. package/dist/message/target.js +34 -0
  90. package/dist/message/target.js.map +1 -0
  91. package/dist/pipeline/cooldown.d.ts +84 -0
  92. package/dist/pipeline/cooldown.d.ts.map +1 -0
  93. package/dist/pipeline/cooldown.js +94 -0
  94. package/dist/pipeline/cooldown.js.map +1 -0
  95. package/dist/pipeline/dispatch.d.ts +98 -0
  96. package/dist/pipeline/dispatch.d.ts.map +1 -0
  97. package/dist/pipeline/dispatch.js +323 -0
  98. package/dist/pipeline/dispatch.js.map +1 -0
  99. package/dist/pipeline/event.d.ts +130 -0
  100. package/dist/pipeline/event.d.ts.map +1 -0
  101. package/dist/pipeline/event.js +538 -0
  102. package/dist/pipeline/event.js.map +1 -0
  103. package/dist/pipeline/middleware.d.ts +63 -0
  104. package/dist/pipeline/middleware.d.ts.map +1 -0
  105. package/dist/pipeline/middleware.js +174 -0
  106. package/dist/pipeline/middleware.js.map +1 -0
  107. package/dist/pipeline/prompt.d.ts +80 -0
  108. package/dist/pipeline/prompt.d.ts.map +1 -0
  109. package/dist/pipeline/prompt.js +155 -0
  110. package/dist/pipeline/prompt.js.map +1 -0
  111. package/dist/pipeline/router.d.ts +98 -0
  112. package/dist/pipeline/router.d.ts.map +1 -0
  113. package/dist/pipeline/router.js +489 -0
  114. package/dist/pipeline/router.js.map +1 -0
  115. package/dist/platform/detect.d.ts +24 -0
  116. package/dist/platform/detect.d.ts.map +1 -0
  117. package/dist/platform/detect.js +178 -0
  118. package/dist/platform/detect.js.map +1 -0
  119. package/dist/platform/paths.d.ts +38 -0
  120. package/dist/platform/paths.d.ts.map +1 -0
  121. package/dist/platform/paths.js +129 -0
  122. package/dist/platform/paths.js.map +1 -0
  123. package/dist/platform/system.d.ts +71 -0
  124. package/dist/platform/system.d.ts.map +1 -0
  125. package/dist/platform/system.js +242 -0
  126. package/dist/platform/system.js.map +1 -0
  127. package/dist/plugin/context.d.ts +92 -0
  128. package/dist/plugin/context.d.ts.map +1 -0
  129. package/dist/plugin/context.js +573 -0
  130. package/dist/plugin/context.js.map +1 -0
  131. package/dist/plugin/define.d.ts +92 -0
  132. package/dist/plugin/define.d.ts.map +1 -0
  133. package/dist/plugin/define.js +82 -0
  134. package/dist/plugin/define.js.map +1 -0
  135. package/dist/plugin/discover.d.ts +106 -0
  136. package/dist/plugin/discover.d.ts.map +1 -0
  137. package/dist/plugin/discover.js +254 -0
  138. package/dist/plugin/discover.js.map +1 -0
  139. package/dist/plugin/events.d.ts +109 -0
  140. package/dist/plugin/events.d.ts.map +1 -0
  141. package/dist/plugin/events.js +209 -0
  142. package/dist/plugin/events.js.map +1 -0
  143. package/dist/plugin/hooks.d.ts +266 -0
  144. package/dist/plugin/hooks.d.ts.map +1 -0
  145. package/dist/plugin/hooks.js +84 -0
  146. package/dist/plugin/hooks.js.map +1 -0
  147. package/dist/plugin/host.d.ts +160 -0
  148. package/dist/plugin/host.d.ts.map +1 -0
  149. package/dist/plugin/host.js +546 -0
  150. package/dist/plugin/host.js.map +1 -0
  151. package/dist/plugin/market.d.ts +264 -0
  152. package/dist/plugin/market.d.ts.map +1 -0
  153. package/dist/plugin/market.js +700 -0
  154. package/dist/plugin/market.js.map +1 -0
  155. package/dist/plugin/services.d.ts +116 -0
  156. package/dist/plugin/services.d.ts.map +1 -0
  157. package/dist/plugin/services.js +213 -0
  158. package/dist/plugin/services.js.map +1 -0
  159. package/dist/plugin/tar.d.ts +65 -0
  160. package/dist/plugin/tar.d.ts.map +1 -0
  161. package/dist/plugin/tar.js +277 -0
  162. package/dist/plugin/tar.js.map +1 -0
  163. package/dist/render/registry.d.ts +127 -0
  164. package/dist/render/registry.d.ts.map +1 -0
  165. package/dist/render/registry.js +306 -0
  166. package/dist/render/registry.js.map +1 -0
  167. package/dist/scheduler/index.d.ts +67 -0
  168. package/dist/scheduler/index.d.ts.map +1 -0
  169. package/dist/scheduler/index.js +279 -0
  170. package/dist/scheduler/index.js.map +1 -0
  171. package/dist/server/api.d.ts +179 -0
  172. package/dist/server/api.d.ts.map +1 -0
  173. package/dist/server/api.js +602 -0
  174. package/dist/server/api.js.map +1 -0
  175. package/dist/server/auth.d.ts +83 -0
  176. package/dist/server/auth.d.ts.map +1 -0
  177. package/dist/server/auth.js +178 -0
  178. package/dist/server/auth.js.map +1 -0
  179. package/dist/server/browse.d.ts +60 -0
  180. package/dist/server/browse.d.ts.map +1 -0
  181. package/dist/server/browse.js +187 -0
  182. package/dist/server/browse.js.map +1 -0
  183. package/dist/server/files.d.ts +27 -0
  184. package/dist/server/files.d.ts.map +1 -0
  185. package/dist/server/files.js +76 -0
  186. package/dist/server/files.js.map +1 -0
  187. package/dist/server/index.d.ts +189 -0
  188. package/dist/server/index.d.ts.map +1 -0
  189. package/dist/server/index.js +1123 -0
  190. package/dist/server/index.js.map +1 -0
  191. package/dist/server/table.d.ts +105 -0
  192. package/dist/server/table.d.ts.map +1 -0
  193. package/dist/server/table.js +289 -0
  194. package/dist/server/table.js.map +1 -0
  195. package/dist/store/index.d.ts +50 -0
  196. package/dist/store/index.d.ts.map +1 -0
  197. package/dist/store/index.js +120 -0
  198. package/dist/store/index.js.map +1 -0
  199. package/dist/store/json.d.ts +73 -0
  200. package/dist/store/json.d.ts.map +1 -0
  201. package/dist/store/json.js +174 -0
  202. package/dist/store/json.js.map +1 -0
  203. package/dist/store/kv.d.ts +126 -0
  204. package/dist/store/kv.d.ts.map +1 -0
  205. package/dist/store/kv.js +232 -0
  206. package/dist/store/kv.js.map +1 -0
  207. package/dist/store/level.d.ts +103 -0
  208. package/dist/store/level.d.ts.map +1 -0
  209. package/dist/store/level.js +119 -0
  210. package/dist/store/level.js.map +1 -0
  211. package/dist/store/memory.d.ts +61 -0
  212. package/dist/store/memory.d.ts.map +1 -0
  213. package/dist/store/memory.js +94 -0
  214. package/dist/store/memory.js.map +1 -0
  215. package/dist/store/sql.d.ts +142 -0
  216. package/dist/store/sql.d.ts.map +1 -0
  217. package/dist/store/sql.js +246 -0
  218. package/dist/store/sql.js.map +1 -0
  219. package/dist/testing/fake.d.ts +109 -0
  220. package/dist/testing/fake.d.ts.map +1 -0
  221. package/dist/testing/fake.js +196 -0
  222. package/dist/testing/fake.js.map +1 -0
  223. package/dist/testing/index.d.ts +16 -0
  224. package/dist/testing/index.d.ts.map +1 -0
  225. package/dist/testing/index.js +16 -0
  226. package/dist/testing/index.js.map +1 -0
  227. package/dist/testing/mock-adapter.d.ts +205 -0
  228. package/dist/testing/mock-adapter.d.ts.map +1 -0
  229. package/dist/testing/mock-adapter.js +309 -0
  230. package/dist/testing/mock-adapter.js.map +1 -0
  231. package/dist/util/deep.d.ts +108 -0
  232. package/dist/util/deep.d.ts.map +1 -0
  233. package/dist/util/deep.js +275 -0
  234. package/dist/util/deep.js.map +1 -0
  235. package/dist/util/defer.d.ts +107 -0
  236. package/dist/util/defer.d.ts.map +1 -0
  237. package/dist/util/defer.js +163 -0
  238. package/dist/util/defer.js.map +1 -0
  239. package/dist/util/dispose.d.ts +88 -0
  240. package/dist/util/dispose.d.ts.map +1 -0
  241. package/dist/util/dispose.js +143 -0
  242. package/dist/util/dispose.js.map +1 -0
  243. package/dist/util/duration.d.ts +28 -0
  244. package/dist/util/duration.d.ts.map +1 -0
  245. package/dist/util/duration.js +77 -0
  246. package/dist/util/duration.js.map +1 -0
  247. package/dist/util/fs.d.ts +110 -0
  248. package/dist/util/fs.d.ts.map +1 -0
  249. package/dist/util/fs.js +269 -0
  250. package/dist/util/fs.js.map +1 -0
  251. package/dist/util/id.d.ts +49 -0
  252. package/dist/util/id.d.ts.map +1 -0
  253. package/dist/util/id.js +87 -0
  254. package/dist/util/id.js.map +1 -0
  255. package/dist/util/lru.d.ts +74 -0
  256. package/dist/util/lru.d.ts.map +1 -0
  257. package/dist/util/lru.js +156 -0
  258. package/dist/util/lru.js.map +1 -0
  259. package/dist/util/queue.d.ts +64 -0
  260. package/dist/util/queue.d.ts.map +1 -0
  261. package/dist/util/queue.js +147 -0
  262. package/dist/util/queue.js.map +1 -0
  263. package/dist/util/text.d.ts +86 -0
  264. package/dist/util/text.d.ts.map +1 -0
  265. package/dist/util/text.js +182 -0
  266. package/dist/util/text.js.map +1 -0
  267. package/package.json +44 -0
  268. package/src/adapter/accounts.ts +758 -0
  269. package/src/adapter/bots.ts +582 -0
  270. package/src/adapter/host.ts +224 -0
  271. package/src/adapter/login.ts +481 -0
  272. package/src/adapter/registry.ts +202 -0
  273. package/src/config/core-config.test.ts +60 -0
  274. package/src/config/core-config.ts +401 -0
  275. package/src/config/schema.test.ts +179 -0
  276. package/src/config/schema.ts +1036 -0
  277. package/src/config/store.test.ts +245 -0
  278. package/src/config/store.ts +506 -0
  279. package/src/config/yaml.ts +119 -0
  280. package/src/http/client.test.ts +568 -0
  281. package/src/http/client.ts +777 -0
  282. package/src/index.ts +106 -0
  283. package/src/kernel/app.test.ts +267 -0
  284. package/src/kernel/app.ts +843 -0
  285. package/src/kernel/kv-sink.ts +58 -0
  286. package/src/kernel/policy.ts +120 -0
  287. package/src/kernel/runtime.test.ts +542 -0
  288. package/src/kernel/runtime.ts +307 -0
  289. package/src/kernel/sql-sink.ts +154 -0
  290. package/src/logger/format.ts +259 -0
  291. package/src/logger/index.ts +427 -0
  292. package/src/logger/rotate.ts +265 -0
  293. package/src/message/segment.test.ts +335 -0
  294. package/src/message/segment.ts +569 -0
  295. package/src/message/split.ts +97 -0
  296. package/src/message/target.ts +48 -0
  297. package/src/pipeline/cooldown.ts +136 -0
  298. package/src/pipeline/dispatch.ts +419 -0
  299. package/src/pipeline/event.ts +735 -0
  300. package/src/pipeline/middleware.test.ts +426 -0
  301. package/src/pipeline/middleware.ts +199 -0
  302. package/src/pipeline/prompt.ts +212 -0
  303. package/src/pipeline/router.test.ts +432 -0
  304. package/src/pipeline/router.ts +575 -0
  305. package/src/platform/detect.ts +178 -0
  306. package/src/platform/paths.ts +147 -0
  307. package/src/platform/system.test.ts +102 -0
  308. package/src/platform/system.ts +289 -0
  309. package/src/plugin/context.test.ts +459 -0
  310. package/src/plugin/context.ts +757 -0
  311. package/src/plugin/define.test.ts +120 -0
  312. package/src/plugin/define.ts +142 -0
  313. package/src/plugin/discover.test.ts +253 -0
  314. package/src/plugin/discover.ts +353 -0
  315. package/src/plugin/events.test.ts +162 -0
  316. package/src/plugin/events.ts +266 -0
  317. package/src/plugin/hooks.ts +373 -0
  318. package/src/plugin/host.test.ts +696 -0
  319. package/src/plugin/host.ts +738 -0
  320. package/src/plugin/market.test.ts +781 -0
  321. package/src/plugin/market.ts +870 -0
  322. package/src/plugin/services.test.ts +135 -0
  323. package/src/plugin/services.ts +261 -0
  324. package/src/plugin/tar.test.ts +158 -0
  325. package/src/plugin/tar.ts +309 -0
  326. package/src/render/registry.test.ts +127 -0
  327. package/src/render/registry.ts +439 -0
  328. package/src/scheduler/index.ts +357 -0
  329. package/src/server/api.test.ts +802 -0
  330. package/src/server/api.ts +869 -0
  331. package/src/server/auth.ts +201 -0
  332. package/src/server/browse.test.ts +193 -0
  333. package/src/server/browse.ts +240 -0
  334. package/src/server/files.ts +97 -0
  335. package/src/server/index.test.ts +566 -0
  336. package/src/server/index.ts +1386 -0
  337. package/src/server/table.ts +351 -0
  338. package/src/store/index.ts +156 -0
  339. package/src/store/json.ts +198 -0
  340. package/src/store/kv.test.ts +307 -0
  341. package/src/store/kv.ts +256 -0
  342. package/src/store/level.ts +167 -0
  343. package/src/store/memory.ts +109 -0
  344. package/src/store/sql.test.ts +204 -0
  345. package/src/store/sql.ts +324 -0
  346. package/src/testing/fake.ts +297 -0
  347. package/src/testing/index.ts +15 -0
  348. package/src/testing/mock-adapter.ts +588 -0
  349. package/src/util/deep.ts +272 -0
  350. package/src/util/defer.ts +211 -0
  351. package/src/util/dispose.ts +169 -0
  352. package/src/util/duration.ts +82 -0
  353. package/src/util/fs.ts +279 -0
  354. package/src/util/id.ts +94 -0
  355. package/src/util/lru.ts +185 -0
  356. package/src/util/queue.ts +167 -0
  357. package/src/util/text.ts +189 -0
@@ -0,0 +1,602 @@
1
+ import { SchemaError } from "../config/schema.js";
2
+ import { browseDirectory } from "./browse.js";
3
+ /** 面板 API 的挂载前缀 */
4
+ export const API_SCOPE = "/api";
5
+ /** `GET logs` 默认返回的条数 */
6
+ const LOG_TAIL_DEFAULT = 200;
7
+ /** `GET logs` 单次最多返回的条数 */
8
+ const LOG_TAIL_MAX = 2000;
9
+ /** 配置写入的来源标记,日志里据此区分"面板改的"与"用户手改文件" */
10
+ const WRITE_SOURCE = "webui";
11
+ /** 合法的日志级别,用于校验查询参数 */
12
+ const LOG_LEVELS = ["trace", "debug", "info", "warn", "error", "fatal", "silent"];
13
+ /**
14
+ * 造一个带状态码的错误
15
+ * @param status HTTP 状态码
16
+ * @param message 中文说明,会原样回给面板
17
+ * @returns 错误对象
18
+ */
19
+ function fail(status, message) {
20
+ const err = new Error(message);
21
+ err.statusCode = status;
22
+ return err;
23
+ }
24
+ /**
25
+ * 取错误的可读信息
26
+ * @param err 任意抛出物
27
+ * @returns 文本
28
+ */
29
+ function messageOf(err) {
30
+ return err instanceof Error ? err.message : String(err);
31
+ }
32
+ /**
33
+ * 把请求体当作对象取出
34
+ * @param body 已解析的请求体
35
+ * @returns 键值对
36
+ * @throws 请求体不是 JSON 对象时抛 400
37
+ */
38
+ function objectOf(body) {
39
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
40
+ throw fail(400, "请求体必须是一个 JSON 对象");
41
+ }
42
+ return body;
43
+ }
44
+ /**
45
+ * 从对象里取必填字符串
46
+ * @param obj 请求体
47
+ * @param key 字段名
48
+ * @returns 非空字符串
49
+ * @throws 缺失或类型不对时抛 400
50
+ */
51
+ function requireString(obj, key) {
52
+ const value = obj[key];
53
+ if (typeof value !== "string" || value === "")
54
+ throw fail(400, `字段 ${key} 必填,且必须是非空字符串`);
55
+ return value;
56
+ }
57
+ /**
58
+ * 从对象里取可选字符串
59
+ * @param obj 请求体
60
+ * @param key 字段名
61
+ * @returns 字符串;缺失时 undefined
62
+ * @throws 存在但类型不对时抛 400
63
+ */
64
+ function optionalString(obj, key) {
65
+ const value = obj[key];
66
+ if (value === undefined || value === null)
67
+ return undefined;
68
+ if (typeof value !== "string")
69
+ throw fail(400, `字段 ${key} 必须是字符串`);
70
+ return value;
71
+ }
72
+ /**
73
+ * 从对象里取可选布尔
74
+ * @param obj 请求体
75
+ * @param key 字段名
76
+ * @returns 布尔;缺失时 undefined
77
+ * @throws 存在但类型不对时抛 400
78
+ */
79
+ function optionalBoolean(obj, key) {
80
+ const value = obj[key];
81
+ if (value === undefined || value === null)
82
+ return undefined;
83
+ if (typeof value !== "boolean")
84
+ throw fail(400, `字段 ${key} 必须是布尔值`);
85
+ return value;
86
+ }
87
+ /**
88
+ * 取查询串里的单个值
89
+ *
90
+ * 查询串允许同名重复(`?scope=a&scope=b`),此时 Fastify 给出数组。面板不需要
91
+ * 多值语义,取第一个即可 —— 报错反而会让"手动拼 URL 调试"变得麻烦。
92
+ * @param query 查询串对象
93
+ * @param key 参数名
94
+ * @returns 字符串;缺失时 undefined
95
+ */
96
+ function queryOf(query, key) {
97
+ const value = query[key];
98
+ if (Array.isArray(value))
99
+ return value[0];
100
+ return value;
101
+ }
102
+ /**
103
+ * 解析查询串里的正整数
104
+ * @param query 查询串对象
105
+ * @param key 参数名
106
+ * @param fallback 缺省值
107
+ * @param max 上限
108
+ * @returns 落在 `[1, max]` 内的整数
109
+ */
110
+ function countOf(query, key, fallback, max) {
111
+ const raw = queryOf(query, key);
112
+ if (raw === undefined || raw === "")
113
+ return fallback;
114
+ const n = Number.parseInt(raw, 10);
115
+ if (!Number.isFinite(n) || n < 1)
116
+ return fallback;
117
+ return Math.min(n, max);
118
+ }
119
+ /**
120
+ * 解析查询串里的日志级别
121
+ * @param query 查询串对象
122
+ * @returns 级别;未指定或非法时 undefined
123
+ */
124
+ function levelOf(query) {
125
+ const raw = queryOf(query, "level");
126
+ if (raw === undefined || !LOG_LEVELS.includes(raw))
127
+ return undefined;
128
+ return raw;
129
+ }
130
+ /**
131
+ * 造出面板 API 的全部端点描述
132
+ *
133
+ * 只造描述,不注册 —— 注册由 `registerApi()` 或调用方自己做,理由见文件头第 1 条。
134
+ * 想单测某个端点时,直接从返回值里挑出来调它的 `handler` 即可,不需要起服务器。
135
+ * @param deps 依赖
136
+ * @returns 端点清单
137
+ */
138
+ export function createApiRoutes(deps) {
139
+ const routes = [];
140
+ const websockets = [];
141
+ /** 只读模式下拦住写操作,见文件头第 2 条 */
142
+ const requireWritable = () => {
143
+ if (deps.config.get().server.readonly) {
144
+ throw fail(403, "面板处于只读模式(配置项 server.readonly 为 true),不能执行写操作");
145
+ }
146
+ };
147
+ /**
148
+ * 登记一条端点,并统一将 SchemaError 转换为 400
149
+ *
150
+ * SchemaError 中携带逐字段的 issues,直接抛出只会保留一条拼接后的消息文本,
151
+ * 前端即无法将错误标注至对应的表单项 —— 因此此处改为**返回**一个 400 信封。
152
+ */
153
+ const add = (method, path, handler, options) => {
154
+ routes.push({
155
+ method,
156
+ path,
157
+ options,
158
+ handler: async (req) => {
159
+ try {
160
+ return await handler(req);
161
+ }
162
+ catch (err) {
163
+ if (err instanceof SchemaError) {
164
+ return { status: 400, body: { error: err.message, issues: err.issues } };
165
+ }
166
+ throw err;
167
+ }
168
+ }
169
+ });
170
+ };
171
+ /** 按名取配置句柄,取不到就是 404 */
172
+ const configOf = (name) => {
173
+ if (name === undefined || name === "")
174
+ throw fail(400, "缺少配置名");
175
+ const file = deps.configStore.get(name);
176
+ if (file === undefined)
177
+ throw fail(404, `没有名为 ${name} 的配置。已声明的配置见 GET ${API_SCOPE}/config`);
178
+ return file;
179
+ };
180
+ /** 按 id 取账号,取不到就是 404 */
181
+ const accountOf = (id) => {
182
+ if (id === undefined || id === "")
183
+ throw fail(400, "缺少账号 id");
184
+ const state = deps.accounts.get(id);
185
+ if (state === undefined)
186
+ throw fail(404, `没有 id 为 ${id} 的账号`);
187
+ return state;
188
+ };
189
+ /* ────────────────────────────── 概览 ────────────────────────────── */
190
+ add("GET", "overview", () => {
191
+ const plugins = deps.plugins.list();
192
+ const accounts = deps.accounts.list();
193
+ return {
194
+ version: deps.version,
195
+ status: deps.status(),
196
+ startedAt: deps.startedAt(),
197
+ uptime: Date.now() - deps.startedAt(),
198
+ platform: deps.platform,
199
+ paths: deps.paths,
200
+ usage: deps.usage(),
201
+ server: {
202
+ ...deps.server.info,
203
+ readonly: deps.config.get().server.readonly,
204
+ connections: deps.server.connections
205
+ },
206
+ counts: {
207
+ plugins: plugins.length,
208
+ pluginsFailed: plugins.filter(p => p.status === "error").length,
209
+ commands: deps.registries.commands().length,
210
+ tasks: deps.registries.tasks().length,
211
+ adapters: deps.adapters.list().length,
212
+ accounts: accounts.length,
213
+ online: accounts.filter(a => a.status === "online").length,
214
+ renderers: deps.renderers.size,
215
+ logins: deps.logins.running
216
+ },
217
+ pipeline: { handled: deps.dispatcher.handled, queued: deps.dispatcher.queued }
218
+ };
219
+ });
220
+ /*
221
+ * 磁盘与显卡
222
+ *
223
+ * **单独一个端点,不并入 `GET /api/overview`。** 两条理由:
224
+ *
225
+ * 1) 概览是每 5 秒必拉的那一个,而本项要量文件系统、还可能 spawn 一个
226
+ * nvidia-smi。并进去就是让最热的端点等最慢的采样。
227
+ * 2) 概览页之外的地方(日后的插件页、排障页)可能只要磁盘不要那一大坨计数。
228
+ *
229
+ * **CPU 与内存刻意不在这里**,它们已在概览里 —— 同一事实供两份,两处的采样时刻
230
+ * 还不一样,面板上就会出现「CPU 卡片与 CPU 环不是一个数」。
231
+ *
232
+ * 不要令牌之外的额外权限:它报的是容量与型号,不含任何路径或文件名,
233
+ * 与 `GET fs` 那种「能看见目录树」不是一类东西,故只读模式下照常可用。
234
+ */
235
+ add("GET", "system", () => deps.system());
236
+ /* ────────────────────────────── 配置 ────────────────────────────── */
237
+ add("GET", "config", () => deps.configStore.list());
238
+ // 刻意**不脱敏**:读这个端点本身就需要令牌,而面板必须能显示与轮换令牌、
239
+ // 显示适配器的连接密钥。返回掩码会让"改一个字段就得重填全部密码"成为常态,
240
+ // 那才是真正会逼用户把密钥写到别处的设计
241
+ add("GET", "config/:name", req => {
242
+ const file = configOf(req.params.name);
243
+ return { name: file.name, title: file.title, file: file.file, schema: file.schema, value: file.get() };
244
+ });
245
+ add("PATCH", "config/:name", async (req) => {
246
+ requireWritable();
247
+ const file = configOf(req.params.name);
248
+ return { value: await file.patch(objectOf(req.body), WRITE_SOURCE) };
249
+ });
250
+ add("PUT", "config/:name", async (req) => {
251
+ requireWritable();
252
+ const file = configOf(req.params.name);
253
+ return { value: await file.replace(objectOf(req.body), WRITE_SOURCE) };
254
+ });
255
+ add("POST", "config/:name/reset", async (req) => {
256
+ requireWritable();
257
+ const file = configOf(req.params.name);
258
+ deps.logger.warn(`面板重置了配置 ${file.name}`);
259
+ return { value: await file.reset(WRITE_SOURCE) };
260
+ });
261
+ /* ────────────────────────────── 插件 ────────────────────────────── */
262
+ add("GET", "plugins", () => deps.plugins.list());
263
+ add("GET", "plugins/:name", req => {
264
+ const name = req.params.name ?? "";
265
+ const state = deps.plugins.get(name);
266
+ if (state === undefined)
267
+ throw fail(404, `没有名为 ${name} 的插件`);
268
+ return state;
269
+ });
270
+ add("POST", "plugins/:name/reload", async (req) => {
271
+ requireWritable();
272
+ const name = req.params.name ?? "";
273
+ const ok = await deps.plugins.reload(name);
274
+ if (!ok)
275
+ throw fail(400, `重载 ${name} 失败,详情见日志`);
276
+ return { name, reloaded: true };
277
+ });
278
+ add("POST", "plugins/:name/unload", async (req) => {
279
+ requireWritable();
280
+ const name = req.params.name ?? "";
281
+ const ok = await deps.plugins.unload(name);
282
+ if (!ok)
283
+ throw fail(404, `插件 ${name} 当前并未加载`);
284
+ return { name, unloaded: true };
285
+ });
286
+ /* ────────────────────────── 插件市场 ────────────────────────── */
287
+ /**
288
+ * 取市场实例
289
+ * @returns 市场实例
290
+ * @throws 当前部署未提供市场时以 501 结束请求
291
+ */
292
+ const market = () => {
293
+ if (deps.market === undefined)
294
+ throw fail(501, "当前部署未启用插件市场");
295
+ return deps.market;
296
+ };
297
+ /**
298
+ * 安装或更新一个市场插件,并按需加载
299
+ *
300
+ * 更新前先卸载:旧版本的模块若留在内存中,其注册的命令仍会响应,而磁盘上已是
301
+ * 新版本代码,两者不一致。失败一律折成 400 —— 名称、版本、网络与归档内容的问题
302
+ * 都由请求方的输入或环境决定,不是服务端故障。
303
+ * @param name 插件名
304
+ * @param load 安装后是否立即加载
305
+ * @param replace 目标已存在时是否覆盖
306
+ * @returns 安装结果,附本次加载成功的插件名
307
+ * @throws 安装失败时以 400 结束请求
308
+ */
309
+ const installFromMarket = async (name, load, replace) => {
310
+ const instance = market();
311
+ let unloaded = false;
312
+ try {
313
+ if (replace && deps.plugins.get(name) !== undefined)
314
+ unloaded = await deps.plugins.unload(name);
315
+ const result = replace ? await instance.update(name) : await instance.install(name);
316
+ const loaded = load ? [...(await deps.plugins.loadAll()).loaded] : [];
317
+ return { ...result, unloaded, loaded };
318
+ }
319
+ catch (err) {
320
+ throw fail(400, err instanceof Error ? err.message : String(err));
321
+ }
322
+ };
323
+ // 刷新索引不需要写权限:该动作只更新索引缓存,不改动配置、账号与已装插件。
324
+ // 只读模式的用途是防止误操作改动部署状态,浏览可安装的插件不属于此列
325
+ add("GET", "market", req => market().list(queryOf(req.query, "refresh") === "1"));
326
+ add("POST", "market/refresh", () => market().list(true));
327
+ add("POST", "market/install", async (req) => {
328
+ requireWritable();
329
+ const body = objectOf(req.body);
330
+ const name = requireString(body, "name");
331
+ return installFromMarket(name, optionalBoolean(body, "load") ?? true, false);
332
+ });
333
+ add("POST", "market/:name/update", async (req) => {
334
+ requireWritable();
335
+ const name = req.params.name ?? "";
336
+ const body = req.body === undefined ? {} : objectOf(req.body);
337
+ return installFromMarket(name, optionalBoolean(body, "load") ?? true, true);
338
+ });
339
+ add("DELETE", "market/:name", async (req) => {
340
+ requireWritable();
341
+ const name = req.params.name ?? "";
342
+ // 先卸载再删除目录:若目录已删除而插件仍在内存中运行,其命令仍会响应,
343
+ // 而重启后则不再存在 —— 此类不一致比一次失败的卸载更难排查
344
+ const unloaded = deps.plugins.get(name) === undefined ? false : await deps.plugins.unload(name);
345
+ let removed;
346
+ try {
347
+ removed = await market().remove(name);
348
+ }
349
+ catch (err) {
350
+ throw fail(400, err instanceof Error ? err.message : String(err));
351
+ }
352
+ if (!removed)
353
+ throw fail(404, `插件目录 ${name} 不存在`);
354
+ return { name, unloaded, removed };
355
+ });
356
+ add("GET", "commands", () => deps.registries.commands());
357
+ add("GET", "tasks", () => deps.registries.tasks());
358
+ /*
359
+ * 中间件清单
360
+ *
361
+ * 与 `commands` / `tasks` 同一形制,都是内省:面板的插件卡片一直显示着中间件的
362
+ * **条数**,而点进去看不到是哪几条 —— 排查「消息被谁拦下了」时,条数没有用。
363
+ *
364
+ * 顺序即实际的执行顺序,不是注册顺序,理由见 `MiddlewarePipeline.list()`。
365
+ */
366
+ add("GET", "middlewares", () => deps.registries.middlewares());
367
+ add("GET", "renderers", () => deps.renderers.list());
368
+ /* ────────────────────── 适配器与账号 ────────────────────── */
369
+ add("GET", "adapters", () => deps.adapters.list());
370
+ // 账号配置里含连接密钥,同 GET config/:name 一样刻意不脱敏
371
+ add("GET", "accounts", () => deps.accounts.list());
372
+ add("GET", "accounts/:id", req => accountOf(req.params.id));
373
+ add("POST", "accounts", async (req) => {
374
+ requireWritable();
375
+ const body = objectOf(req.body);
376
+ const adapterId = requireString(body, "adapterId");
377
+ const config = body.config === undefined ? {} : objectOf(body.config);
378
+ const label = optionalString(body, "label");
379
+ const enabled = optionalBoolean(body, "enabled") ?? true;
380
+ // create() 的失败几乎都是用户输入问题(适配器没装、配置字段填错),
381
+ // 而 validateAccount 的错误信息按契约就是给用户看的 —— 一律 400
382
+ try {
383
+ return { status: 201, body: await deps.accounts.create(adapterId, config, label, enabled) };
384
+ }
385
+ catch (err) {
386
+ if (err instanceof SchemaError)
387
+ throw err;
388
+ throw fail(400, messageOf(err));
389
+ }
390
+ });
391
+ add("PATCH", "accounts/:id", async (req) => {
392
+ requireWritable();
393
+ const state = accountOf(req.params.id);
394
+ const body = objectOf(req.body);
395
+ const patch = {};
396
+ if (body.config !== undefined)
397
+ patch.config = objectOf(body.config);
398
+ const label = optionalString(body, "label");
399
+ if (label !== undefined)
400
+ patch.label = label;
401
+ const enabled = optionalBoolean(body, "enabled");
402
+ if (enabled !== undefined)
403
+ patch.enabled = enabled;
404
+ try {
405
+ return await deps.accounts.update(state.record.id, patch);
406
+ }
407
+ catch (err) {
408
+ if (err instanceof SchemaError)
409
+ throw err;
410
+ throw fail(400, messageOf(err));
411
+ }
412
+ });
413
+ add("DELETE", "accounts/:id", async (req) => {
414
+ requireWritable();
415
+ const state = accountOf(req.params.id);
416
+ await deps.accounts.remove(state.record.id);
417
+ return undefined;
418
+ });
419
+ // 连接类动作全部返回**动作之后的状态**而不是空体:面板据此立刻刷新那一行,
420
+ // 少一次往返,也不会出现"点了连接但列表还显示离线"的错觉
421
+ add("POST", "accounts/:id/connect", async (req) => {
422
+ requireWritable();
423
+ const state = accountOf(req.params.id);
424
+ await deps.accounts.connect(state.record.id);
425
+ return deps.accounts.get(state.record.id);
426
+ });
427
+ add("POST", "accounts/:id/disconnect", async (req) => {
428
+ requireWritable();
429
+ const state = accountOf(req.params.id);
430
+ await deps.accounts.disconnect(state.record.id, "面板手动断开");
431
+ return deps.accounts.get(state.record.id);
432
+ });
433
+ add("POST", "accounts/:id/reconnect", async (req) => {
434
+ requireWritable();
435
+ const state = accountOf(req.params.id);
436
+ await deps.accounts.reconnect(state.record.id);
437
+ return deps.accounts.get(state.record.id);
438
+ });
439
+ /* ────────────────────────── 交互式登录 ────────────────────────── */
440
+ add("GET", "logins", () => deps.logins.list());
441
+ add("GET", "logins/:id", req => {
442
+ const id = req.params.id ?? "";
443
+ const snapshot = deps.logins.snapshot(id);
444
+ if (snapshot === undefined)
445
+ throw fail(404, `登录会话 ${id} 不存在或已结束并清理`);
446
+ return snapshot;
447
+ });
448
+ // start() 是同步返回的:登录流程在后台跑,面板拿到初始快照后轮询或等 WS 推送。
449
+ // 这里刻意不做成"等到登录完成才回响应" —— 扫码登录能耗上几分钟,
450
+ // 任何一层反向代理都会先把这条请求掐断
451
+ add("POST", "logins", req => {
452
+ requireWritable();
453
+ const body = objectOf(req.body);
454
+ const adapterId = requireString(body, "adapterId");
455
+ const mode = requireString(body, "mode");
456
+ const label = optionalString(body, "label");
457
+ try {
458
+ return { status: 201, body: deps.logins.start(adapterId, mode, label) };
459
+ }
460
+ catch (err) {
461
+ throw fail(400, messageOf(err));
462
+ }
463
+ });
464
+ add("POST", "logins/:id/answer", req => {
465
+ requireWritable();
466
+ const id = req.params.id ?? "";
467
+ const body = objectOf(req.body);
468
+ const seq = body.seq;
469
+ if (typeof seq !== "number" || !Number.isInteger(seq))
470
+ throw fail(400, "字段 seq 必填,且必须是整数");
471
+ // 答复被拒有三种原因(会话没了、当前没在提问、序号过期),共同的正确反应
472
+ // 都是"重新读一次快照",所以不区分状态码,只把当前快照一并回去
473
+ const accepted = deps.logins.answer(id, seq, body.value);
474
+ return { accepted, session: deps.logins.snapshot(id) };
475
+ });
476
+ add("DELETE", "logins/:id", req => {
477
+ requireWritable();
478
+ const id = req.params.id ?? "";
479
+ return { cancelled: deps.logins.cancel(id), session: deps.logins.snapshot(id) };
480
+ });
481
+ /* ────────────────────────────── 日志 ────────────────────────────── */
482
+ add("GET", "logs", req => {
483
+ const level = levelOf(req.query);
484
+ const scope = queryOf(req.query, "scope");
485
+ const keyword = queryOf(req.query, "keyword");
486
+ const query = {
487
+ limit: countOf(req.query, "limit", LOG_TAIL_DEFAULT, LOG_TAIL_MAX)
488
+ };
489
+ if (level !== undefined)
490
+ query.level = level;
491
+ if (scope !== undefined && scope !== "")
492
+ query.scope = scope;
493
+ if (keyword !== undefined && keyword !== "")
494
+ query.keyword = keyword;
495
+ return { file: deps.loggerHub.file, level: deps.loggerHub.level, records: deps.loggerHub.tail(query) };
496
+ });
497
+ // 实时日志:只推此后新产生的记录,历史请走 GET logs(见文件头第 4 条)。
498
+ // 过滤条件放在握手的查询串里而不是靠客户端发一帧配置过来 —— 后者存在
499
+ // "配置帧到达之前已经推了一批不该推的记录"的窗口期
500
+ websockets.push({
501
+ path: "logs",
502
+ handler: (conn, req) => {
503
+ const level = levelOf(req.query);
504
+ const scope = queryOf(req.query, "scope");
505
+ const keyword = queryOf(req.query, "keyword");
506
+ const threshold = level === undefined ? undefined : LOG_LEVELS.indexOf(level);
507
+ /** 判断一条记录是否要推给这个连接 */
508
+ const matches = (rec) => {
509
+ if (threshold !== undefined && LOG_LEVELS.indexOf(rec.level) < threshold)
510
+ return false;
511
+ if (scope !== undefined && scope !== "" && rec.scope !== scope)
512
+ return false;
513
+ if (keyword !== undefined && keyword !== "" && !rec.msg.includes(keyword))
514
+ return false;
515
+ return true;
516
+ };
517
+ const off = deps.loggerHub.subscribe(rec => {
518
+ if (!conn.open)
519
+ return;
520
+ if (!matches(rec))
521
+ return;
522
+ conn.send(JSON.stringify(rec));
523
+ });
524
+ // 必须摘:LoggerHub 的订阅者表是进程级的,连接断了还留着的话,
525
+ // 面板每刷新一次就永久多一个订阅者,且每条日志都会往一个死 socket 上写
526
+ conn.onClose(() => off());
527
+ }
528
+ });
529
+ /* ───────────────────────── 服务器自身 ───────────────────────── */
530
+ // 路由表是排障用的:插件说"我注册了 /plugin/foo/bar 但访问 404"时,
531
+ // 第一件要确认的事就是它到底有没有出现在这张表里
532
+ add("GET", "server", () => ({
533
+ ...deps.server.info,
534
+ readonly: deps.config.get().server.readonly,
535
+ connections: deps.server.connections,
536
+ routes: deps.server.listRoutes(),
537
+ websockets: deps.server.listWebsockets(),
538
+ static: deps.server.listStatic()
539
+ }));
540
+ /* ────────────────────────── 目录浏览 ────────────────────────── */
541
+ /*
542
+ * 只读列目录:`file` / `dir` 配置项的候选来源
543
+ *
544
+ * 三条边界写在这里,因为它们都是**面板策略**,与文件系统本身无关
545
+ * (文件系统那一侧的四条限制见 browse.ts 的文件头):
546
+ *
547
+ * 1) **要令牌。** 与其余 `/api/*` 一致 —— `add()` 不传 options 即为「要令牌」。
548
+ * 未设令牌时服务器只放行本机(见 auth.ts),故该端点不会凭空对外开放。
549
+ * 2) **只读模式下禁用。** 表面上矛盾:一个只读接口为何在只读模式下不可用?
550
+ * 因为它的用途只有「给配置项挑一个路径」,而只读模式下配置根本改不了 ——
551
+ * 此时它提供的唯一东西就是「让访问者看见这台机器的目录树」,那是纯粹的扩权。
552
+ * 宁可在用不到它的场合关掉。这一条是 2026-08-25 定夺的第 4 项。
553
+ * 3) **起点由前端给,不由内核猜。** 「从哪个目录开始浏览」取决于字段当前填的是什么,
554
+ * 只有前端知道。不带 `path` 时 Windows 列盘符、其余系统列 `/`。
555
+ */
556
+ add("GET", "fs", async (req) => {
557
+ if (deps.config.get().server.readonly) {
558
+ throw fail(403, "面板处于只读模式(配置项 server.readonly 为 true),目录浏览已停用");
559
+ }
560
+ const result = await browseDirectory(queryOf(req.query, "path"));
561
+ if (!result.ok)
562
+ throw fail(result.status, result.message);
563
+ return result.listing;
564
+ });
565
+ return { routes, websockets };
566
+ }
567
+ /**
568
+ * 将面板 API 挂载至服务器
569
+ *
570
+ * 接收 `ServerSink` 而非 `ManagedServer`:注册仅使用接缝中的三个方法,
571
+ * 收窄接口使该函数可在测试中对接一个测试替身服务器。
572
+ * @param server 服务器接缝
573
+ * @param surface 端点清单
574
+ * @returns 摘除全部端点的句柄;由 `App.stop()` 调用
575
+ */
576
+ export function installApiRoutes(server, surface) {
577
+ const offs = [];
578
+ for (const route of surface.routes) {
579
+ offs.push(server.route(API_SCOPE, route.method, route.path, route.handler, route.options));
580
+ }
581
+ for (const ws of surface.websockets) {
582
+ offs.push(server.websocket(API_SCOPE, ws.path, ws.handler));
583
+ }
584
+ return () => {
585
+ // 逆序摘,且摘完清空:Disposer 本身是幂等的,但重复调用会白跑一遍查表
586
+ for (const off of offs.reverse())
587
+ off();
588
+ offs.length = 0;
589
+ };
590
+ }
591
+ /**
592
+ * 构造并挂载面板 API
593
+ *
594
+ * `createApiRoutes` 与 `installApiRoutes` 的便捷组合,由 `kernel/app.ts` 使用。
595
+ * @param server 服务器接缝
596
+ * @param deps 依赖
597
+ * @returns 摘除全部端点的句柄
598
+ */
599
+ export function registerApi(server, deps) {
600
+ return installApiRoutes(server, createApiRoutes(deps));
601
+ }
602
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"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"}