koishi-plugin-media-luna 0.0.1

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 (437) hide show
  1. package/client/README.md +558 -0
  2. package/client/api.ts +256 -0
  3. package/client/components/ChannelConfigDialog.vue +1113 -0
  4. package/client/components/ChannelsView.vue +698 -0
  5. package/client/components/ConfigRenderer.vue +164 -0
  6. package/client/components/EmptyState.vue +87 -0
  7. package/client/components/GenerateView.vue +778 -0
  8. package/client/components/HistoryGallery.vue +590 -0
  9. package/client/components/ImageLightbox.vue +510 -0
  10. package/client/components/ImageUpload.vue +298 -0
  11. package/client/components/JsonEditor.vue +68 -0
  12. package/client/components/LoadingState.vue +73 -0
  13. package/client/components/PresetsView.vue +800 -0
  14. package/client/components/ScrollContainer.vue +45 -0
  15. package/client/components/SettingsView.vue +231 -0
  16. package/client/components/StatusBadge.vue +55 -0
  17. package/client/components/TagFilter.vue +139 -0
  18. package/client/components/TagInput.vue +63 -0
  19. package/client/components/TasksView.vue +1074 -0
  20. package/client/components/ViewModeSwitch.vue +78 -0
  21. package/client/components/settings/CachePanel.vue +142 -0
  22. package/client/components/settings/MiddlewaresPanel.vue +480 -0
  23. package/client/components/settings/PluginsPanel.vue +493 -0
  24. package/client/index.ts +13 -0
  25. package/client/pages/index.vue +177 -0
  26. package/client/styles/shared.css +258 -0
  27. package/client/types.ts +158 -0
  28. package/client/utils/format.ts +72 -0
  29. package/dist/index.js +1 -0
  30. package/dist/style.css +1 -0
  31. package/lib/api/README.md +643 -0
  32. package/lib/api/cache-api.d.ts +6 -0
  33. package/lib/api/cache-api.d.ts.map +1 -0
  34. package/lib/api/cache-api.js +147 -0
  35. package/lib/api/cache-api.js.map +1 -0
  36. package/lib/api/channel-api.d.ts +6 -0
  37. package/lib/api/channel-api.d.ts.map +1 -0
  38. package/lib/api/channel-api.js +148 -0
  39. package/lib/api/channel-api.js.map +1 -0
  40. package/lib/api/connector-api.d.ts +6 -0
  41. package/lib/api/connector-api.d.ts.map +1 -0
  42. package/lib/api/connector-api.js +63 -0
  43. package/lib/api/connector-api.js.map +1 -0
  44. package/lib/api/generate-api.d.ts +6 -0
  45. package/lib/api/generate-api.d.ts.map +1 -0
  46. package/lib/api/generate-api.js +123 -0
  47. package/lib/api/generate-api.js.map +1 -0
  48. package/lib/api/index.d.ts +15 -0
  49. package/lib/api/index.d.ts.map +1 -0
  50. package/lib/api/index.js +34 -0
  51. package/lib/api/index.js.map +1 -0
  52. package/lib/api/middleware-api.d.ts +6 -0
  53. package/lib/api/middleware-api.d.ts.map +1 -0
  54. package/lib/api/middleware-api.js +212 -0
  55. package/lib/api/middleware-api.js.map +1 -0
  56. package/lib/api/plugin-api.d.ts +6 -0
  57. package/lib/api/plugin-api.d.ts.map +1 -0
  58. package/lib/api/plugin-api.js +78 -0
  59. package/lib/api/plugin-api.js.map +1 -0
  60. package/lib/api/preset-api.d.ts +6 -0
  61. package/lib/api/preset-api.d.ts.map +1 -0
  62. package/lib/api/preset-api.js +256 -0
  63. package/lib/api/preset-api.js.map +1 -0
  64. package/lib/api/settings-api.d.ts +6 -0
  65. package/lib/api/settings-api.d.ts.map +1 -0
  66. package/lib/api/settings-api.js +118 -0
  67. package/lib/api/settings-api.js.map +1 -0
  68. package/lib/api/task-api.d.ts +6 -0
  69. package/lib/api/task-api.d.ts.map +1 -0
  70. package/lib/api/task-api.js +148 -0
  71. package/lib/api/task-api.js.map +1 -0
  72. package/lib/config.d.ts +6 -0
  73. package/lib/config.d.ts.map +1 -0
  74. package/lib/config.js +8 -0
  75. package/lib/config.js.map +1 -0
  76. package/lib/connectors/builtin/chat-api.d.ts +9 -0
  77. package/lib/connectors/builtin/chat-api.d.ts.map +1 -0
  78. package/lib/connectors/builtin/chat-api.js +351 -0
  79. package/lib/connectors/builtin/chat-api.js.map +1 -0
  80. package/lib/connectors/builtin/dalle.d.ts +6 -0
  81. package/lib/connectors/builtin/dalle.d.ts.map +1 -0
  82. package/lib/connectors/builtin/dalle.js +109 -0
  83. package/lib/connectors/builtin/dalle.js.map +1 -0
  84. package/lib/connectors/builtin/flux.d.ts +7 -0
  85. package/lib/connectors/builtin/flux.d.ts.map +1 -0
  86. package/lib/connectors/builtin/flux.js +199 -0
  87. package/lib/connectors/builtin/flux.js.map +1 -0
  88. package/lib/connectors/builtin/index.d.ts +5 -0
  89. package/lib/connectors/builtin/index.d.ts.map +1 -0
  90. package/lib/connectors/builtin/index.js +6 -0
  91. package/lib/connectors/builtin/index.js.map +1 -0
  92. package/lib/connectors/builtin/sd-webui.d.ts +7 -0
  93. package/lib/connectors/builtin/sd-webui.d.ts.map +1 -0
  94. package/lib/connectors/builtin/sd-webui.js +157 -0
  95. package/lib/connectors/builtin/sd-webui.js.map +1 -0
  96. package/lib/connectors/connector-registry.d.ts +36 -0
  97. package/lib/connectors/connector-registry.d.ts.map +1 -0
  98. package/lib/connectors/connector-registry.js +66 -0
  99. package/lib/connectors/connector-registry.js.map +1 -0
  100. package/lib/connectors/index.d.ts +3 -0
  101. package/lib/connectors/index.d.ts.map +1 -0
  102. package/lib/connectors/index.js +4 -0
  103. package/lib/connectors/index.js.map +1 -0
  104. package/lib/core/api/api-utils.d.ts +46 -0
  105. package/lib/core/api/api-utils.d.ts.map +1 -0
  106. package/lib/core/api/api-utils.js +78 -0
  107. package/lib/core/api/api-utils.js.map +1 -0
  108. package/lib/core/api/cache-api.d.ts +6 -0
  109. package/lib/core/api/cache-api.d.ts.map +1 -0
  110. package/lib/core/api/cache-api.js +147 -0
  111. package/lib/core/api/cache-api.js.map +1 -0
  112. package/lib/core/api/channel-api.d.ts +6 -0
  113. package/lib/core/api/channel-api.d.ts.map +1 -0
  114. package/lib/core/api/channel-api.js +146 -0
  115. package/lib/core/api/channel-api.js.map +1 -0
  116. package/lib/core/api/connector-api.d.ts +6 -0
  117. package/lib/core/api/connector-api.d.ts.map +1 -0
  118. package/lib/core/api/connector-api.js +63 -0
  119. package/lib/core/api/connector-api.js.map +1 -0
  120. package/lib/core/api/generate-api.d.ts +6 -0
  121. package/lib/core/api/generate-api.d.ts.map +1 -0
  122. package/lib/core/api/generate-api.js +124 -0
  123. package/lib/core/api/generate-api.js.map +1 -0
  124. package/lib/core/api/index.d.ts +16 -0
  125. package/lib/core/api/index.d.ts.map +1 -0
  126. package/lib/core/api/index.js +38 -0
  127. package/lib/core/api/index.js.map +1 -0
  128. package/lib/core/api/middleware-api.d.ts +6 -0
  129. package/lib/core/api/middleware-api.d.ts.map +1 -0
  130. package/lib/core/api/middleware-api.js +196 -0
  131. package/lib/core/api/middleware-api.js.map +1 -0
  132. package/lib/core/api/plugin-api.d.ts +6 -0
  133. package/lib/core/api/plugin-api.d.ts.map +1 -0
  134. package/lib/core/api/plugin-api.js +78 -0
  135. package/lib/core/api/plugin-api.js.map +1 -0
  136. package/lib/core/api/preset-api.d.ts +6 -0
  137. package/lib/core/api/preset-api.d.ts.map +1 -0
  138. package/lib/core/api/preset-api.js +272 -0
  139. package/lib/core/api/preset-api.js.map +1 -0
  140. package/lib/core/api/settings-api.d.ts +6 -0
  141. package/lib/core/api/settings-api.d.ts.map +1 -0
  142. package/lib/core/api/settings-api.js +118 -0
  143. package/lib/core/api/settings-api.js.map +1 -0
  144. package/lib/core/api/task-api.d.ts +6 -0
  145. package/lib/core/api/task-api.d.ts.map +1 -0
  146. package/lib/core/api/task-api.js +281 -0
  147. package/lib/core/api/task-api.js.map +1 -0
  148. package/lib/core/channel.service.d.ts +44 -0
  149. package/lib/core/channel.service.d.ts.map +1 -0
  150. package/lib/core/channel.service.js +146 -0
  151. package/lib/core/channel.service.js.map +1 -0
  152. package/lib/core/config/config.service.d.ts +89 -0
  153. package/lib/core/config/config.service.d.ts.map +1 -0
  154. package/lib/core/config/config.service.js +216 -0
  155. package/lib/core/config/config.service.js.map +1 -0
  156. package/lib/core/config/index.d.ts +3 -0
  157. package/lib/core/config/index.d.ts.map +1 -0
  158. package/lib/core/config/index.js +3 -0
  159. package/lib/core/config/index.js.map +1 -0
  160. package/lib/core/error.d.ts +73 -0
  161. package/lib/core/error.d.ts.map +1 -0
  162. package/lib/core/error.js +137 -0
  163. package/lib/core/error.js.map +1 -0
  164. package/lib/core/index.d.ts +12 -0
  165. package/lib/core/index.d.ts.map +1 -0
  166. package/lib/core/index.js +23 -0
  167. package/lib/core/index.js.map +1 -0
  168. package/lib/core/logger.d.ts +18 -0
  169. package/lib/core/logger.d.ts.map +1 -0
  170. package/lib/core/logger.js +39 -0
  171. package/lib/core/logger.js.map +1 -0
  172. package/lib/core/medialuna.service.d.ts +168 -0
  173. package/lib/core/medialuna.service.d.ts.map +1 -0
  174. package/lib/core/medialuna.service.js +423 -0
  175. package/lib/core/medialuna.service.js.map +1 -0
  176. package/lib/core/pipeline/dependency-graph.d.ts +43 -0
  177. package/lib/core/pipeline/dependency-graph.d.ts.map +1 -0
  178. package/lib/core/pipeline/dependency-graph.js +223 -0
  179. package/lib/core/pipeline/dependency-graph.js.map +1 -0
  180. package/lib/core/pipeline/generation-pipeline.d.ts +40 -0
  181. package/lib/core/pipeline/generation-pipeline.d.ts.map +1 -0
  182. package/lib/core/pipeline/generation-pipeline.js +216 -0
  183. package/lib/core/pipeline/generation-pipeline.js.map +1 -0
  184. package/lib/core/pipeline/index.d.ts +4 -0
  185. package/lib/core/pipeline/index.d.ts.map +1 -0
  186. package/lib/core/pipeline/index.js +5 -0
  187. package/lib/core/pipeline/index.js.map +1 -0
  188. package/lib/core/pipeline/middleware-registry.d.ts +33 -0
  189. package/lib/core/pipeline/middleware-registry.d.ts.map +1 -0
  190. package/lib/core/pipeline/middleware-registry.js +78 -0
  191. package/lib/core/pipeline/middleware-registry.js.map +1 -0
  192. package/lib/core/plugin-loader.d.ts +77 -0
  193. package/lib/core/plugin-loader.d.ts.map +1 -0
  194. package/lib/core/plugin-loader.js +300 -0
  195. package/lib/core/plugin-loader.js.map +1 -0
  196. package/lib/core/registry/connector.registry.d.ts +36 -0
  197. package/lib/core/registry/connector.registry.d.ts.map +1 -0
  198. package/lib/core/registry/connector.registry.js +65 -0
  199. package/lib/core/registry/connector.registry.js.map +1 -0
  200. package/lib/core/registry/index.d.ts +3 -0
  201. package/lib/core/registry/index.d.ts.map +1 -0
  202. package/lib/core/registry/index.js +4 -0
  203. package/lib/core/registry/index.js.map +1 -0
  204. package/lib/core/registry/service.registry.d.ts +27 -0
  205. package/lib/core/registry/service.registry.d.ts.map +1 -0
  206. package/lib/core/registry/service.registry.js +54 -0
  207. package/lib/core/registry/service.registry.js.map +1 -0
  208. package/lib/core/request.service.d.ts +83 -0
  209. package/lib/core/request.service.d.ts.map +1 -0
  210. package/lib/core/request.service.js +237 -0
  211. package/lib/core/request.service.js.map +1 -0
  212. package/lib/core/types.d.ts +270 -0
  213. package/lib/core/types.d.ts.map +1 -0
  214. package/lib/core/types.js +17 -0
  215. package/lib/core/types.js.map +1 -0
  216. package/lib/database.d.ts +6 -0
  217. package/lib/database.d.ts.map +1 -0
  218. package/lib/database.js +89 -0
  219. package/lib/database.js.map +1 -0
  220. package/lib/index.d.ts +13 -0
  221. package/lib/index.d.ts.map +1 -0
  222. package/lib/index.js +54 -0
  223. package/lib/index.js.map +1 -0
  224. package/lib/middlewares/builtin/billing.d.ts +45 -0
  225. package/lib/middlewares/builtin/billing.d.ts.map +1 -0
  226. package/lib/middlewares/builtin/billing.js +362 -0
  227. package/lib/middlewares/builtin/billing.js.map +1 -0
  228. package/lib/middlewares/builtin/index.d.ts +6 -0
  229. package/lib/middlewares/builtin/index.d.ts.map +1 -0
  230. package/lib/middlewares/builtin/index.js +7 -0
  231. package/lib/middlewares/builtin/index.js.map +1 -0
  232. package/lib/middlewares/builtin/preset.d.ts +14 -0
  233. package/lib/middlewares/builtin/preset.d.ts.map +1 -0
  234. package/lib/middlewares/builtin/preset.js +156 -0
  235. package/lib/middlewares/builtin/preset.js.map +1 -0
  236. package/lib/middlewares/builtin/remote-preset-sync.d.ts +8 -0
  237. package/lib/middlewares/builtin/remote-preset-sync.d.ts.map +1 -0
  238. package/lib/middlewares/builtin/remote-preset-sync.js +32 -0
  239. package/lib/middlewares/builtin/remote-preset-sync.js.map +1 -0
  240. package/lib/middlewares/builtin/request.d.ts +10 -0
  241. package/lib/middlewares/builtin/request.d.ts.map +1 -0
  242. package/lib/middlewares/builtin/request.js +50 -0
  243. package/lib/middlewares/builtin/request.js.map +1 -0
  244. package/lib/middlewares/builtin/storage.d.ts +64 -0
  245. package/lib/middlewares/builtin/storage.d.ts.map +1 -0
  246. package/lib/middlewares/builtin/storage.js +715 -0
  247. package/lib/middlewares/builtin/storage.js.map +1 -0
  248. package/lib/middlewares/builtin/task-recorder.d.ts +20 -0
  249. package/lib/middlewares/builtin/task-recorder.d.ts.map +1 -0
  250. package/lib/middlewares/builtin/task-recorder.js +138 -0
  251. package/lib/middlewares/builtin/task-recorder.js.map +1 -0
  252. package/lib/middlewares/index.d.ts +2 -0
  253. package/lib/middlewares/index.d.ts.map +1 -0
  254. package/lib/middlewares/index.js +3 -0
  255. package/lib/middlewares/index.js.map +1 -0
  256. package/lib/pipeline/dependency-graph.d.ts +43 -0
  257. package/lib/pipeline/dependency-graph.d.ts.map +1 -0
  258. package/lib/pipeline/dependency-graph.js +240 -0
  259. package/lib/pipeline/dependency-graph.js.map +1 -0
  260. package/lib/pipeline/generation-pipeline.d.ts +38 -0
  261. package/lib/pipeline/generation-pipeline.d.ts.map +1 -0
  262. package/lib/pipeline/generation-pipeline.js +211 -0
  263. package/lib/pipeline/generation-pipeline.js.map +1 -0
  264. package/lib/pipeline/index.d.ts +4 -0
  265. package/lib/pipeline/index.d.ts.map +1 -0
  266. package/lib/pipeline/index.js +5 -0
  267. package/lib/pipeline/index.js.map +1 -0
  268. package/lib/pipeline/middleware-registry.d.ts +36 -0
  269. package/lib/pipeline/middleware-registry.d.ts.map +1 -0
  270. package/lib/pipeline/middleware-registry.js +83 -0
  271. package/lib/pipeline/middleware-registry.js.map +1 -0
  272. package/lib/plugins/billing/config.d.ts +19 -0
  273. package/lib/plugins/billing/config.d.ts.map +1 -0
  274. package/lib/plugins/billing/config.js +98 -0
  275. package/lib/plugins/billing/config.js.map +1 -0
  276. package/lib/plugins/billing/index.d.ts +4 -0
  277. package/lib/plugins/billing/index.d.ts.map +1 -0
  278. package/lib/plugins/billing/index.js +20 -0
  279. package/lib/plugins/billing/index.js.map +1 -0
  280. package/lib/plugins/billing/middleware.d.ts +12 -0
  281. package/lib/plugins/billing/middleware.d.ts.map +1 -0
  282. package/lib/plugins/billing/middleware.js +233 -0
  283. package/lib/plugins/billing/middleware.js.map +1 -0
  284. package/lib/plugins/cache/config.d.ts +44 -0
  285. package/lib/plugins/cache/config.d.ts.map +1 -0
  286. package/lib/plugins/cache/config.js +187 -0
  287. package/lib/plugins/cache/config.js.map +1 -0
  288. package/lib/plugins/cache/index.d.ts +6 -0
  289. package/lib/plugins/cache/index.d.ts.map +1 -0
  290. package/lib/plugins/cache/index.js +87 -0
  291. package/lib/plugins/cache/index.js.map +1 -0
  292. package/lib/plugins/cache/middleware.d.ts +12 -0
  293. package/lib/plugins/cache/middleware.d.ts.map +1 -0
  294. package/lib/plugins/cache/middleware.js +194 -0
  295. package/lib/plugins/cache/middleware.js.map +1 -0
  296. package/lib/plugins/cache/service.d.ts +106 -0
  297. package/lib/plugins/cache/service.d.ts.map +1 -0
  298. package/lib/plugins/cache/service.js +467 -0
  299. package/lib/plugins/cache/service.js.map +1 -0
  300. package/lib/plugins/cache/utils/index.d.ts +4 -0
  301. package/lib/plugins/cache/utils/index.d.ts.map +1 -0
  302. package/lib/plugins/cache/utils/index.js +5 -0
  303. package/lib/plugins/cache/utils/index.js.map +1 -0
  304. package/lib/plugins/cache/utils/mime.d.ts +9 -0
  305. package/lib/plugins/cache/utils/mime.d.ts.map +1 -0
  306. package/lib/plugins/cache/utils/mime.js +65 -0
  307. package/lib/plugins/cache/utils/mime.js.map +1 -0
  308. package/lib/plugins/cache/utils/s3.d.ts +19 -0
  309. package/lib/plugins/cache/utils/s3.d.ts.map +1 -0
  310. package/lib/plugins/cache/utils/s3.js +147 -0
  311. package/lib/plugins/cache/utils/s3.js.map +1 -0
  312. package/lib/plugins/cache/utils/webdav.d.ts +16 -0
  313. package/lib/plugins/cache/utils/webdav.d.ts.map +1 -0
  314. package/lib/plugins/cache/utils/webdav.js +69 -0
  315. package/lib/plugins/cache/utils/webdav.js.map +1 -0
  316. package/lib/plugins/connector-chat-api/index.d.ts +7 -0
  317. package/lib/plugins/connector-chat-api/index.d.ts.map +1 -0
  318. package/lib/plugins/connector-chat-api/index.js +400 -0
  319. package/lib/plugins/connector-chat-api/index.js.map +1 -0
  320. package/lib/plugins/connector-dalle/index.d.ts +7 -0
  321. package/lib/plugins/connector-dalle/index.d.ts.map +1 -0
  322. package/lib/plugins/connector-dalle/index.js +140 -0
  323. package/lib/plugins/connector-dalle/index.js.map +1 -0
  324. package/lib/plugins/connector-flux/index.d.ts +7 -0
  325. package/lib/plugins/connector-flux/index.d.ts.map +1 -0
  326. package/lib/plugins/connector-flux/index.js +232 -0
  327. package/lib/plugins/connector-flux/index.js.map +1 -0
  328. package/lib/plugins/connector-sd-webui/index.d.ts +7 -0
  329. package/lib/plugins/connector-sd-webui/index.d.ts.map +1 -0
  330. package/lib/plugins/connector-sd-webui/index.js +171 -0
  331. package/lib/plugins/connector-sd-webui/index.js.map +1 -0
  332. package/lib/plugins/index.d.ts +22 -0
  333. package/lib/plugins/index.d.ts.map +1 -0
  334. package/lib/plugins/index.js +21 -0
  335. package/lib/plugins/index.js.map +1 -0
  336. package/lib/plugins/preset/config.d.ts +37 -0
  337. package/lib/plugins/preset/config.d.ts.map +1 -0
  338. package/lib/plugins/preset/config.js +74 -0
  339. package/lib/plugins/preset/config.js.map +1 -0
  340. package/lib/plugins/preset/index.d.ts +6 -0
  341. package/lib/plugins/preset/index.d.ts.map +1 -0
  342. package/lib/plugins/preset/index.js +58 -0
  343. package/lib/plugins/preset/index.js.map +1 -0
  344. package/lib/plugins/preset/middleware.d.ts +6 -0
  345. package/lib/plugins/preset/middleware.d.ts.map +1 -0
  346. package/lib/plugins/preset/middleware.js +126 -0
  347. package/lib/plugins/preset/middleware.js.map +1 -0
  348. package/lib/plugins/preset/remote-sync.service.d.ts +84 -0
  349. package/lib/plugins/preset/remote-sync.service.d.ts.map +1 -0
  350. package/lib/plugins/preset/remote-sync.service.js +342 -0
  351. package/lib/plugins/preset/remote-sync.service.js.map +1 -0
  352. package/lib/plugins/preset/service.d.ts +64 -0
  353. package/lib/plugins/preset/service.d.ts.map +1 -0
  354. package/lib/plugins/preset/service.js +196 -0
  355. package/lib/plugins/preset/service.js.map +1 -0
  356. package/lib/plugins/prompt-encoding/config.d.ts +25 -0
  357. package/lib/plugins/prompt-encoding/config.d.ts.map +1 -0
  358. package/lib/plugins/prompt-encoding/config.js +62 -0
  359. package/lib/plugins/prompt-encoding/config.js.map +1 -0
  360. package/lib/plugins/prompt-encoding/index.d.ts +5 -0
  361. package/lib/plugins/prompt-encoding/index.d.ts.map +1 -0
  362. package/lib/plugins/prompt-encoding/index.js +21 -0
  363. package/lib/plugins/prompt-encoding/index.js.map +1 -0
  364. package/lib/plugins/prompt-encoding/middleware.d.ts +6 -0
  365. package/lib/plugins/prompt-encoding/middleware.d.ts.map +1 -0
  366. package/lib/plugins/prompt-encoding/middleware.js +151 -0
  367. package/lib/plugins/prompt-encoding/middleware.js.map +1 -0
  368. package/lib/plugins/task/config.d.ts +15 -0
  369. package/lib/plugins/task/config.d.ts.map +1 -0
  370. package/lib/plugins/task/config.js +33 -0
  371. package/lib/plugins/task/config.js.map +1 -0
  372. package/lib/plugins/task/index.d.ts +5 -0
  373. package/lib/plugins/task/index.d.ts.map +1 -0
  374. package/lib/plugins/task/index.js +58 -0
  375. package/lib/plugins/task/index.js.map +1 -0
  376. package/lib/plugins/task/middleware.d.ts +14 -0
  377. package/lib/plugins/task/middleware.d.ts.map +1 -0
  378. package/lib/plugins/task/middleware.js +123 -0
  379. package/lib/plugins/task/middleware.js.map +1 -0
  380. package/lib/plugins/task/service.d.ts +94 -0
  381. package/lib/plugins/task/service.d.ts.map +1 -0
  382. package/lib/plugins/task/service.js +226 -0
  383. package/lib/plugins/task/service.js.map +1 -0
  384. package/lib/plugins/webui-auth/config.d.ts +12 -0
  385. package/lib/plugins/webui-auth/config.d.ts.map +1 -0
  386. package/lib/plugins/webui-auth/config.js +30 -0
  387. package/lib/plugins/webui-auth/config.js.map +1 -0
  388. package/lib/plugins/webui-auth/index.d.ts +5 -0
  389. package/lib/plugins/webui-auth/index.d.ts.map +1 -0
  390. package/lib/plugins/webui-auth/index.js +99 -0
  391. package/lib/plugins/webui-auth/index.js.map +1 -0
  392. package/lib/plugins/webui-auth/service.d.ts +42 -0
  393. package/lib/plugins/webui-auth/service.d.ts.map +1 -0
  394. package/lib/plugins/webui-auth/service.js +106 -0
  395. package/lib/plugins/webui-auth/service.js.map +1 -0
  396. package/lib/services/asset-cache.service.d.ts +133 -0
  397. package/lib/services/asset-cache.service.d.ts.map +1 -0
  398. package/lib/services/asset-cache.service.js +882 -0
  399. package/lib/services/asset-cache.service.js.map +1 -0
  400. package/lib/services/cache.service.d.ts +110 -0
  401. package/lib/services/cache.service.d.ts.map +1 -0
  402. package/lib/services/cache.service.js +333 -0
  403. package/lib/services/cache.service.js.map +1 -0
  404. package/lib/services/channel.service.d.ts +44 -0
  405. package/lib/services/channel.service.d.ts.map +1 -0
  406. package/lib/services/channel.service.js +154 -0
  407. package/lib/services/channel.service.js.map +1 -0
  408. package/lib/services/config.service.d.ts +73 -0
  409. package/lib/services/config.service.d.ts.map +1 -0
  410. package/lib/services/config.service.js +171 -0
  411. package/lib/services/config.service.js.map +1 -0
  412. package/lib/services/index.d.ts +8 -0
  413. package/lib/services/index.d.ts.map +1 -0
  414. package/lib/services/index.js +9 -0
  415. package/lib/services/index.js.map +1 -0
  416. package/lib/services/medialuna.service.d.ts +173 -0
  417. package/lib/services/medialuna.service.d.ts.map +1 -0
  418. package/lib/services/medialuna.service.js +455 -0
  419. package/lib/services/medialuna.service.js.map +1 -0
  420. package/lib/services/preset.service.d.ts +69 -0
  421. package/lib/services/preset.service.d.ts.map +1 -0
  422. package/lib/services/preset.service.js +202 -0
  423. package/lib/services/preset.service.js.map +1 -0
  424. package/lib/services/remote-preset.service.d.ts +97 -0
  425. package/lib/services/remote-preset.service.d.ts.map +1 -0
  426. package/lib/services/remote-preset.service.js +212 -0
  427. package/lib/services/remote-preset.service.js.map +1 -0
  428. package/lib/services/task.service.d.ts +57 -0
  429. package/lib/services/task.service.d.ts.map +1 -0
  430. package/lib/services/task.service.js +138 -0
  431. package/lib/services/task.service.js.map +1 -0
  432. package/lib/types/index.d.ts +357 -0
  433. package/lib/types/index.d.ts.map +1 -0
  434. package/lib/types/index.js +21 -0
  435. package/lib/types/index.js.map +1 -0
  436. package/package.json +66 -0
  437. package/readme.md +326 -0
