@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,573 @@
1
+ /**
2
+ * 模块职责:构造插件上下文(`ctx`)——"一切皆可为插件"的落地实现
3
+ * 依赖方向:依赖 plugin/{hooks,events,services}、util/*、类型包;**不依赖任何子系统实现**
4
+ * 生命周期:每个插件实例一个 ctx,随插件卸载整体失效
5
+ * 注意事项:三条硬规则 ——
6
+ *
7
+ * **零全局变量。** 全部能力须经 ctx 上的具名方法获取,故「某插件用了哪些能力」
8
+ * 可枚举,卸载时可确定性回收。
9
+ *
10
+ * **每个注册型方法都把 disposer 登记进 DisposalRegistry。** 插件作者无从遗漏清理 ——
11
+ * 否则改十次代码就有十份定时器同时在跑。
12
+ *
13
+ * **路径不做算术。** `ctx.resource()` 与模板根由内核依据插件根计算,`safeJoin` 拦
14
+ * `../` 越界;手工拼相对路径会在目录层级一变时给出空白页面。
15
+ */
16
+ import { join } from "node:path";
17
+ import { DisposalRegistry } from "../util/dispose.js";
18
+ import { parseDuration } from "../util/duration.js";
19
+ import { safeJoin } from "../util/fs.js";
20
+ import { LruCache } from "../util/lru.js";
21
+ /** 插件内的模板目录名 */
22
+ const TEMPLATE_DIR = "templates";
23
+ /** 插件内的静态资源目录名 */
24
+ const RESOURCE_DIR = "resources";
25
+ /** 渲染输出格式对应的 MIME */
26
+ const IMAGE_MIME = {
27
+ jpeg: "image/jpeg",
28
+ png: "image/png",
29
+ webp: "image/webp"
30
+ };
31
+ /**
32
+ * 链式命令构造器
33
+ *
34
+ * 每一环都在改同一份 `CommandRegistration`,路由器持有该对象引用,
35
+ * 因此 `.desc()` / `.master()` 这类不影响索引键的改动无需通知路由器;
36
+ * 只有 `.alias()` 改了索引键才调 `reindex`。
37
+ */
38
+ class ChainedCommand {
39
+ /** 登记内容 */
40
+ #reg;
41
+ /** 命令路由 */
42
+ #sink;
43
+ /** 注销句柄(已登记进 registry) */
44
+ #undo;
45
+ /** 日志器,用于提示可疑用法 */
46
+ #logger;
47
+ /**
48
+ * @param reg 登记内容
49
+ * @param sink 命令路由
50
+ * @param undo 注销句柄
51
+ * @param logger 日志器
52
+ */
53
+ constructor(reg, sink, undo, logger) {
54
+ this.#reg = reg;
55
+ this.#sink = sink;
56
+ this.#undo = undo;
57
+ this.#logger = logger;
58
+ }
59
+ /**
60
+ * 绑定处理函数
61
+ * @param fn 处理函数
62
+ * @returns 自身
63
+ */
64
+ action(fn) {
65
+ if (this.#reg.handler) {
66
+ // 覆盖 action 几乎总是复制粘贴的产物:静默覆盖会让人以为前一个还在生效
67
+ this.#logger.warn(`命令 ${describePatterns(this.#reg.patterns)} 的 action 被重复设置,后者生效`);
68
+ }
69
+ this.#reg.handler = fn;
70
+ return this;
71
+ }
72
+ /**
73
+ * 追加别名
74
+ * @param patterns 别名模式
75
+ * @returns 自身
76
+ */
77
+ alias(...patterns) {
78
+ if (patterns.length === 0)
79
+ return this;
80
+ this.#reg.patterns.push(...patterns);
81
+ this.#sink.reindex(this.#reg);
82
+ return this;
83
+ }
84
+ /**
85
+ * 设置说明
86
+ * @param text 说明文案
87
+ * @returns 自身
88
+ */
89
+ desc(text) {
90
+ this.#reg.options.desc = text;
91
+ return this;
92
+ }
93
+ /**
94
+ * 限定场景
95
+ * @param scenes 允许的场景
96
+ * @returns 自身
97
+ */
98
+ scene(...scenes) {
99
+ this.#reg.options.scene = scenes;
100
+ return this;
101
+ }
102
+ /**
103
+ * 限定仅主人可用
104
+ * @returns 自身
105
+ */
106
+ master() {
107
+ this.#reg.options.master = true;
108
+ return this;
109
+ }
110
+ /**
111
+ * 限定仅群管可用
112
+ * @returns 自身
113
+ */
114
+ admin() {
115
+ this.#reg.options.admin = true;
116
+ return this;
117
+ }
118
+ /**
119
+ * 设置冷却
120
+ * @param spec 冷却时长
121
+ * @param scope 作用域
122
+ * @returns 自身
123
+ */
124
+ cooldown(spec, scope) {
125
+ this.#reg.options.cooldown = spec;
126
+ if (scope)
127
+ this.#reg.options.cooldownScope = scope;
128
+ return this;
129
+ }
130
+ /**
131
+ * 设置优先级
132
+ * @param value 数值,小者优先
133
+ * @returns 自身
134
+ */
135
+ priority(value) {
136
+ this.#reg.options.priority = value;
137
+ return this;
138
+ }
139
+ /** 注销该命令 */
140
+ dispose() {
141
+ this.#undo();
142
+ }
143
+ }
144
+ /**
145
+ * 把模式数组渲染成可读文本
146
+ * @param patterns 模式数组
147
+ * @returns 可读字符串
148
+ */
149
+ export function describePatterns(patterns) {
150
+ return patterns.map(p => (typeof p === "string" ? p : p.source)).join(" | ");
151
+ }
152
+ /**
153
+ * 把两条渲染通路的实参归一为一次调用描述
154
+ *
155
+ * `render()` 有两种形态:`render(page, opts)` 与 `render(template, data, opts)`。
156
+ * 以第一参是否为字符串判别 —— `RenderablePage` 是对象,二者不可能混淆。
157
+ * 判别只做这一处,两个调用点(`ctx.render` 与 `e.render`)共用同一份语义。
158
+ * @param first 页面或模板相对路径
159
+ * @param second 模板数据(字符串通路)或渲染选项(TSX 通路)
160
+ * @param third 渲染选项(字符串通路)
161
+ * @returns 归一化后的调用描述
162
+ */
163
+ export function splitRenderArgs(first, second, third) {
164
+ if (typeof first === "string") {
165
+ return { template: first, data: second ?? {}, opts: third ?? {} };
166
+ }
167
+ return { template: first.name, data: {}, html: first.html, opts: second ?? {} };
168
+ }
169
+ /**
170
+ * 插件上下文实现
171
+ *
172
+ * 每个成员都对应 `PluginContext` 的一项能力;除 `resource()` 这类纯计算外,
173
+ * 所有注册都经过 `#own()` 登记回收。
174
+ */
175
+ class Context {
176
+ /** 依赖 */
177
+ #deps;
178
+ /** 计数 */
179
+ #counters;
180
+ /** 已打开的 SQL 库,按库名缓存(含进行中的打开操作) */
181
+ #sqlCache = new Map();
182
+ /** URL 作用域,如 `/plugin/mhy-game` */
183
+ #scope;
184
+ /** 插件名 */
185
+ name;
186
+ /** 插件版本 */
187
+ version;
188
+ /** 插件安装目录 */
189
+ root;
190
+ /** 插件数据目录 */
191
+ dataDir;
192
+ /** 插件日志器 */
193
+ logger;
194
+ /** 插件 KV 命名空间 */
195
+ kv;
196
+ /** 插件配置句柄 */
197
+ config;
198
+ /** 应用只读视图 */
199
+ app;
200
+ /** HTTP 客户端 */
201
+ http;
202
+ /** 卸载信号 */
203
+ signal;
204
+ /**
205
+ * @param deps 依赖
206
+ * @param counters 计数对象(与宿主共享同一引用)
207
+ */
208
+ constructor(deps, counters) {
209
+ this.#deps = deps;
210
+ this.#counters = counters;
211
+ this.#scope = `/plugin/${deps.name}`;
212
+ this.name = deps.name;
213
+ this.version = deps.version;
214
+ this.root = deps.root;
215
+ this.dataDir = deps.dataDir;
216
+ this.logger = deps.logger;
217
+ this.kv = deps.kv;
218
+ this.config = deps.config;
219
+ this.app = deps.app;
220
+ this.http = deps.http;
221
+ this.signal = deps.signal;
222
+ }
223
+ /**
224
+ * 声明一条命令
225
+ * @param pattern 触发模式
226
+ * @param opts 命令选项
227
+ * @returns 链式构造器
228
+ */
229
+ command(pattern, opts = {}) {
230
+ const patterns = [pattern];
231
+ if (opts.alias)
232
+ patterns.push(...(Array.isArray(opts.alias) ? opts.alias : [opts.alias]));
233
+ // options 拷一份:插件可能复用同一个 options 字面量声明多条命令,
234
+ // 而链式方法会就地改它
235
+ const reg = {
236
+ plugin: this.name,
237
+ patterns,
238
+ options: { ...opts },
239
+ handler: undefined
240
+ };
241
+ const undo = this.#deps.hooks.commands.register(reg);
242
+ this.#counters.commands++;
243
+ const disposer = this.#own(() => {
244
+ this.#counters.commands--;
245
+ undo();
246
+ }, `command:${describePatterns(patterns)}`);
247
+ return new ChainedCommand(reg, this.#deps.hooks.commands, disposer, this.logger);
248
+ }
249
+ /**
250
+ * 注册中间件
251
+ * @param fn 中间件函数
252
+ * @param opts 注册选项
253
+ * @returns 注销句柄
254
+ */
255
+ middleware(fn, opts = {}) {
256
+ const undo = this.#deps.hooks.middlewares.register({ plugin: this.name, fn, options: opts });
257
+ this.#counters.middlewares++;
258
+ return this.#own(() => {
259
+ this.#counters.middlewares--;
260
+ undo();
261
+ }, "middleware");
262
+ }
263
+ /**
264
+ * 监听内核事件
265
+ * @param event 事件名
266
+ * @param handler 处理函数
267
+ * @returns 注销句柄
268
+ */
269
+ on(event, handler) {
270
+ return this.#own(this.#deps.events.on(event, handler, this.name), `on:${String(event)}`);
271
+ }
272
+ /**
273
+ * 注册 cron 定时任务
274
+ * @param expression cron 表达式
275
+ * @param fn 任务体
276
+ * @param opts 任务选项
277
+ * @returns 注销句柄
278
+ */
279
+ cron(expression, fn, opts = {}) {
280
+ return this.#task("cron", expression, fn, opts);
281
+ }
282
+ /**
283
+ * 注册固定间隔任务
284
+ * @param interval 间隔
285
+ * @param fn 任务体
286
+ * @param opts 任务选项
287
+ * @returns 注销句柄
288
+ * @throws 间隔小于 1 秒时(几乎总是写错了单位)
289
+ */
290
+ every(interval, fn, opts = {}) {
291
+ const ms = parseDuration(interval, 0);
292
+ if (ms < 1000) {
293
+ throw new Error(`插件 ${this.name} 的间隔任务周期 ${ms}ms 过短:最小 1s,请确认单位是否写错`);
294
+ }
295
+ return this.#task("interval", ms, fn, opts);
296
+ }
297
+ /**
298
+ * 对外提供服务
299
+ * @param key 服务键
300
+ * @param value 服务实例
301
+ * @returns 注销句柄
302
+ * @throws 键名非法或已被占用时
303
+ */
304
+ provide(key, value) {
305
+ const undo = this.#deps.services.provide(key, value, this.name);
306
+ this.#counters.services++;
307
+ return this.#own(() => {
308
+ this.#counters.services--;
309
+ undo();
310
+ }, `provide:${key}`);
311
+ }
312
+ /**
313
+ * 取用其他插件提供的服务
314
+ * @param key 服务键
315
+ * @returns 服务实例;未提供时 undefined
316
+ */
317
+ inject(key) {
318
+ return this.#deps.services.get(key);
319
+ }
320
+ /**
321
+ * 取用服务,缺失即抛错
322
+ * @param key 服务键
323
+ * @returns 服务实例
324
+ * @throws 服务未注册时
325
+ */
326
+ require(key) {
327
+ return this.#deps.services.require(key, this.name);
328
+ }
329
+ /**
330
+ * 等待某服务就绪
331
+ *
332
+ * 插件被卸载时立刻以 undefined 结束等待:否则一个等不到的服务会把
333
+ * 已卸载插件的闭包一直挂在内存里。
334
+ * @param key 服务键
335
+ * @param timeout 等待超时,缺省 30s
336
+ * @returns 服务实例;超时或插件已卸载时 undefined
337
+ */
338
+ async waitFor(key, timeout) {
339
+ if (this.signal.aborted)
340
+ return undefined;
341
+ const ready = this.#deps.services.get(key);
342
+ if (ready !== undefined)
343
+ return ready;
344
+ return new Promise(resolve => {
345
+ let settled = false;
346
+ /** 只兑现一次 */
347
+ const finish = (value) => {
348
+ if (settled)
349
+ return;
350
+ settled = true;
351
+ this.signal.removeEventListener("abort", onAbort);
352
+ resolve(value);
353
+ };
354
+ /** 卸载时放弃等待 */
355
+ function onAbort() {
356
+ finish(undefined);
357
+ }
358
+ this.signal.addEventListener("abort", onAbort, { once: true });
359
+ void this.#deps.services.waitFor(key, timeout).then(finish, () => finish(undefined));
360
+ });
361
+ }
362
+ /**
363
+ * 注册 HTTP 路由
364
+ * @param method HTTP 方法
365
+ * @param path 路径
366
+ * @param handler 处理函数
367
+ * @param opts 选项
368
+ * @returns 注销句柄
369
+ * @throws 服务器未启用时
370
+ */
371
+ route(method, path, handler, opts) {
372
+ const undo = this.#deps.hooks.server.route(this.#scope, method, path, handler, opts);
373
+ this.#counters.routes++;
374
+ return this.#own(() => {
375
+ this.#counters.routes--;
376
+ undo();
377
+ }, `route:${method} ${path}`);
378
+ }
379
+ /**
380
+ * 注册 WebSocket 路径
381
+ * @param path 路径
382
+ * @param handler 连接处理函数
383
+ * @param opts 选项
384
+ * @returns 注销句柄
385
+ * @throws 服务器未启用时
386
+ */
387
+ websocket(path, handler, opts) {
388
+ const undo = this.#deps.hooks.server.websocket(this.#scope, path, handler, opts);
389
+ this.#counters.routes++;
390
+ return this.#own(() => {
391
+ this.#counters.routes--;
392
+ undo();
393
+ }, `ws:${path}`);
394
+ }
395
+ /**
396
+ * 挂载静态目录
397
+ * @param urlPath URL 前缀
398
+ * @param dir 本地目录绝对路径
399
+ * @returns 注销句柄
400
+ * @throws 服务器未启用时
401
+ */
402
+ static(urlPath, dir) {
403
+ return this.#own(this.#deps.hooks.server.static(this.#scope, urlPath, dir), `static:${urlPath}`);
404
+ }
405
+ /**
406
+ * 接管站点根路径,替换内置面板
407
+ *
408
+ * 不经过 `this.#scope`:接管面板的意义就在于占据 `/`,挂在
409
+ * `/plugin/<插件名>` 之下的页面无法成为默认入口。归属标识写成
410
+ * `plugin:<插件名>`,`claimant("/")` 因此能回答"面板由谁提供"。
411
+ * 根路径已被占用时抛错,不静默覆盖 —— 见 types 里的说明。
412
+ * @param dir 单页应用产物目录(绝对路径)
413
+ * @returns 注销句柄
414
+ * @throws 服务器未启用、或根路径已被占用时
415
+ */
416
+ panel(dir) {
417
+ const undo = this.#deps.hooks.server.panel(`plugin:${this.name}`, dir);
418
+ this.#deps.logger.info(`已接管面板根路径:${dir}`);
419
+ return this.#own(undo, "panel:/");
420
+ }
421
+ /**
422
+ * 注册适配器
423
+ * @param provider 适配器实现
424
+ * @returns 注销句柄
425
+ */
426
+ registerAdapter(provider) {
427
+ return this.#own(this.#deps.hooks.adapters.register(provider, this.name), `adapter:${provider.id}`);
428
+ }
429
+ /**
430
+ * 注册渲染器
431
+ * @param provider 渲染器实现
432
+ * @returns 注销句柄
433
+ */
434
+ registerRenderer(provider) {
435
+ return this.#own(this.#deps.hooks.render.register(provider, this.name), `renderer:${provider.id}`);
436
+ }
437
+ /**
438
+ * 注册 KV 驱动
439
+ * @param driver 驱动实现
440
+ * @returns 注销句柄
441
+ */
442
+ registerKvDriver(driver) {
443
+ return this.#own(this.#deps.hooks.kvDrivers.register(driver, this.name), `kv-driver:${driver.id}`);
444
+ }
445
+ /**
446
+ * 渲染实现
447
+ * @param first 页面或模板相对路径
448
+ * @param second 模板数据(字符串通路)或渲染选项(TSX 通路)
449
+ * @param third 渲染选项(字符串通路)
450
+ * @returns 图片段;分页时为数组
451
+ * @throws 无可用渲染器、渲染失败或渲染器返回空结果时
452
+ */
453
+ async render(first, second, third) {
454
+ const call = splitRenderArgs(first, second, third);
455
+ const result = await this.#deps.hooks.render.render({
456
+ ...call.opts,
457
+ ...(call.html !== undefined ? { html: call.html } : {}),
458
+ template: call.template,
459
+ data: call.data,
460
+ templateRoot: join(this.root, TEMPLATE_DIR),
461
+ resourceRoot: join(this.root, RESOURCE_DIR),
462
+ origin: this.name
463
+ });
464
+ if (result.images.length === 0) {
465
+ throw new Error(`渲染器 ${result.renderer} 处理模板 ${call.template} 后没有产出图片`);
466
+ }
467
+ const type = call.opts.type ?? "jpeg";
468
+ const mime = IMAGE_MIME[type] ?? "image/jpeg";
469
+ const segments = result.images.map((bytes, index) => ({
470
+ type: "image",
471
+ // buffer 直传:渲染器刚出的图就在内存里,转 base64 只是白占一倍内存
472
+ file: { kind: "buffer", data: bytes, name: `${this.name}-${index}.${type}`, mime }
473
+ }));
474
+ return segments.length === 1 ? segments[0] : segments;
475
+ }
476
+ /**
477
+ * 打开本插件专属的 SQLite 库
478
+ *
479
+ * 同名库只打开一次:插件在多处 `await ctx.sql()` 拿到的是同一个连接,
480
+ * 否则 WAL 下多连接互相等锁,症状是"偶发变慢",极难定位。
481
+ * @param name 库名,缺省 `"main"`
482
+ * @returns SQL 句柄
483
+ * @throws better-sqlite3 不可用时
484
+ */
485
+ async sql(name = "main") {
486
+ const cached = this.#sqlCache.get(name);
487
+ if (cached)
488
+ return cached;
489
+ const opening = this.#deps.hooks.sql.open(this.name, name);
490
+ this.#sqlCache.set(name, opening);
491
+ // 打开失败不留下坏缓存,否则重试永远拿到同一个已拒绝的 promise
492
+ opening.catch(() => this.#sqlCache.delete(name));
493
+ if (this.#sqlCache.size === 1) {
494
+ this.#own(() => void this.#deps.hooks.sql.close(this.name), "sql:close");
495
+ }
496
+ return opening;
497
+ }
498
+ /**
499
+ * 创建 LRU + TTL 缓存
500
+ * @param opts 缓存参数
501
+ * @returns 缓存实例,随插件卸载自动清空
502
+ */
503
+ cache(opts) {
504
+ const cache = new LruCache(opts);
505
+ this.#own(() => cache.clear(), "cache");
506
+ return cache;
507
+ }
508
+ /**
509
+ * 拼出插件内资源的绝对路径
510
+ *
511
+ * 走 `safeJoin`:插件传入 `"../../../etc/passwd"` 会被拒绝。参数很可能来自
512
+ * 用户消息(如"看某个模板"),不挡住就是任意文件读。
513
+ * @param parts 相对插件根的路径片段
514
+ * @returns 绝对路径
515
+ * @throws 结果越出插件根目录时
516
+ */
517
+ resource(...parts) {
518
+ return safeJoin(this.root, join(...parts));
519
+ }
520
+ /**
521
+ * 注册清理回调
522
+ * @param fn 清理函数
523
+ */
524
+ onDispose(fn) {
525
+ this.#deps.registry.add(fn, "onDispose");
526
+ }
527
+ /**
528
+ * 选一个可用账号
529
+ * @param bot 账号记录 id 或平台 selfId
530
+ * @returns Bot;无可用账号时 undefined
531
+ */
532
+ pickBot(bot) {
533
+ return this.#deps.hooks.bots.pick(bot);
534
+ }
535
+ /**
536
+ * 登记定时任务
537
+ * @param kind 任务类型
538
+ * @param schedule cron 表达式或间隔毫秒
539
+ * @param fn 任务体
540
+ * @param opts 任务选项
541
+ * @returns 注销句柄
542
+ */
543
+ #task(kind, schedule, fn, opts) {
544
+ const undo = this.#deps.hooks.tasks.register({ plugin: this.name, kind, schedule, fn, options: opts });
545
+ this.#counters.tasks++;
546
+ return this.#own(() => {
547
+ this.#counters.tasks--;
548
+ undo();
549
+ }, `task:${opts.name ?? schedule}`);
550
+ }
551
+ /**
552
+ * 把一个 disposer 登记进本插件的回收簿
553
+ *
554
+ * 插件卸载后仍然发生的注册(异步 setup 慢一步)会被立即回收 ——
555
+ * 这是 `DisposalRegistry.add` 的既有行为,此处依赖它。
556
+ * @param fn 回收函数
557
+ * @param label 标签
558
+ * @returns 提前回收的句柄
559
+ */
560
+ #own(fn, label) {
561
+ return this.#deps.registry.add(fn, label);
562
+ }
563
+ }
564
+ /**
565
+ * 构造插件上下文
566
+ * @param deps 依赖
567
+ * @returns 上下文与计数对象
568
+ */
569
+ export function createPluginContext(deps) {
570
+ const counters = { commands: 0, middlewares: 0, tasks: 0, routes: 0, services: 0 };
571
+ return { ctx: new Context(deps, counters), counters };
572
+ }
573
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/plugin/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 模块职责:`definePlugin()` —— 插件的声明入口与配置类型推导
3
+ * 依赖方向:依赖 config/schema、类型包
4
+ * 生命周期:模块加载期执行一次(纯校验,无副作用)
5
+ * 注意事项:两个设计要点 ——
6
+ *
7
+ * 1) **配置类型自动推导**。`configSchema: s.object({ cookie: s.string() })`
8
+ * 之后,`ctx.config.get().cookie` 就是 `string`,写错字段名编译期报错。
9
+ * 类型包为保持叶子(不许依赖任何工作区包)故把 `configSchema` 声明为
10
+ * `unknown`,推导只能在这里做 —— 这也是插件必须从 `@yunzai-ng/core`
11
+ * 导入 `definePlugin` 而不是自己拼对象的原因。
12
+ *
13
+ * 2) **在声明期就校验元信息**。插件名会被当作配置文件名、KV 命名空间、
14
+ * URL 前缀和日志 scope 使用,非法名字必须在 `import` 的那一刻就报错,
15
+ * 而不是等到写文件时抛一个看不出所以然的 ENOENT。
16
+ */
17
+ import type { Awaitable, Disposer, PluginContext, PluginDefinition, PluginMeta } from "@yunzai-ng/types";
18
+ import type { Schema } from "../config/schema.js";
19
+ /** 标记"这是 definePlugin 的产物",用于加载时校验默认导出 */
20
+ declare const BRAND: unique symbol;
21
+ /**
22
+ * 从 schema 推出配置类型
23
+ *
24
+ * 未声明 schema 时给出 `Record<string, never>`:`ctx.config.get()` 仍可调用,
25
+ * 但读取任何字段均会在编译期报错,以提示作者"尚未声明配置"。
26
+ */
27
+ export type ConfigOf<S> = S extends Schema<infer T> ? T : Record<string, never>;
28
+ /** `definePlugin` 的入参 */
29
+ export interface DefinePluginInput<S extends Schema<unknown> | undefined = undefined> extends PluginMeta {
30
+ /**
31
+ * 配置 schema
32
+ *
33
+ * 用 `s.object({...})` 构造。内核据此生成带中文注释的 YAML、
34
+ * 渲染 WebUI 表单、校验用户输入 —— 三处共用一份声明,永不脱节。
35
+ */
36
+ configSchema?: S;
37
+ /**
38
+ * 插件入口
39
+ *
40
+ * 在这里注册命令、中间件、定时任务等。**不要**在这里做耗时的网络请求:
41
+ * 内核对 setup 有超时(默认 30s),超时会把插件标记为加载失败。
42
+ * 需要预热的资源请注册 `ctx.on("app/ready", ...)` 或用 `ctx.cron`。
43
+ * @param ctx 注入的上下文
44
+ * @returns 可选的清理函数,等价于在里面调 `ctx.onDispose`
45
+ */
46
+ setup(ctx: PluginContext<ConfigOf<S>>): Awaitable<void | Disposer>;
47
+ }
48
+ /** 带品牌标记的插件定义(内核内部使用) */
49
+ export interface BrandedPluginDefinition<C = unknown> extends PluginDefinition<C> {
50
+ /** 品牌标记 */
51
+ readonly [BRAND]: true;
52
+ }
53
+ /**
54
+ * 声明一个插件
55
+ *
56
+ * @param input 插件定义
57
+ * @returns 供内核加载的插件定义(已冻结)
58
+ * @throws 插件名缺失/非法、`setup` 不是函数、依赖项写法错误时
59
+ * @example
60
+ * ```ts
61
+ * export default definePlugin({
62
+ * name: "mhy-game",
63
+ * configSchema: s.object({ cookie: s.string().default("") }),
64
+ * setup(ctx) {
65
+ * ctx.command("#体力").desc("查询实时便笺").action(async e => {
66
+ * await e.reply(ctx.config.get().cookie ? "查询中" : "请先配置 cookie")
67
+ * })
68
+ * }
69
+ * })
70
+ * ```
71
+ */
72
+ export declare function definePlugin<S extends Schema<unknown> | undefined = undefined>(input: DefinePluginInput<S>): PluginDefinition<ConfigOf<S>>;
73
+ /**
74
+ * 判断一个值是否 `definePlugin` 的产物
75
+ *
76
+ * 加载器用它区分"插件写错了默认导出"和"插件确实是插件",
77
+ * 从而给出"请用 definePlugin 包一层"这种能直接照做的提示。
78
+ * @param value 待判定值
79
+ * @returns 是否为插件定义
80
+ */
81
+ export declare function isPluginDefinition(value: unknown): value is BrandedPluginDefinition;
82
+ /**
83
+ * 宽松判定:像插件定义但可能没走 `definePlugin`
84
+ *
85
+ * 允许手写对象(如测试里的假插件、compat 插件动态生成的定义),
86
+ * 只要有 name 与 setup 就接受,但加载器会记一条 debug 提示。
87
+ * @param value 待判定值
88
+ * @returns 是否可当作插件定义使用
89
+ */
90
+ export declare function looksLikePlugin(value: unknown): value is PluginDefinition;
91
+ export {};
92
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/plugin/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAWjD,0CAA0C;AAC1C,QAAA,MAAM,KAAK,eAAiC,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAE/E,yBAAyB;AACzB,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,CAAE,SAAQ,UAAU;IACtG;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,CAAA;IAEhB;;;;;;;;OAQG;IACH,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAA;CACnE;AAED,yBAAyB;AACzB,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IAC/E,WAAW;IACX,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC5E,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC1B,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CA2B/B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAEnF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAIzE"}