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,342 @@
1
+ // 远程预设同步服务
2
+ import { createPluginLogger } from '../../core';
3
+ /**
4
+ * 远程预设同步服务
5
+ */
6
+ export class RemoteSyncService {
7
+ _ctx;
8
+ _logger;
9
+ _presetService;
10
+ _getCacheService;
11
+ _syncDispose = null;
12
+ /** 存储每个 API URL 对应的 ETag */
13
+ _etagCache = new Map();
14
+ constructor(ctx, presetService, getCacheService) {
15
+ this._ctx = ctx;
16
+ this._logger = createPluginLogger(ctx.logger('media-luna'), 'remote-sync');
17
+ this._presetService = presetService;
18
+ this._getCacheService = getCacheService;
19
+ }
20
+ /** 从远程 API 拉取模板列表(支持 ETag 缓存) */
21
+ async fetchRemoteTemplates(apiUrl) {
22
+ // 检查 context 是否仍然有效
23
+ if (!this._ctx.scope.isActive) {
24
+ throw new Error('Context is inactive, cannot fetch remote templates');
25
+ }
26
+ const headers = {};
27
+ const cachedEtag = this._etagCache.get(apiUrl);
28
+ if (cachedEtag) {
29
+ headers['If-None-Match'] = cachedEtag;
30
+ this._logger.debug('Sending request with ETag: %s', cachedEtag);
31
+ }
32
+ try {
33
+ // 使用原生 fetch 以获取完整响应(包括 headers 和状态码)
34
+ const response = await fetch(apiUrl, {
35
+ method: 'GET',
36
+ headers,
37
+ signal: AbortSignal.timeout(30000)
38
+ });
39
+ // 处理 304 Not Modified
40
+ if (response.status === 304) {
41
+ this._logger.info('Remote data not modified (304)');
42
+ return {
43
+ templates: [],
44
+ notModified: true
45
+ };
46
+ }
47
+ if (!response.ok) {
48
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
49
+ }
50
+ // 保存新的 ETag
51
+ const newEtag = response.headers.get('etag');
52
+ if (newEtag) {
53
+ this._etagCache.set(apiUrl, newEtag);
54
+ this._logger.debug('Saved new ETag: %s', newEtag);
55
+ }
56
+ const data = await response.json();
57
+ // 检查 API 响应格式
58
+ if (data.code !== undefined && data.code !== 200) {
59
+ throw new Error(`API returned error: ${data.message || 'Unknown error'}`);
60
+ }
61
+ return {
62
+ templates: data.data || [],
63
+ notModified: false,
64
+ etag: newEtag || undefined
65
+ };
66
+ }
67
+ catch (error) {
68
+ this._logger.error('Failed to fetch remote templates: %s', error);
69
+ throw error;
70
+ }
71
+ }
72
+ /** 将远程模板转换为本地预设数据(不含缓存处理) */
73
+ transformToPreset(template, remoteUrl) {
74
+ const referenceImagesRemote = template.refs
75
+ .filter(ref => !ref.is_placeholder)
76
+ .sort((a, b) => a.position - b.position)
77
+ .map(ref => ref.file_path);
78
+ const tags = [...new Set([template.type, ...template.tags].filter(Boolean))];
79
+ const thumbnailRemote = template.thumbnail_path || template.file_path || undefined;
80
+ return {
81
+ name: template.title,
82
+ promptTemplate: template.prompt,
83
+ tags,
84
+ // 初始时 referenceImages 为空,等缓存完成后更新
85
+ referenceImages: [],
86
+ referenceImagesRemote,
87
+ parameterOverrides: {},
88
+ source: 'api',
89
+ enabled: true,
90
+ remoteId: template.id,
91
+ remoteUrl,
92
+ // 初始时 thumbnail 为空,等缓存完成后更新
93
+ thumbnail: undefined,
94
+ thumbnailRemote
95
+ };
96
+ }
97
+ /**
98
+ * 缓存预设的图片资源(缩略图和参考图片)
99
+ * @param presetData 预设数据(需要包含 thumbnailRemote 和 referenceImagesRemote)
100
+ * @param thumbnailDelay 下载间隔(毫秒),用于限流
101
+ * @returns 更新后的预设数据(包含缓存后的 URL)
102
+ */
103
+ async cachePresetImages(presetData, thumbnailDelay = 100) {
104
+ // 检查 context 是否仍然有效
105
+ if (!this._ctx.scope.isActive) {
106
+ this._logger.debug('Context inactive, returning original preset data');
107
+ return {
108
+ ...presetData,
109
+ thumbnail: presetData.thumbnailRemote,
110
+ referenceImages: presetData.referenceImagesRemote || []
111
+ };
112
+ }
113
+ const cache = this._getCacheService();
114
+ // 如果缓存服务不可用,返回原数据(使用远程URL作为降级)
115
+ if (!cache || !cache.isEnabled()) {
116
+ this._logger.debug('Cache service not available, using remote URLs as fallback');
117
+ return {
118
+ ...presetData,
119
+ thumbnail: presetData.thumbnailRemote,
120
+ referenceImages: presetData.referenceImagesRemote || []
121
+ };
122
+ }
123
+ const result = { ...presetData };
124
+ const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
125
+ // 缓存缩略图
126
+ if (presetData.thumbnailRemote) {
127
+ try {
128
+ const cached = await cache.cacheFromUrl(presetData.thumbnailRemote);
129
+ result.thumbnail = cache.getUrl(cached.id) || presetData.thumbnailRemote;
130
+ this._logger.debug('Cached thumbnail: %s -> %s', presetData.thumbnailRemote, result.thumbnail);
131
+ }
132
+ catch (e) {
133
+ this._logger.warn('Failed to cache thumbnail %s: %s', presetData.thumbnailRemote, e);
134
+ // 降级使用远程URL
135
+ result.thumbnail = presetData.thumbnailRemote;
136
+ }
137
+ // 限流
138
+ if (thumbnailDelay > 0) {
139
+ await delay(thumbnailDelay);
140
+ }
141
+ }
142
+ // 缓存参考图片
143
+ const cachedReferenceImages = [];
144
+ for (const remoteUrl of presetData.referenceImagesRemote || []) {
145
+ try {
146
+ const cached = await cache.cacheFromUrl(remoteUrl);
147
+ const localUrl = cache.getUrl(cached.id) || remoteUrl;
148
+ cachedReferenceImages.push(localUrl);
149
+ this._logger.debug('Cached reference image: %s -> %s', remoteUrl, localUrl);
150
+ }
151
+ catch (e) {
152
+ this._logger.warn('Failed to cache reference image %s: %s', remoteUrl, e);
153
+ // 降级使用远程URL
154
+ cachedReferenceImages.push(remoteUrl);
155
+ }
156
+ // 限流
157
+ if (thumbnailDelay > 0) {
158
+ await delay(thumbnailDelay);
159
+ }
160
+ }
161
+ result.referenceImages = cachedReferenceImages;
162
+ return result;
163
+ }
164
+ /** 执行同步 */
165
+ async sync(apiUrl, deleteRemoved = false, thumbnailDelay = 100) {
166
+ const result = {
167
+ success: false,
168
+ added: 0,
169
+ updated: 0,
170
+ removed: 0,
171
+ errors: [],
172
+ notModified: false
173
+ };
174
+ // 检查 context 是否仍然有效
175
+ if (!this._ctx.scope.isActive) {
176
+ result.errors.push('Context is inactive, sync aborted');
177
+ this._logger.debug('Context inactive, skipping sync');
178
+ return result;
179
+ }
180
+ try {
181
+ this._logger.info('Starting sync from: %s', apiUrl);
182
+ const fetchResult = await this.fetchRemoteTemplates(apiUrl);
183
+ // 304 Not Modified - 数据未变化,直接返回成功
184
+ if (fetchResult.notModified) {
185
+ result.success = true;
186
+ result.notModified = true;
187
+ this._logger.info('Sync skipped: data not modified (304)');
188
+ return result;
189
+ }
190
+ const remoteTemplates = fetchResult.templates;
191
+ this._logger.info('Fetched %d templates from remote', remoteTemplates.length);
192
+ const localPresets = await this._presetService.listByRemoteUrl(apiUrl);
193
+ const remoteIds = new Set(remoteTemplates.map(t => t.id));
194
+ for (const template of remoteTemplates) {
195
+ try {
196
+ // 转换为预设数据
197
+ let presetData = this.transformToPreset(template, apiUrl);
198
+ // 检查是否需要重新缓存图片
199
+ const existing = await this._presetService.getByRemoteId(template.id, apiUrl);
200
+ const needsCaching = this._needsImageCaching(existing, presetData);
201
+ if (needsCaching) {
202
+ // 缓存图片资源
203
+ presetData = await this.cachePresetImages(presetData, thumbnailDelay);
204
+ this._logger.debug('Cached images for preset: %s', template.title);
205
+ }
206
+ else if (existing) {
207
+ // 保留已有的缓存URL
208
+ presetData.thumbnail = existing.thumbnail;
209
+ presetData.referenceImages = existing.referenceImages;
210
+ }
211
+ if (existing) {
212
+ await this._presetService.update(existing.id, presetData);
213
+ result.updated++;
214
+ this._logger.debug('Updated preset: %s', template.title);
215
+ }
216
+ else {
217
+ await this._presetService.create(presetData);
218
+ result.added++;
219
+ this._logger.debug('Created preset: %s', template.title);
220
+ }
221
+ }
222
+ catch (error) {
223
+ const message = `Failed to sync template ${template.id}: ${error instanceof Error ? error.message : String(error)}`;
224
+ result.errors.push(message);
225
+ this._logger.warn(message);
226
+ }
227
+ }
228
+ if (deleteRemoved) {
229
+ for (const preset of localPresets) {
230
+ if (preset.remoteId && !remoteIds.has(preset.remoteId)) {
231
+ try {
232
+ await this._presetService.delete(preset.id);
233
+ result.removed++;
234
+ this._logger.debug('Deleted preset: %s', preset.name);
235
+ }
236
+ catch (error) {
237
+ const message = `Failed to delete preset ${preset.id}: ${error instanceof Error ? error.message : String(error)}`;
238
+ result.errors.push(message);
239
+ }
240
+ }
241
+ }
242
+ }
243
+ result.success = result.errors.length === 0;
244
+ this._logger.info('Sync completed: %d added, %d updated, %d removed', result.added, result.updated, result.removed);
245
+ return result;
246
+ }
247
+ catch (error) {
248
+ result.errors.push(error instanceof Error ? error.message : String(error));
249
+ this._logger.error('Sync failed: %s', error);
250
+ return result;
251
+ }
252
+ }
253
+ /**
254
+ * 判断是否需要重新缓存图片
255
+ * - 新预设需要缓存
256
+ * - 远程URL变化需要重新缓存
257
+ * - 本地缓存URL为空需要缓存
258
+ */
259
+ _needsImageCaching(existing, newData) {
260
+ // 新预设需要缓存
261
+ if (!existing)
262
+ return true;
263
+ // 缩略图远程URL变化
264
+ if (existing.thumbnailRemote !== newData.thumbnailRemote)
265
+ return true;
266
+ // 参考图片远程URL变化
267
+ const existingRemote = existing.referenceImagesRemote || [];
268
+ const newRemote = newData.referenceImagesRemote || [];
269
+ if (existingRemote.length !== newRemote.length)
270
+ return true;
271
+ if (!existingRemote.every((url, i) => url === newRemote[i]))
272
+ return true;
273
+ // 本地缓存URL为空(之前缓存失败或未缓存)
274
+ if (newData.thumbnailRemote && !existing.thumbnail)
275
+ return true;
276
+ if (newRemote.length > 0 && existing.referenceImages.length === 0)
277
+ return true;
278
+ return false;
279
+ }
280
+ /** 启动定时同步 */
281
+ startAutoSync(config) {
282
+ this.stopAutoSync();
283
+ if (!config.autoSync || config.syncInterval <= 0 || !config.apiUrl) {
284
+ return;
285
+ }
286
+ const intervalMs = config.syncInterval * 60 * 1000;
287
+ const thumbnailDelay = config.thumbnailDelay || 100;
288
+ this._logger.info('Starting auto sync every %d minutes', config.syncInterval);
289
+ // 立即执行一次同步(延迟执行以确保服务初始化完成)
290
+ const initialSyncTimer = setTimeout(() => {
291
+ // 检查 context 是否仍然有效
292
+ if (!this._ctx.scope.isActive) {
293
+ this._logger.debug('Context inactive, skipping initial sync');
294
+ return;
295
+ }
296
+ this.sync(config.apiUrl, config.deleteRemoved, thumbnailDelay).catch(e => {
297
+ this._logger.error('Initial sync failed: %s', e);
298
+ });
299
+ }, 3000);
300
+ // 使用原生 setInterval 并手动管理
301
+ const intervalId = setInterval(() => {
302
+ // 检查 context 是否仍然有效
303
+ if (!this._ctx.scope.isActive) {
304
+ this._logger.debug('Context inactive, stopping scheduled sync');
305
+ clearInterval(intervalId);
306
+ return;
307
+ }
308
+ this.sync(config.apiUrl, config.deleteRemoved, thumbnailDelay).catch(e => {
309
+ this._logger.error('Scheduled sync failed: %s', e);
310
+ });
311
+ }, intervalMs);
312
+ // 保存清理函数
313
+ this._syncDispose = () => {
314
+ clearTimeout(initialSyncTimer);
315
+ clearInterval(intervalId);
316
+ };
317
+ }
318
+ /** 停止定时同步 */
319
+ stopAutoSync() {
320
+ if (this._syncDispose) {
321
+ this._syncDispose();
322
+ this._syncDispose = null;
323
+ this._logger.info('Auto sync stopped');
324
+ }
325
+ }
326
+ /** 清除 ETag 缓存(强制下次完整拉取) */
327
+ clearEtagCache(apiUrl) {
328
+ if (apiUrl) {
329
+ this._etagCache.delete(apiUrl);
330
+ }
331
+ else {
332
+ this._etagCache.clear();
333
+ }
334
+ this._logger.debug('ETag cache cleared');
335
+ }
336
+ /** 销毁服务 */
337
+ dispose() {
338
+ this.stopAutoSync();
339
+ this._etagCache.clear();
340
+ }
341
+ }
342
+ //# sourceMappingURL=remote-sync.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-sync.service.js","sourceRoot":"","sources":["../../../src/plugins/preset/remote-sync.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { Context } from 'koishi';
2
+ /** 预设数据 */
3
+ export interface PresetData {
4
+ id: number;
5
+ name: string;
6
+ promptTemplate: string;
7
+ tags: string[];
8
+ /** 参考图片URL数组(本地缓存后为本地URL) */
9
+ referenceImages: string[];
10
+ /** 原始远程参考图片URL数组 */
11
+ referenceImagesRemote?: string[];
12
+ parameterOverrides: Record<string, any>;
13
+ source: 'api' | 'user';
14
+ enabled: boolean;
15
+ remoteId?: number;
16
+ remoteUrl?: string;
17
+ /** 缩略图URL(本地缓存后为本地URL) */
18
+ thumbnail?: string;
19
+ /** 原始远程缩略图URL */
20
+ thumbnailRemote?: string;
21
+ }
22
+ /**
23
+ * 预设服务
24
+ *
25
+ * 管理预设的 CRUD 操作
26
+ */
27
+ export declare class PresetService {
28
+ private _ctx;
29
+ private _logger;
30
+ constructor(ctx: Context);
31
+ /** 将数据库记录转换为 PresetData */
32
+ private _toData;
33
+ /** 获取所有预设 */
34
+ list(): Promise<PresetData[]>;
35
+ /** 获取启用的预设 */
36
+ listEnabled(): Promise<PresetData[]>;
37
+ /** 根据 ID 获取预设 */
38
+ getById(id: number): Promise<PresetData | null>;
39
+ /** 根据名称获取预设 */
40
+ getByName(name: string): Promise<PresetData | null>;
41
+ /** 根据远程 ID 和 URL 获取预设 */
42
+ getByRemoteId(remoteId: number, remoteUrl: string): Promise<PresetData | null>;
43
+ /** 获取指定远程源的所有预设 */
44
+ listByRemoteUrl(remoteUrl: string): Promise<PresetData[]>;
45
+ /** 根据标签获取预设(匹配任意一个标签) */
46
+ getByTags(tags: string[]): Promise<PresetData[]>;
47
+ /** 根据标签获取预设(匹配所有标签) */
48
+ getByAllTags(tags: string[]): Promise<PresetData[]>;
49
+ /** 获取所有唯一标签 */
50
+ getAllTags(): Promise<string[]>;
51
+ /** 根据渠道标签获取匹配的预设 */
52
+ getMatchingPresets(channelTags: string[]): Promise<PresetData[]>;
53
+ /** 生成唯一名称 */
54
+ private _generateUniqueName;
55
+ /** 创建预设 */
56
+ create(data: Omit<PresetData, 'id'>): Promise<PresetData>;
57
+ /** 更新预设 */
58
+ update(id: number, data: Partial<Omit<PresetData, 'id'>>): Promise<PresetData | null>;
59
+ /** 删除预设 */
60
+ delete(id: number): Promise<boolean>;
61
+ /** 批量导入预设 */
62
+ bulkUpsert(presets: Array<Omit<PresetData, 'id'>>, source?: 'api' | 'user'): Promise<number>;
63
+ }
64
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/plugins/preset/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AA2BhC,WAAW;AACX,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,6BAA6B;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,oBAAoB;IACpB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;IAChC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACvC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAc;gBAEjB,GAAG,EAAE,OAAO;IAKxB,2BAA2B;IAC3B,OAAO,CAAC,OAAO;IAmBf,aAAa;IACP,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKnC,cAAc;IACR,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAK1C,iBAAiB;IACX,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKrD,eAAe;IACT,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKzD,yBAAyB;IACnB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAKpF,mBAAmB;IACb,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAK/D,yBAAyB;IACnB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOtD,uBAAuB;IACjB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOzD,eAAe;IACT,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUrC,oBAAoB;IACd,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOtE,aAAa;YACC,mBAAmB;IAcjC,WAAW;IACL,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB/D,WAAW;IACL,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA8B3F,WAAW;IACL,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1C,aAAa;IACP,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB1G"}
@@ -0,0 +1,196 @@
1
+ // 预设服务
2
+ import { createPluginLogger } from '../../core';
3
+ /**
4
+ * 预设服务
5
+ *
6
+ * 管理预设的 CRUD 操作
7
+ */
8
+ export class PresetService {
9
+ _ctx;
10
+ _logger;
11
+ constructor(ctx) {
12
+ this._ctx = ctx;
13
+ this._logger = createPluginLogger(ctx.logger('media-luna'), 'preset');
14
+ }
15
+ /** 将数据库记录转换为 PresetData */
16
+ _toData(record) {
17
+ const referenceImagesRemote = JSON.parse(record.referenceImagesRemote || '[]');
18
+ return {
19
+ id: record.id,
20
+ name: record.name,
21
+ promptTemplate: record.promptTemplate,
22
+ tags: JSON.parse(record.tags || '[]'),
23
+ referenceImages: JSON.parse(record.referenceImages || '[]'),
24
+ referenceImagesRemote: referenceImagesRemote.length > 0 ? referenceImagesRemote : undefined,
25
+ parameterOverrides: JSON.parse(record.parameterOverrides || '{}'),
26
+ source: record.source,
27
+ enabled: record.enabled,
28
+ remoteId: record.remoteId,
29
+ remoteUrl: record.remoteUrl,
30
+ thumbnail: record.thumbnail,
31
+ thumbnailRemote: record.thumbnailRemote
32
+ };
33
+ }
34
+ /** 获取所有预设 */
35
+ async list() {
36
+ const records = await this._ctx.database.get('medialuna_preset', {});
37
+ return records.map(r => this._toData(r));
38
+ }
39
+ /** 获取启用的预设 */
40
+ async listEnabled() {
41
+ const records = await this._ctx.database.get('medialuna_preset', { enabled: true });
42
+ return records.map(r => this._toData(r));
43
+ }
44
+ /** 根据 ID 获取预设 */
45
+ async getById(id) {
46
+ const records = await this._ctx.database.get('medialuna_preset', { id });
47
+ return records.length > 0 ? this._toData(records[0]) : null;
48
+ }
49
+ /** 根据名称获取预设 */
50
+ async getByName(name) {
51
+ const records = await this._ctx.database.get('medialuna_preset', { name });
52
+ return records.length > 0 ? this._toData(records[0]) : null;
53
+ }
54
+ /** 根据远程 ID 和 URL 获取预设 */
55
+ async getByRemoteId(remoteId, remoteUrl) {
56
+ const records = await this._ctx.database.get('medialuna_preset', { remoteId, remoteUrl });
57
+ return records.length > 0 ? this._toData(records[0]) : null;
58
+ }
59
+ /** 获取指定远程源的所有预设 */
60
+ async listByRemoteUrl(remoteUrl) {
61
+ const records = await this._ctx.database.get('medialuna_preset', { remoteUrl, source: 'api' });
62
+ return records.map(r => this._toData(r));
63
+ }
64
+ /** 根据标签获取预设(匹配任意一个标签) */
65
+ async getByTags(tags) {
66
+ const records = await this._ctx.database.get('medialuna_preset', { enabled: true });
67
+ return records
68
+ .map(r => this._toData(r))
69
+ .filter(p => tags.some(tag => p.tags.includes(tag)));
70
+ }
71
+ /** 根据标签获取预设(匹配所有标签) */
72
+ async getByAllTags(tags) {
73
+ const records = await this._ctx.database.get('medialuna_preset', { enabled: true });
74
+ return records
75
+ .map(r => this._toData(r))
76
+ .filter(p => tags.every(tag => p.tags.includes(tag)));
77
+ }
78
+ /** 获取所有唯一标签 */
79
+ async getAllTags() {
80
+ const records = await this._ctx.database.get('medialuna_preset', {});
81
+ const tagSet = new Set();
82
+ for (const record of records) {
83
+ const tags = JSON.parse(record.tags || '[]');
84
+ tags.forEach(tag => tagSet.add(tag));
85
+ }
86
+ return Array.from(tagSet).sort();
87
+ }
88
+ /** 根据渠道标签获取匹配的预设 */
89
+ async getMatchingPresets(channelTags) {
90
+ if (channelTags.length === 0) {
91
+ return this.listEnabled();
92
+ }
93
+ return this.getByTags(channelTags);
94
+ }
95
+ /** 生成唯一名称 */
96
+ async _generateUniqueName(baseName, excludeId) {
97
+ let name = baseName;
98
+ let counter = 1;
99
+ while (true) {
100
+ const existing = await this.getByName(name);
101
+ if (!existing || existing.id === excludeId) {
102
+ return name;
103
+ }
104
+ counter++;
105
+ name = `${baseName}-${counter}`;
106
+ }
107
+ }
108
+ /** 创建预设 */
109
+ async create(data) {
110
+ const now = new Date();
111
+ const uniqueName = await this._generateUniqueName(data.name);
112
+ const record = await this._ctx.database.create('medialuna_preset', {
113
+ name: uniqueName,
114
+ displayName: uniqueName,
115
+ promptTemplate: data.promptTemplate,
116
+ tags: JSON.stringify(data.tags),
117
+ referenceImages: JSON.stringify(data.referenceImages),
118
+ referenceImagesRemote: JSON.stringify(data.referenceImagesRemote || []),
119
+ parameterOverrides: JSON.stringify(data.parameterOverrides),
120
+ source: data.source,
121
+ enabled: data.enabled,
122
+ remoteId: data.remoteId,
123
+ remoteUrl: data.remoteUrl,
124
+ thumbnail: data.thumbnail,
125
+ thumbnailRemote: data.thumbnailRemote,
126
+ createdAt: now,
127
+ updatedAt: now
128
+ });
129
+ return this._toData(record);
130
+ }
131
+ /** 更新预设 */
132
+ async update(id, data) {
133
+ const existing = await this.getById(id);
134
+ if (!existing)
135
+ return null;
136
+ const updateData = {
137
+ updatedAt: new Date()
138
+ };
139
+ if (data.name !== undefined) {
140
+ const uniqueName = await this._generateUniqueName(data.name, id);
141
+ updateData.name = uniqueName;
142
+ updateData.displayName = uniqueName;
143
+ }
144
+ if (data.promptTemplate !== undefined)
145
+ updateData.promptTemplate = data.promptTemplate;
146
+ if (data.tags !== undefined)
147
+ updateData.tags = JSON.stringify(data.tags);
148
+ if (data.referenceImages !== undefined)
149
+ updateData.referenceImages = JSON.stringify(data.referenceImages);
150
+ if (data.referenceImagesRemote !== undefined)
151
+ updateData.referenceImagesRemote = JSON.stringify(data.referenceImagesRemote);
152
+ if (data.parameterOverrides !== undefined)
153
+ updateData.parameterOverrides = JSON.stringify(data.parameterOverrides);
154
+ if (data.source !== undefined)
155
+ updateData.source = data.source;
156
+ if (data.enabled !== undefined)
157
+ updateData.enabled = data.enabled;
158
+ if (data.remoteId !== undefined)
159
+ updateData.remoteId = data.remoteId;
160
+ if (data.remoteUrl !== undefined)
161
+ updateData.remoteUrl = data.remoteUrl;
162
+ if (data.thumbnail !== undefined)
163
+ updateData.thumbnail = data.thumbnail;
164
+ if (data.thumbnailRemote !== undefined)
165
+ updateData.thumbnailRemote = data.thumbnailRemote;
166
+ await this._ctx.database.set('medialuna_preset', { id }, updateData);
167
+ return this.getById(id);
168
+ }
169
+ /** 删除预设 */
170
+ async delete(id) {
171
+ const existing = await this.getById(id);
172
+ if (!existing)
173
+ return false;
174
+ await this._ctx.database.remove('medialuna_preset', { id });
175
+ return true;
176
+ }
177
+ /** 批量导入预设 */
178
+ async bulkUpsert(presets, source = 'api') {
179
+ let count = 0;
180
+ for (const preset of presets) {
181
+ const existing = await this.getByName(preset.name);
182
+ if (existing) {
183
+ if (existing.source === 'api') {
184
+ await this.update(existing.id, { ...preset, source });
185
+ count++;
186
+ }
187
+ }
188
+ else {
189
+ await this.create({ ...preset, source });
190
+ count++;
191
+ }
192
+ }
193
+ return count;
194
+ }
195
+ }
196
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/plugins/preset/service.ts"],"names":[],"mappings":"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"}