@@ -0,0 +1,493 @@
1
+ <template>
2
+ <div class="plugins-panel">
3
+ <!-- 加载状态 -->
4
+ <div v-if="loading" class="loading-state">
5
+ <k-icon name="sync" class="spin" />
6
+ <span>加载中...</span>
7
+ </div>
8
+
9
+ <!-- 空状态 -->
10
+ <div v-else-if="plugins.length === 0" class="empty-state">
11
+ <k-icon name="apps" />
12
+ <p>暂无扩展插件</p>
13
+ <p class="hint">第三方扩展插件将在这里显示<br>内置功能请在"功能模块"中配置</p>
14
+ </div>
15
+
16
+ <!-- 插件列表 -->
17
+ <template v-else>
18
+ <div class="plugins-list">
19
+ <div
20
+ v-for="plugin in plugins"
21
+ :key="plugin.id"
22
+ class="plugin-card"
23
+ :class="{ active: selectedPlugin?.id === plugin.id, disabled: !plugin.enabled }"
24
+ @click="selectPlugin(plugin)"
25
+ >
26
+ <div class="plugin-info">
27
+ <div class="plugin-header">
28
+ <span class="plugin-name">{{ plugin.name }}</span>
29
+ <span v-if="plugin.version" class="plugin-version">v{{ plugin.version }}</span>
30
+ </div>
31
+ <p class="plugin-description">{{ plugin.description || '暂无描述' }}</p>
32
+ </div>
33
+ <div class="plugin-status">
34
+ <span v-if="plugin.connector" class="plugin-badge connector">连接器</span>
35
+ <span v-if="plugin.middlewares?.length" class="plugin-badge middleware">
36
+ {{ plugin.middlewares.length }} 个中间件
37
+ </span>
38
+ <k-icon
39
+ :name="plugin.enabled ? 'check-circle' : 'close-circle'"
40
+ :class="plugin.enabled ? 'enabled' : 'disabled'"
41
+ />
42
+ </div>
43
+ </div>
44
+ </div>
45
+
46
+ <!-- 插件详情 -->
47
+ <div v-if="selectedPlugin" class="plugin-detail">
48
+ <header class="detail-header">
49
+ <div class="header-left">
50
+ <h3>{{ selectedPlugin.name }}</h3>
51
+ <span v-if="selectedPlugin.version" class="version">v{{ selectedPlugin.version }}</span>
52
+ </div>
53
+ <div class="header-actions">
54
+ <k-button
55
+ v-for="action in selectedPlugin.actions"
56
+ :key="action.name"
57
+ :type="action.type || 'default'"
58
+ size="small"
59
+ @click="executeAction(action)"
60
+ >
61
+ <template v-if="action.icon" #icon>
62
+ <k-icon :name="action.icon" />
63
+ </template>
64
+ {{ action.label }}
65
+ </k-button>
66
+ </div>
67
+ </header>
68
+
69
+ <!-- 连接器信息 -->
70
+ <div v-if="selectedPlugin.connector" class="connector-info">
71
+ <h4>连接器</h4>
72
+ <div class="connector-meta">
73
+ <span class="connector-id">{{ selectedPlugin.connector.id }}</span>
74
+ <span class="connector-types">
75
+ 支持: {{ selectedPlugin.connector.supportedTypes?.join(', ') || '无' }}
76
+ </span>
77
+ </div>
78
+ </div>
79
+
80
+ <!-- 中间件列表 -->
81
+ <div v-if="selectedPlugin.middlewares?.length" class="middlewares-list">
82
+ <h4>中间件</h4>
83
+ <div class="middleware-tags">
84
+ <span
85
+ v-for="mw in selectedPlugin.middlewares"
86
+ :key="mw.name"
87
+ class="middleware-tag"
88
+ :class="{ enabled: mw.enabled }"
89
+ >
90
+ {{ mw.displayName || mw.name }}
91
+ <span class="phase-badge">{{ phaseLabel(mw.phase) }}</span>
92
+ </span>
93
+ </div>
94
+ </div>
95
+
96
+ <!-- 配置表单 -->
97
+ <div v-if="selectedPlugin.configFields?.length" class="config-section">
98
+ <h4>配置</h4>
99
+ <ConfigRenderer
100
+ :fields="selectedPlugin.configFields"
101
+ v-model="pluginConfig"
102
+ />
103
+ <div class="config-actions">
104
+ <k-button type="primary" @click="saveConfig" :loading="saving">
105
+ <template #icon><k-icon name="save" /></template>
106
+ 保存配置
107
+ </k-button>
108
+ </div>
109
+ </div>
110
+
111
+ <!-- 无配置提示 -->
112
+ <div v-else class="no-config">
113
+ <k-icon name="info-circle" />
114
+ <span>该插件暂无可配置项</span>
115
+ </div>
116
+ </div>
117
+
118
+ <!-- 无选中提示 -->
119
+ <div v-else class="no-selection">
120
+ <k-icon name="apps" />
121
+ <p>请从左侧选择一个插件查看详情</p>
122
+ </div>
123
+ </template>
124
+ </div>
125
+ </template>
126
+
127
+ <script setup lang="ts">
128
+ import { ref, onMounted } from 'vue'
129
+ import { message } from '@koishijs/client'
130
+ import { pluginApi, PluginInfo } from '../../api'
131
+ import ConfigRenderer from '../ConfigRenderer.vue'
132
+
133
+ // 状态
134
+ const loading = ref(true)
135
+ const plugins = ref<PluginInfo[]>([])
136
+ const selectedPlugin = ref<PluginInfo | null>(null)
137
+ const pluginConfig = ref<Record<string, any>>({})
138
+ const saving = ref(false)
139
+
140
+ // 阶段标签映射
141
+ const phaseLabels: Record<string, string> = {
142
+ 'lifecycle-prepare': '准备',
143
+ 'lifecycle-pre-request': '前置',
144
+ 'lifecycle-request': '请求',
145
+ 'lifecycle-post-request': '后置',
146
+ 'lifecycle-finalize': '完成'
147
+ }
148
+
149
+ const phaseLabel = (phase: string) => phaseLabels[phase] || phase
150
+
151
+ // 加载插件列表
152
+ const loadPlugins = async () => {
153
+ try {
154
+ loading.value = true
155
+ plugins.value = await pluginApi.list()
156
+ } catch (e) {
157
+ console.error('Failed to load plugins:', e)
158
+ plugins.value = []
159
+ } finally {
160
+ loading.value = false
161
+ }
162
+ }
163
+
164
+ // 选择插件
165
+ const selectPlugin = (plugin: PluginInfo) => {
166
+ selectedPlugin.value = plugin
167
+ pluginConfig.value = { ...plugin.config }
168
+ // 填充默认值
169
+ for (const field of plugin.configFields || []) {
170
+ if (pluginConfig.value[field.key] === undefined && field.default !== undefined) {
171
+ pluginConfig.value[field.key] = field.default
172
+ }
173
+ }
174
+ }
175
+
176
+ // 保存配置
177
+ const saveConfig = async () => {
178
+ if (!selectedPlugin.value) return
179
+ saving.value = true
180
+ try {
181
+ await pluginApi.updateConfig(selectedPlugin.value.id, pluginConfig.value)
182
+ message.success('保存成功')
183
+ await loadPlugins()
184
+ // 更新当前选中的插件
185
+ const updated = plugins.value.find(p => p.id === selectedPlugin.value?.id)
186
+ if (updated) {
187
+ selectedPlugin.value = updated
188
+ pluginConfig.value = { ...updated.config }
189
+ }
190
+ } catch (e) {
191
+ message.error('保存失败')
192
+ } finally {
193
+ saving.value = false
194
+ }
195
+ }
196
+
197
+ // 执行操作
198
+ const executeAction = async (action: { apiEvent: string; label: string }) => {
199
+ try {
200
+ // 操作使用通用的 API 格式
201
+ const { send } = await import('@koishijs/client')
202
+ const result = await send(action.apiEvent as any) as any
203
+ if (result?.success === false) {
204
+ throw new Error(result.error || '操作失败')
205
+ }
206
+ // 特殊处理同步结果
207
+ if (action.apiEvent === 'media-luna/presets/sync' && result?.data) {
208
+ const { added, updated, removed, notModified } = result.data
209
+ if (notModified) {
210
+ message.info('数据未变化,无需更新')
211
+ } else {
212
+ message.success(`同步完成:新增 ${added},更新 ${updated},删除 ${removed}`)
213
+ }
214
+ } else if (result?.data?.message) {
215
+ message.success(result.data.message)
216
+ } else {
217
+ message.success(`${action.label} 完成`)
218
+ }
219
+ await loadPlugins()
220
+ } catch (e) {
221
+ message.error(`${action.label} 失败: ${e instanceof Error ? e.message : '未知错误'}`)
222
+ }
223
+ }
224
+
225
+ onMounted(loadPlugins)
226
+ </script>
227
+
228
+ <style scoped>
229
+ .plugins-panel {
230
+ display: flex;
231
+ gap: 1.5rem;
232
+ height: 100%;
233
+ }
234
+
235
+ .loading-state,
236
+ .empty-state {
237
+ display: flex;
238
+ flex-direction: column;
239
+ align-items: center;
240
+ justify-content: center;
241
+ gap: 12px;
242
+ padding: 3rem;
243
+ color: var(--k-color-text-description);
244
+ width: 100%;
245
+ }
246
+
247
+ .loading-state .k-icon,
248
+ .empty-state .k-icon {
249
+ font-size: 2rem;
250
+ opacity: 0.5;
251
+ }
252
+
253
+ .empty-state .hint {
254
+ font-size: 12px;
255
+ opacity: 0.7;
256
+ }
257
+
258
+ .spin {
259
+ animation: spin 1s linear infinite;
260
+ }
261
+
262
+ @keyframes spin {
263
+ to { transform: rotate(360deg); }
264
+ }
265
+
266
+ .plugins-list {
267
+ width: 280px;
268
+ flex-shrink: 0;
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 8px;
272
+ max-height: calc(100vh - 200px);
273
+ overflow-y: auto;
274
+ }
275
+
276
+ .plugin-card {
277
+ background: var(--k-card-bg);
278
+ border: 1px solid var(--k-color-border);
279
+ border-radius: 10px;
280
+ padding: 12px 14px;
281
+ cursor: pointer;
282
+ transition: all 0.2s;
283
+ }
284
+
285
+ .plugin-card:hover {
286
+ border-color: var(--k-color-active);
287
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
288
+ }
289
+
290
+ .plugin-card.active {
291
+ border-color: var(--k-color-active);
292
+ background: var(--k-color-active-bg);
293
+ }
294
+
295
+ .plugin-card.disabled {
296
+ opacity: 0.6;
297
+ }
298
+
299
+ .plugin-info {
300
+ margin-bottom: 8px;
301
+ }
302
+
303
+ .plugin-header {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: 6px;
307
+ margin-bottom: 4px;
308
+ }
309
+
310
+ .plugin-name {
311
+ font-weight: 500;
312
+ color: var(--k-color-text);
313
+ }
314
+
315
+ .plugin-version {
316
+ font-size: 11px;
317
+ color: var(--k-color-text-description);
318
+ background: var(--k-color-bg-2);
319
+ padding: 1px 6px;
320
+ border-radius: 4px;
321
+ }
322
+
323
+ .plugin-description {
324
+ font-size: 12px;
325
+ color: var(--k-color-text-description);
326
+ margin: 0;
327
+ line-height: 1.4;
328
+ display: -webkit-box;
329
+ -webkit-line-clamp: 2;
330
+ -webkit-box-orient: vertical;
331
+ overflow: hidden;
332
+ }
333
+
334
+ .plugin-status {
335
+ display: flex;
336
+ align-items: center;
337
+ gap: 6px;
338
+ flex-wrap: wrap;
339
+ }
340
+
341
+ .plugin-badge {
342
+ font-size: 10px;
343
+ padding: 2px 6px;
344
+ border-radius: 4px;
345
+ background: var(--k-color-bg-2);
346
+ color: var(--k-color-text-description);
347
+ }
348
+
349
+ .plugin-badge.connector {
350
+ background: rgba(var(--k-color-active-rgb), 0.15);
351
+ color: var(--k-color-active);
352
+ }
353
+
354
+ .plugin-badge.middleware {
355
+ background: rgba(var(--k-color-success-rgb), 0.15);
356
+ color: var(--k-color-success);
357
+ }
358
+
359
+ .plugin-status .k-icon {
360
+ margin-left: auto;
361
+ }
362
+
363
+ .plugin-status .enabled {
364
+ color: var(--k-color-success);
365
+ }
366
+
367
+ .plugin-status .disabled {
368
+ color: var(--k-color-text-description);
369
+ }
370
+
371
+ .plugin-detail {
372
+ flex: 1;
373
+ min-width: 0;
374
+ background: var(--k-card-bg);
375
+ border: 1px solid var(--k-color-border);
376
+ border-radius: 12px;
377
+ padding: 1.5rem;
378
+ overflow-y: auto;
379
+ max-height: calc(100vh - 200px);
380
+ }
381
+
382
+ .detail-header {
383
+ display: flex;
384
+ justify-content: space-between;
385
+ align-items: flex-start;
386
+ margin-bottom: 1.5rem;
387
+ padding-bottom: 1rem;
388
+ border-bottom: 1px solid var(--k-color-border);
389
+ }
390
+
391
+ .header-left {
392
+ display: flex;
393
+ align-items: center;
394
+ gap: 8px;
395
+ }
396
+
397
+ .header-left h3 {
398
+ margin: 0;
399
+ font-size: 1.1rem;
400
+ font-weight: 600;
401
+ }
402
+
403
+ .header-left .version {
404
+ font-size: 12px;
405
+ color: var(--k-color-text-description);
406
+ }
407
+
408
+ .header-actions {
409
+ display: flex;
410
+ gap: 8px;
411
+ }
412
+
413
+ .connector-info, .middlewares-list, .config-section {
414
+ margin-bottom: 1.5rem;
415
+ }
416
+
417
+ .connector-info h4, .middlewares-list h4, .config-section h4 {
418
+ font-size: 14px;
419
+ font-weight: 500;
420
+ color: var(--k-color-text);
421
+ margin: 0 0 0.75rem 0;
422
+ }
423
+
424
+ .connector-meta {
425
+ display: flex;
426
+ gap: 12px;
427
+ font-size: 13px;
428
+ color: var(--k-color-text-description);
429
+ }
430
+
431
+ .connector-id {
432
+ font-family: monospace;
433
+ background: var(--k-color-bg-2);
434
+ padding: 2px 8px;
435
+ border-radius: 4px;
436
+ }
437
+
438
+ .middleware-tags {
439
+ display: flex;
440
+ flex-wrap: wrap;
441
+ gap: 8px;
442
+ }
443
+
444
+ .middleware-tag {
445
+ display: inline-flex;
446
+ align-items: center;
447
+ gap: 6px;
448
+ padding: 4px 10px;
449
+ background: var(--k-color-bg-2);
450
+ border-radius: 6px;
451
+ font-size: 12px;
452
+ color: var(--k-color-text-description);
453
+ }
454
+
455
+ .middleware-tag.enabled {
456
+ color: var(--k-color-text);
457
+ }
458
+
459
+ .phase-badge {
460
+ font-size: 10px;
461
+ padding: 1px 4px;
462
+ background: var(--k-color-bg-1);
463
+ border-radius: 3px;
464
+ }
465
+
466
+ .config-actions {
467
+ margin-top: 1rem;
468
+ padding-top: 1rem;
469
+ border-top: 1px solid var(--k-color-border);
470
+ }
471
+
472
+ .no-config, .no-selection {
473
+ display: flex;
474
+ flex-direction: column;
475
+ align-items: center;
476
+ justify-content: center;
477
+ gap: 12px;
478
+ padding: 3rem;
479
+ color: var(--k-color-text-description);
480
+ }
481
+
482
+ .no-config .k-icon, .no-selection .k-icon {
483
+ font-size: 2rem;
484
+ opacity: 0.5;
485
+ }
486
+
487
+ .no-selection {
488
+ flex: 1;
489
+ background: var(--k-card-bg);
490
+ border: 1px solid var(--k-color-border);
491
+ border-radius: 12px;
492
+ }
493
+ </style>
@@ -0,0 +1,13 @@
1
+ import { Context } from '@koishijs/client'
2
+ import {} from 'koishi-plugin-media-luna'
3
+
4
+ import Index from './pages/index.vue'
5
+
6
+ export default (ctx: Context) => {
7
+ ctx.page({
8
+ name: 'Media Luna',
9
+ path: '/media-luna',
10
+ component: Index,
11
+ order: 500,
12
+ })
13
+ }
@@ -0,0 +1,177 @@
1
+ <template>
2
+ <k-layout class="app-layout media-luna-app">
3
+ <div class="top-nav">
4
+ <div class="nav-container">
5
+ <div class="logo-area"><span class="logo-text">MEDIA LUNA</span></div>
6
+ <div class="nav-tabs" role="tablist">
7
+ <div
8
+ v-for="item in menuItems"
9
+ :key="item.id"
10
+ class="nav-tab"
11
+ :class="{ active: currentView === item.id }"
12
+ @click="currentView = item.id"
13
+ role="tab"
14
+ :aria-selected="currentView === item.id"
15
+ >
16
+ <component :is="item.icon" class="tab-icon" />
17
+ <span>{{ item.label }}</span>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+
23
+ <div class="main-content">
24
+ <keep-alive>
25
+ <component :is="activeComponent" />
26
+ </keep-alive>
27
+ </div>
28
+ </k-layout>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { ref, computed, onMounted, onBeforeUnmount, h } from 'vue'
33
+ import ChannelsView from '../components/ChannelsView.vue'
34
+ import PresetsView from '../components/PresetsView.vue'
35
+ import TasksView from '../components/TasksView.vue'
36
+ import GenerateView from '../components/GenerateView.vue'
37
+ import SettingsView from '../components/SettingsView.vue'
38
+
39
+ const currentView = ref('generate')
40
+
41
+ const activeComponent = computed(() => {
42
+ switch (currentView.value) {
43
+ case 'generate': return GenerateView
44
+ case 'channels': return ChannelsView
45
+ case 'presets': return PresetsView
46
+ case 'tasks': return TasksView
47
+ case 'settings': return SettingsView
48
+ default: return GenerateView
49
+ }
50
+ })
51
+
52
+ const createIcon = (d: string) => () => h('svg', { viewBox: '0 0 24 24', fill: 'currentColor' }, [ h('path', { d }) ])
53
+
54
+ const menuItems = [
55
+ { id: 'generate', label: '生成', icon: createIcon('M7.5 5.6L10 7 8.6 4.5 10 2 7.5 3.4 5 2 6.4 4.5 5 7zM19 2l-2.5 1.4L14 2l1.4 2.5L14 7l2.5-1.4L19 7l-1.4-2.5zm-5.6 5.4L9 12l4.4 4.6L17.8 12zM2 13l2.5 1.4L6 17l1.4-2.5L10 13 7.5 11.6 6 9l-1.4 2.5z') },
56
+ { id: 'channels', label: '渠道', icon: createIcon('M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z') },
57
+ { id: 'presets', label: '预设', icon: createIcon('M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z') },
58
+ { id: 'tasks', label: '任务', icon: createIcon('M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z') },
59
+ { id: 'settings', label: '设置', icon: createIcon('M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.58 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z') },
60
+ ]
61
+
62
+ // Logic to hide Koishi's default header
63
+ let prevHeaderDisplay = ''
64
+ function hideHeader() {
65
+ const el = document.querySelector('.layout-header') as HTMLElement
66
+ if (el) { prevHeaderDisplay = el.style.display; el.style.display = 'none' }
67
+ }
68
+ function restoreHeader() {
69
+ const el = document.querySelector('.layout-header') as HTMLElement
70
+ if (el) el.style.display = prevHeaderDisplay || ''
71
+ }
72
+ onMounted(hideHeader)
73
+ onBeforeUnmount(restoreHeader)
74
+ </script>
75
+
76
+ <style scoped>
77
+ .app-layout { background: var(--k-color-bg-1); height: 100vh; min-height: 0; }
78
+ .top-nav { position: sticky; top: 0; z-index: 10; background: var(--k-color-bg-2); border-bottom: 1px solid var(--k-color-border); height: 50px; }
79
+ .nav-container { max-width: 1200px; margin: 0 auto; padding: 0 20px; height: 50px; display: flex; flex-direction: row; align-items: center; gap: 16px; }
80
+ .nav-tabs { display: flex; flex-direction: row; gap: 8px; margin-left: auto; }
81
+ .nav-tab { display: inline-flex; flex-direction: row; align-items: center; gap: 6px; padding: 6px 12px; cursor: pointer; color: var(--k-color-text-description); border-bottom: 2px solid transparent; transition: color .15s ease, border-color .15s ease; white-space: nowrap; }
82
+ .nav-tab:hover { color: var(--k-color-text); }
83
+ .nav-tab.active { color: var(--k-color-active); border-bottom-color: var(--k-color-active); font-weight: 600; }
84
+ .tab-icon { display: inline-flex; font-size: 14px; width: 14px; height: 14px; flex-shrink: 0; }
85
+ .main-content {
86
+ max-width: 1200px;
87
+ margin: 0 auto;
88
+ padding: 20px;
89
+ height: calc(100vh - 50px);
90
+ overflow: auto;
91
+ -webkit-overflow-scrolling: touch;
92
+ scrollbar-width: none;
93
+ -ms-overflow-style: none;
94
+ }
95
+ .main-content::-webkit-scrollbar {
96
+ width: 0;
97
+ height: 0;
98
+ }
99
+ .logo-area .logo-text { font-weight: 600; letter-spacing: .5px; color: var(--k-color-text); white-space: nowrap; }
100
+
101
+ /* Hide default Koishi console headers */
102
+ .app-layout :deep(.k-header),
103
+ .app-layout :deep(.k-view-header),
104
+ .app-layout :deep(.k-page-header),
105
+ .app-layout :deep(.k-toolbar) { display: none !important; height: 0 !important; margin: 0 !important; padding: 0 !important; }
106
+ </style>
107
+
108
+ <style>
109
+ /* Global Element Plus Overrides */
110
+ .el-dialog {
111
+ background-color: var(--k-card-bg) !important;
112
+ border-radius: 12px !important;
113
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
114
+ border: 1px solid var(--k-color-border) !important;
115
+ --el-dialog-bg-color: var(--k-card-bg) !important;
116
+ }
117
+
118
+ .el-dialog__header {
119
+ padding: 1.25rem 1.5rem !important;
120
+ border-bottom: 1px solid var(--k-color-border) !important;
121
+ margin-right: 0 !important;
122
+ }
123
+
124
+ .el-dialog__title {
125
+ font-weight: 600 !important;
126
+ color: var(--k-color-text) !important;
127
+ font-size: 1.1rem !important;
128
+ }
129
+
130
+ .el-dialog__headerbtn {
131
+ top: 1.25rem !important;
132
+ }
133
+
134
+ .el-dialog__body {
135
+ padding: 1.5rem !important;
136
+ color: var(--k-color-text) !important;
137
+ }
138
+
139
+ .el-dialog__footer {
140
+ padding: 1.25rem 1.5rem !important;
141
+ border-top: 1px solid var(--k-color-border) !important;
142
+ background-color: var(--k-color-bg-1) !important;
143
+ }
144
+
145
+ /* Fix Input Backgrounds in Dialogs */
146
+ .el-input__wrapper, .el-textarea__inner {
147
+ background-color: var(--k-color-bg-2) !important;
148
+ box-shadow: 0 0 0 1px var(--k-color-border) inset !important;
149
+ }
150
+
151
+ .el-input__wrapper:hover, .el-textarea__inner:hover {
152
+ box-shadow: 0 0 0 1px var(--k-color-active) inset !important;
153
+ }
154
+
155
+ .el-input__wrapper.is-focus, .el-textarea__inner:focus {
156
+ box-shadow: 0 0 0 1px var(--k-color-active) inset !important;
157
+ background-color: var(--k-color-bg-1) !important;
158
+ }
159
+
160
+ .el-input__inner {
161
+ color: var(--k-color-text) !important;
162
+ }
163
+
164
+ /* Fix Select Dropdown */
165
+ .el-select-dropdown__item {
166
+ color: var(--k-color-text) !important;
167
+ }
168
+
169
+ .el-select-dropdown__item.hover, .el-select-dropdown__item:hover {
170
+ background-color: var(--k-color-bg-2) !important;
171
+ }
172
+
173
+ .el-popper.is-light {
174
+ background: var(--k-card-bg) !important;
175
+ border: 1px solid var(--k-color-border) !important;
176
+ }
177
+ </style>