@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,36 @@
1
+ import type { Logger } from "@yunzai-ng/types";
2
+ import { type SqlSink } from "../plugin/hooks.js";
3
+ /** 创建 SQL 接缝的参数 */
4
+ export interface SqlSinkOptions {
5
+ /** 存放 `.db` 文件的根目录(绝对路径) */
6
+ dir: string;
7
+ /** 日志器 */
8
+ logger: Logger;
9
+ /** 是否启用(对应配置 `store.sqlite`) */
10
+ enabled: boolean;
11
+ }
12
+ /** 带生命周期管理的 SQL 接缝 */
13
+ export interface ManagedSqlSink extends SqlSink {
14
+ /** 当前打开的库数量 */
15
+ readonly size: number;
16
+ /**
17
+ * 列出已打开的库
18
+ * @returns 形如 `["mhy-game/gacha"]` 的键数组,按字典序
19
+ */
20
+ list(): string[];
21
+ /**
22
+ * 关闭全部库
23
+ * @returns 全部关闭后兑现
24
+ */
25
+ closeAll(): Promise<void>;
26
+ }
27
+ /**
28
+ * 创建 SQL 接缝
29
+ *
30
+ * 未启用或原生模块缺失时并不在此处报错,而是等到插件确实调用 `open()`:
31
+ * 多数插件完全不使用 SQL,为其在启动期抛错等于将"可选依赖"变为必选。
32
+ * @param opts 参数
33
+ * @returns SQL 接缝
34
+ */
35
+ export declare function createSqlSink(opts: SqlSinkOptions): ManagedSqlSink;
36
+ //# sourceMappingURL=sql-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-sink.d.ts","sourceRoot":"","sources":["../../src/kernel/sql-sink.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAM5E,mBAAmB;AACnB,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,UAAU;IACV,MAAM,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,eAAe;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,IAAI,IAAI,MAAM,EAAE,CAAA;IAEhB;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAcD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAmFlE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * 模块职责:把 `store/sql.ts` 的 SQLite 能力接到插件上下文的 `SqlSink` 接缝上
3
+ * 依赖方向:依赖 store/sql、plugin/hooks、类型包;不依赖任何插件
4
+ * 生命周期:应用级单例,`closeAll()` 时关闭全部连接
5
+ * 注意事项:连接的**归属**在这里确定 —— 每个插件的库落在 `<data>/sql/<插件名>/<库名>.db`,
6
+ * 插件卸载时由上下文调用 `close(插件名)` 一次性关掉它开过的所有库。
7
+ * `SqlHandle` 上刻意没有 `close()`:句柄会被插件在模块间传递,
8
+ * 谁都能关就意味着谁都可能在别人还在用时关掉。
9
+ *
10
+ * `open()` 缓存的是**Promise 而不是结果**。两个模块在同一 tick 里
11
+ * `await ctx.sql("gacha")` 是常见写法,缓存结果的话两次都会 miss,
12
+ * 于是同一个文件被打开两次 —— SQLite 允许,但两个连接各有一套
13
+ * 语句缓存和 WAL 视图,写入会互相 SQLITE_BUSY。
14
+ */
15
+ import { join } from "node:path";
16
+ import { SubsystemUnavailableError } from "../plugin/hooks.js";
17
+ import { openSql } from "../store/sql.js";
18
+ /** 库名与插件名的合法形式:不含路径分隔符,避免写到目录外面去 */
19
+ const SAFE_NAME = /^[a-z0-9][a-z0-9._-]*$/i;
20
+ /**
21
+ * 校验一段名字能不能安全地当目录/文件名用
22
+ * @param kind 名字用途,用于报错
23
+ * @param value 待校验的名字
24
+ * @throws 名字非法时
25
+ */
26
+ function assertSafe(kind, value) {
27
+ if (!SAFE_NAME.test(value)) {
28
+ throw new Error(`${kind} ${JSON.stringify(value)} 不合法:需以字母或数字开头,只含字母数字与 . - _`);
29
+ }
30
+ }
31
+ /**
32
+ * 创建 SQL 接缝
33
+ *
34
+ * 未启用或原生模块缺失时并不在此处报错,而是等到插件确实调用 `open()`:
35
+ * 多数插件完全不使用 SQL,为其在启动期抛错等于将"可选依赖"变为必选。
36
+ * @param opts 参数
37
+ * @returns SQL 接缝
38
+ */
39
+ export function createSqlSink(opts) {
40
+ const logger = opts.logger.child({ scope: "sql" });
41
+ /** `插件名/库名` → 打开中或已打开的库 */
42
+ const opened = new Map();
43
+ /**
44
+ * 关闭一个库并从表中摘除
45
+ * @param key 缓存键
46
+ * @param pending 打开中或已打开的库
47
+ */
48
+ const shut = async (key, pending) => {
49
+ opened.delete(key);
50
+ try {
51
+ // 必须 await:若对正在打开的库直接丢弃引用,连接会在无人持有的情况下
52
+ // 泄漏于事件循环中,导致进程无法退出
53
+ const store = await pending;
54
+ store.close();
55
+ }
56
+ catch (err) {
57
+ // 对打开阶段即已失败的库,此处再次抛出并无意义
58
+ logger.debug(`关闭 ${key} 时出错(打开阶段可能就已失败)`, err);
59
+ }
60
+ };
61
+ return {
62
+ get size() {
63
+ return opened.size;
64
+ },
65
+ list() {
66
+ return [...opened.keys()].sort();
67
+ },
68
+ async open(plugin, name) {
69
+ assertSafe("插件名", plugin);
70
+ assertSafe("库名", name);
71
+ if (!opts.enabled) {
72
+ throw new SubsystemUnavailableError("SQL", "配置项 store.sqlite 为 false,在 WebUI 里开启后重启即可");
73
+ }
74
+ const key = `${plugin}/${name}`;
75
+ const cached = opened.get(key);
76
+ if (cached)
77
+ return (await cached).handle;
78
+ const pending = (async () => {
79
+ const file = join(opts.dir, plugin, `${name}.db`);
80
+ const store = await openSql({ file });
81
+ if (!store) {
82
+ throw new SubsystemUnavailableError("SQL", "可选依赖 better-sqlite3 不可用(Termux 等环境常编译失败)。" +
83
+ "执行 pnpm rebuild better-sqlite3 重装,或让插件降级用 ctx.kv");
84
+ }
85
+ logger.debug(`已打开 ${key} → ${store.file}`);
86
+ return store;
87
+ })();
88
+ opened.set(key, pending);
89
+ try {
90
+ return (await pending).handle;
91
+ }
92
+ catch (err) {
93
+ // 失败的 Promise 不留在表里:磁盘满、权限不对这类问题修好之后
94
+ // 插件重载应该能重新打开,而不是一直拿到同一个陈旧的 rejection
95
+ opened.delete(key);
96
+ throw err;
97
+ }
98
+ },
99
+ async close(plugin) {
100
+ const prefix = `${plugin}/`;
101
+ const jobs = [];
102
+ for (const [key, pending] of opened) {
103
+ if (key.startsWith(prefix))
104
+ jobs.push(shut(key, pending));
105
+ }
106
+ await Promise.all(jobs);
107
+ },
108
+ async closeAll() {
109
+ const jobs = [...opened].map(([key, pending]) => shut(key, pending));
110
+ await Promise.all(jobs);
111
+ }
112
+ };
113
+ }
114
+ //# sourceMappingURL=sql-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-sink.js","sourceRoot":"","sources":["../../src/kernel/sql-sink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { LogLevel } from "@yunzai-ng/types";
2
+ /** 级别名 → pino 数字级别 */
3
+ export declare const LEVEL_VALUES: Record<Exclude<LogLevel, "silent">, number>;
4
+ /**
5
+ * 判断当前是否应输出颜色
6
+ * @returns 是否启用颜色
7
+ */
8
+ export declare function supportsColor(): boolean;
9
+ /**
10
+ * 给文本加 ANSI 颜色
11
+ * @param code 颜色码,如 `"32"`
12
+ * @param text 文本
13
+ * @param enabled 是否启用;false 时原样返回
14
+ * @returns 带颜色的文本
15
+ */
16
+ export declare function paint(code: string, text: string, enabled: boolean): string;
17
+ /** 解析后的日志记录 */
18
+ export interface LogRecord {
19
+ /** 级别名 */
20
+ level: LogLevel;
21
+ /** 毫秒时间戳 */
22
+ time: number;
23
+ /** 主消息 */
24
+ msg: string;
25
+ /** 作用域(插件名 / 适配器名 / 账号 id) */
26
+ scope?: string;
27
+ /** 错误堆栈 */
28
+ stack?: string;
29
+ /** 其余业务字段 */
30
+ fields?: Record<string, unknown>;
31
+ }
32
+ /**
33
+ * 解析 pino 输出的一行 JSON
34
+ * @param line 日志行(含尾部换行)
35
+ * @returns 解析结果;不是合法 JSON 时 undefined
36
+ */
37
+ export declare function parseRecord(line: string): LogRecord | undefined;
38
+ /** 控制台格式化选项 */
39
+ export interface FormatOptions {
40
+ /** 是否着色 */
41
+ color: boolean;
42
+ /** 作用域列的对齐宽度,缺省 14;设 0 不对齐 */
43
+ scopeWidth?: number;
44
+ /** 是否打印错误堆栈,缺省 true */
45
+ stack?: boolean;
46
+ }
47
+ /**
48
+ * 把日志记录格式化为一行(或多行,含堆栈)控制台文本
49
+ * @param rec 日志记录
50
+ * @param opts 格式化选项
51
+ * @returns 带尾部换行的文本
52
+ */
53
+ export declare function formatRecord(rec: LogRecord, opts: FormatOptions): string;
54
+ /**
55
+ * 将任意日志参数拼接为消息文本
56
+ *
57
+ * 不直接交由 pino 处理:pino 仅将第一个参数视为消息,其余参数仅在第一个参数含
58
+ * `%s`/`%d` 占位符时才被消费,否则**静默丢弃**。而 `logger.info("查询", uid, data)`
59
+ * 这类 console.log 写法很常见,故此处统一按 console.log 语义拼接。
60
+ * @param args 日志参数
61
+ * @returns 拼接后的消息与提取出的错误
62
+ */
63
+ export declare function joinArgs(args: readonly unknown[]): {
64
+ msg: string;
65
+ err?: Error;
66
+ };
67
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/logger/format.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAahD,sBAAsB;AACtB,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAOpE,CAAA;AA2BD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAIvC;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE1E;AAED,eAAe;AACf,MAAM,WAAW,SAAS;IACxB,UAAU;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,YAAY;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU;IACV,GAAG,EAAE,MAAM,CAAA;IACX,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CA2B/D;AAgBD,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,KAAK,EAAE,OAAO,CAAA;IACd,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CA+BxE;AAyBD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CA+B/E"}
@@ -0,0 +1,218 @@
1
+ /**
2
+ * 模块职责:日志行的解析与彩色格式化
3
+ * 依赖方向:依赖 util/text
4
+ * 生命周期:纯函数
5
+ * 注意事项:自行实现而不使用 `pino-pretty`,理由与 rotate.ts 相同:pino-pretty 作为
6
+ * transport 运行于 worker 线程,单文件打包后无法定位入口;作为同步
7
+ * prettifier 又会引入一系列依赖。此处以 150 行完成,且可按需对齐中日韩
8
+ * 全角字符(`visualWidth`)。
9
+ *
10
+ * 颜色遵循约定:`NO_COLOR` 有值即禁用,`FORCE_COLOR` 有值即启用,
11
+ * 否则依据 stdout 是否为 TTY 判定。
12
+ */
13
+ import { inspect } from "node:util";
14
+ import { padVisualEnd, visualWidth } from "../util/text.js";
15
+ /** pino 的数字级别 → 级别名 */
16
+ const LEVEL_NAMES = {
17
+ 10: "trace",
18
+ 20: "debug",
19
+ 30: "info",
20
+ 40: "warn",
21
+ 50: "error",
22
+ 60: "fatal"
23
+ };
24
+ /** 级别名 → pino 数字级别 */
25
+ export const LEVEL_VALUES = {
26
+ trace: 10,
27
+ debug: 20,
28
+ info: 30,
29
+ warn: 40,
30
+ error: 50,
31
+ fatal: 60
32
+ };
33
+ /** 控制台里显示的级别标签(定宽 5 列,便于竖向对齐) */
34
+ const LEVEL_LABELS = {
35
+ trace: "TRACE",
36
+ debug: "DEBUG",
37
+ info: "INFO ",
38
+ warn: "WARN ",
39
+ error: "ERROR",
40
+ fatal: "FATAL",
41
+ silent: " "
42
+ };
43
+ /** ANSI 前景色码 */
44
+ const LEVEL_COLORS = {
45
+ trace: "90", // 亮黑(灰)
46
+ debug: "36", // 青
47
+ info: "32", // 绿
48
+ warn: "33", // 黄
49
+ error: "31", // 红
50
+ fatal: "35", // 洋红
51
+ silent: "0"
52
+ };
53
+ /** pino 注入的、不该当作业务字段打印出来的键 */
54
+ const RESERVED_KEYS = new Set(["level", "time", "msg", "pid", "hostname", "v", "err", "scope"]);
55
+ /**
56
+ * 判断当前是否应输出颜色
57
+ * @returns 是否启用颜色
58
+ */
59
+ export function supportsColor() {
60
+ if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== "")
61
+ return false;
62
+ if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== "")
63
+ return true;
64
+ return process.stdout.isTTY === true;
65
+ }
66
+ /**
67
+ * 给文本加 ANSI 颜色
68
+ * @param code 颜色码,如 `"32"`
69
+ * @param text 文本
70
+ * @param enabled 是否启用;false 时原样返回
71
+ * @returns 带颜色的文本
72
+ */
73
+ export function paint(code, text, enabled) {
74
+ return enabled ? `\u001b[${code}m${text}\u001b[0m` : text;
75
+ }
76
+ /**
77
+ * 解析 pino 输出的一行 JSON
78
+ * @param line 日志行(含尾部换行)
79
+ * @returns 解析结果;不是合法 JSON 时 undefined
80
+ */
81
+ export function parseRecord(line) {
82
+ const text = line.trim();
83
+ if (text === "" || text[0] !== "{")
84
+ return undefined;
85
+ let raw;
86
+ try {
87
+ raw = JSON.parse(text);
88
+ }
89
+ catch {
90
+ return undefined;
91
+ }
92
+ const levelNum = typeof raw.level === "number" ? raw.level : 30;
93
+ const err = raw.err;
94
+ const fields = {};
95
+ for (const [key, value] of Object.entries(raw)) {
96
+ if (!RESERVED_KEYS.has(key))
97
+ fields[key] = value;
98
+ }
99
+ return {
100
+ level: LEVEL_NAMES[levelNum] ?? "info",
101
+ time: typeof raw.time === "number" ? raw.time : Date.now(),
102
+ msg: typeof raw.msg === "string" ? raw.msg : typeof err?.message === "string" ? err.message : "",
103
+ scope: typeof raw.scope === "string" ? raw.scope : undefined,
104
+ stack: typeof err?.stack === "string" ? err.stack : undefined,
105
+ fields: Object.keys(fields).length > 0 ? fields : undefined
106
+ };
107
+ }
108
+ /**
109
+ * 格式化时间为 `HH:mm:ss.SSS`
110
+ * @param time 毫秒时间戳
111
+ * @returns 时间字符串
112
+ */
113
+ function formatTime(time) {
114
+ const d = new Date(time);
115
+ const hh = String(d.getHours()).padStart(2, "0");
116
+ const mm = String(d.getMinutes()).padStart(2, "0");
117
+ const ss = String(d.getSeconds()).padStart(2, "0");
118
+ const ms = String(d.getMilliseconds()).padStart(3, "0");
119
+ return `${hh}:${mm}:${ss}.${ms}`;
120
+ }
121
+ /**
122
+ * 把日志记录格式化为一行(或多行,含堆栈)控制台文本
123
+ * @param rec 日志记录
124
+ * @param opts 格式化选项
125
+ * @returns 带尾部换行的文本
126
+ */
127
+ export function formatRecord(rec, opts) {
128
+ const { color } = opts;
129
+ const levelColor = LEVEL_COLORS[rec.level];
130
+ const time = paint("90", formatTime(rec.time), color);
131
+ const level = paint(levelColor, LEVEL_LABELS[rec.level], color);
132
+ let scope = "";
133
+ if (rec.scope) {
134
+ const width = opts.scopeWidth ?? 14;
135
+ // 作用域超宽时不截断(宁可错行也不让用户看不出是哪个插件),
136
+ // 只在未超宽时补齐
137
+ const label = width > 0 && visualWidth(rec.scope) < width ? padVisualEnd(rec.scope, width) : rec.scope;
138
+ scope = ` ${paint("36", label, color)}`;
139
+ }
140
+ let extra = "";
141
+ if (rec.fields) {
142
+ const parts = [];
143
+ for (const [key, value] of Object.entries(rec.fields)) {
144
+ parts.push(`${paint("90", `${key}=`, color)}${stringifyField(value)}`);
145
+ }
146
+ if (parts.length > 0)
147
+ extra = ` ${parts.join(" ")}`;
148
+ }
149
+ let out = `${time} ${level}${scope} ${rec.msg}${extra}\n`;
150
+ if (rec.stack && opts.stack !== false) {
151
+ out += `${paint("90", indent(rec.stack), color)}\n`;
152
+ }
153
+ return out;
154
+ }
155
+ /**
156
+ * 缩进多行文本
157
+ * @param text 文本
158
+ * @returns 每行前加四空格
159
+ */
160
+ function indent(text) {
161
+ return text
162
+ .split("\n")
163
+ .map(line => ` ${line}`)
164
+ .join("\n");
165
+ }
166
+ /**
167
+ * 将字段值转换为紧凑的单行文本
168
+ * @param value 字段值
169
+ * @returns 单行字符串
170
+ */
171
+ function stringifyField(value) {
172
+ if (typeof value === "string")
173
+ return value;
174
+ if (typeof value === "number" || typeof value === "boolean" || value === null)
175
+ return String(value);
176
+ return inspect(value, { depth: 2, breakLength: Number.POSITIVE_INFINITY, compact: true, colors: false });
177
+ }
178
+ /**
179
+ * 将任意日志参数拼接为消息文本
180
+ *
181
+ * 不直接交由 pino 处理:pino 仅将第一个参数视为消息,其余参数仅在第一个参数含
182
+ * `%s`/`%d` 占位符时才被消费,否则**静默丢弃**。而 `logger.info("查询", uid, data)`
183
+ * 这类 console.log 写法很常见,故此处统一按 console.log 语义拼接。
184
+ * @param args 日志参数
185
+ * @returns 拼接后的消息与提取出的错误
186
+ */
187
+ export function joinArgs(args) {
188
+ const parts = [];
189
+ let err;
190
+ for (const arg of args) {
191
+ if (arg instanceof Error) {
192
+ // 第一个 Error 单独提出来,让 pino 的 err 序列化器保留堆栈
193
+ if (!err)
194
+ err = arg;
195
+ parts.push(arg.message);
196
+ continue;
197
+ }
198
+ if (typeof arg === "string") {
199
+ parts.push(arg);
200
+ continue;
201
+ }
202
+ if (arg === undefined) {
203
+ parts.push("undefined");
204
+ continue;
205
+ }
206
+ if (arg === null) {
207
+ parts.push("null");
208
+ continue;
209
+ }
210
+ if (typeof arg === "object") {
211
+ parts.push(inspect(arg, { depth: 3, breakLength: 120, compact: 3, colors: false }));
212
+ continue;
213
+ }
214
+ parts.push(String(arg));
215
+ }
216
+ return { msg: parts.join(" "), err };
217
+ }
218
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/logger/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { Disposer, Logger, LogLevel } from "@yunzai-ng/types";
2
+ import { type LogRecord } from "./format.js";
3
+ /** 日志配置 */
4
+ export interface LoggerConfig {
5
+ /** 全局级别,缺省 `"info"` */
6
+ level?: LogLevel;
7
+ /** 文件输出级别,缺省与 `level` 相同 */
8
+ fileLevel?: LogLevel;
9
+ /** 控制台输出级别,缺省与 `level` 相同 */
10
+ consoleLevel?: LogLevel;
11
+ /** 日志目录;不给则只输出到控制台 */
12
+ dir?: string;
13
+ /** 日志文件名前缀,缺省 `"app"` */
14
+ basename?: string;
15
+ /** 是否输出到控制台,缺省 true */
16
+ console?: boolean;
17
+ /** 是否着色,缺省自动探测 */
18
+ color?: boolean;
19
+ /** 单文件字节上限 */
20
+ maxSize?: number;
21
+ /** 日志保留天数 */
22
+ keepDays?: number;
23
+ /** 日志文件数上限 */
24
+ maxFiles?: number;
25
+ /** 尾部缓冲条数(供 WebUI 回看),缺省 500 */
26
+ tailSize?: number;
27
+ /** 控制台作用域列宽,缺省 14 */
28
+ scopeWidth?: number;
29
+ }
30
+ /** 尾部日志查询条件 */
31
+ export interface TailQuery {
32
+ /** 最多返回条数 */
33
+ limit?: number;
34
+ /** 最低级别 */
35
+ level?: LogLevel;
36
+ /** 作用域精确匹配 */
37
+ scope?: string;
38
+ /** 消息子串匹配(不区分大小写) */
39
+ keyword?: string;
40
+ }
41
+ /**
42
+ * 日志枢纽
43
+ *
44
+ * 内核只创建一个;插件通过 `ctx.logger`(即 `hub.root.child({ scope })`)取用。
45
+ */
46
+ export declare class LoggerHub {
47
+ #private;
48
+ /** 根日志器 */
49
+ readonly root: Logger;
50
+ /**
51
+ * @param config 日志配置
52
+ */
53
+ constructor(config?: LoggerConfig);
54
+ /** 当前全局级别 */
55
+ get level(): LogLevel;
56
+ /** 当前日志文件路径;未启用文件输出时 undefined */
57
+ get file(): string | undefined;
58
+ /**
59
+ * 判断某级别当前是否会被输出
60
+ *
61
+ * 由 `HubLogger` 在每次打日志前调用;命中 false 时连消息都不拼。
62
+ * @param level 目标级别
63
+ * @returns 是否启用
64
+ */
65
+ enabled(level: LogLevel): boolean;
66
+ /**
67
+ * 运行时修改级别
68
+ *
69
+ * 立刻对所有已创建的子日志器生效 —— 这正是把过滤放在包装层的原因。
70
+ * @param level 新级别
71
+ * @param target 只改某一路:`"console"` / `"file"`;缺省两路都改
72
+ */
73
+ setLevel(level: LogLevel, target?: "console" | "file"): void;
74
+ /**
75
+ * 取尾部日志
76
+ * @param query 查询条件
77
+ * @returns 按时间正序的日志记录
78
+ */
79
+ tail(query?: TailQuery): LogRecord[];
80
+ /**
81
+ * 订阅实时日志(WebUI 的 SSE / WebSocket 推送用)
82
+ * @param fn 回调;**不要在里面打日志**,会被静默丢弃以防递归
83
+ * @returns 取消订阅
84
+ */
85
+ subscribe(fn: (rec: LogRecord) => void): Disposer;
86
+ /** 同步刷盘 */
87
+ flush(): void;
88
+ /** 刷盘并关闭文件 */
89
+ close(): void;
90
+ }
91
+ /**
92
+ * 创建日志枢纽
93
+ * @param config 日志配置
94
+ * @returns 日志枢纽
95
+ */
96
+ export declare function createLoggerHub(config?: LoggerConfig): LoggerHub;
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAgB,KAAK,SAAS,EAAsD,MAAM,aAAa,CAAA;AAG9G,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,QAAQ,CAAA;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qBAAqB;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,eAAe;AACf,MAAM,WAAW,SAAS;IACxB,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW;IACX,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,cAAc;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAcD;;;;GAIG;AACH,qBAAa,SAAS;;IAgCpB,WAAW;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;OAEG;gBACS,MAAM,GAAE,YAAiB;IAkCrC,aAAa;IACb,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAED,kCAAkC;IAClC,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIjC;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAc5D;;;;OAIG;IACH,IAAI,CAAC,KAAK,GAAE,SAAc,GAAG,SAAS,EAAE;IAsBxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,QAAQ;IAKjD,WAAW;IACX,KAAK,IAAI,IAAI;IAIb,cAAc;IACd,KAAK,IAAI,IAAI;CA4Dd;AA0HD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,YAAiB,GAAG,SAAS,CAEpE"}