@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,546 @@
1
+ /**
2
+ * 模块职责:插件宿主 —— 导入、装配上下文、setup、卸载与热重载
3
+ * 依赖方向:依赖 plugin/{discover,define,context,events,services,hooks}、config、store、util
4
+ * 生命周期:应用级单例;`dispose()` 卸载全部插件
5
+ * 注意事项:这里是「内核不依赖插件」的执行现场,四条规则 ——
6
+ *
7
+ * **一个插件出问题,其余插件与内核照常工作。** 导入失败、setup 抛错、setup 超时、
8
+ * 依赖缺失,一律降级为一条 `status = "error"` 记录,内核继续启动。
9
+ *
10
+ * **卸载必须完整归还资源。** 每个插件一份 `DisposalRegistry` 与一个 `AbortController`:
11
+ * 先 abort(停掉插件内的 fetch 与循环),再逆序回收注册,最后按 owner 兜底清扫 ——
12
+ * 兜底是为了应对「绕过 ctx 直接调注册表」这类越界写法。
13
+ *
14
+ * **依赖失败要连带处理。** `resolveLoadOrder` 只能剔除未安装的依赖;一个插件 setup
15
+ * 失败而依赖它的照常加载,会得到更难排查的半可用状态,故 setup 前再查一次实际状态。
16
+ *
17
+ * **热重载只是开发期功能。** Node 的 ESM 缓存清不掉,每次重载都会永久留下一份旧模块
18
+ * 连同其闭包,故 `reload()` 会在日志里说明这一点。
19
+ */
20
+ import { join } from "node:path";
21
+ import { pathToFileURL } from "node:url";
22
+ import { Schema } from "../config/schema.js";
23
+ import { DisposalRegistry } from "../util/dispose.js";
24
+ import { TimeoutError, withTimeout } from "../util/defer.js";
25
+ import { ensureDir } from "../util/fs.js";
26
+ import { createPluginContext } from "./context.js";
27
+ import { isPluginDefinition, looksLikePlugin } from "./define.js";
28
+ import { discoverPlugins, resolveLoadOrder } from "./discover.js";
29
+ /** setup 的默认超时(毫秒) */
30
+ const DEFAULT_SETUP_TIMEOUT = 30_000;
31
+ /** 插件数据/配置的命名空间前缀 */
32
+ const KV_PREFIX = "plugin";
33
+ /**
34
+ * 热重载击穿模块缓存用的 query 名
35
+ *
36
+ * 刻意不用 `v` 或 `t`:它们是 Vite/vitest 的保留 query(依赖版本号与 HMR 时间戳),
37
+ * 会在解析时被剥掉,于是 `?v=1` 拿回来的还是缓存里那份旧模块 —— 重载看着成功,
38
+ * 实际什么都没变。用一个带前缀的私有名字,谁都不会去动它。
39
+ */
40
+ const RELOAD_QUERY = "yzngReload";
41
+ /**
42
+ * 取插件版本
43
+ *
44
+ * `definePlugin` 中的声明优先,其次 package.json 的 `version`,两处皆无则 `0.0.0`。
45
+ *
46
+ * **取版本必须经此函数。** 曾出现日志只看 `definition.version`、而面板状态另有一条
47
+ * 回落至 package.json 的取值:未在 `definePlugin` 中重复声明版本的插件(官方面板插件
48
+ * 即是)在日志里显示为 `0.0.0`、在面板里显示为 `0.1.0`,同一进程内自相矛盾。版本号
49
+ * 的单一事实来源应是 package.json,插件不应被要求在两处各写一遍。
50
+ * @param definition 插件定义;无定义时(导入失败)传 undefined
51
+ * @param candidate 候选,含 package.json
52
+ * @returns 版本号
53
+ */
54
+ function versionOf(definition, candidate) {
55
+ return definition?.version ?? candidate?.manifest?.version ?? "0.0.0";
56
+ }
57
+ /**
58
+ * 将未知错误转换为一段可读描述
59
+ * @param err 错误
60
+ * @returns 错误描述
61
+ */
62
+ function describeError(err) {
63
+ if (err instanceof Error)
64
+ return err.message;
65
+ return String(err);
66
+ }
67
+ /**
68
+ * 插件宿主
69
+ *
70
+ * 线程模型:单线程;`loadAll` / `reload` / `unload` 之间用一条串行链互斥,
71
+ * 避免"WebUI 点重载"与"文件监听触发重载"同时进来把状态搅乱。
72
+ */
73
+ export class PluginHost {
74
+ /** 依赖 */
75
+ #deps;
76
+ /** 日志器 */
77
+ #logger;
78
+ /** 插件名 → 记录 */
79
+ #records = new Map();
80
+ /** 插件名 → 对外状态(含失败项,故独立于 #records) */
81
+ #states = new Map();
82
+ /** 名字 → 已知候选(供按名重载) */
83
+ #candidates = new Map();
84
+ /** 串行锁 */
85
+ #chain = Promise.resolve();
86
+ /** 模块缓存击穿计数(热重载用) */
87
+ #reloadEpoch = 0;
88
+ /**
89
+ * @param deps 依赖
90
+ */
91
+ constructor(deps) {
92
+ this.#deps = deps;
93
+ this.#logger = deps.logger.child({ scope: "plugin" });
94
+ }
95
+ /** 已加载插件数 */
96
+ get size() {
97
+ return this.#records.size;
98
+ }
99
+ /**
100
+ * 扫描并加载全部插件
101
+ * @returns 加载汇总
102
+ */
103
+ async loadAll() {
104
+ return this.#serial(() => this.#loadAll());
105
+ }
106
+ /**
107
+ * 卸载一个插件
108
+ * @param name 插件名
109
+ * @returns 是否确实卸载了(未加载时 false)
110
+ */
111
+ async unload(name) {
112
+ return this.#serial(() => this.#unload(name));
113
+ }
114
+ /**
115
+ * 重载一个插件
116
+ *
117
+ * 会重新读磁盘上的代码。见文件头第 4 条:这在 Node 里必然泄漏一份旧模块,
118
+ * 仅供开发期使用。
119
+ * @param name 插件名
120
+ * @returns 是否成功
121
+ */
122
+ async reload(name) {
123
+ return this.#serial(async () => {
124
+ const candidate = this.#candidates.get(name);
125
+ if (!candidate) {
126
+ this.#logger.warn(`重载失败:没有名为 ${name} 的插件`);
127
+ return false;
128
+ }
129
+ await this.#unload(name);
130
+ this.#reloadEpoch++;
131
+ const definition = await this.#import(candidate);
132
+ if (!definition)
133
+ return false;
134
+ this.#logger.info(`插件 ${name} 已重载。提示:Node 无法卸载旧模块,反复重载会累积内存,` +
135
+ `生产环境请重启进程`);
136
+ return await this.#setup(candidate, definition);
137
+ });
138
+ }
139
+ /**
140
+ * 卸载全部插件
141
+ *
142
+ * 逆加载顺序卸载:先卸载依赖别人的,再卸载被依赖的。
143
+ * @returns 卸载的插件数
144
+ */
145
+ async dispose() {
146
+ return this.#serial(async () => {
147
+ const names = [...this.#records.keys()].reverse();
148
+ for (const name of names)
149
+ await this.#unload(name);
150
+ this.#states.clear();
151
+ this.#candidates.clear();
152
+ return names.length;
153
+ });
154
+ }
155
+ /**
156
+ * 列出全部插件状态
157
+ * @returns 状态数组,按名字排序
158
+ */
159
+ list() {
160
+ return [...this.#states.values()]
161
+ .map(state => this.#refresh(state))
162
+ .sort((a, b) => a.name.localeCompare(b.name));
163
+ }
164
+ /**
165
+ * 按名取插件状态
166
+ * @param name 插件名
167
+ * @returns 状态;未知插件时 undefined
168
+ */
169
+ get(name) {
170
+ const state = this.#states.get(name);
171
+ return state ? this.#refresh(state) : undefined;
172
+ }
173
+ /**
174
+ * 按名取插件的运行时上下文
175
+ *
176
+ * 供事件分发器使用:执行某个插件的命令处理函数时,`e.render()` 要用该插件的
177
+ * 模板根、`e.prompt()` 要用该插件的卸载信号。返回值刻意是完整的上下文而不是
178
+ * 另包一层窄接口 —— 分发器那边的参数类型(`PluginRuntimeView`)只取三个成员,
179
+ * 结构上天然满足,多定义一层适配器反而让"这两者必须对得上"变得不明显。
180
+ *
181
+ * 插件已卸载时返回 undefined:分发器据此把那条命令当作已失效跳过,
182
+ * 而不是拿着一个 signal 已 abort 的上下文继续跑。
183
+ * @param name 插件名
184
+ * @returns 上下文;未加载或已卸载时 undefined
185
+ */
186
+ runtime(name) {
187
+ return this.#records.get(name)?.ctx;
188
+ }
189
+ /**
190
+ * 将实时计数同步至状态快照
191
+ *
192
+ * 计数存放于 `PluginCounters` 中由上下文实时增减,状态对象仅在被查询时同步 ——
193
+ * 以免每注册一条命令即更新一次快照。
194
+ * @param state 状态对象
195
+ * @returns 同一个对象(已更新)
196
+ */
197
+ #refresh(state) {
198
+ const record = this.#records.get(state.name);
199
+ if (record) {
200
+ state.commands = record.counters.commands;
201
+ state.middlewares = record.counters.middlewares;
202
+ state.tasks = record.counters.tasks;
203
+ }
204
+ return state;
205
+ }
206
+ /**
207
+ * 串行执行,避免并发加载/卸载互相打断
208
+ * @param fn 要执行的操作
209
+ * @returns 操作结果
210
+ */
211
+ #serial(fn) {
212
+ const next = this.#chain.then(fn, fn);
213
+ // 挂一个空 catch 以保持链条状态正常:错误由调用方从返回的 promise 中获取
214
+ this.#chain = next.then(() => undefined, () => undefined);
215
+ return next;
216
+ }
217
+ /**
218
+ * 扫描 → 导入 → 排序 → 依次 setup
219
+ * @returns 加载汇总
220
+ */
221
+ async #loadAll() {
222
+ const startedAt = Date.now();
223
+ const dirs = [...(this.#deps.extraDirs ?? []), this.#deps.paths.plugins, ...(this.#deps.builtinDirs ?? [])];
224
+ const candidates = await discoverPlugins({
225
+ dirs,
226
+ builtinDirs: this.#deps.builtinDirs,
227
+ disabled: this.#deps.disabled,
228
+ logger: this.#logger
229
+ });
230
+ this.#logger.info(`发现 ${candidates.length} 个插件,开始导入`);
231
+ // 导入阶段可以并发:definePlugin 是纯函数,模块顶层不该有副作用
232
+ // (有副作用的插件本来就是 bug,且并发与否都会发生)
233
+ const pairs = await Promise.all(candidates.map(async (candidate) => ({ candidate, definition: await this.#import(candidate) })));
234
+ const units = [];
235
+ const failed = [];
236
+ for (const pair of pairs) {
237
+ if (!pair.definition) {
238
+ failed.push({ name: pair.candidate.id, reason: this.#states.get(pair.candidate.id)?.error ?? "导入失败" });
239
+ continue;
240
+ }
241
+ this.#candidates.set(pair.definition.name, pair.candidate);
242
+ const unit = {
243
+ name: pair.definition.name,
244
+ pair
245
+ };
246
+ if (pair.definition.dependencies)
247
+ unit.dependencies = pair.definition.dependencies;
248
+ if (pair.definition.priority !== undefined)
249
+ unit.priority = pair.definition.priority;
250
+ units.push(unit);
251
+ }
252
+ const { order, skipped } = resolveLoadOrder(units);
253
+ for (const item of skipped) {
254
+ this.#logger.warn(`跳过插件 ${item.name}:${item.reason}`);
255
+ this.#markFailed(item.name, item.reason, this.#candidates.get(item.name));
256
+ failed.push(item);
257
+ }
258
+ const loaded = [];
259
+ for (const unit of order) {
260
+ const definition = unit.pair.definition;
261
+ if (!definition)
262
+ continue;
263
+ const ok = await this.#setup(unit.pair.candidate, definition);
264
+ if (ok)
265
+ loaded.push(definition.name);
266
+ else
267
+ failed.push({ name: definition.name, reason: this.#states.get(definition.name)?.error ?? "加载失败" });
268
+ }
269
+ const cost = Date.now() - startedAt;
270
+ this.#logger.info(`插件加载完成:成功 ${loaded.length} 个,失败/跳过 ${failed.length} 个,耗时 ${cost}ms`);
271
+ return { loaded, failed, cost };
272
+ }
273
+ /**
274
+ * 导入插件模块并取出定义
275
+ *
276
+ * 失败只记状态不抛错 —— 一个插件语法写错不该让内核起不来。
277
+ * @param candidate 候选
278
+ * @returns 插件定义;失败时 undefined
279
+ */
280
+ async #import(candidate) {
281
+ const url = pathToFileURL(candidate.entry).href;
282
+ // 首次加载不附带 query,以保持堆栈中的路径简洁易辨识
283
+ const spec = this.#reloadEpoch === 0 ? url : `${url}?${RELOAD_QUERY}=${this.#reloadEpoch}`;
284
+ try {
285
+ const mod = (await import(spec));
286
+ const exported = mod["default"] ?? mod["plugin"];
287
+ if (isPluginDefinition(exported))
288
+ return exported;
289
+ if (looksLikePlugin(exported)) {
290
+ this.#logger.debug(`插件 ${candidate.id} 的定义没走 definePlugin,已按宽松规则接受(建议改用 definePlugin 以获得类型推导与校验)`);
291
+ return exported;
292
+ }
293
+ const hint = exported === undefined
294
+ ? "没有默认导出。请 `export default definePlugin({ ... })`"
295
+ : "默认导出不是插件定义。请确认用了 `definePlugin({ name, setup })`";
296
+ this.#markFailed(candidate.id, hint, candidate);
297
+ this.#logger.error(`插件 ${candidate.id} 导入失败:${hint}(${candidate.entry})`);
298
+ return undefined;
299
+ }
300
+ catch (err) {
301
+ const reason = describeError(err);
302
+ this.#markFailed(candidate.id, reason, candidate);
303
+ this.#logger.error(`插件 ${candidate.id} 导入出错:${reason}`, err);
304
+ return undefined;
305
+ }
306
+ }
307
+ /**
308
+ * 装配上下文并执行 setup
309
+ * @param candidate 候选
310
+ * @param definition 插件定义
311
+ * @returns 是否成功
312
+ */
313
+ async #setup(candidate, definition) {
314
+ const name = definition.name;
315
+ if (this.#records.has(name)) {
316
+ this.#logger.warn(`插件 ${name} 已加载,忽略重复加载`);
317
+ return true;
318
+ }
319
+ // 依赖必须确实处于已加载状态:resolveLoadOrder 只保证顺序与"是否已安装",
320
+ // 已安装但 setup 失败的情形只能在此处拦截
321
+ const broken = (definition.dependencies ?? []).filter(dep => this.#states.get(dep)?.status !== "loaded");
322
+ if (broken.length > 0) {
323
+ const reason = `依赖的插件未成功加载:${broken.join("、")}`;
324
+ this.#logger.warn(`跳过插件 ${name}:${reason}`);
325
+ this.#markFailed(name, reason, candidate);
326
+ return false;
327
+ }
328
+ const startedAt = Date.now();
329
+ const registry = new DisposalRegistry(name);
330
+ const abort = new AbortController();
331
+ try {
332
+ const dataDir = await ensureDir(join(this.#deps.paths.data, KV_PREFIX, name));
333
+ const config = await this.#defineConfig(definition);
334
+ const { ctx, counters } = createPluginContext({
335
+ name,
336
+ version: versionOf(definition, candidate),
337
+ root: candidate.dir,
338
+ dataDir,
339
+ logger: this.#deps.logger.child({ scope: name }),
340
+ kv: this.#deps.kv.namespace(KV_PREFIX).sub(name),
341
+ config: config.handle,
342
+ app: this.#deps.app(),
343
+ http: this.#deps.http,
344
+ services: this.#deps.services,
345
+ events: this.#deps.events,
346
+ hooks: this.#deps.hooks,
347
+ registry,
348
+ signal: abort.signal
349
+ });
350
+ const timeout = this.#deps.setupTimeout ?? DEFAULT_SETUP_TIMEOUT;
351
+ const cleanup = await withTimeout(Promise.resolve(definition.setup(ctx)), timeout, `插件 ${name} 的 setup 超过 ${timeout}ms 未完成。setup 里不要做耗时网络请求,改用 ctx.on("app/ready")`);
352
+ if (typeof cleanup === "function")
353
+ registry.add(cleanup, "setup:return");
354
+ const loadCost = Date.now() - startedAt;
355
+ this.#records.set(name, {
356
+ definition,
357
+ candidate,
358
+ ctx,
359
+ registry,
360
+ abort,
361
+ counters,
362
+ hasConfig: config.declared,
363
+ loadCost
364
+ });
365
+ this.#candidates.set(name, candidate);
366
+ this.#states.set(name, this.#stateOf(definition, candidate, counters, loadCost, config.declared));
367
+ this.#logger.info(`插件 ${name}@${versionOf(definition, candidate)} 已加载(${counters.commands} 条命令、` +
368
+ `${counters.tasks} 个任务,${loadCost}ms)`);
369
+ this.#deps.events.emitDetached("plugin/loaded", name);
370
+ return true;
371
+ }
372
+ catch (err) {
373
+ const reason = err instanceof TimeoutError
374
+ ? `setup 超时(${this.#deps.setupTimeout ?? DEFAULT_SETUP_TIMEOUT}ms)`
375
+ : describeError(err);
376
+ // 关键:setup 抛错或超时后,其已完成的注册必须回收。
377
+ // abort 在前,使超时后仍在执行的 setup 尽快停止;registry 已回收,
378
+ // 此后迟到的注册将被 DisposalRegistry.add 立即回收
379
+ abort.abort();
380
+ const failures = registry.dispose();
381
+ for (const failure of failures) {
382
+ this.#logger.warn(`回收插件 ${name} 的 ${failure.label} 时出错`, failure.error);
383
+ }
384
+ this.#deps.services.removeByOwner(name);
385
+ this.#deps.events.removeByOwner(name);
386
+ this.#markFailed(name, reason, candidate);
387
+ this.#logger.error(`插件 ${name} 加载失败:${reason}`, err);
388
+ this.#deps.events.emitDetached("plugin/error", name, err);
389
+ return false;
390
+ }
391
+ }
392
+ /**
393
+ * 卸载单个插件(不加锁,供内部调用)
394
+ * @param name 插件名
395
+ * @returns 是否确实卸载了
396
+ */
397
+ async #unload(name) {
398
+ const record = this.#records.get(name);
399
+ if (!record)
400
+ return false;
401
+ this.#records.delete(name);
402
+ // 先 abort:插件里 `while (!ctx.signal.aborted)` 的循环、传了 signal 的 fetch
403
+ // 会立刻停下,避免它们在回收过程中还在往已拆掉的注册表里写
404
+ record.abort.abort();
405
+ const failures = record.registry.dispose();
406
+ for (const failure of failures) {
407
+ this.#logger.warn(`回收插件 ${name} 的 ${failure.label} 时出错`, failure.error);
408
+ }
409
+ // 兜底清扫:正常路径下二者均已由 registry 完整回收,
410
+ // 此处防的是"插件绕过 ctx 直接取注册表注册"的越界写法
411
+ const leakedServices = this.#deps.services.removeByOwner(name);
412
+ if (leakedServices.length > 0) {
413
+ this.#logger.warn(`插件 ${name} 有 ${leakedServices.length} 个服务未经 ctx 注册:${leakedServices.join("、")}`);
414
+ }
415
+ const leakedListeners = this.#deps.events.removeByOwner(name);
416
+ if (leakedListeners > 0) {
417
+ this.#logger.warn(`插件 ${name} 有 ${leakedListeners} 个事件监听未经 ctx 注册`);
418
+ }
419
+ // 配置声明必须解除,否则重载时 `define` 会以"已被声明"抛错
420
+ if (record.hasConfig)
421
+ this.#deps.config.remove(name);
422
+ this.#states.delete(name);
423
+ this.#logger.info(`插件 ${name} 已卸载`);
424
+ this.#deps.events.emitDetached("plugin/unloaded", name);
425
+ return true;
426
+ }
427
+ /**
428
+ * 声明插件配置
429
+ *
430
+ * 没声明 `configSchema` 的插件也要有一个可用的 `ctx.config`:
431
+ * 让它 `get()` 返回空对象,比让插件作者判空好 —— 配置是不是空取决于用户,
432
+ * 插件代码不该为此分叉。
433
+ * @param definition 插件定义
434
+ * @returns 配置句柄与"是否真的声明了"
435
+ */
436
+ async #defineConfig(definition) {
437
+ const schema = definition.configSchema;
438
+ if (!(schema instanceof Schema)) {
439
+ if (schema !== undefined) {
440
+ this.#logger.warn(`插件 ${definition.name} 的 configSchema 不是 s.object(...) 的产物,已忽略。` +
441
+ `请从 @yunzai-ng/core 导入 s 来构造`);
442
+ }
443
+ return { handle: emptyConfigHandle(), declared: false };
444
+ }
445
+ const handle = await this.#deps.config.define(definition.name, schema, {
446
+ title: definition.description ?? definition.name,
447
+ notes: [`插件 ${definition.name}${definition.version ? `@${definition.version}` : ""} 的配置`]
448
+ });
449
+ return { handle, declared: true };
450
+ }
451
+ /**
452
+ * 记录一个加载失败的插件
453
+ * @param name 插件名
454
+ * @param reason 失败原因
455
+ * @param candidate 候选(有则能填出目录与内置标记)
456
+ */
457
+ #markFailed(name, reason, candidate) {
458
+ this.#states.set(name, {
459
+ name,
460
+ version: versionOf(undefined, candidate),
461
+ root: candidate?.dir ?? "",
462
+ status: "error",
463
+ error: reason,
464
+ loadCost: 0,
465
+ commands: 0,
466
+ tasks: 0,
467
+ middlewares: 0,
468
+ builtin: candidate?.builtin ?? false,
469
+ configured: false
470
+ });
471
+ }
472
+ /**
473
+ * 组装成功加载后的状态快照
474
+ * @param definition 插件定义
475
+ * @param candidate 候选
476
+ * @param counters 计数
477
+ * @param loadCost 加载耗时
478
+ * @param configured 是否声明了配置 schema
479
+ * @returns 状态快照
480
+ */
481
+ #stateOf(definition, candidate, counters, loadCost, configured) {
482
+ const manifest = candidate.manifest;
483
+ const author = definition.author ?? (typeof manifest?.author === "string" ? manifest.author : manifest?.author?.name);
484
+ const state = {
485
+ name: definition.name,
486
+ version: versionOf(definition, candidate),
487
+ root: candidate.dir,
488
+ status: "loaded",
489
+ loadCost,
490
+ commands: counters.commands,
491
+ tasks: counters.tasks,
492
+ middlewares: counters.middlewares,
493
+ builtin: candidate.builtin,
494
+ configured
495
+ };
496
+ const description = definition.description ?? manifest?.description;
497
+ if (description !== undefined)
498
+ state.description = description;
499
+ if (author !== undefined)
500
+ state.author = author;
501
+ // 取不到主页时**不写这个字段**:面板据其有无决定要不要画「访问仓库」,
502
+ // 写一个空串会让按钮出现而点了没反应
503
+ const homepage = definition.homepage ?? (typeof manifest?.homepage === "string" ? manifest.homepage : undefined);
504
+ if (homepage !== undefined && homepage !== "")
505
+ state.homepage = homepage;
506
+ return state;
507
+ }
508
+ }
509
+ /**
510
+ * 构造一个"没有配置"的配置句柄
511
+ *
512
+ * 所有写操作都抛错并指明办法:静默成功会让插件作者以为配置存进去了。
513
+ * @returns 空配置句柄
514
+ */
515
+ function emptyConfigHandle() {
516
+ /** 统一拒绝写操作 */
517
+ const reject = () => Promise.reject(new Error("本插件没有声明 configSchema,无法写配置。请在 definePlugin 里加上 configSchema: s.object({...})"));
518
+ return {
519
+ file: "",
520
+ schema: { type: "object", properties: {} },
521
+ get: () => ({}),
522
+ patch: reject,
523
+ replace: reject,
524
+ reset: reject,
525
+ onChange: () => () => undefined
526
+ };
527
+ }
528
+ /**
529
+ * 组装 `AppView.plugins`
530
+ *
531
+ * 插件状态在宿主这里,命令与任务清单在路由器/调度器那里;视图把两边拼起来,
532
+ * 免得内核里到处传三个对象。
533
+ * @param host 插件宿主
534
+ * @param inspectors 命令与任务查询入口
535
+ * @returns 插件视图
536
+ */
537
+ export function createPluginsView(host, inspectors) {
538
+ return {
539
+ list: () => host.list(),
540
+ get: (name) => host.get(name),
541
+ commands: () => inspectors.commands(),
542
+ tasks: () => inspectors.tasks(),
543
+ middlewares: () => inspectors.middlewares()
544
+ };
545
+ }
546
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/plugin/host.ts"],"names":[],"mappings":"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"}