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.
- package/client/README.md +558 -0
- package/client/api.ts +256 -0
- package/client/components/ChannelConfigDialog.vue +1113 -0
- package/client/components/ChannelsView.vue +698 -0
- package/client/components/ConfigRenderer.vue +164 -0
- package/client/components/EmptyState.vue +87 -0
- package/client/components/GenerateView.vue +778 -0
- package/client/components/HistoryGallery.vue +590 -0
- package/client/components/ImageLightbox.vue +510 -0
- package/client/components/ImageUpload.vue +298 -0
- package/client/components/JsonEditor.vue +68 -0
- package/client/components/LoadingState.vue +73 -0
- package/client/components/PresetsView.vue +800 -0
- package/client/components/ScrollContainer.vue +45 -0
- package/client/components/SettingsView.vue +231 -0
- package/client/components/StatusBadge.vue +55 -0
- package/client/components/TagFilter.vue +139 -0
- package/client/components/TagInput.vue +63 -0
- package/client/components/TasksView.vue +1074 -0
- package/client/components/ViewModeSwitch.vue +78 -0
- package/client/components/settings/CachePanel.vue +142 -0
- package/client/components/settings/MiddlewaresPanel.vue +480 -0
- package/client/components/settings/PluginsPanel.vue +493 -0
- package/client/index.ts +13 -0
- package/client/pages/index.vue +177 -0
- package/client/styles/shared.css +258 -0
- package/client/types.ts +158 -0
- package/client/utils/format.ts +72 -0
- package/dist/index.js +1 -0
- package/dist/style.css +1 -0
- package/lib/api/README.md +643 -0
- package/lib/api/cache-api.d.ts +6 -0
- package/lib/api/cache-api.d.ts.map +1 -0
- package/lib/api/cache-api.js +147 -0
- package/lib/api/cache-api.js.map +1 -0
- package/lib/api/channel-api.d.ts +6 -0
- package/lib/api/channel-api.d.ts.map +1 -0
- package/lib/api/channel-api.js +148 -0
- package/lib/api/channel-api.js.map +1 -0
- package/lib/api/connector-api.d.ts +6 -0
- package/lib/api/connector-api.d.ts.map +1 -0
- package/lib/api/connector-api.js +63 -0
- package/lib/api/connector-api.js.map +1 -0
- package/lib/api/generate-api.d.ts +6 -0
- package/lib/api/generate-api.d.ts.map +1 -0
- package/lib/api/generate-api.js +123 -0
- package/lib/api/generate-api.js.map +1 -0
- package/lib/api/index.d.ts +15 -0
- package/lib/api/index.d.ts.map +1 -0
- package/lib/api/index.js +34 -0
- package/lib/api/index.js.map +1 -0
- package/lib/api/middleware-api.d.ts +6 -0
- package/lib/api/middleware-api.d.ts.map +1 -0
- package/lib/api/middleware-api.js +212 -0
- package/lib/api/middleware-api.js.map +1 -0
- package/lib/api/plugin-api.d.ts +6 -0
- package/lib/api/plugin-api.d.ts.map +1 -0
- package/lib/api/plugin-api.js +78 -0
- package/lib/api/plugin-api.js.map +1 -0
- package/lib/api/preset-api.d.ts +6 -0
- package/lib/api/preset-api.d.ts.map +1 -0
- package/lib/api/preset-api.js +256 -0
- package/lib/api/preset-api.js.map +1 -0
- package/lib/api/settings-api.d.ts +6 -0
- package/lib/api/settings-api.d.ts.map +1 -0
- package/lib/api/settings-api.js +118 -0
- package/lib/api/settings-api.js.map +1 -0
- package/lib/api/task-api.d.ts +6 -0
- package/lib/api/task-api.d.ts.map +1 -0
- package/lib/api/task-api.js +148 -0
- package/lib/api/task-api.js.map +1 -0
- package/lib/config.d.ts +6 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +8 -0
- package/lib/config.js.map +1 -0
- package/lib/connectors/builtin/chat-api.d.ts +9 -0
- package/lib/connectors/builtin/chat-api.d.ts.map +1 -0
- package/lib/connectors/builtin/chat-api.js +351 -0
- package/lib/connectors/builtin/chat-api.js.map +1 -0
- package/lib/connectors/builtin/dalle.d.ts +6 -0
- package/lib/connectors/builtin/dalle.d.ts.map +1 -0
- package/lib/connectors/builtin/dalle.js +109 -0
- package/lib/connectors/builtin/dalle.js.map +1 -0
- package/lib/connectors/builtin/flux.d.ts +7 -0
- package/lib/connectors/builtin/flux.d.ts.map +1 -0
- package/lib/connectors/builtin/flux.js +199 -0
- package/lib/connectors/builtin/flux.js.map +1 -0
- package/lib/connectors/builtin/index.d.ts +5 -0
- package/lib/connectors/builtin/index.d.ts.map +1 -0
- package/lib/connectors/builtin/index.js +6 -0
- package/lib/connectors/builtin/index.js.map +1 -0
- package/lib/connectors/builtin/sd-webui.d.ts +7 -0
- package/lib/connectors/builtin/sd-webui.d.ts.map +1 -0
- package/lib/connectors/builtin/sd-webui.js +157 -0
- package/lib/connectors/builtin/sd-webui.js.map +1 -0
- package/lib/connectors/connector-registry.d.ts +36 -0
- package/lib/connectors/connector-registry.d.ts.map +1 -0
- package/lib/connectors/connector-registry.js +66 -0
- package/lib/connectors/connector-registry.js.map +1 -0
- package/lib/connectors/index.d.ts +3 -0
- package/lib/connectors/index.d.ts.map +1 -0
- package/lib/connectors/index.js +4 -0
- package/lib/connectors/index.js.map +1 -0
- package/lib/core/api/api-utils.d.ts +46 -0
- package/lib/core/api/api-utils.d.ts.map +1 -0
- package/lib/core/api/api-utils.js +78 -0
- package/lib/core/api/api-utils.js.map +1 -0
- package/lib/core/api/cache-api.d.ts +6 -0
- package/lib/core/api/cache-api.d.ts.map +1 -0
- package/lib/core/api/cache-api.js +147 -0
- package/lib/core/api/cache-api.js.map +1 -0
- package/lib/core/api/channel-api.d.ts +6 -0
- package/lib/core/api/channel-api.d.ts.map +1 -0
- package/lib/core/api/channel-api.js +146 -0
- package/lib/core/api/channel-api.js.map +1 -0
- package/lib/core/api/connector-api.d.ts +6 -0
- package/lib/core/api/connector-api.d.ts.map +1 -0
- package/lib/core/api/connector-api.js +63 -0
- package/lib/core/api/connector-api.js.map +1 -0
- package/lib/core/api/generate-api.d.ts +6 -0
- package/lib/core/api/generate-api.d.ts.map +1 -0
- package/lib/core/api/generate-api.js +124 -0
- package/lib/core/api/generate-api.js.map +1 -0
- package/lib/core/api/index.d.ts +16 -0
- package/lib/core/api/index.d.ts.map +1 -0
- package/lib/core/api/index.js +38 -0
- package/lib/core/api/index.js.map +1 -0
- package/lib/core/api/middleware-api.d.ts +6 -0
- package/lib/core/api/middleware-api.d.ts.map +1 -0
- package/lib/core/api/middleware-api.js +196 -0
- package/lib/core/api/middleware-api.js.map +1 -0
- package/lib/core/api/plugin-api.d.ts +6 -0
- package/lib/core/api/plugin-api.d.ts.map +1 -0
- package/lib/core/api/plugin-api.js +78 -0
- package/lib/core/api/plugin-api.js.map +1 -0
- package/lib/core/api/preset-api.d.ts +6 -0
- package/lib/core/api/preset-api.d.ts.map +1 -0
- package/lib/core/api/preset-api.js +272 -0
- package/lib/core/api/preset-api.js.map +1 -0
- package/lib/core/api/settings-api.d.ts +6 -0
- package/lib/core/api/settings-api.d.ts.map +1 -0
- package/lib/core/api/settings-api.js +118 -0
- package/lib/core/api/settings-api.js.map +1 -0
- package/lib/core/api/task-api.d.ts +6 -0
- package/lib/core/api/task-api.d.ts.map +1 -0
- package/lib/core/api/task-api.js +281 -0
- package/lib/core/api/task-api.js.map +1 -0
- package/lib/core/channel.service.d.ts +44 -0
- package/lib/core/channel.service.d.ts.map +1 -0
- package/lib/core/channel.service.js +146 -0
- package/lib/core/channel.service.js.map +1 -0
- package/lib/core/config/config.service.d.ts +89 -0
- package/lib/core/config/config.service.d.ts.map +1 -0
- package/lib/core/config/config.service.js +216 -0
- package/lib/core/config/config.service.js.map +1 -0
- package/lib/core/config/index.d.ts +3 -0
- package/lib/core/config/index.d.ts.map +1 -0
- package/lib/core/config/index.js +3 -0
- package/lib/core/config/index.js.map +1 -0
- package/lib/core/error.d.ts +73 -0
- package/lib/core/error.d.ts.map +1 -0
- package/lib/core/error.js +137 -0
- package/lib/core/error.js.map +1 -0
- package/lib/core/index.d.ts +12 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/index.js +23 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/logger.d.ts +18 -0
- package/lib/core/logger.d.ts.map +1 -0
- package/lib/core/logger.js +39 -0
- package/lib/core/logger.js.map +1 -0
- package/lib/core/medialuna.service.d.ts +168 -0
- package/lib/core/medialuna.service.d.ts.map +1 -0
- package/lib/core/medialuna.service.js +423 -0
- package/lib/core/medialuna.service.js.map +1 -0
- package/lib/core/pipeline/dependency-graph.d.ts +43 -0
- package/lib/core/pipeline/dependency-graph.d.ts.map +1 -0
- package/lib/core/pipeline/dependency-graph.js +223 -0
- package/lib/core/pipeline/dependency-graph.js.map +1 -0
- package/lib/core/pipeline/generation-pipeline.d.ts +40 -0
- package/lib/core/pipeline/generation-pipeline.d.ts.map +1 -0
- package/lib/core/pipeline/generation-pipeline.js +216 -0
- package/lib/core/pipeline/generation-pipeline.js.map +1 -0
- package/lib/core/pipeline/index.d.ts +4 -0
- package/lib/core/pipeline/index.d.ts.map +1 -0
- package/lib/core/pipeline/index.js +5 -0
- package/lib/core/pipeline/index.js.map +1 -0
- package/lib/core/pipeline/middleware-registry.d.ts +33 -0
- package/lib/core/pipeline/middleware-registry.d.ts.map +1 -0
- package/lib/core/pipeline/middleware-registry.js +78 -0
- package/lib/core/pipeline/middleware-registry.js.map +1 -0
- package/lib/core/plugin-loader.d.ts +77 -0
- package/lib/core/plugin-loader.d.ts.map +1 -0
- package/lib/core/plugin-loader.js +300 -0
- package/lib/core/plugin-loader.js.map +1 -0
- package/lib/core/registry/connector.registry.d.ts +36 -0
- package/lib/core/registry/connector.registry.d.ts.map +1 -0
- package/lib/core/registry/connector.registry.js +65 -0
- package/lib/core/registry/connector.registry.js.map +1 -0
- package/lib/core/registry/index.d.ts +3 -0
- package/lib/core/registry/index.d.ts.map +1 -0
- package/lib/core/registry/index.js +4 -0
- package/lib/core/registry/index.js.map +1 -0
- package/lib/core/registry/service.registry.d.ts +27 -0
- package/lib/core/registry/service.registry.d.ts.map +1 -0
- package/lib/core/registry/service.registry.js +54 -0
- package/lib/core/registry/service.registry.js.map +1 -0
- package/lib/core/request.service.d.ts +83 -0
- package/lib/core/request.service.d.ts.map +1 -0
- package/lib/core/request.service.js +237 -0
- package/lib/core/request.service.js.map +1 -0
- package/lib/core/types.d.ts +270 -0
- package/lib/core/types.d.ts.map +1 -0
- package/lib/core/types.js +17 -0
- package/lib/core/types.js.map +1 -0
- package/lib/database.d.ts +6 -0
- package/lib/database.d.ts.map +1 -0
- package/lib/database.js +89 -0
- package/lib/database.js.map +1 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +54 -0
- package/lib/index.js.map +1 -0
- package/lib/middlewares/builtin/billing.d.ts +45 -0
- package/lib/middlewares/builtin/billing.d.ts.map +1 -0
- package/lib/middlewares/builtin/billing.js +362 -0
- package/lib/middlewares/builtin/billing.js.map +1 -0
- package/lib/middlewares/builtin/index.d.ts +6 -0
- package/lib/middlewares/builtin/index.d.ts.map +1 -0
- package/lib/middlewares/builtin/index.js +7 -0
- package/lib/middlewares/builtin/index.js.map +1 -0
- package/lib/middlewares/builtin/preset.d.ts +14 -0
- package/lib/middlewares/builtin/preset.d.ts.map +1 -0
- package/lib/middlewares/builtin/preset.js +156 -0
- package/lib/middlewares/builtin/preset.js.map +1 -0
- package/lib/middlewares/builtin/remote-preset-sync.d.ts +8 -0
- package/lib/middlewares/builtin/remote-preset-sync.d.ts.map +1 -0
- package/lib/middlewares/builtin/remote-preset-sync.js +32 -0
- package/lib/middlewares/builtin/remote-preset-sync.js.map +1 -0
- package/lib/middlewares/builtin/request.d.ts +10 -0
- package/lib/middlewares/builtin/request.d.ts.map +1 -0
- package/lib/middlewares/builtin/request.js +50 -0
- package/lib/middlewares/builtin/request.js.map +1 -0
- package/lib/middlewares/builtin/storage.d.ts +64 -0
- package/lib/middlewares/builtin/storage.d.ts.map +1 -0
- package/lib/middlewares/builtin/storage.js +715 -0
- package/lib/middlewares/builtin/storage.js.map +1 -0
- package/lib/middlewares/builtin/task-recorder.d.ts +20 -0
- package/lib/middlewares/builtin/task-recorder.d.ts.map +1 -0
- package/lib/middlewares/builtin/task-recorder.js +138 -0
- package/lib/middlewares/builtin/task-recorder.js.map +1 -0
- package/lib/middlewares/index.d.ts +2 -0
- package/lib/middlewares/index.d.ts.map +1 -0
- package/lib/middlewares/index.js +3 -0
- package/lib/middlewares/index.js.map +1 -0
- package/lib/pipeline/dependency-graph.d.ts +43 -0
- package/lib/pipeline/dependency-graph.d.ts.map +1 -0
- package/lib/pipeline/dependency-graph.js +240 -0
- package/lib/pipeline/dependency-graph.js.map +1 -0
- package/lib/pipeline/generation-pipeline.d.ts +38 -0
- package/lib/pipeline/generation-pipeline.d.ts.map +1 -0
- package/lib/pipeline/generation-pipeline.js +211 -0
- package/lib/pipeline/generation-pipeline.js.map +1 -0
- package/lib/pipeline/index.d.ts +4 -0
- package/lib/pipeline/index.d.ts.map +1 -0
- package/lib/pipeline/index.js +5 -0
- package/lib/pipeline/index.js.map +1 -0
- package/lib/pipeline/middleware-registry.d.ts +36 -0
- package/lib/pipeline/middleware-registry.d.ts.map +1 -0
- package/lib/pipeline/middleware-registry.js +83 -0
- package/lib/pipeline/middleware-registry.js.map +1 -0
- package/lib/plugins/billing/config.d.ts +19 -0
- package/lib/plugins/billing/config.d.ts.map +1 -0
- package/lib/plugins/billing/config.js +98 -0
- package/lib/plugins/billing/config.js.map +1 -0
- package/lib/plugins/billing/index.d.ts +4 -0
- package/lib/plugins/billing/index.d.ts.map +1 -0
- package/lib/plugins/billing/index.js +20 -0
- package/lib/plugins/billing/index.js.map +1 -0
- package/lib/plugins/billing/middleware.d.ts +12 -0
- package/lib/plugins/billing/middleware.d.ts.map +1 -0
- package/lib/plugins/billing/middleware.js +233 -0
- package/lib/plugins/billing/middleware.js.map +1 -0
- package/lib/plugins/cache/config.d.ts +44 -0
- package/lib/plugins/cache/config.d.ts.map +1 -0
- package/lib/plugins/cache/config.js +187 -0
- package/lib/plugins/cache/config.js.map +1 -0
- package/lib/plugins/cache/index.d.ts +6 -0
- package/lib/plugins/cache/index.d.ts.map +1 -0
- package/lib/plugins/cache/index.js +87 -0
- package/lib/plugins/cache/index.js.map +1 -0
- package/lib/plugins/cache/middleware.d.ts +12 -0
- package/lib/plugins/cache/middleware.d.ts.map +1 -0
- package/lib/plugins/cache/middleware.js +194 -0
- package/lib/plugins/cache/middleware.js.map +1 -0
- package/lib/plugins/cache/service.d.ts +106 -0
- package/lib/plugins/cache/service.d.ts.map +1 -0
- package/lib/plugins/cache/service.js +467 -0
- package/lib/plugins/cache/service.js.map +1 -0
- package/lib/plugins/cache/utils/index.d.ts +4 -0
- package/lib/plugins/cache/utils/index.d.ts.map +1 -0
- package/lib/plugins/cache/utils/index.js +5 -0
- package/lib/plugins/cache/utils/index.js.map +1 -0
- package/lib/plugins/cache/utils/mime.d.ts +9 -0
- package/lib/plugins/cache/utils/mime.d.ts.map +1 -0
- package/lib/plugins/cache/utils/mime.js +65 -0
- package/lib/plugins/cache/utils/mime.js.map +1 -0
- package/lib/plugins/cache/utils/s3.d.ts +19 -0
- package/lib/plugins/cache/utils/s3.d.ts.map +1 -0
- package/lib/plugins/cache/utils/s3.js +147 -0
- package/lib/plugins/cache/utils/s3.js.map +1 -0
- package/lib/plugins/cache/utils/webdav.d.ts +16 -0
- package/lib/plugins/cache/utils/webdav.d.ts.map +1 -0
- package/lib/plugins/cache/utils/webdav.js +69 -0
- package/lib/plugins/cache/utils/webdav.js.map +1 -0
- package/lib/plugins/connector-chat-api/index.d.ts +7 -0
- package/lib/plugins/connector-chat-api/index.d.ts.map +1 -0
- package/lib/plugins/connector-chat-api/index.js +400 -0
- package/lib/plugins/connector-chat-api/index.js.map +1 -0
- package/lib/plugins/connector-dalle/index.d.ts +7 -0
- package/lib/plugins/connector-dalle/index.d.ts.map +1 -0
- package/lib/plugins/connector-dalle/index.js +140 -0
- package/lib/plugins/connector-dalle/index.js.map +1 -0
- package/lib/plugins/connector-flux/index.d.ts +7 -0
- package/lib/plugins/connector-flux/index.d.ts.map +1 -0
- package/lib/plugins/connector-flux/index.js +232 -0
- package/lib/plugins/connector-flux/index.js.map +1 -0
- package/lib/plugins/connector-sd-webui/index.d.ts +7 -0
- package/lib/plugins/connector-sd-webui/index.d.ts.map +1 -0
- package/lib/plugins/connector-sd-webui/index.js +171 -0
- package/lib/plugins/connector-sd-webui/index.js.map +1 -0
- package/lib/plugins/index.d.ts +22 -0
- package/lib/plugins/index.d.ts.map +1 -0
- package/lib/plugins/index.js +21 -0
- package/lib/plugins/index.js.map +1 -0
- package/lib/plugins/preset/config.d.ts +37 -0
- package/lib/plugins/preset/config.d.ts.map +1 -0
- package/lib/plugins/preset/config.js +74 -0
- package/lib/plugins/preset/config.js.map +1 -0
- package/lib/plugins/preset/index.d.ts +6 -0
- package/lib/plugins/preset/index.d.ts.map +1 -0
- package/lib/plugins/preset/index.js +58 -0
- package/lib/plugins/preset/index.js.map +1 -0
- package/lib/plugins/preset/middleware.d.ts +6 -0
- package/lib/plugins/preset/middleware.d.ts.map +1 -0
- package/lib/plugins/preset/middleware.js +126 -0
- package/lib/plugins/preset/middleware.js.map +1 -0
- package/lib/plugins/preset/remote-sync.service.d.ts +84 -0
- package/lib/plugins/preset/remote-sync.service.d.ts.map +1 -0
- package/lib/plugins/preset/remote-sync.service.js +342 -0
- package/lib/plugins/preset/remote-sync.service.js.map +1 -0
- package/lib/plugins/preset/service.d.ts +64 -0
- package/lib/plugins/preset/service.d.ts.map +1 -0
- package/lib/plugins/preset/service.js +196 -0
- package/lib/plugins/preset/service.js.map +1 -0
- package/lib/plugins/prompt-encoding/config.d.ts +25 -0
- package/lib/plugins/prompt-encoding/config.d.ts.map +1 -0
- package/lib/plugins/prompt-encoding/config.js +62 -0
- package/lib/plugins/prompt-encoding/config.js.map +1 -0
- package/lib/plugins/prompt-encoding/index.d.ts +5 -0
- package/lib/plugins/prompt-encoding/index.d.ts.map +1 -0
- package/lib/plugins/prompt-encoding/index.js +21 -0
- package/lib/plugins/prompt-encoding/index.js.map +1 -0
- package/lib/plugins/prompt-encoding/middleware.d.ts +6 -0
- package/lib/plugins/prompt-encoding/middleware.d.ts.map +1 -0
- package/lib/plugins/prompt-encoding/middleware.js +151 -0
- package/lib/plugins/prompt-encoding/middleware.js.map +1 -0
- package/lib/plugins/task/config.d.ts +15 -0
- package/lib/plugins/task/config.d.ts.map +1 -0
- package/lib/plugins/task/config.js +33 -0
- package/lib/plugins/task/config.js.map +1 -0
- package/lib/plugins/task/index.d.ts +5 -0
- package/lib/plugins/task/index.d.ts.map +1 -0
- package/lib/plugins/task/index.js +58 -0
- package/lib/plugins/task/index.js.map +1 -0
- package/lib/plugins/task/middleware.d.ts +14 -0
- package/lib/plugins/task/middleware.d.ts.map +1 -0
- package/lib/plugins/task/middleware.js +123 -0
- package/lib/plugins/task/middleware.js.map +1 -0
- package/lib/plugins/task/service.d.ts +94 -0
- package/lib/plugins/task/service.d.ts.map +1 -0
- package/lib/plugins/task/service.js +226 -0
- package/lib/plugins/task/service.js.map +1 -0
- package/lib/plugins/webui-auth/config.d.ts +12 -0
- package/lib/plugins/webui-auth/config.d.ts.map +1 -0
- package/lib/plugins/webui-auth/config.js +30 -0
- package/lib/plugins/webui-auth/config.js.map +1 -0
- package/lib/plugins/webui-auth/index.d.ts +5 -0
- package/lib/plugins/webui-auth/index.d.ts.map +1 -0
- package/lib/plugins/webui-auth/index.js +99 -0
- package/lib/plugins/webui-auth/index.js.map +1 -0
- package/lib/plugins/webui-auth/service.d.ts +42 -0
- package/lib/plugins/webui-auth/service.d.ts.map +1 -0
- package/lib/plugins/webui-auth/service.js +106 -0
- package/lib/plugins/webui-auth/service.js.map +1 -0
- package/lib/services/asset-cache.service.d.ts +133 -0
- package/lib/services/asset-cache.service.d.ts.map +1 -0
- package/lib/services/asset-cache.service.js +882 -0
- package/lib/services/asset-cache.service.js.map +1 -0
- package/lib/services/cache.service.d.ts +110 -0
- package/lib/services/cache.service.d.ts.map +1 -0
- package/lib/services/cache.service.js +333 -0
- package/lib/services/cache.service.js.map +1 -0
- package/lib/services/channel.service.d.ts +44 -0
- package/lib/services/channel.service.d.ts.map +1 -0
- package/lib/services/channel.service.js +154 -0
- package/lib/services/channel.service.js.map +1 -0
- package/lib/services/config.service.d.ts +73 -0
- package/lib/services/config.service.d.ts.map +1 -0
- package/lib/services/config.service.js +171 -0
- package/lib/services/config.service.js.map +1 -0
- package/lib/services/index.d.ts +8 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +9 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/medialuna.service.d.ts +173 -0
- package/lib/services/medialuna.service.d.ts.map +1 -0
- package/lib/services/medialuna.service.js +455 -0
- package/lib/services/medialuna.service.js.map +1 -0
- package/lib/services/preset.service.d.ts +69 -0
- package/lib/services/preset.service.d.ts.map +1 -0
- package/lib/services/preset.service.js +202 -0
- package/lib/services/preset.service.js.map +1 -0
- package/lib/services/remote-preset.service.d.ts +97 -0
- package/lib/services/remote-preset.service.d.ts.map +1 -0
- package/lib/services/remote-preset.service.js +212 -0
- package/lib/services/remote-preset.service.js.map +1 -0
- package/lib/services/task.service.d.ts +57 -0
- package/lib/services/task.service.d.ts.map +1 -0
- package/lib/services/task.service.js +138 -0
- package/lib/services/task.service.js.map +1 -0
- package/lib/types/index.d.ts +357 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +21 -0
- package/lib/types/index.js.map +1 -0
- package/package.json +66 -0
- package/readme.md +326 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import type { GenerationRequest, OutputAsset } from '../../types';
|
|
3
|
+
/** 任务状态 */
|
|
4
|
+
export type TaskStatus = 'pending' | 'processing' | 'success' | 'failed';
|
|
5
|
+
/** 任务数据 */
|
|
6
|
+
export interface TaskData {
|
|
7
|
+
id: number;
|
|
8
|
+
uid: number | null;
|
|
9
|
+
channelId: number;
|
|
10
|
+
requestSnapshot: GenerationRequest;
|
|
11
|
+
responseSnapshot: OutputAsset[] | null;
|
|
12
|
+
status: TaskStatus;
|
|
13
|
+
middlewareLogs: Record<string, any>;
|
|
14
|
+
startTime: Date;
|
|
15
|
+
endTime: Date | null;
|
|
16
|
+
duration: number | null;
|
|
17
|
+
}
|
|
18
|
+
/** 任务查询选项 */
|
|
19
|
+
export interface TaskQueryOptions {
|
|
20
|
+
uid?: number;
|
|
21
|
+
channelId?: number;
|
|
22
|
+
status?: TaskStatus;
|
|
23
|
+
limit?: number;
|
|
24
|
+
offset?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 任务服务
|
|
28
|
+
*
|
|
29
|
+
* 管理任务记录的 CRUD 操作
|
|
30
|
+
*/
|
|
31
|
+
export declare class TaskService {
|
|
32
|
+
private _ctx;
|
|
33
|
+
constructor(ctx: Context);
|
|
34
|
+
/** 将数据库记录转换为 TaskData */
|
|
35
|
+
private _toData;
|
|
36
|
+
/** 创建任务 */
|
|
37
|
+
create(uid: number | null, channelId: number, request: GenerationRequest): Promise<TaskData>;
|
|
38
|
+
/** 更新任务状态 */
|
|
39
|
+
updateStatus(id: number, status: TaskStatus, options?: {
|
|
40
|
+
responseSnapshot?: OutputAsset[];
|
|
41
|
+
inputSnapshot?: OutputAsset[];
|
|
42
|
+
middlewareLogs?: Record<string, any>;
|
|
43
|
+
}): Promise<TaskData | null>;
|
|
44
|
+
/** 根据 ID 获取任务 */
|
|
45
|
+
getById(id: number): Promise<TaskData | null>;
|
|
46
|
+
/** 查询任务列表 */
|
|
47
|
+
query(options?: TaskQueryOptions): Promise<TaskData[]>;
|
|
48
|
+
/** 获取用户最近的任务 */
|
|
49
|
+
getRecentByUid(uid: number, limit?: number): Promise<TaskData[]>;
|
|
50
|
+
/** 统计任务数量 */
|
|
51
|
+
count(options?: Omit<TaskQueryOptions, 'limit' | 'offset'>): Promise<number>;
|
|
52
|
+
/** 删除任务 */
|
|
53
|
+
delete(id: number): Promise<boolean>;
|
|
54
|
+
/** 清理旧任务 */
|
|
55
|
+
cleanup(beforeDate: Date): Promise<number>;
|
|
56
|
+
/** 获取统计信息 */
|
|
57
|
+
getStats(): Promise<{
|
|
58
|
+
total: number;
|
|
59
|
+
pending: number;
|
|
60
|
+
processing: number;
|
|
61
|
+
success: number;
|
|
62
|
+
failed: number;
|
|
63
|
+
successRate: number;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* 获取用户的生成历史(仅成功的任务,用于画廊展示)
|
|
67
|
+
* 返回简化的数据,适合前端展示
|
|
68
|
+
*/
|
|
69
|
+
getUserGallery(uid: number, options?: {
|
|
70
|
+
limit?: number;
|
|
71
|
+
offset?: number;
|
|
72
|
+
channelId?: number;
|
|
73
|
+
}): Promise<{
|
|
74
|
+
items: Array<{
|
|
75
|
+
id: number;
|
|
76
|
+
prompt: string;
|
|
77
|
+
images: string[];
|
|
78
|
+
createdAt: Date;
|
|
79
|
+
channelId: number;
|
|
80
|
+
}>;
|
|
81
|
+
total: number;
|
|
82
|
+
hasMore: boolean;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* 获取用户最近生成的图片(扁平化,用于快速预览)
|
|
86
|
+
*/
|
|
87
|
+
getUserRecentImages(uid: number, limit?: number): Promise<Array<{
|
|
88
|
+
taskId: number;
|
|
89
|
+
url: string;
|
|
90
|
+
prompt: string;
|
|
91
|
+
createdAt: Date;
|
|
92
|
+
}>>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/plugins/task/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// 任务服务
|
|
2
|
+
/**
|
|
3
|
+
* 任务服务
|
|
4
|
+
*
|
|
5
|
+
* 管理任务记录的 CRUD 操作
|
|
6
|
+
*/
|
|
7
|
+
export class TaskService {
|
|
8
|
+
_ctx;
|
|
9
|
+
constructor(ctx) {
|
|
10
|
+
this._ctx = ctx;
|
|
11
|
+
}
|
|
12
|
+
/** 将数据库记录转换为 TaskData */
|
|
13
|
+
_toData(record) {
|
|
14
|
+
return {
|
|
15
|
+
id: record.id,
|
|
16
|
+
uid: record.uid,
|
|
17
|
+
channelId: record.channelId,
|
|
18
|
+
requestSnapshot: JSON.parse(record.requestSnapshot || '{}'),
|
|
19
|
+
responseSnapshot: record.responseSnapshot ? JSON.parse(record.responseSnapshot) : null,
|
|
20
|
+
status: record.status,
|
|
21
|
+
middlewareLogs: JSON.parse(record.middlewareLogs || '{}'),
|
|
22
|
+
startTime: record.startTime,
|
|
23
|
+
endTime: record.endTime,
|
|
24
|
+
duration: record.duration
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** 创建任务 */
|
|
28
|
+
async create(uid, channelId, request) {
|
|
29
|
+
const now = new Date();
|
|
30
|
+
const record = await this._ctx.database.create('medialuna_task', {
|
|
31
|
+
uid,
|
|
32
|
+
channelId,
|
|
33
|
+
requestSnapshot: JSON.stringify(request),
|
|
34
|
+
responseSnapshot: null,
|
|
35
|
+
status: 'pending',
|
|
36
|
+
middlewareLogs: '{}',
|
|
37
|
+
startTime: now,
|
|
38
|
+
endTime: null,
|
|
39
|
+
duration: null,
|
|
40
|
+
createdAt: now
|
|
41
|
+
});
|
|
42
|
+
return this._toData(record);
|
|
43
|
+
}
|
|
44
|
+
/** 更新任务状态 */
|
|
45
|
+
async updateStatus(id, status, options) {
|
|
46
|
+
const updateData = {
|
|
47
|
+
status
|
|
48
|
+
};
|
|
49
|
+
if (status === 'success' || status === 'failed') {
|
|
50
|
+
const now = new Date();
|
|
51
|
+
const record = await this._ctx.database.get('medialuna_task', { id });
|
|
52
|
+
if (record.length > 0) {
|
|
53
|
+
updateData.endTime = now;
|
|
54
|
+
updateData.duration = now.getTime() - record[0].startTime.getTime();
|
|
55
|
+
// 如果有输入快照,更新 requestSnapshot 添加输入文件 URL
|
|
56
|
+
if (options?.inputSnapshot) {
|
|
57
|
+
const existingRequest = JSON.parse(record[0].requestSnapshot || '{}');
|
|
58
|
+
existingRequest.inputFiles = options.inputSnapshot;
|
|
59
|
+
updateData.requestSnapshot = JSON.stringify(existingRequest);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (options?.responseSnapshot) {
|
|
64
|
+
updateData.responseSnapshot = JSON.stringify(options.responseSnapshot);
|
|
65
|
+
}
|
|
66
|
+
if (options?.middlewareLogs) {
|
|
67
|
+
updateData.middlewareLogs = JSON.stringify(options.middlewareLogs);
|
|
68
|
+
}
|
|
69
|
+
await this._ctx.database.set('medialuna_task', { id }, updateData);
|
|
70
|
+
return this.getById(id);
|
|
71
|
+
}
|
|
72
|
+
/** 根据 ID 获取任务 */
|
|
73
|
+
async getById(id) {
|
|
74
|
+
const records = await this._ctx.database.get('medialuna_task', { id });
|
|
75
|
+
return records.length > 0 ? this._toData(records[0]) : null;
|
|
76
|
+
}
|
|
77
|
+
/** 查询任务列表 */
|
|
78
|
+
async query(options = {}) {
|
|
79
|
+
let selection = this._ctx.database.select('medialuna_task');
|
|
80
|
+
if (options.uid !== undefined && options.uid !== null) {
|
|
81
|
+
selection = selection.where({ uid: options.uid });
|
|
82
|
+
}
|
|
83
|
+
if (options.channelId !== undefined && options.channelId !== null) {
|
|
84
|
+
selection = selection.where({ channelId: options.channelId });
|
|
85
|
+
}
|
|
86
|
+
if (options.status) {
|
|
87
|
+
selection = selection.where({ status: options.status });
|
|
88
|
+
}
|
|
89
|
+
const records = await selection
|
|
90
|
+
.orderBy('id', 'desc')
|
|
91
|
+
.limit(options.limit ?? 100)
|
|
92
|
+
.offset(options.offset ?? 0)
|
|
93
|
+
.execute();
|
|
94
|
+
return records.map(r => this._toData(r));
|
|
95
|
+
}
|
|
96
|
+
/** 获取用户最近的任务 */
|
|
97
|
+
async getRecentByUid(uid, limit = 10) {
|
|
98
|
+
return this.query({ uid, limit });
|
|
99
|
+
}
|
|
100
|
+
/** 统计任务数量 */
|
|
101
|
+
async count(options = {}) {
|
|
102
|
+
let selection = this._ctx.database.select('medialuna_task');
|
|
103
|
+
if (options.uid !== undefined && options.uid !== null) {
|
|
104
|
+
selection = selection.where({ uid: options.uid });
|
|
105
|
+
}
|
|
106
|
+
if (options.channelId !== undefined && options.channelId !== null) {
|
|
107
|
+
selection = selection.where({ channelId: options.channelId });
|
|
108
|
+
}
|
|
109
|
+
if (options.status) {
|
|
110
|
+
selection = selection.where({ status: options.status });
|
|
111
|
+
}
|
|
112
|
+
const result = await selection.execute();
|
|
113
|
+
return result.length;
|
|
114
|
+
}
|
|
115
|
+
/** 删除任务 */
|
|
116
|
+
async delete(id) {
|
|
117
|
+
const existing = await this.getById(id);
|
|
118
|
+
if (!existing)
|
|
119
|
+
return false;
|
|
120
|
+
await this._ctx.database.remove('medialuna_task', { id });
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/** 清理旧任务 */
|
|
124
|
+
async cleanup(beforeDate) {
|
|
125
|
+
// 先查询符合条件的任务
|
|
126
|
+
const result = await this._ctx.database.get('medialuna_task', {
|
|
127
|
+
createdAt: { $lt: beforeDate }
|
|
128
|
+
});
|
|
129
|
+
const ids = result.map(r => r.id);
|
|
130
|
+
if (ids.length > 0) {
|
|
131
|
+
for (const id of ids) {
|
|
132
|
+
await this._ctx.database.remove('medialuna_task', { id });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return ids.length;
|
|
136
|
+
}
|
|
137
|
+
/** 获取统计信息 */
|
|
138
|
+
async getStats() {
|
|
139
|
+
const total = await this.count();
|
|
140
|
+
const pending = await this.count({ status: 'pending' });
|
|
141
|
+
const processing = await this.count({ status: 'processing' });
|
|
142
|
+
const success = await this.count({ status: 'success' });
|
|
143
|
+
const failed = await this.count({ status: 'failed' });
|
|
144
|
+
const completed = success + failed;
|
|
145
|
+
const successRate = completed > 0 ? (success / completed) * 100 : 0;
|
|
146
|
+
return {
|
|
147
|
+
total,
|
|
148
|
+
pending,
|
|
149
|
+
processing,
|
|
150
|
+
success,
|
|
151
|
+
failed,
|
|
152
|
+
successRate: Math.round(successRate * 100) / 100
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 获取用户的生成历史(仅成功的任务,用于画廊展示)
|
|
157
|
+
* 返回简化的数据,适合前端展示
|
|
158
|
+
*/
|
|
159
|
+
async getUserGallery(uid, options = {}) {
|
|
160
|
+
const limit = Math.min(options.limit || 20, 100);
|
|
161
|
+
const offset = options.offset || 0;
|
|
162
|
+
// 查询成功的任务
|
|
163
|
+
const queryOptions = {
|
|
164
|
+
uid,
|
|
165
|
+
status: 'success',
|
|
166
|
+
limit: limit + 1, // 多查一条用于判断 hasMore
|
|
167
|
+
offset
|
|
168
|
+
};
|
|
169
|
+
if (options.channelId) {
|
|
170
|
+
queryOptions.channelId = options.channelId;
|
|
171
|
+
}
|
|
172
|
+
const tasks = await this.query(queryOptions);
|
|
173
|
+
const hasMore = tasks.length > limit;
|
|
174
|
+
const items = tasks.slice(0, limit);
|
|
175
|
+
// 统计总数
|
|
176
|
+
const total = await this.count({
|
|
177
|
+
uid,
|
|
178
|
+
status: 'success',
|
|
179
|
+
channelId: options.channelId
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
items: items.map(task => ({
|
|
183
|
+
id: task.id,
|
|
184
|
+
prompt: task.requestSnapshot?.prompt || '',
|
|
185
|
+
images: (task.responseSnapshot || [])
|
|
186
|
+
.filter(asset => asset.kind === 'image' && asset.url)
|
|
187
|
+
.map(asset => asset.url),
|
|
188
|
+
createdAt: task.startTime,
|
|
189
|
+
channelId: task.channelId
|
|
190
|
+
})),
|
|
191
|
+
total,
|
|
192
|
+
hasMore
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取用户最近生成的图片(扁平化,用于快速预览)
|
|
197
|
+
*/
|
|
198
|
+
async getUserRecentImages(uid, limit = 20) {
|
|
199
|
+
const tasks = await this.query({
|
|
200
|
+
uid,
|
|
201
|
+
status: 'success',
|
|
202
|
+
limit: Math.min(limit * 2, 100) // 多查一些,因为一个任务可能有多张图
|
|
203
|
+
});
|
|
204
|
+
const images = [];
|
|
205
|
+
for (const task of tasks) {
|
|
206
|
+
if (!task.responseSnapshot)
|
|
207
|
+
continue;
|
|
208
|
+
for (const asset of task.responseSnapshot) {
|
|
209
|
+
if (asset.kind === 'image' && asset.url) {
|
|
210
|
+
images.push({
|
|
211
|
+
taskId: task.id,
|
|
212
|
+
url: asset.url,
|
|
213
|
+
prompt: task.requestSnapshot?.prompt || '',
|
|
214
|
+
createdAt: task.startTime
|
|
215
|
+
});
|
|
216
|
+
if (images.length >= limit)
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (images.length >= limit)
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
return images;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/plugins/task/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConfigField } from '../../core';
|
|
2
|
+
export interface WebuiAuthConfig {
|
|
3
|
+
/** 直接配置的 uid(简单模式) */
|
|
4
|
+
uid: number | null;
|
|
5
|
+
/** 验证码有效期(秒) */
|
|
6
|
+
codeExpiry: number;
|
|
7
|
+
/** 绑定指令名称 */
|
|
8
|
+
commandName: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const webuiAuthConfigFields: ConfigField[];
|
|
11
|
+
export declare const defaultWebuiAuthConfig: WebuiAuthConfig;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/plugins/webui-auth/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa;IACb,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,qBAAqB,EAAE,WAAW,EAsB9C,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,eAIpC,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// WebUI 认证插件配置
|
|
2
|
+
export const webuiAuthConfigFields = [
|
|
3
|
+
{
|
|
4
|
+
key: 'uid',
|
|
5
|
+
label: '绑定的用户 ID',
|
|
6
|
+
type: 'number',
|
|
7
|
+
description: '直接填写 Koishi 用户 ID(uid),或通过指令绑定',
|
|
8
|
+
placeholder: '留空则需要通过指令绑定'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: 'commandName',
|
|
12
|
+
label: '绑定指令名称',
|
|
13
|
+
type: 'text',
|
|
14
|
+
default: 'bindui',
|
|
15
|
+
description: '在聊天平台发送此指令生成验证码'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: 'codeExpiry',
|
|
19
|
+
label: '验证码有效期',
|
|
20
|
+
type: 'number',
|
|
21
|
+
default: 300,
|
|
22
|
+
description: '验证码有效期(秒),默认 5 分钟'
|
|
23
|
+
}
|
|
24
|
+
];
|
|
25
|
+
export const defaultWebuiAuthConfig = {
|
|
26
|
+
uid: null,
|
|
27
|
+
codeExpiry: 300,
|
|
28
|
+
commandName: 'bindui'
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/plugins/webui-auth/config.ts"],"names":[],"mappings":"AAAA,eAAe;AAaf,MAAM,CAAC,MAAM,qBAAqB,GAAkB;IAClD;QACE,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gCAAgC;QAC7C,WAAW,EAAE,aAAa;KAC3B;IACD;QACE,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,iBAAiB;KAC/B;IACD;QACE,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,mBAAmB;KACjC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAoB;IACrD,GAAG,EAAE,IAAI;IACT,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,QAAQ;CACtB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/webui-auth/index.ts"],"names":[],"mappings":";AAUA,wBA6GE;AAGF,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// WebUI 认证插件入口
|
|
2
|
+
import { definePlugin } from '../../core';
|
|
3
|
+
import { WebuiAuthService } from './service';
|
|
4
|
+
import { webuiAuthConfigFields, defaultWebuiAuthConfig } from './config';
|
|
5
|
+
export default definePlugin({
|
|
6
|
+
id: 'webui-auth',
|
|
7
|
+
name: 'WebUI 用户绑定',
|
|
8
|
+
description: '将 WebUI 与 Koishi 用户绑定,支持指令绑定或直接配置 uid',
|
|
9
|
+
version: '1.0.0',
|
|
10
|
+
configFields: webuiAuthConfigFields,
|
|
11
|
+
configDefaults: defaultWebuiAuthConfig,
|
|
12
|
+
services: [
|
|
13
|
+
{
|
|
14
|
+
name: 'webui-auth',
|
|
15
|
+
factory: (pluginCtx) => new WebuiAuthService(pluginCtx)
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
settingsActions: [
|
|
19
|
+
{
|
|
20
|
+
name: 'clear-bind',
|
|
21
|
+
label: '清除绑定',
|
|
22
|
+
type: 'error',
|
|
23
|
+
apiEvent: 'media-luna/webui-auth/clear'
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
async onLoad(pluginCtx) {
|
|
27
|
+
const ctx = pluginCtx.ctx;
|
|
28
|
+
const config = pluginCtx.getConfig();
|
|
29
|
+
const authService = pluginCtx.getService('webui-auth');
|
|
30
|
+
if (!authService) {
|
|
31
|
+
pluginCtx.logger.error('Failed to get webui-auth service');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// 注册 Koishi 指令
|
|
35
|
+
const commandName = config.commandName || 'bindui';
|
|
36
|
+
const dispose = ctx.command(commandName, '绑定 WebUI 用户')
|
|
37
|
+
.action(async ({ session }) => {
|
|
38
|
+
if (!session) {
|
|
39
|
+
return '无法获取会话信息';
|
|
40
|
+
}
|
|
41
|
+
// 获取用户的 Koishi uid
|
|
42
|
+
try {
|
|
43
|
+
const bindings = await ctx.database.get('binding', {
|
|
44
|
+
platform: session.platform,
|
|
45
|
+
pid: session.userId
|
|
46
|
+
});
|
|
47
|
+
if (!bindings || bindings.length === 0) {
|
|
48
|
+
return '未找到用户绑定信息,请先完成平台绑定';
|
|
49
|
+
}
|
|
50
|
+
const uid = bindings[0].aid;
|
|
51
|
+
// 生成验证码并输出到日志(code 仅用于触发日志,不直接返回给用户)
|
|
52
|
+
authService.createBindCode(uid);
|
|
53
|
+
// 提示用户输入验证码
|
|
54
|
+
await session.send(`请在 ${config.codeExpiry || 300} 秒内输入控制台显示的验证码:`);
|
|
55
|
+
// 等待用户输入
|
|
56
|
+
const input = await session.prompt(config.codeExpiry ? config.codeExpiry * 1000 : 300000);
|
|
57
|
+
if (!input) {
|
|
58
|
+
return '验证码已过期,请重新发起绑定';
|
|
59
|
+
}
|
|
60
|
+
// 验证
|
|
61
|
+
const result = authService.verifyCodeAndBind(input.trim(), uid);
|
|
62
|
+
if (result.success) {
|
|
63
|
+
return `绑定成功!WebUI 已关联到用户 ${uid}`;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return `绑定失败: ${result.error}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
pluginCtx.logger.error('Failed to bindui: %s', e);
|
|
71
|
+
return '绑定失败,请稍后重试';
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
pluginCtx.onDispose(() => dispose.dispose());
|
|
75
|
+
// 注册 WebUI API
|
|
76
|
+
const console = ctx.console;
|
|
77
|
+
if (console) {
|
|
78
|
+
// 获取当前绑定状态
|
|
79
|
+
console.addListener('media-luna/webui-auth/status', async () => {
|
|
80
|
+
const uid = authService.getUid();
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
data: {
|
|
84
|
+
bound: uid !== null,
|
|
85
|
+
uid
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
// 清除绑定
|
|
90
|
+
console.addListener('media-luna/webui-auth/clear', async () => {
|
|
91
|
+
authService.clearBind();
|
|
92
|
+
return { success: true };
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
pluginCtx.logger.info('WebUI auth plugin loaded, command: %s', commandName);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
export { WebuiAuthService } from './service';
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/webui-auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PluginContext } from '../../core';
|
|
2
|
+
/**
|
|
3
|
+
* WebUI 认证服务
|
|
4
|
+
*
|
|
5
|
+
* 管理 WebUI 与 Koishi 用户的绑定
|
|
6
|
+
*/
|
|
7
|
+
export declare class WebuiAuthService {
|
|
8
|
+
private _pluginCtx;
|
|
9
|
+
private _pendingBinds;
|
|
10
|
+
private _cleanupTimer;
|
|
11
|
+
constructor(pluginCtx: PluginContext);
|
|
12
|
+
/** 生成 6 位验证码 */
|
|
13
|
+
private _generateCode;
|
|
14
|
+
/** 清理过期的验证码 */
|
|
15
|
+
private _cleanup;
|
|
16
|
+
/**
|
|
17
|
+
* 创建绑定验证码(用户在聊天平台发起 /bindui)
|
|
18
|
+
* 验证码输出到日志,返回验证码供内部使用
|
|
19
|
+
*/
|
|
20
|
+
createBindCode(uid: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* 验证并绑定
|
|
23
|
+
* 用户在聊天平台输入验证码后调用
|
|
24
|
+
*/
|
|
25
|
+
verifyCodeAndBind(inputCode: string, expectedUid: number): {
|
|
26
|
+
success: boolean;
|
|
27
|
+
error?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* 获取当前绑定的 uid
|
|
31
|
+
*/
|
|
32
|
+
getUid(): number | null;
|
|
33
|
+
/**
|
|
34
|
+
* 直接设置 uid(管理员手动配置)
|
|
35
|
+
*/
|
|
36
|
+
setUid(uid: number | null): void;
|
|
37
|
+
/**
|
|
38
|
+
* 清除绑定
|
|
39
|
+
*/
|
|
40
|
+
clearBind(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/plugins/webui-auth/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAW/C;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,aAAa,CAA8B;gBAEvC,SAAS,EAAE,aAAa;IAcpC,gBAAgB;IAChB,OAAO,CAAC,aAAa;IAIrB,eAAe;IACf,OAAO,CAAC,QAAQ;IAShB;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAuBnC;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IA6B/F;;OAEG;IACH,MAAM,IAAI,MAAM,GAAG,IAAI;IAKvB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKhC;;OAEG;IACH,SAAS,IAAI,IAAI;CAIlB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// WebUI 认证服务
|
|
2
|
+
import { Logger } from 'koishi';
|
|
3
|
+
const logger = new Logger('media-luna/webui-auth');
|
|
4
|
+
/**
|
|
5
|
+
* WebUI 认证服务
|
|
6
|
+
*
|
|
7
|
+
* 管理 WebUI 与 Koishi 用户的绑定
|
|
8
|
+
*/
|
|
9
|
+
export class WebuiAuthService {
|
|
10
|
+
_pluginCtx;
|
|
11
|
+
_pendingBinds = new Map();
|
|
12
|
+
_cleanupTimer = null;
|
|
13
|
+
constructor(pluginCtx) {
|
|
14
|
+
this._pluginCtx = pluginCtx;
|
|
15
|
+
// 定期清理过期的验证码
|
|
16
|
+
this._cleanupTimer = setInterval(() => this._cleanup(), 60000);
|
|
17
|
+
pluginCtx.onDispose(() => {
|
|
18
|
+
if (this._cleanupTimer) {
|
|
19
|
+
clearInterval(this._cleanupTimer);
|
|
20
|
+
this._cleanupTimer = null;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** 生成 6 位验证码 */
|
|
25
|
+
_generateCode() {
|
|
26
|
+
return Math.random().toString(36).substring(2, 8).toUpperCase();
|
|
27
|
+
}
|
|
28
|
+
/** 清理过期的验证码 */
|
|
29
|
+
_cleanup() {
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
for (const [code, bind] of this._pendingBinds) {
|
|
32
|
+
if (bind.expireAt < now) {
|
|
33
|
+
this._pendingBinds.delete(code);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 创建绑定验证码(用户在聊天平台发起 /bindui)
|
|
39
|
+
* 验证码输出到日志,返回验证码供内部使用
|
|
40
|
+
*/
|
|
41
|
+
createBindCode(uid) {
|
|
42
|
+
const config = this._pluginCtx.getConfig();
|
|
43
|
+
const code = this._generateCode();
|
|
44
|
+
const expiry = (config.codeExpiry || 300) * 1000;
|
|
45
|
+
const bind = {
|
|
46
|
+
uid,
|
|
47
|
+
code,
|
|
48
|
+
expireAt: Date.now() + expiry
|
|
49
|
+
};
|
|
50
|
+
this._pendingBinds.set(code, bind);
|
|
51
|
+
// 验证码输出到日志(INFO 级别)
|
|
52
|
+
logger.info('='.repeat(50));
|
|
53
|
+
logger.info('WebUI 绑定验证码: %s', code);
|
|
54
|
+
logger.info('目标用户 uid: %d', uid);
|
|
55
|
+
logger.info('有效期: %d 秒', config.codeExpiry || 300);
|
|
56
|
+
logger.info('='.repeat(50));
|
|
57
|
+
return code;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 验证并绑定
|
|
61
|
+
* 用户在聊天平台输入验证码后调用
|
|
62
|
+
*/
|
|
63
|
+
verifyCodeAndBind(inputCode, expectedUid) {
|
|
64
|
+
const normalizedCode = inputCode.trim().toUpperCase();
|
|
65
|
+
const bind = this._pendingBinds.get(normalizedCode);
|
|
66
|
+
if (!bind) {
|
|
67
|
+
return { success: false, error: '验证码无效' };
|
|
68
|
+
}
|
|
69
|
+
if (bind.expireAt < Date.now()) {
|
|
70
|
+
this._pendingBinds.delete(normalizedCode);
|
|
71
|
+
return { success: false, error: '验证码已过期' };
|
|
72
|
+
}
|
|
73
|
+
// 验证 uid 是否匹配
|
|
74
|
+
if (bind.uid !== expectedUid) {
|
|
75
|
+
return { success: false, error: '验证码与当前用户不匹配' };
|
|
76
|
+
}
|
|
77
|
+
// 验证成功,删除验证码
|
|
78
|
+
this._pendingBinds.delete(normalizedCode);
|
|
79
|
+
// 保存到配置
|
|
80
|
+
this._pluginCtx.updateConfig({ uid: bind.uid });
|
|
81
|
+
logger.info('WebUI 绑定成功: uid=%d', bind.uid);
|
|
82
|
+
return { success: true };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 获取当前绑定的 uid
|
|
86
|
+
*/
|
|
87
|
+
getUid() {
|
|
88
|
+
const config = this._pluginCtx.getConfig();
|
|
89
|
+
return config.uid ?? null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 直接设置 uid(管理员手动配置)
|
|
93
|
+
*/
|
|
94
|
+
setUid(uid) {
|
|
95
|
+
this._pluginCtx.updateConfig({ uid });
|
|
96
|
+
logger.info('WebUI uid 已更新: %s', uid ?? '(清除)');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 清除绑定
|
|
100
|
+
*/
|
|
101
|
+
clearBind() {
|
|
102
|
+
this._pluginCtx.updateConfig({ uid: null });
|
|
103
|
+
logger.info('WebUI 绑定已清除');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=service.js.map
|