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
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineComponent as ne,computed as ae,ref as h,resolveComponent as M,createElementBlock as s,openBlock as t,createElementVNode as e,createCommentVNode as o,Fragment as S,renderList as K,normalizeClass as Z,toDisplayString as u,createVNode as a,withKeys as Ee,withCtx as I,createStaticVNode as Ce,createBlock as ee,watch as pe,withDirectives as ye,vShow as be,withModifiers as de,createTextVNode as R,onMounted as ve,onUnmounted as Fe,Teleport as qe,Transition as Ne,createSlots as Re,onBeforeUnmount as Be,h as Ue,resolveDynamicComponent as Se,KeepAlive as He}from"vue";import{send as Ge,message as J}from"@koishijs/client";async function E(i,C){const p=await Ge(i,C);if(!p.success)throw new Error(p.error||"请求失败");return p.data}const fe={list:()=>E("media-luna/channels/list"),get:i=>E("media-luna/channels/get",{id:i}),create:i=>E("media-luna/channels/create",i),update:(i,C)=>E("media-luna/channels/update",{id:i,data:C}),delete:i=>E("media-luna/channels/delete",{id:i}),toggle:(i,C)=>E("media-luna/channels/toggle",{id:i,enabled:C}),tags:()=>E("media-luna/channels/tags"),getByTags:(i,C)=>E("media-luna/channels/by-tags",{tags:i,matchAll:C})},ge={list:i=>E("media-luna/presets/list",{enabledOnly:i}),get:i=>E("media-luna/presets/get",{id:i}),create:i=>E("media-luna/presets/create",i),update:(i,C)=>E("media-luna/presets/update",{id:i,data:C}),delete:i=>E("media-luna/presets/delete",{id:i}),toggle:(i,C)=>E("media-luna/presets/toggle",{id:i,enabled:C}),copy:i=>E("media-luna/presets/copy",{id:i}),matching:i=>E("media-luna/presets/matching",{channelId:i}),tags:()=>E("media-luna/presets/tags"),getByTags:(i,C)=>E("media-luna/presets/by-tags",{tags:i,matchAll:C})},_e={list:i=>E("media-luna/tasks/list",i),get:i=>E("media-luna/tasks/get",{id:i}),delete:i=>E("media-luna/tasks/delete",{id:i}),stats:i=>E("media-luna/tasks/stats",{channelId:i}),cleanup:i=>E("media-luna/tasks/cleanup",{days:i}),recent:(i,C)=>E("media-luna/tasks/recent",{userId:i,limit:C}),my:i=>E("media-luna/tasks/my",i)},Je={me:()=>E("media-luna/auth/me")},$e={list:()=>E("media-luna/middlewares/list"),get:i=>E("media-luna/middlewares/get",{name:i}),update:(i,C)=>E("media-luna/middlewares/update",{name:i,data:C}),reset:i=>E("media-luna/middlewares/reset",{name:i}),executionOrder:()=>E("media-luna/middlewares/execution-order"),cardFields:()=>E("media-luna/middlewares/card-fields")},ke={list:()=>E("media-luna/connectors/list"),get:i=>E("media-luna/connectors/get",{id:i}),fields:i=>E("media-luna/connectors/fields",{id:i}),schema:()=>E("media-luna/connectors/schema")},je={generate:i=>E("media-luna/generate",i),preview:i=>E("media-luna/generate/preview",i)},We={upload:(i,C,p)=>E("media-luna/cache/upload",{data:i,mime:C,filename:p}),cacheUrl:i=>E("media-luna/cache/cache-url",{url:i}),get:i=>E("media-luna/cache/get",{id:i}),read:i=>E("media-luna/cache/read",{id:i}),delete:i=>E("media-luna/cache/delete",{id:i}),stats:()=>E("media-luna/cache/stats"),clear:()=>E("media-luna/cache/clear")},Oe={panels:()=>E("media-luna/settings/panels"),get:i=>E("media-luna/settings/get",{id:i}),update:(i,C)=>E("media-luna/settings/update",{id:i,config:C}),syncRemotePresets:()=>E("media-luna/presets/sync")},Ve={list:()=>E("media-luna/plugins/list"),get:i=>E("media-luna/plugins/get",{id:i}),updateConfig:(i,C)=>E("media-luna/plugins/update-config",{pluginId:i,config:C}),enable:i=>E("media-luna/plugins/enable",{id:i}),disable:i=>E("media-luna/plugins/disable",{id:i})},Ke={class:"tag-filter"},Qe={class:"filter-tags"},Xe=["onClick"],Ye={key:0,class:"filter-input-wrapper"},Ze=ne({__name:"TagFilter",props:{modelValue:{default:()=>[]},allTags:{},presetTags:{default:()=>[]},showInput:{type:Boolean,default:true},maxDynamicTags:{default:20}},emits:["update:modelValue","change"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:m=>{x("update:modelValue",m),x("change",m)}}),b=h(""),D=ae(()=>{const m=p.allTags.filter(y=>!p.presetTags.includes(y)).slice(0,p.maxDynamicTags);return[...p.presetTags,...m]}),T=m=>{const y=[...c.value],H=y.indexOf(m);H>=0?y.splice(H,1):y.push(m),c.value=y},f=()=>{const m=b.value.trim();m&&!c.value.includes(m)&&(c.value=[...c.value,m]),b.value=""};return(m,y)=>{const H=M("k-icon"),z=M("el-input");return t(),s("div",Ke,[e("div",Qe,[(t(true),s(S,null,K(D.value,r=>(t(),s("span",{key:r,class:Z(["filter-tag",{active:c.value.includes(r)}]),onClick:k=>T(r)},u(r),11,Xe))),128))]),i.showInput?(t(),s("div",Ye,[a(z,{modelValue:b.value,"onUpdate:modelValue":y[0]||(y[0]=r=>b.value=r),placeholder:"输入标签筛选...",size:"small",clearable:"",onKeyup:Ee(f,["enter"]),class:"filter-input"},{prefix:I(()=>[a(H,{name:"search"})]),_:1},8,["modelValue"])])):o("v-if",true)])}}}),oe=(i,C)=>{const p=i.__vccOpts||i;for(const[x,c]of C)p[x]=c;return p},Pe=oe(Ze,[["__scopeId","data-v-61b504c8"]]),et={class:"view-mode-switch"},tt=ne({__name:"ViewModeSwitch",props:{modelValue:{}},emits:["update:modelValue"],setup(i){return(C,p)=>(t(),s("div",et,[e("button",{class:Z(["mode-btn",{active:i.modelValue==="card"}]),onClick:p[0]||(p[0]=x=>C.$emit("update:modelValue","card")),title:"卡片视图"},[...p[2]||(p[2]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-ae3ef498><rect x="3" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-ae3ef498></rect></svg>',1)])],2),e("button",{class:Z(["mode-btn",{active:i.modelValue==="list"}]),onClick:p[1]||(p[1]=x=>C.$emit("update:modelValue","list")),title:"列表视图"},[...p[3]||(p[3]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2)]))}}),Le=oe(tt,[["__scopeId","data-v-ae3ef498"]]),lt={class:"tag-input"},st=ne({__name:"TagInput",props:{modelValue:{},suggestions:{},placeholder:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:b=>x("update:modelValue",b)});return(b,D)=>{const T=M("el-option"),f=M("el-select");return t(),s("div",lt,[a(f,{modelValue:c.value,"onUpdate:modelValue":D[0]||(D[0]=m=>c.value=m),multiple:"",filterable:"","allow-create":"","default-first-option":"",placeholder:i.placeholder,class:"tag-select","tag-type":"primary"},{default:I(()=>[(t(true),s(S,null,K(i.suggestions,m=>(t(),ee(T,{key:m,label:m,value:m},null,8,["label","value"]))),128))]),_:1},8,["modelValue","placeholder"])])}}}),Ae=oe(st,[["__scopeId","data-v-68388640"]]),at={class:"config-renderer"},nt={key:0,class:"form-row"},ot={class:"field-container"},it={key:6,class:"field-desc"},dt=ne({__name:"ConfigRenderer",props:{fields:{},modelValue:{},clearable:{type:Boolean,default:false}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=T=>p.modelValue[T],b=(T,f)=>{const m={...p.modelValue,[T]:f};x("update:modelValue",m)},D=T=>{if(!T.showWhen)return true;const{field:f,value:m}=T.showWhen;return p.modelValue[f]===m};return(T,f)=>{const m=M("el-switch"),y=M("el-option"),H=M("el-select"),z=M("el-input-number"),r=M("el-input");return t(),s("div",at,[(t(true),s(S,null,K(i.fields,k=>(t(),s(S,{key:k.key},[D(k)?(t(),s("div",nt,[e("div",{class:Z(["form-label",{required:k.required}])},u(k.label),3),e("div",ot,[o(" Boolean 类型 "),k.type==="boolean"?(t(),ee(m,{key:0,"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v)},null,8,["model-value","onUpdate:modelValue"])):k.type==="select"?(t(),s(S,{key:1},[o(" Select 类型 "),a(H,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder||"请选择",clearable:i.clearable,style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(k.options,v=>(t(),ee(y,{key:String(v.value),label:v.label,value:v.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)):k.type==="number"?(t(),s(S,{key:2},[o(" Number 类型 "),a(z,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder,controls:true},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):k.type==="textarea"?(t(),s(S,{key:3},[o(" Textarea 类型 "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),type:"textarea",rows:4,placeholder:k.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):k.type==="password"?(t(),s(S,{key:4},[o(" Password 类型 "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),type:"password","show-password":"",placeholder:k.placeholder},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),s(S,{key:5},[o(" Text/String 类型 (默认) "),a(r,{"model-value":c(k.key),"onUpdate:modelValue":v=>b(k.key,v),placeholder:k.placeholder,clearable:i.clearable},null,8,["model-value","onUpdate:modelValue","placeholder","clearable"])],64)),o(" 字段描述 "),k.description?(t(),s("div",it,u(k.description),1)):o("v-if",true)])])):o("v-if",true)],64))),128))])}}}),xe=oe(dt,[["__scopeId","data-v-d82952a0"]]),rt={class:"dialog-layout"},ct={class:"tab-nav"},ut=["onClick"],vt={key:0,class:"tab-badge"},mt={class:"tab-content"},pt={class:"content-section"},gt={class:"form-group"},ft={class:"form-row"},_t={class:"form-group flex-1"},ht={class:"form-group"},yt={class:"switch-wrapper"},bt={class:"switch-label"},kt={class:"form-group"},$t={class:"section-divider"},wt={class:"content-section"},Vt={class:"override-hint-bar"},Ct={class:"pipeline-flow"},xt={class:"phase-icon"},It={class:"phase-info"},Ut={class:"phase-name"},St={class:"phase-desc"},Ot={class:"phase-badge"},Tt={key:0,class:"phase-middlewares"},Dt={class:"mw-card"},zt={class:"mw-content"},Ft={class:"mw-name"},Pt={class:"mw-desc"},Lt={key:2,class:"phase-connector"},At={class:"connector-arrow"},Mt={class:"content-section"},Et={class:"override-hint-bar"},qt={key:0,class:"plugins-override-list"},Nt=["onClick"],Rt={class:"plugin-info"},Bt={class:"plugin-name"},Ht={key:0,class:"override-badge"},Gt={class:"plugin-actions"},Jt={class:"plugin-config-fields"},jt={key:0,class:"override-field-row"},Wt={class:"field-label"},Kt={class:"field-input"},Qt={key:0,class:"field-hint"},Xt={key:1,class:"empty-hint"},Yt={class:"dialog-footer"},Zt=ne({__name:"ChannelConfigDialog",props:{modelValue:{type:Boolean},channel:{default:null}},emits:["update:modelValue","saved"],setup(i,{emit:C}){const p=i,x=C,c=ae({get:()=>p.modelValue,set:w=>x("update:modelValue",w)}),b=ae(()=>{var w;return!!((w=p.channel)!=null&&w.id)}),D=h("basic"),T=h(false),f=h(new Set),m=h([]),y=h({}),H=h([]),z=h([]),r=h({name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}),k=[{id:"basic",label:"基本信息",icon:"file-text"},{id:"middlewares",label:"中间件流程",icon:"git-branch"},{id:"plugins",label:"插件配置",icon:"puzzle"}],v=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],A={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},G=ae(()=>r.value.connectorId?y.value[r.value.connectorId]||[]:[]),Q=ae(()=>{const w=m.value.find(d=>d.id===r.value.connectorId);return(w==null?void 0:w.name)||"连接器"}),N=ae(()=>k.map(w=>{let d="";return w.id==="middlewares"&&(d=String(H.value.length)),w.id==="plugins"&&q.value.length>0&&(d=String(q.value.length)),{...w,badge:d}})),q=ae(()=>z.value.filter(w=>w.configFields&&w.configFields.length>0)),g=w=>H.value.filter(d=>d.phase===w),W=(w,d)=>{var B,le,ce;return(ce=(le=(B=r.value.pluginOverrides)==null?void 0:B[w])==null?void 0:le.middlewares)==null?void 0:ce[d]},se=(w,d,B)=>{r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.pluginOverrides[w]||(r.value.pluginOverrides[w]={}),r.value.pluginOverrides[w].middlewares||(r.value.pluginOverrides[w].middlewares={}),B==null?(delete r.value.pluginOverrides[w].middlewares[d],Object.keys(r.value.pluginOverrides[w].middlewares).length===0&&delete r.value.pluginOverrides[w].middlewares,Object.keys(r.value.pluginOverrides[w]).length===0&&delete r.value.pluginOverrides[w]):r.value.pluginOverrides[w].middlewares[d]=B},re=w=>{const d=W(w.configGroup||w.name,w.name);return d!==void 0?d?"active override":"override":w.enabled?"active":""},P=(w,d)=>{var B,le;return(le=(B=r.value.pluginOverrides)==null?void 0:B[w])==null?void 0:le[d]},$=(w,d,B)=>{r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.pluginOverrides[w]||(r.value.pluginOverrides[w]={}),B==null||B===""?(delete r.value.pluginOverrides[w][d],Object.keys(r.value.pluginOverrides[w]).length===0&&delete r.value.pluginOverrides[w]):r.value.pluginOverrides[w][d]=B},O=w=>{var B;const d=(B=r.value.pluginOverrides)==null?void 0:B[w];return d&&Object.keys(d).length>0},_=w=>{r.value.pluginOverrides&&delete r.value.pluginOverrides[w]},V=w=>{f.value.has(w)?f.value.delete(w):f.value.add(w)},l=(w,d)=>{var L,ue;if(!d.showWhen)return true;const{field:B,value:le}=d.showWhen,ce=(ue=(L=r.value.pluginOverrides)==null?void 0:L[w.id])==null?void 0:ue[B],me=w.config[B];return(ce!==void 0?ce:me)===le},n=async w=>{if(r.value.connectorConfig={},w&&!y.value[w])try{const d=await ke.fields(w);y.value[w]=d}catch(d){console.error("Failed to load connector fields:",d)}},U=async()=>{var w;if(!r.value.name){J.error("请输入渠道名称");return}if(!r.value.connectorId){J.error("请选择连接器");return}T.value=true;try{b.value&&((w=p.channel)!=null&&w.id)?(await fe.update(p.channel.id,r.value),J.success("保存成功")):(await fe.create(r.value),J.success("创建成功")),x("saved"),c.value=false}catch(d){J.error(d instanceof Error?d.message:"操作失败")}finally{T.value=false}},j=()=>{D.value="basic",f.value.clear()},te=async()=>{try{const[w,d,B]=await Promise.all([ke.list(),$e.list(),Ve.list()]);m.value=w,H.value=d,z.value=B.filter(le=>le.configFields&&le.configFields.length>0||le.middlewares&&le.middlewares.length>0)}catch(w){console.error("Failed to load data:",w)}};return pe(()=>p.modelValue,async w=>{if(w)if(await te(),p.channel){if(r.value=JSON.parse(JSON.stringify(p.channel)),r.value.pluginOverrides||(r.value.pluginOverrides={}),r.value.connectorConfig||(r.value.connectorConfig={}),r.value.connectorId&&!y.value[r.value.connectorId])try{const d=await ke.fields(r.value.connectorId);y.value[r.value.connectorId]=d}catch(d){console.error("Failed to load connector fields:",d)}for(const d of Object.keys(r.value.pluginOverrides))f.value.add(d)}else r.value={name:"",enabled:true,connectorId:"",connectorConfig:{},pluginOverrides:{},tags:[]}}),(w,d)=>{const B=M("k-icon"),le=M("el-input"),ce=M("el-option"),me=M("el-select"),he=M("el-switch"),L=M("k-button"),ue=M("el-input-number"),ie=M("el-dialog");return t(),ee(ie,{modelValue:c.value,"onUpdate:modelValue":d[6]||(d[6]=F=>c.value=F),title:b.value?"编辑渠道":"创建渠道",width:"800px","close-on-click-modal":false,class:"channel-config-dialog",onClosed:j},{footer:I(()=>[e("div",Yt,[a(L,{onClick:d[5]||(d[5]=F=>c.value=false)},{default:I(()=>[...d[24]||(d[24]=[R("取消",-1)])]),_:1}),a(L,{type:"primary",onClick:U,loading:T.value},{default:I(()=>[R(u(b.value?"保存":"创建"),1)]),_:1},8,["loading"])])]),default:I(()=>[e("div",rt,[o(" 左侧 Tab 导航 "),e("div",ct,[(t(true),s(S,null,K(N.value,F=>(t(),s("div",{key:F.id,class:Z(["tab-item",{active:D.value===F.id}]),onClick:X=>D.value=F.id},[a(B,{name:F.icon},null,8,["name"]),e("span",null,u(F.label),1),F.badge?(t(),s("span",vt,u(F.badge),1)):o("v-if",true)],10,ut))),128))]),o(" 右侧内容区 "),e("div",mt,[o(" 基本信息 "),ye(e("div",pt,[d[13]||(d[13]=e("div",{class:"section-header"},[e("h4",null,"基本信息"),e("p",null,"设置渠道的名称、连接器和标签")],-1)),e("div",gt,[d[7]||(d[7]=e("label",{class:"form-label required"},"渠道名称",-1)),a(le,{modelValue:r.value.name,"onUpdate:modelValue":d[0]||(d[0]=F=>r.value.name=F),placeholder:"如 OpenAI DALL-E"},null,8,["modelValue"]),d[8]||(d[8]=e("div",{class:"form-hint"},"用户可见的渠道名称,冲突时会自动添加后缀",-1))]),e("div",ft,[e("div",_t,[d[9]||(d[9]=e("label",{class:"form-label required"},"连接器",-1)),a(me,{modelValue:r.value.connectorId,"onUpdate:modelValue":d[1]||(d[1]=F=>r.value.connectorId=F),placeholder:"选择连接器",onChange:n,style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(m.value,F=>(t(),ee(ce,{key:F.id,label:F.name,value:F.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",ht,[d[10]||(d[10]=e("label",{class:"form-label"},"启用状态",-1)),e("div",yt,[a(he,{modelValue:r.value.enabled,"onUpdate:modelValue":d[2]||(d[2]=F=>r.value.enabled=F)},null,8,["modelValue"]),e("span",bt,u(r.value.enabled?"启用":"禁用"),1)])])]),e("div",kt,[d[11]||(d[11]=e("label",{class:"form-label"},"标签",-1)),a(Ae,{modelValue:r.value.tags,"onUpdate:modelValue":d[3]||(d[3]=F=>r.value.tags=F),placeholder:"输入标签后按回车..."},null,8,["modelValue"]),d[12]||(d[12]=e("div",{class:"form-hint"},"用于分类和筛选渠道",-1))]),o(" 连接器配置(内嵌) "),G.value.length>0?(t(),s(S,{key:0},[e("div",$t,[e("span",null,u(Q.value)+" 配置",1)]),a(xe,{fields:G.value,modelValue:r.value.connectorConfig,"onUpdate:modelValue":d[4]||(d[4]=F=>r.value.connectorConfig=F)},null,8,["fields","modelValue"])],64)):o("v-if",true)],512),[[be,D.value==="basic"]]),o(" 中间件流程 "),ye(e("div",wt,[d[18]||(d[18]=e("div",{class:"section-header"},[e("h4",null,"中间件流程"),e("p",null,"控制此渠道的中间件启用状态")],-1)),e("div",Vt,[a(B,{name:"info-circle"}),d[14]||(d[14]=e("span",null,"留空表示跟随全局配置",-1))]),e("div",Ct,[(t(),s(S,null,K(v,(F,X)=>e("div",{key:F.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:Z(["phase-header",F.colorClass])},[e("div",xt,[a(B,{name:F.icon},null,8,["name"])]),e("div",It,[e("span",Ut,u(F.label),1),e("span",St,u(F.description),1)]),e("span",Ot,u(g(F.id).length),1)],2),o(" 中间件列表 "),g(F.id).length>0?(t(),s("div",Tt,[(t(true),s(S,null,K(g(F.id),Y=>(t(),s("div",{key:Y.name,class:Z(["mw-item",{"has-override":W(Y.configGroup||Y.name,Y.name)!==void 0}])},[e("div",Dt,[e("div",{class:Z(["mw-status",re(Y)])},null,2),e("div",zt,[e("span",Ft,u(Y.displayName),1),e("span",Pt,u(Y.description||A[Y.category]||Y.category),1)]),a(me,{"model-value":W(Y.configGroup||Y.name,Y.name),"onUpdate:modelValue":Me=>se(Y.configGroup||Y.name,Y.name,Me),placeholder:Y.enabled?"全局: 启用":"全局: 禁用",clearable:"",size:"small",class:"mw-switch"},{default:I(()=>[a(ce,{label:"启用",value:true}),a(ce,{label:"禁用",value:false})]),_:1},8,["model-value","onUpdate:modelValue","placeholder"])])],2))),128))])):(t(),s(S,{key:1},[o(" 空状态 "),d[15]||(d[15]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),X<v.length-1?(t(),s("div",Lt,[d[16]||(d[16]=e("div",{class:"connector-line"},null,-1)),e("div",At,[a(B,{name:"chevron-down"})]),d[17]||(d[17]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),d[19]||(d[19]=e("div",{class:"pipeline-footer"},[e("div",{class:"footer-item"},[e("span",{class:"dot active"}),e("span",null,"启用 - 中间件将在请求中执行")]),e("div",{class:"footer-item"},[e("span",{class:"dot"}),e("span",null,"禁用 - 中间件将被跳过")]),e("div",{class:"footer-item"},[e("span",{class:"dot override"}),e("span",null,"已覆盖 - 与全局配置不同")])],-1))],512),[[be,D.value==="middlewares"]]),o(" 插件配置 "),ye(e("div",Mt,[d[23]||(d[23]=e("div",{class:"section-header"},[e("h4",null,"插件配置覆盖"),e("p",null,"为此渠道单独配置插件参数")],-1)),e("div",Et,[a(B,{name:"info-circle"}),d[20]||(d[20]=e("span",null,"留空使用全局配置,填写后将覆盖全局设置",-1))]),q.value.length>0?(t(),s("div",qt,[(t(true),s(S,null,K(q.value,F=>(t(),s("div",{key:F.id,class:Z(["plugin-override-card",{expanded:f.value.has(F.id)}])},[e("div",{class:"plugin-header",onClick:X=>V(F.id)},[e("div",Rt,[e("span",Bt,u(F.name),1),O(F.id)?(t(),s("span",Ht,"已覆盖")):o("v-if",true)]),e("div",Gt,[O(F.id)?(t(),ee(L,{key:0,size:"mini",onClick:de(X=>_(F.id),["stop"])},{default:I(()=>[...d[21]||(d[21]=[R(" 清除 ",-1)])]),_:1},8,["onClick"])):o("v-if",true),a(B,{name:f.value.has(F.id)?"chevron-up":"chevron-down"},null,8,["name"])])],8,Nt),ye(e("div",Jt,[(t(true),s(S,null,K(F.configFields,X=>(t(),s(S,{key:X.key},[l(F,X)?(t(),s("div",jt,[e("label",Wt,u(X.label),1),e("div",Kt,[o(" Boolean 类型 "),X.type==="boolean"?(t(),ee(me,{key:0,"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:"使用全局配置",clearable:""},{default:I(()=>[a(ce,{label:"是",value:true}),a(ce,{label:"否",value:false})]),_:1},8,["model-value","onUpdate:modelValue"])):X.type==="select"?(t(),s(S,{key:1},[o(" Select 类型 "),a(me,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??"未设置"}`,clearable:""},{default:I(()=>[(t(true),s(S,null,K(X.options,Y=>(t(),ee(ce,{key:String(Y.value),label:Y.label,value:Y.value},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue","placeholder"])],64)):X.type==="number"?(t(),s(S,{key:2},[o(" Number 类型 "),a(ue,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??""}`},null,8,["model-value","onUpdate:modelValue","placeholder"])],64)):(t(),s(S,{key:3},[o(" Text/String 类型 (默认) "),a(le,{"model-value":P(F.id,X.key),"onUpdate:modelValue":Y=>$(F.id,X.key,Y),placeholder:`全局: ${F.config[X.key]??"未设置"}`,clearable:""},null,8,["model-value","onUpdate:modelValue","placeholder"])],64))]),X.description?(t(),s("div",Qt,u(X.description),1)):o("v-if",true)])):o("v-if",true)],64))),128))],512),[[be,f.value.has(F.id)]])],2))),128))])):(t(),s("div",Xt,[a(B,{name:"apps"}),d[22]||(d[22]=e("span",null,"暂无可配置的插件",-1))]))],512),[[be,D.value==="plugins"]])])])]),_:1},8,["modelValue","title"])}}}),el=oe(Zt,[["__scopeId","data-v-74bfe0c7"]]),tl={key:0},ll=ne({__name:"LoadingState",props:{text:{default:"加载中..."},icon:{default:"sync"},size:{default:"default"}},setup(i){const C=i,p=ae(()=>`size-${C.size}`);return(x,c)=>{const b=M("k-icon");return t(),s("div",{class:Z(["loading-state",p.value])},[a(b,{name:i.icon,class:"loading-icon"},null,8,["name"]),i.text?(t(),s("span",tl,u(i.text),1)):o("v-if",true)],2)}}}),sl=oe(ll,[["__scopeId","data-v-99cf565d"]]),al={class:"view-container"},nl={class:"view-header"},ol={class:"header-left"},il={class:"header-right"},dl={class:"view-content"},rl={class:"channel-grid"},cl=["onClick"],ul={class:"card-header"},vl={class:"header-main"},ml={class:"channel-name"},pl={class:"header-meta"},gl={class:"connector-badge"},fl={key:0,class:"cost-badge"},_l={class:"card-body"},hl={key:0,class:"field-list"},yl={class:"field-label"},bl={class:"field-value"},kl={key:1,class:"tags-list"},$l={class:"list-view"},wl={class:"channel-table"},Vl=["onClick"],Cl={class:"col-name"},xl={class:"name-text"},Il={class:"col-connector"},Ul={class:"connector-badge"},Sl={class:"col-tags"},Ol={class:"tags-wrapper"},Tl={key:0,class:"mini-tag more"},Dl={class:"col-cost"},zl={key:0,class:"cost-value"},Fl={class:"action-btns"},Pl=ne({__name:"ChannelsView",setup(i){const C=["text2img","img2img","NSFW"],p=h(false),x=h("card"),c=h([]),b=h([]),D=h([]),T=h({}),f=h(false),m=h(null),y=h([]),H=ae(()=>{const P=new Set;return c.value.forEach($=>{($.tags||[]).forEach(O=>P.add(O))}),Array.from(P).sort()}),z=ae(()=>y.value.length===0?c.value:c.value.filter(P=>y.value.every($=>(P.tags||[]).includes($)))),r=P=>{const $=b.value.find(O=>O.id===P);return $?$.name:P},k=P=>{var O;const $=b.value.find(_=>_.id===P.connectorId);return(O=$==null?void 0:$.cardFields)!=null&&O.length?$.cardFields.map(_=>{const V=$.fields.find(l=>l.key===_.key);return{key:_.key,label:_.label||(V==null?void 0:V.label)||_.key,format:_.format||"text"}}):[]},v=(P,$)=>{var _,V,l,n,U;const O=$.configGroup;switch($.source){case"channel":if(O){const j=(V=(_=P.pluginOverrides)==null?void 0:_[O])==null?void 0:V[$.key];if(j!==void 0)return j}return P[$.key];case"connectorConfig":return(l=P.connectorConfig)==null?void 0:l[$.key];case"pluginOverride":return O?(U=(n=P.pluginOverrides)==null?void 0:n[O])==null?void 0:U[$.key]:void 0;default:return}},A=(P,$)=>{var l,n,U;const O=$.configGroup;if(!O)return $.suffix||"";const _=(n=(l=P.pluginOverrides)==null?void 0:l[O])==null?void 0:n.currencyLabel;if(_)return` ${_}${$.suffix||""}`;const V=(U=T.value[O])==null?void 0:U.currencyLabel;return V?` ${V}${$.suffix||""}`:` 积分${$.suffix||""}`},G=(P,$,O)=>{if(P==null||P==="")return"-";let _;switch($){case"password-mask":_="••••••";break;case"boolean":_=P?"是":"否";break;case"number":_=String(P);break;case"size":_=String(P);break;case"currency":_=P===0?"免费":String(P);break;default:_=String(P)}return O?`${_} ${O}`:_},Q=async()=>{p.value=true;try{const[P,$,O]=await Promise.all([fe.list(),ke.list(),$e.cardFields()]);c.value=P,b.value=$,D.value=O.fields,T.value=O.globalConfigs}catch{J.error("加载数据失败")}finally{p.value=false}},N=()=>{m.value=null,f.value=true},q=P=>{m.value=P,f.value=true},g=()=>{Q()},W=async P=>{if(confirm(`确定要删除渠道 "${P.name}" 吗?`))try{await fe.delete(P.id),J.success("删除成功"),Q()}catch{J.error("删除失败")}},se=async P=>{try{await fe.toggle(P.id,P.enabled)}catch{P.enabled=!P.enabled,J.error("操作失败")}},re=P=>{const $=JSON.parse(JSON.stringify(P));delete $.id,$.name=`${P.name} (副本)`,m.value=$,f.value=true};return ve(()=>{Q()}),(P,$)=>{const O=M("k-icon"),_=M("k-button"),V=M("el-switch");return t(),s("div",al,[e("div",nl,[e("div",ol,[a(_,{solid:"",type:"primary",onClick:N,class:"create-btn"},{icon:I(()=>[a(O,{name:"add"})]),default:I(()=>[$[7]||($[7]=R(" 新建渠道 ",-1))]),_:1}),a(Pe,{modelValue:y.value,"onUpdate:modelValue":$[0]||($[0]=l=>y.value=l),"all-tags":H.value,"preset-tags":C},null,8,["modelValue","all-tags"])]),e("div",il,[a(Le,{modelValue:x.value,"onUpdate:modelValue":$[1]||($[1]=l=>x.value=l)},null,8,["modelValue"])])]),e("div",dl,[p.value?(t(),ee(sl,{key:0})):x.value==="card"?(t(),s(S,{key:1},[o(" 卡片视图 "),e("div",rl,[(t(true),s(S,null,K(z.value,l=>(t(),s("div",{key:l.id,class:"channel-card-wrapper"},[e("div",{class:"channel-card",onClick:n=>q(l)},[e("div",ul,[e("div",vl,[e("div",ml,u(l.name),1),a(V,{modelValue:l.enabled,"onUpdate:modelValue":n=>l.enabled=n,size:"small",onChange:n=>se(l),onClick:$[2]||($[2]=de(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("div",pl,[e("span",gl,[a(O,{name:"link"}),R(" "+u(r(l.connectorId)),1)]),o(" 中间件字段(如费用)显示在标题旁 "),(t(true),s(S,null,K(D.value,n=>(t(),s(S,{key:`mw-${n.key}`},[n.key==="cost"?(t(),s("span",fl,u(G(v(l,n),n.format,A(l,n))),1)):o("v-if",true)],64))),128))])]),e("div",_l,[o(" 配置字段列表 "),k(l).length?(t(),s("div",hl,[(t(true),s(S,null,K(k(l),n=>(t(),s("div",{key:n.key,class:"field-item"},[e("span",yl,u(n.label),1),e("span",bl,u(G(l.connectorConfig[n.key],n.format)),1)]))),128))])):o("v-if",true),o(" 标签 "),l.tags&&l.tags.length?(t(),s("div",kl,[(t(true),s(S,null,K(l.tags,n=>(t(),s("span",{key:n,class:"tag-pill"},u(n),1))),128))])):o("v-if",true)]),e("div",{class:"card-footer",onClick:$[3]||($[3]=de(()=>{},["stop"]))},[a(_,{size:"mini",class:"copy-btn",onClick:n=>re(l)},{icon:I(()=>[a(O,{name:"copy"})]),default:I(()=>[$[8]||($[8]=R(" 复制 ",-1))]),_:1},8,["onClick"]),$[10]||($[10]=e("div",{class:"spacer"},null,-1)),a(_,{size:"mini",class:"delete-btn",onClick:n=>W(l)},{icon:I(()=>[a(O,{name:"delete"})]),default:I(()=>[$[9]||($[9]=R(" 删除 ",-1))]),_:1},8,["onClick"])])],8,cl)]))),128))])],2112)):(t(),s(S,{key:2},[o(" 列表视图 "),e("div",$l,[e("table",wl,[$[13]||($[13]=e("thead",null,[e("tr",null,[e("th",{class:"col-name"},"名称"),e("th",{class:"col-connector"},"连接器"),e("th",{class:"col-tags"},"标签"),e("th",{class:"col-cost"},"费用"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),s(S,null,K(z.value,l=>(t(),s("tr",{key:l.id,class:"channel-row",onClick:n=>q(l)},[e("td",Cl,[e("span",xl,u(l.name),1)]),e("td",Il,[e("span",Ul,u(r(l.connectorId)),1)]),e("td",Sl,[e("div",Ol,[(t(true),s(S,null,K((l.tags||[]).slice(0,2),n=>(t(),s("span",{key:n,class:"mini-tag"},u(n),1))),128)),l.tags&&l.tags.length>2?(t(),s("span",Tl,"+"+u(l.tags.length-2),1)):o("v-if",true)])]),e("td",Dl,[(t(true),s(S,null,K(D.value,n=>(t(),s(S,{key:`mw-${n.key}`},[n.key==="cost"?(t(),s("span",zl,u(G(v(l,n),n.format,A(l,n))),1)):o("v-if",true)],64))),128))]),e("td",{class:"col-status",onClick:$[4]||($[4]=de(()=>{},["stop"]))},[a(V,{modelValue:l.enabled,"onUpdate:modelValue":n=>l.enabled=n,size:"small",onChange:n=>se(l)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:$[5]||($[5]=de(()=>{},["stop"]))},[e("div",Fl,[a(_,{size:"mini",class:"copy-btn",onClick:n=>re(l)},{icon:I(()=>[a(O,{name:"copy"})]),default:I(()=>[$[11]||($[11]=R(" 复制 ",-1))]),_:1},8,["onClick"]),a(_,{size:"mini",class:"delete-btn",onClick:n=>W(l)},{icon:I(()=>[a(O,{name:"delete"})]),default:I(()=>[$[12]||($[12]=R(" 删除 ",-1))]),_:1},8,["onClick"])])])],8,Vl))),128))])])])],2112))]),o(" 编辑/创建对话框 "),a(el,{modelValue:f.value,"onUpdate:modelValue":$[6]||($[6]=l=>f.value=l),channel:m.value,onSaved:g},null,8,["modelValue","channel"])])}}}),Ll=oe(Pl,[["__scopeId","data-v-e6ec7ca7"]]),Al={class:"json-editor"},Ml={key:0,class:"error-msg"},El=ne({__name:"JsonEditor",props:{modelValue:{},rows:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=h(""),b=h("");pe(()=>p.modelValue,T=>{try{c.value=JSON.stringify(T,null,2)}catch{c.value=""}},{immediate:true});const D=()=>{try{const T=JSON.parse(c.value);b.value="",x("update:modelValue",T)}catch{b.value="Invalid JSON format"}};return(T,f)=>{const m=M("el-input");return t(),s("div",Al,[a(m,{modelValue:c.value,"onUpdate:modelValue":f[0]||(f[0]=y=>c.value=y),type:"textarea",rows:i.rows,class:"code-input",onBlur:D},null,8,["modelValue","rows"]),b.value?(t(),s("div",Ml,u(b.value),1)):o("v-if",true)])}}}),ql=oe(El,[["__scopeId","data-v-4d47b7db"]]),Nl={class:"image-upload"},Rl={key:0,class:"image-list"},Bl={class:"image-preview"},Hl=["src","alt"],Gl={class:"image-overlay"},Jl={class:"image-name"},jl={class:"upload-content"},Wl={key:1,class:"upload-loading"},Kl=ne({__name:"ImageUpload",props:{modelValue:{},maxCount:{}},emits:["update:modelValue"],setup(i,{emit:C}){const p=i,x=C,c=h(),b=h(false),D=h([]),T=async()=>{var v;const k=[];for(const A of p.modelValue)A&&k.push({url:A,filename:((v=A.split("/").pop())==null?void 0:v.split("?")[0])||"image",mime:"image/png",previewUrl:A});D.value=k};pe(()=>p.modelValue,()=>{T()},{immediate:true});const f=()=>{var k;(k=c.value)==null||k.click()},m=async k=>{const v=k.target;!v.files||v.files.length===0||(await H(Array.from(v.files)),v.value="")},y=async k=>{var A;const v=(A=k.dataTransfer)==null?void 0:A.files;!v||v.length===0||await H(Array.from(v).filter(G=>G.type.startsWith("image/")))},H=async k=>{if(k.length===0)return;const v=p.maxCount||10;D.value.length+k.length>v&&(J.warning(`最多上传 ${v} 张图片`),k=k.slice(0,v-D.value.length)),b.value=true;try{for(const A of k){const G=await z(A),Q=await We.upload(G,A.type,A.name);if(!Q.url){J.error("缓存服务未配置 selfUrl,无法获取图片 URL");continue}D.value.push({url:Q.url,filename:Q.filename,mime:Q.mime,previewUrl:Q.url})}x("update:modelValue",D.value.map(A=>A.url))}catch(A){J.error("上传失败"),console.error(A)}finally{b.value=false}},z=k=>new Promise((v,A)=>{const G=new FileReader;G.onload=()=>{const N=G.result.split(",")[1];v(N)},G.onerror=A,G.readAsDataURL(k)}),r=k=>{D.value.splice(k,1),x("update:modelValue",D.value.map(v=>v.url))};return ve(()=>{T()}),(k,v)=>{const A=M("k-icon"),G=M("k-button");return t(),s("div",Nl,[o(" 已上传的图片列表 "),D.value.length>0?(t(),s("div",Rl,[(t(true),s(S,null,K(D.value,(Q,N)=>(t(),s("div",{key:Q.url||N,class:"image-item"},[e("div",Bl,[e("img",{src:Q.previewUrl,alt:Q.filename},null,8,Hl),e("div",Gl,[a(G,{size:"mini",class:"remove-btn",onClick:q=>r(N)},{icon:I(()=>[a(A,{name:"delete"})]),_:1},8,["onClick"])])]),e("div",Jl,u(Q.filename),1)]))),128))])):o("v-if",true),o(" 上传按钮 "),e("div",{class:"upload-area",onClick:f,onDragover:v[0]||(v[0]=de(()=>{},["prevent"])),onDrop:de(y,["prevent"])},[e("input",{ref_key:"fileInput",ref:c,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:m},null,544),e("div",jl,[a(A,{name:"add",class:"upload-icon"}),v[1]||(v[1]=e("span",{class:"upload-text"},"点击或拖拽上传图片",-1))])],32),o(" 加载状态 "),b.value?(t(),s("div",Wl,[a(A,{name:"sync",class:"loading-icon"}),v[2]||(v[2]=R(" 上传中... ",-1))])):o("v-if",true)])}}}),Te=oe(Kl,[["__scopeId","data-v-47f2485e"]]),Ql={class:"view-container"},Xl={class:"view-header"},Yl={class:"header-left"},Zl={class:"header-right"},es={class:"view-content"},ts={key:0,class:"loading-state"},ls={class:"masonry-grid"},ss=["onClick"],as={key:0,class:"card-thumbnail"},ns=["src","alt"],os={class:"thumbnail-overlay"},is={key:0,class:"ref-count"},ds={key:1,class:"card-thumbnail placeholder"},rs={class:"card-content"},cs={class:"card-title"},us={key:0,class:"card-tags"},vs={key:0,class:"mini-tag more"},ms={class:"list-view"},ps={class:"preset-table"},gs=["onClick"],fs={class:"col-thumb"},_s={class:"thumb-wrapper"},hs=["src","alt"],ys={key:1,class:"thumb-placeholder"},bs={class:"col-name"},ks={class:"name-text"},$s={class:"col-template"},ws={class:"template-preview"},Vs={class:"col-refs"},Cs={key:0,class:"ref-badge"},xs={key:1,class:"no-data"},Is={class:"col-source"},Us={class:"action-btns"},Ss={class:"dialog-footer"},Os=ne({__name:"PresetsView",setup(i){const C=["本地","远程","text2img","img2img","NSFW"],p=h(false),x=h([]),c=h(false),b=h(false),D=h([]),T=h("card"),f=ae(()=>{const q=new Set;return x.value.forEach(g=>{(g.tags||[]).forEach(W=>q.add(W))}),Array.from(q).sort()}),m=h({name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"}),y=h([]);pe(()=>m.value.thumbnail,q=>{y.value=q?[q]:[]},{immediate:true}),pe(y,q=>{m.value.thumbnail=q.length>0?q[0]:""});const H=ae(()=>D.value.length===0?x.value:x.value.filter(q=>D.value.every(g=>g==="本地"?q.source==="user":g==="远程"?q.source==="api":(q.tags||[]).includes(g)))),z=async()=>{p.value=true;try{x.value=await ge.list()}catch{J.error("加载数据失败")}finally{p.value=false}},r=()=>{b.value=false,m.value={name:"",promptTemplate:"",referenceImages:[],tags:[],parameterOverrides:{},enabled:true,source:"user"},c.value=true},k=q=>{b.value=true,m.value=JSON.parse(JSON.stringify(q)),c.value=true},v=q=>{b.value=false;const g=JSON.parse(JSON.stringify(q));delete g.id,g.name=`${q.name} (副本)`,g.source="user",m.value=g,c.value=true},A=async q=>{try{await ge.toggle(q.id,q.enabled)}catch{q.enabled=!q.enabled,J.error("操作失败")}},G=(q,g=50)=>{if(!q)return"-";const W=q.replace(/\s+/g," ").trim();return W.length<=g?W:W.slice(0,g)+"..."},Q=async()=>{if(!m.value.name||!m.value.promptTemplate){J.warning("请填写必要信息");return}try{b.value&&m.value.id?(await ge.update(m.value.id,m.value),J.success("更新成功")):(await ge.create(m.value),J.success("创建成功")),c.value=false,z()}catch{J.error("操作失败")}},N=async q=>{if(confirm(`确定要删除预设 "${q.name}" 吗?`))try{await ge.delete(q.id),J.success("删除成功"),z()}catch{J.error("删除失败")}};return ve(()=>{z()}),(q,g)=>{const W=M("k-icon"),se=M("k-button"),re=M("el-switch"),P=M("el-input"),$=M("el-form-item"),O=M("el-divider"),_=M("el-form"),V=M("el-dialog");return t(),s("div",Ql,[e("div",Xl,[e("div",Yl,[a(se,{solid:"",type:"primary",onClick:r},{icon:I(()=>[a(W,{name:"add"})]),default:I(()=>[g[14]||(g[14]=R(" 新建预设 ",-1))]),_:1}),a(Pe,{modelValue:D.value,"onUpdate:modelValue":g[0]||(g[0]=l=>D.value=l),"all-tags":f.value,"preset-tags":C},null,8,["modelValue","all-tags"])]),e("div",Zl,[a(Le,{modelValue:T.value,"onUpdate:modelValue":g[1]||(g[1]=l=>T.value=l)},null,8,["modelValue"])])]),e("div",es,[p.value?(t(),s("div",ts,[a(W,{name:"sync",class:"loading-icon"}),g[15]||(g[15]=R(" 加载中... ",-1))])):T.value==="card"?(t(),s(S,{key:1},[o(" 卡片视图 (瀑布流) "),e("div",ls,[(t(true),s(S,null,K(H.value,l=>{var n,U;return t(),s("div",{key:l.id,class:"masonry-item"},[e("div",{class:"preset-card",onClick:j=>k(l)},[o(" 缩略图 "),l.thumbnail?(t(),s("div",as,[e("img",{src:l.thumbnail,alt:l.name,loading:"lazy"},null,8,ns),e("div",os,[(n=l.referenceImages)!=null&&n.length?(t(),s("span",is,[a(W,{name:"image"}),R(" "+u(l.referenceImages.length),1)])):o("v-if",true)])])):(t(),s("div",ds,[a(W,{name:"image",class:"placeholder-icon"})])),o(" 内容 "),e("div",rs,[e("div",cs,u(l.name),1),(U=l.tags)!=null&&U.length?(t(),s("div",us,[(t(true),s(S,null,K(l.tags.slice(0,4),j=>(t(),s("span",{key:j,class:"mini-tag"},u(j),1))),128)),l.tags.length>4?(t(),s("span",vs,"+"+u(l.tags.length-4),1)):o("v-if",true)])):o("v-if",true)]),o(" 操作按钮 "),e("div",{class:"card-actions",onClick:g[2]||(g[2]=de(()=>{},["stop"]))},[a(re,{modelValue:l.enabled,"onUpdate:modelValue":j=>l.enabled=j,size:"small",onChange:j=>A(l)},null,8,["modelValue","onUpdate:modelValue","onChange"]),a(se,{size:"mini",class:"copy-btn",onClick:j=>v(l)},{icon:I(()=>[a(W,{name:"copy"})]),default:I(()=>[g[16]||(g[16]=R(" 复制 ",-1))]),_:1},8,["onClick"]),l.source==="user"?(t(),ee(se,{key:0,size:"mini",class:"delete-btn",onClick:j=>N(l)},{icon:I(()=>[a(W,{name:"delete"})]),default:I(()=>[g[17]||(g[17]=R(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)]),o(" 来源标记 "),e("div",{class:Z(["source-indicator",l.source])},u(l.source==="api"?"远程":"本地"),3)],8,ss)])}),128))])],2112)):(t(),s(S,{key:2},[o(" 列表视图 "),e("div",ms,[e("table",ps,[g[20]||(g[20]=e("thead",null,[e("tr",null,[e("th",{class:"col-thumb"},"缩略图"),e("th",{class:"col-name"},"名称"),e("th",{class:"col-template"},"Prompt 模板"),e("th",{class:"col-refs"},"参考图"),e("th",{class:"col-source"},"来源"),e("th",{class:"col-status"},"状态"),e("th",{class:"col-actions"},"操作")])],-1)),e("tbody",null,[(t(true),s(S,null,K(H.value,l=>{var n;return t(),s("tr",{key:l.id,class:"preset-row",onClick:U=>k(l)},[e("td",fs,[e("div",_s,[l.thumbnail?(t(),s("img",{key:0,src:l.thumbnail,alt:l.name},null,8,hs)):(t(),s("div",ys,[a(W,{name:"image"})]))])]),e("td",bs,[e("span",ks,u(l.name),1)]),e("td",$s,[e("span",ws,u(G(l.promptTemplate)),1)]),e("td",Vs,[(n=l.referenceImages)!=null&&n.length?(t(),s("span",Cs,[a(W,{name:"image"}),R(" "+u(l.referenceImages.length),1)])):(t(),s("span",xs,"-"))]),e("td",Is,[e("span",{class:Z(["source-badge",l.source])},u(l.source==="api"?"远程":"本地"),3)]),e("td",{class:"col-status",onClick:g[3]||(g[3]=de(()=>{},["stop"]))},[a(re,{modelValue:l.enabled,"onUpdate:modelValue":U=>l.enabled=U,size:"small",onChange:U=>A(l)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),e("td",{class:"col-actions",onClick:g[4]||(g[4]=de(()=>{},["stop"]))},[e("div",Us,[a(se,{size:"mini",class:"copy-btn",onClick:U=>v(l)},{icon:I(()=>[a(W,{name:"copy"})]),default:I(()=>[g[18]||(g[18]=R(" 复制 ",-1))]),_:1},8,["onClick"]),l.source==="user"?(t(),ee(se,{key:0,size:"mini",class:"delete-btn",onClick:U=>N(l)},{icon:I(()=>[a(W,{name:"delete"})]),default:I(()=>[g[19]||(g[19]=R(" 删除 ",-1))]),_:1},8,["onClick"])):o("v-if",true)])])],8,gs)}),128))])])])],2112))]),o(" 编辑/创建对话框 "),a(V,{modelValue:c.value,"onUpdate:modelValue":g[13]||(g[13]=l=>c.value=l),title:b.value?"编辑预设":"创建预设",width:"600px","close-on-click-modal":false},{footer:I(()=>[e("span",Ss,[a(se,{onClick:g[12]||(g[12]=l=>c.value=false)},{default:I(()=>[...g[27]||(g[27]=[R("取消",-1)])]),_:1}),a(se,{type:"primary",onClick:Q},{default:I(()=>[...g[28]||(g[28]=[R("保存",-1)])]),_:1})])]),default:I(()=>[c.value?(t(),ee(_,{key:0,ref:"formRef",model:m.value,"label-width":"100px"},{default:I(()=>[a($,{label:"名称",required:""},{default:I(()=>[a(P,{modelValue:m.value.name,"onUpdate:modelValue":g[5]||(g[5]=l=>m.value.name=l),disabled:b.value&&m.value.source==="api",placeholder:"如 二次元少女"},null,8,["modelValue","disabled"]),g[21]||(g[21]=e("div",{class:"form-tip"},"用于指令调用和展示,冲突时会自动添加后缀",-1))]),_:1}),a($,{label:"Prompt 模板",required:""},{default:I(()=>[a(P,{modelValue:m.value.promptTemplate,"onUpdate:modelValue":g[6]||(g[6]=l=>m.value.promptTemplate=l),type:"textarea",rows:4,placeholder:"输入提示词模板,支持变量如 {prompt}"},null,8,["modelValue"]),g[22]||(g[22]=e("div",{class:"form-tip"},"默认将用户输入附加在最后,也可使用 {prompt} 指定位置",-1))]),_:1}),m.value.source==="user"?(t(),ee($,{key:0,label:"缩略图"},{default:I(()=>[a(Te,{modelValue:y.value,"onUpdate:modelValue":g[7]||(g[7]=l=>y.value=l),"max-count":1},null,8,["modelValue"]),g[23]||(g[23]=e("div",{class:"form-tip"},"用于在卡片视图中展示预设的预览图",-1))]),_:1})):o("v-if",true),a($,{label:"参考图"},{default:I(()=>[a(Te,{modelValue:m.value.referenceImages,"onUpdate:modelValue":g[8]||(g[8]=l=>m.value.referenceImages=l),"max-count":5},null,8,["modelValue"]),g[24]||(g[24]=e("div",{class:"form-tip"},"生成时会自动附加这些参考图片",-1))]),_:1}),a(O,{"content-position":"left"},{default:I(()=>[...g[25]||(g[25]=[R("高级设置",-1)])]),_:1}),a($,{label:"标签"},{default:I(()=>[a(Ae,{modelValue:m.value.tags,"onUpdate:modelValue":g[9]||(g[9]=l=>m.value.tags=l),placeholder:"输入标签..."},null,8,["modelValue"]),g[26]||(g[26]=e("div",{class:"form-tip"},"与渠道标签匹配时会自动关联",-1))]),_:1}),a($,{label:"参数覆盖"},{default:I(()=>[a(ql,{modelValue:m.value.parameterOverrides,"onUpdate:modelValue":g[10]||(g[10]=l=>m.value.parameterOverrides=l),rows:3},null,8,["modelValue"])]),_:1}),a($,{label:"启用状态"},{default:I(()=>[a(re,{modelValue:m.value.enabled,"onUpdate:modelValue":g[11]||(g[11]=l=>m.value.enabled=l)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])):o("v-if",true)]),_:1},8,["modelValue","title"])])}}}),Ts=oe(Os,[["__scopeId","data-v-99691cb5"]]),Ds=ne({__name:"StatusBadge",props:{status:{}},setup(i){const C=i,p=ae(()=>{switch(C.status){case"pending":return"等待中";case"processing":return"处理中";case"success":return"成功";case"failed":return"失败";default:return C.status}});return(x,c)=>(t(),s("span",{class:Z(["status-badge",i.status])},u(p.value),3))}}),De=oe(Ds,[["__scopeId","data-v-0bc21896"]]),zs={class:"lightbox-container"},Fs={class:"lightbox-content"},Ps=["src"],Ls={key:2,class:"image-counter"},As={key:0,class:"lightbox-sidebar"},Ms={class:"sidebar-header"},Es={class:"sidebar-body"},qs={class:"info-block"},Ns={class:"block-header"},Rs={key:0,class:"info-block"},Bs={class:"info-value"},Hs={key:1,class:"info-block"},Gs={class:"info-value"},Js={class:"sidebar-footer"},js=ne({__name:"ImageLightbox",props:{visible:{type:Boolean},images:{},initialIndex:{default:0},prompt:{},createdAt:{},duration:{},showSidebar:{type:Boolean,default:true}},emits:["update:visible","close"],setup(i,{emit:C}){const p=i,x=C,c=h(p.initialIndex),b=ae(()=>p.images[c.value]||"");pe(()=>p.visible,v=>{v?(c.value=p.initialIndex,document.body.style.overflow="hidden"):document.body.style.overflow=""}),pe(()=>p.initialIndex,v=>{c.value=v});const D=()=>{x("update:visible",false),x("close")},T=()=>{c.value=(c.value-1+p.images.length)%p.images.length},f=()=>{c.value=(c.value+1)%p.images.length},m=()=>{p.prompt&&(navigator.clipboard.writeText(p.prompt),J.success("已复制提示词"))},y=()=>{window.open(b.value,"_blank")},H=()=>{const v=document.createElement("a");v.href=b.value,v.download=`image-${Date.now()}.png`,v.click()},z=v=>(typeof v=="string"?new Date(v):v).toLocaleString(),r=v=>v<1e3?`${v}ms`:`${(v/1e3).toFixed(1)}s`,k=v=>{p.visible&&(v.key==="Escape"?D():v.key==="ArrowLeft"?T():v.key==="ArrowRight"&&f())};return ve(()=>{window.addEventListener("keydown",k)}),Fe(()=>{window.removeEventListener("keydown",k),document.body.style.overflow=""}),(v,A)=>{const G=M("k-icon");return t(),ee(qe,{to:"body"},[a(Ne,{name:"lightbox-fade"},{default:I(()=>[i.visible?(t(),s("div",{key:0,class:"lightbox-overlay",onClick:de(D,["self"])},[e("div",zs,[e("div",Fs,[o(" 左侧图片区域 "),e("div",{class:"lightbox-image-area",onClick:de(D,["self"])},[o(" 关闭按钮 "),e("button",{class:"close-btn",onClick:D,title:"关闭 (Esc)"},[a(G,{name:"times"})]),o(" 多图时的导航 "),i.images.length>1?(t(),s("button",{key:0,class:"nav-btn prev",onClick:de(T,["stop"]),title:"上一张"},[a(G,{name:"chevron-left"})])):o("v-if",true),e("img",{src:b.value,class:"lightbox-image",alt:"Preview"},null,8,Ps),i.images.length>1?(t(),s("button",{key:1,class:"nav-btn next",onClick:de(f,["stop"]),title:"下一张"},[a(G,{name:"chevron-right"})])):o("v-if",true),o(" 图片计数器 "),i.images.length>1?(t(),s("div",Ls,u(c.value+1)+" / "+u(i.images.length),1)):o("v-if",true)]),o(" 右侧信息栏 "),i.showSidebar?(t(),s("div",As,[e("div",Ms,[A[0]||(A[0]=e("div",{class:"info-title"},"图片详情",-1)),e("button",{class:"header-close-btn",onClick:D,title:"关闭"},[a(G,{name:"times"})])]),e("div",Es,[o(" 提示词 "),e("div",qs,[e("div",Ns,[A[1]||(A[1]=e("span",null,"提示词",-1)),i.prompt?(t(),s("button",{key:0,class:"copy-btn",onClick:m}," 复制 ")):o("v-if",true)]),e("div",{class:Z(["prompt-content",{empty:!i.prompt}])},u(i.prompt||"无提示词"),3)]),o(" 创建时间 "),i.createdAt?(t(),s("div",Rs,[A[2]||(A[2]=e("div",{class:"block-header"},[e("span",null,"创建时间")],-1)),e("div",Bs,u(z(i.createdAt)),1)])):o("v-if",true),o(" 生成耗时 "),i.duration?(t(),s("div",Hs,[A[3]||(A[3]=e("div",{class:"block-header"},[e("span",null,"生成耗时")],-1)),e("div",Gs,u(r(i.duration)),1)])):o("v-if",true)]),e("div",Js,[e("button",{class:"action-btn primary",onClick:y},[a(G,{name:"external-link"}),A[4]||(A[4]=R(" 查看原图 ",-1))]),e("button",{class:"action-btn secondary",onClick:H},[a(G,{name:"download"}),A[5]||(A[5]=R(" 下载 ",-1))])])])):o("v-if",true)])])])):o("v-if",true)]),_:1})])}}}),Ie=oe(js,[["__scopeId","data-v-bd68872f"]]),Ws={class:"view-container"},Ks={class:"view-header"},Qs={class:"header-left"},Xs={class:"view-mode-switch"},Ys={class:"header-actions"},Zs={key:0,class:"stats-grid"},ea={class:"stat-card"},ta={class:"stat-icon total"},la={class:"stat-content"},sa={class:"stat-value"},aa={class:"stat-card"},na={class:"stat-icon success"},oa={class:"stat-content"},ia={class:"stat-value success"},da={class:"stat-card"},ra={class:"stat-icon failed"},ca={class:"stat-content"},ua={class:"stat-value failed"},va={class:"stat-card"},ma={class:"stat-icon processing"},pa={class:"stat-content"},ga={class:"stat-value pending"},fa={class:"stat-card"},_a={class:"stat-icon rate"},ha={class:"stat-content"},ya={class:"stat-value"},ba={class:"filter-bar"},ka={class:"filter-group"},$a={key:0,class:"pagination-info"},wa={class:"view-content"},Va={class:"mono-text"},Ca=["title"],xa={key:0},Ia={key:1,class:"text-muted"},Ua={key:0},Sa={key:1},Oa={class:"time-text"},Ta={key:0,class:"empty-gallery"},Da={key:1,class:"masonry-grid"},za=["onClick"],Fa={class:"gallery-image-wrapper"},Pa=["src"],La=["src"],Aa={class:"gallery-overlay"},Ma={class:"gallery-info"},Ea=["title"],qa={class:"gallery-meta"},Na={class:"gallery-time"},Ra={class:"pagination"},Ba={key:0,class:"task-detail"},Ha={class:"detail-section"},Ga={class:"detail-grid"},Ja={class:"detail-item"},ja={class:"detail-item"},Wa={class:"detail-item"},Ka={class:"detail-item"},Qa={class:"detail-item"},Xa={class:"detail-item"},Ya={class:"detail-section"},Za={class:"code-block"},en={key:0,class:"detail-section"},tn={class:"output-gallery"},ln=["src"],sn=["src"],an=["src"],nn={key:3,class:"text-asset"},on=["href"],dn={key:1,class:"detail-section"},rn={class:"code-block error"},cn={class:"cleanup-form"},un={class:"dialog-footer"},vn=ne({__name:"TasksView",setup(i){const C=h("list"),p=h(false),x=h([]),c=h(null),b=h(0),D=h(1),T=h(20),f=h({status:"",userId:void 0,channelId:void 0}),m=h(false),y=h(null);h(false);const H=h(null),z=h(false),r=h([]),k=h(0),v=h(""),A=h(),G=h(),Q=h(false),N=h(30),q=l=>{var n,U,j;return((U=(n=l.middlewareLogs)==null?void 0:n.preset)==null?void 0:U.transformedPrompt)||((j=l.requestSnapshot)==null?void 0:j.prompt)||""},g=ae(()=>{var n,U,j;const l=[];for(const te of x.value){if(te.status!=="success"||!te.responseSnapshot)continue;const w=((U=(n=te.middlewareLogs)==null?void 0:n.preset)==null?void 0:U.transformedPrompt)||((j=te.requestSnapshot)==null?void 0:j.prompt)||"";te.responseSnapshot.forEach((d,B)=>{(d.kind==="image"||d.kind==="video")&&d.url&&l.push({id:te.id,assetIndex:B,kind:d.kind,url:d.url,prompt:w,channelId:te.channelId,createdAt:te.startTime})})}return l}),W=async()=>{p.value=true;try{const l={limit:T.value,offset:(D.value-1)*T.value};f.value.status&&(l.status=f.value.status),f.value.userId&&(l.userId=Number(f.value.userId)),f.value.channelId&&(l.channelId=Number(f.value.channelId));const[n,U]=await Promise.all([_e.list(l),_e.stats()]);x.value=n.items,b.value=n.total,c.value=U}catch(l){console.error("Failed to fetch tasks:",l),J.error("加载数据失败")}finally{p.value=false}},se=l=>{y.value=l,m.value=true},re=l=>{r.value=[l.url],k.value=0,v.value=l.prompt,A.value=l.createdAt,G.value=void 0,z.value=true,H.value=l},P=()=>{Q.value=true},$=async()=>{try{const l=await _e.cleanup(N.value);J.success(`成功清理 ${l.deleted} 条任务`),Q.value=false,W()}catch{J.error("清理失败")}},O=l=>new Date(l).toLocaleString(),_=l=>l<1e3?`${l}ms`:`${(l/1e3).toFixed(2)}s`,V=l=>{const n=l.target;n.style.display="none"};return ve(()=>{W()}),(l,n)=>{const U=M("k-icon"),j=M("k-button"),te=M("el-option"),w=M("el-select"),d=M("el-input"),B=M("el-table-column"),le=M("el-table"),ce=M("el-pagination"),me=M("el-dialog"),he=M("el-input-number");return t(),s("div",Ws,[o(" 固定头部区域 "),e("div",Ks,[e("div",Qs,[o(" 视图切换 "),e("div",Xs,[e("button",{class:Z(["mode-btn",{active:C.value==="list"}]),onClick:n[0]||(n[0]=L=>C.value="list"),title:"列表视图"},[...n[14]||(n[14]=[e("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor"},[e("rect",{x:"3",y:"4",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"10.5",width:"18",height:"3",rx:"1"}),e("rect",{x:"3",y:"17",width:"18",height:"3",rx:"1"})],-1)])],2),e("button",{class:Z(["mode-btn",{active:C.value==="gallery"}]),onClick:n[1]||(n[1]=L=>C.value="gallery"),title:"画廊视图"},[...n[15]||(n[15]=[Ce('<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" data-v-7992e681><rect x="3" y="3" width="8" height="8" rx="1" data-v-7992e681></rect><rect x="13" y="3" width="8" height="8" rx="1" data-v-7992e681></rect><rect x="3" y="13" width="8" height="8" rx="1" data-v-7992e681></rect><rect x="13" y="13" width="8" height="8" rx="1" data-v-7992e681></rect></svg>',1)])],2)])]),e("div",Ys,[a(j,{onClick:P},{icon:I(()=>[a(U,{name:"delete"})]),default:I(()=>[n[16]||(n[16]=R(" 清理记录 ",-1))]),_:1}),a(j,{onClick:W},{icon:I(()=>[a(U,{name:"refresh"})]),default:I(()=>[n[17]||(n[17]=R(" 刷新 ",-1))]),_:1})])]),o(" 统计信息 (固定) "),c.value?(t(),s("div",Zs,[e("div",ea,[e("div",ta,[a(U,{name:"clipboard-list"})]),e("div",la,[e("div",sa,u(c.value.total),1),n[18]||(n[18]=e("div",{class:"stat-label"},"总任务数",-1))])]),e("div",aa,[e("div",na,[a(U,{name:"check-circle"})]),e("div",oa,[e("div",ia,u(c.value.byStatus.success),1),n[19]||(n[19]=e("div",{class:"stat-label"},"成功",-1))])]),e("div",da,[e("div",ra,[a(U,{name:"exclamation-triangle"})]),e("div",ca,[e("div",ua,u(c.value.byStatus.failed),1),n[20]||(n[20]=e("div",{class:"stat-label"},"失败",-1))])]),e("div",va,[e("div",ma,[a(U,{name:"clock"})]),e("div",pa,[e("div",ga,u(c.value.byStatus.pending+c.value.byStatus.processing),1),n[21]||(n[21]=e("div",{class:"stat-label"},"进行中",-1))])]),e("div",fa,[e("div",_a,[a(U,{name:"chart-pie"})]),e("div",ha,[e("div",ya,u(c.value.successRate),1),n[22]||(n[22]=e("div",{class:"stat-label"},"成功率",-1))])])])):o("v-if",true),o(" 筛选栏 (固定) "),e("div",ba,[e("div",ka,[a(w,{modelValue:f.value.status,"onUpdate:modelValue":n[2]||(n[2]=L=>f.value.status=L),placeholder:"所有状态",clearable:"",onChange:W,style:{width:"140px"}},{default:I(()=>[a(te,{label:"等待中",value:"pending"}),a(te,{label:"处理中",value:"processing"}),a(te,{label:"成功",value:"success"}),a(te,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),a(d,{modelValue:f.value.channelId,"onUpdate:modelValue":n[3]||(n[3]=L=>f.value.channelId=L),placeholder:"渠道 ID",clearable:"",onChange:W,style:{width:"140px"}},null,8,["modelValue"]),a(d,{modelValue:f.value.userId,"onUpdate:modelValue":n[4]||(n[4]=L=>f.value.userId=L),placeholder:"用户 ID",clearable:"",onChange:W,style:{width:"140px"}},null,8,["modelValue"])]),b.value>0?(t(),s("div",$a," 共 "+u(b.value)+" 条记录 ",1)):o("v-if",true)]),o(" 可滚动的内容区域 "),e("div",wa,[o(" 列表视图 "),C.value==="list"?(t(),ee(le,{key:0,data:x.value,style:{width:"100%"},class:"task-table",onRowClick:se},{default:I(()=>[a(B,{prop:"id",label:"ID",width:"80",align:"center"},{default:I(({row:L})=>[e("span",Va,"#"+u(L.id),1)]),_:1}),a(B,{label:"状态",width:"100",align:"center"},{default:I(({row:L})=>[a(De,{status:L.status},null,8,["status"])]),_:1}),a(B,{prop:"channelId",label:"渠道",width:"100",align:"center"}),a(B,{label:"提示词","min-width":"300"},{default:I(({row:L})=>[e("div",{class:"prompt-cell",title:q(L)},u(q(L)),9,Ca)]),_:1}),a(B,{label:"输出",width:"120",align:"center"},{default:I(({row:L})=>[L.responseSnapshot&&L.responseSnapshot.length?(t(),s("span",xa,u(L.responseSnapshot.length)+" 个资产 ",1)):(t(),s("span",Ia,"-"))]),_:1}),a(B,{label:"耗时",width:"100",align:"right"},{default:I(({row:L})=>[L.duration?(t(),s("span",Ua,u(_(L.duration)),1)):(t(),s("span",Sa,"-"))]),_:1}),a(B,{label:"时间",width:"180",align:"right"},{default:I(({row:L})=>[e("span",Oa,u(O(L.startTime)),1)]),_:1})]),_:1},8,["data"])):C.value==="gallery"?(t(),s(S,{key:1},[o(" 画廊视图 (瀑布流) "),g.value.length===0?(t(),s("div",Ta,[a(U,{name:"image",class:"empty-icon"}),n[23]||(n[23]=e("p",null,"暂无成功生成的图片",-1))])):(t(),s("div",Da,[(t(true),s(S,null,K(g.value,L=>(t(),s("div",{key:L.id+"-"+L.assetIndex,class:"masonry-item"},[e("div",{class:"gallery-item",onClick:ue=>re(L)},[e("div",Fa,[L.kind==="image"?(t(),s("img",{key:0,src:L.url,class:"gallery-image",loading:"lazy",onError:V},null,40,Pa)):L.kind==="video"?(t(),s("video",{key:1,src:L.url,class:"gallery-video",muted:"",loop:"",onMouseenter:n[5]||(n[5]=ue=>ue.target.play()),onMouseleave:n[6]||(n[6]=ue=>ue.target.pause())},null,40,La)):o("v-if",true),e("div",Aa,[a(U,{name:"zoom-in",class:"zoom-icon"})])]),e("div",Ma,[e("div",{class:"gallery-prompt",title:L.prompt},u(L.prompt),9,Ea),e("div",qa,[e("span",Na,u(O(L.createdAt)),1)])])],8,za)]))),128))]))],64)):o("v-if",true)]),o(" 分页 (固定在底部) "),e("div",Ra,[a(ce,{"current-page":D.value,"onUpdate:currentPage":n[7]||(n[7]=L=>D.value=L),"page-size":T.value,"onUpdate:pageSize":n[8]||(n[8]=L=>T.value=L),total:b.value,"page-sizes":[20,50,100],layout:"total, sizes, prev, pager, next",onCurrentChange:W,onSizeChange:W},null,8,["current-page","page-size","total"])]),o(" 任务详情对话框 "),a(me,{modelValue:m.value,"onUpdate:modelValue":n[9]||(n[9]=L=>m.value=L),title:"任务详情",width:"800px"},{default:I(()=>{var L,ue;return[y.value?(t(),s("div",Ba,[e("div",Ha,[n[31]||(n[31]=e("h3",null,"基本信息",-1)),e("div",Ga,[e("div",Ja,[n[24]||(n[24]=e("span",{class:"label"},"ID:",-1)),R(" "+u(y.value.id),1)]),e("div",ja,[n[25]||(n[25]=e("span",{class:"label"},"状态:",-1)),n[26]||(n[26]=R()),a(De,{status:y.value.status},null,8,["status"])]),e("div",Wa,[n[27]||(n[27]=e("span",{class:"label"},"渠道 ID:",-1)),R(" "+u(y.value.channelId),1)]),e("div",Ka,[n[28]||(n[28]=e("span",{class:"label"},"用户 ID:",-1)),R(" "+u(y.value.userId||"N/A"),1)]),e("div",Qa,[n[29]||(n[29]=e("span",{class:"label"},"创建时间:",-1)),R(" "+u(O(y.value.startTime)),1)]),e("div",Xa,[n[30]||(n[30]=e("span",{class:"label"},"耗时:",-1)),R(" "+u(_(y.value.duration||0)),1)])])]),e("div",Ya,[n[32]||(n[32]=e("h3",null,"Prompt",-1)),e("div",Za,u(q(y.value)),1)]),y.value.responseSnapshot&&y.value.responseSnapshot.length>0?(t(),s("div",en,[e("h3",null,"生成结果 ("+u(y.value.responseSnapshot.length)+" 个资产)",1),e("div",tn,[(t(true),s(S,null,K(y.value.responseSnapshot,(ie,F)=>{var X;return t(),s("div",{key:F,class:"output-item"},[ie.kind==="image"&&ie.url?(t(),s("img",{key:0,src:ie.url,class:"output-image"},null,8,ln)):ie.kind==="video"&&ie.url?(t(),s("video",{key:1,src:ie.url,class:"output-image",controls:""},null,8,sn)):ie.kind==="audio"&&ie.url?(t(),s("audio",{key:2,src:ie.url,controls:"",style:{width:"100%"}},null,8,an)):ie.kind==="text"&&ie.content?(t(),s("div",nn,u(ie.content),1)):ie.url?(t(),s("a",{key:4,href:ie.url,target:"_blank",class:"file-link"},[a(U,{name:"file"}),R(" "+u(((X=ie.meta)==null?void 0:X.filename)||ie.url),1)],8,on)):o("v-if",true)])}),128))])])):o("v-if",true),(ue=(L=y.value.middlewareLogs)==null?void 0:L.request)!=null&&ue.error?(t(),s("div",dn,[n[33]||(n[33]=e("h3",null,"错误信息",-1)),e("div",rn,u(y.value.middlewareLogs.request.error),1)])):o("v-if",true)])):o("v-if",true)]}),_:1},8,["modelValue"]),o(" 图片预览弹窗 "),a(Ie,{visible:z.value,"onUpdate:visible":n[10]||(n[10]=L=>z.value=L),images:r.value,"initial-index":k.value,prompt:v.value,"created-at":A.value,duration:G.value},null,8,["visible","images","initial-index","prompt","created-at","duration"]),o(" 清理对话框 "),a(me,{modelValue:Q.value,"onUpdate:modelValue":n[13]||(n[13]=L=>Q.value=L),title:"清理旧任务",width:"400px"},{footer:I(()=>[e("span",un,[a(j,{onClick:n[12]||(n[12]=L=>Q.value=false)},{default:I(()=>[...n[35]||(n[35]=[R("取消",-1)])]),_:1}),a(j,{type:"error",onClick:$},{default:I(()=>[...n[36]||(n[36]=[R("确认清理",-1)])]),_:1})])]),default:I(()=>[e("div",cn,[n[34]||(n[34]=e("p",null,"清理多少天前的任务?",-1)),a(he,{modelValue:N.value,"onUpdate:modelValue":n[11]||(n[11]=L=>N.value=L),min:1,max:365},null,8,["modelValue"])])]),_:1},8,["modelValue"])])}}}),mn=oe(vn,[["__scopeId","data-v-7992e681"]]),pn={class:"gallery-content"},gn={class:"gallery-header"},fn={class:"header-left"},_n={key:0,class:"gallery-count"},hn={class:"header-actions"},yn={key:0,class:"gallery-empty"},bn={class:"gallery-empty"},kn=["onClick"],$n={key:0,class:"task-image-wrapper"},wn=["src"],Vn={key:0,class:"more-images"},Cn={class:"task-processing"},xn={class:"processing-text"},In={class:"task-failed"},Un={class:"task-info"},Sn=["title"],On={class:"task-meta"},Tn={class:"task-time"},Dn={key:0,class:"task-duration"},zn={key:0,class:"loading-more"},we=10,Fn=ne({__name:"HistoryGallery",emits:["select"],setup(i,{expose:C,emit:p}){const x=p,c=h(false),b=h(false),D=h(false),T=h([]),f=h(0),m=h(false),y=h(0),H=h();let z=null;const r=h(false),k=h([]),v=h(0),A=h(""),G=h(),Q=h(),N=async()=>{try{const V=await Je.me();return D.value=V.loggedIn,V.loggedIn}catch{return D.value=false,false}},q=V=>{var U,j,te;const l=[];if(V.responseSnapshot)for(const w of V.responseSnapshot)w.kind==="image"&&w.url&&l.push(w.url);const n=((j=(U=V.middlewareLogs)==null?void 0:U.preset)==null?void 0:j.transformedPrompt)||((te=V.requestSnapshot)==null?void 0:te.prompt)||"";return{id:V.id,status:V.status,prompt:n,images:l,createdAt:new Date(V.startTime),duration:V.duration||void 0}},g=async(V=false)=>{if(D.value){b.value=true;try{const l=await _e.my({limit:we,offset:V?y.value:0}),n=l.items.map(q);V?T.value=[...T.value,...n]:(T.value=n,y.value=0),f.value=l.total,m.value=l.items.length>=we,y.value+=we}catch(l){console.error("Failed to load tasks:",l)}finally{b.value=false}}},W=()=>{!b.value&&m.value&&g(true)},se=V=>{const l=V.target,{scrollTop:n,scrollHeight:U,clientHeight:j}=l;U-n-j<100&&W()},re=async()=>{await N(),await g()},P=V=>{V.status==="success"&&V.images.length>0&&(k.value=V.images,v.value=0,A.value=V.prompt,G.value=V.createdAt,Q.value=V.duration,r.value=true,x("select",V))},$=V=>{const n=new Date().getTime()-V.getTime();return n<6e4?"刚刚":n<36e5?`${Math.floor(n/6e4)}分钟前`:n<864e5?`${Math.floor(n/36e5)}小时前`:n<6048e5?`${Math.floor(n/864e5)}天前`:V.toLocaleDateString()},O=V=>V<1e3?`${V}ms`:`${(V/1e3).toFixed(1)}s`,_=()=>{z=setInterval(()=>{T.value.some(l=>l.status==="pending"||l.status==="processing")&&g()},3e3)};return C({refresh:re}),ve(async()=>{await N()&&(await g(),_())}),Fe(()=>{z&&clearInterval(z)}),(V,l)=>{const n=M("k-icon");return t(),s("div",{class:Z(["history-gallery",{collapsed:c.value}])},[o(" 折叠状态的侧边条 "),c.value?(t(),s("div",{key:0,class:"collapsed-bar",onClick:l[0]||(l[0]=U=>c.value=false)},[a(n,{name:"history"}),l[3]||(l[3]=e("span",{class:"collapsed-text"},"历史",-1))])):(t(),s(S,{key:1},[o(" 展开的内容 "),e("div",pn,[e("div",gn,[e("div",fn,[l[4]||(l[4]=e("span",{class:"gallery-title"},"历史记录",-1)),f.value>0?(t(),s("span",_n,u(f.value),1)):o("v-if",true)]),e("div",hn,[a(n,{name:"refresh",class:Z(["action-icon",{spinning:b.value}]),onClick:re,title:"刷新"},null,8,["class"]),a(n,{name:"chevron-right",class:"action-icon",onClick:l[1]||(l[1]=U=>c.value=true),title:"收起"})])]),o(" 未登录提示 "),D.value?b.value&&T.value.length===0?(t(),s(S,{key:1},[o(" 加载中 "),l[6]||(l[6]=e("div",{class:"gallery-loading"},[e("div",{class:"loader-small"})],-1))],2112)):T.value.length===0?(t(),s(S,{key:2},[o(" 空状态 "),e("div",bn,[a(n,{name:"image",class:"empty-icon"}),l[7]||(l[7]=e("p",null,"暂无记录",-1))])],2112)):(t(),s(S,{key:3},[o(" 任务列表 (瀑布流) "),e("div",{class:"gallery-list",ref_key:"listRef",ref:H,onScroll:se},[(t(true),s(S,null,K(T.value,U=>(t(),s("div",{key:U.id,class:Z(["task-card",{clickable:U.status==="success"}]),onClick:j=>P(U)},[o(" 图片区域 - 只显示第一张 "),U.images&&U.images.length>0?(t(),s("div",$n,[e("img",{src:U.images[0],class:"task-image",loading:"lazy"},null,8,wn),U.images.length>1?(t(),s("div",Vn," +"+u(U.images.length-1),1)):o("v-if",true)])):U.status==="processing"||U.status==="pending"?(t(),s(S,{key:1},[o(" 处理中动画 "),e("div",Cn,[l[8]||(l[8]=e("div",{class:"processing-animation"},[e("div",{class:"dot"}),e("div",{class:"dot"}),e("div",{class:"dot"})],-1)),e("span",xn,u(U.status==="pending"?"等待中":"生成中"),1)])],2112)):U.status==="failed"?(t(),s(S,{key:2},[o(" 失败状态 "),e("div",In,[a(n,{name:"exclamation-triangle",class:"failed-icon"}),l[9]||(l[9]=e("span",null,"失败",-1))])],2112)):o("v-if",true),o(" 任务信息 "),e("div",Un,[e("div",{class:"task-prompt",title:U.prompt},u(U.prompt||"(无提示词)"),9,Sn),e("div",On,[e("span",Tn,u($(U.createdAt)),1),U.duration?(t(),s("span",Dn,u(O(U.duration)),1)):o("v-if",true)])])],10,kn))),128)),o(" 加载更多 "),b.value&&T.value.length>0?(t(),s("div",zn,[...l[10]||(l[10]=[e("div",{class:"loader-small"},null,-1)])])):o("v-if",true)],544)],2112)):(t(),s("div",yn,[a(n,{name:"user",class:"empty-icon"}),l[5]||(l[5]=e("p",null,"请登录查看历史",-1))]))])],2112)),o(" 图片预览弹窗 "),a(Ie,{visible:r.value,"onUpdate:visible":l[2]||(l[2]=U=>r.value=U),images:k.value,"initial-index":v.value,prompt:A.value,"created-at":G.value,duration:Q.value},null,8,["visible","images","initial-index","prompt","created-at","duration"])],2)}}}),Pn=oe(Fn,[["__scopeId","data-v-77080b46"]]),Ln={class:"view-container"},An={class:"view-content"},Mn={class:"generate-layout"},En={class:"config-panel"},qn={class:"form-section"},Nn={class:"section-title"},Rn={class:"form-item"},Bn={class:"form-item"},Hn={class:"form-section flex-grow"},Gn={class:"section-title"},Jn={class:"form-section"},jn={class:"section-title"},Wn={class:"upload-area"},Kn={key:0,class:"upload-list"},Qn=["src"],Xn=["onClick"],Yn={class:"form-actions"},Zn={class:"preview-panel"},eo={key:0,class:"result-container"},to={key:0,class:"success-result"},lo={key:0,class:"output-grid"},so=["src","onClick"],ao={class:"output-actions"},no=["href"],oo=["src"],io=["src"],ro=["href"],co={class:"text-output"},uo=["href"],vo={class:"result-meta"},mo={key:0,class:"meta-item"},po={key:1,class:"meta-item"},go={key:1,class:"error-result"},fo={class:"error-msg"},_o={key:1,class:"generating-state"},ho={key:2,class:"empty-state"},yo=ne({__name:"GenerateView",setup(i){const C=h([]),p=h([]),x=h(false),c=h(null),b=h([]),D=h([]),T=h(),f=h();let m=0;const y=h({channel:void 0,prompt:"",parameters:{}}),H=h(void 0),z=h(false),r=h([]),k=h(0),v=h(""),A=O=>{var _;(_=c.value)!=null&&_.output&&(r.value=c.value.output.filter(V=>V.kind==="image"&&V.url).map(V=>V.url),k.value=O,z.value=true)},G=async()=>{try{const[O,_]=await Promise.all([fe.list(),ge.list()]);C.value=O,p.value=_}catch(O){console.error(O)}},Q=()=>{},N=O=>new Promise((_,V)=>{const l=new FileReader;l.onload=()=>{const U=l.result.split(",")[1];_(U)},l.onerror=V,l.readAsDataURL(O)}),q=()=>{var O;(O=T.value)==null||O.click()},g=async O=>{const _=O.target;!_.files||_.files.length===0||(await se(Array.from(_.files)),_.value="")},W=async O=>{var V;const _=(V=O.dataTransfer)==null?void 0:V.files;!_||_.length===0||await se(Array.from(_).filter(l=>l.type.startsWith("image/")))},se=async O=>{const _=4-b.value.length;if(_<=0){J.warning("最多上传 4 张图片");return}const V=O.slice(0,_);for(const l of V){const n=URL.createObjectURL(l);b.value.push({uid:++m,url:n,raw:l});try{const U=await N(l);D.value.push({type:"image",base64:U,mimeType:l.type,filename:l.name})}catch(U){console.error("Failed to read file:",l.name,U)}}},re=O=>{const _=b.value[O];_&&(URL.revokeObjectURL(_.url),b.value.splice(O,1),D.value.splice(O,1))},P=async()=>{var O,_,V,l;if(!y.value.channel){J.warning("请选择渠道");return}x.value=true,c.value=null;try{const n={channelId:y.value.channel,prompt:y.value.prompt||"",parameters:{...y.value.parameters}};if(D.value.length>0&&(n.files=D.value),H.value){const j=p.value.find(te=>te.id===H.value);j&&(n.parameters.preset=j.name)}const U=await je.generate(n);if(c.value=U,U.success)if((O=f.value)==null||O.refresh(),U.taskId)try{const j=await _e.get(U.taskId);v.value=((V=(_=j.middlewareLogs)==null?void 0:_.preset)==null?void 0:V.transformedPrompt)||((l=j.requestSnapshot)==null?void 0:l.prompt)||""}catch{v.value=y.value.prompt}else v.value=y.value.prompt}catch{c.value={success:false,error:"请求失败"}}finally{x.value=false}},$=O=>{O.prompt&&(y.value.prompt=O.prompt)};return ve(()=>{G()}),(O,_)=>{var w;const V=M("k-icon"),l=M("el-option"),n=M("el-select"),U=M("el-input"),j=M("k-button"),te=M("k-card");return t(),s("div",Ln,[e("div",An,[e("div",Mn,[o(" 左侧配置区 "),e("div",En,[a(te,{class:"config-card"},{default:I(()=>[e("div",qn,[e("div",Nn,[a(V,{name:"settings"}),_[5]||(_[5]=R(" 基础配置 ",-1))]),e("div",Rn,[_[6]||(_[6]=e("div",{class:"label"},"生成渠道",-1)),a(n,{modelValue:y.value.channel,"onUpdate:modelValue":_[0]||(_[0]=d=>y.value.channel=d),placeholder:"选择生成渠道",style:{width:"100%"}},{default:I(()=>[(t(true),s(S,null,K(C.value,d=>(t(),ee(l,{key:d.id,label:d.name,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",Bn,[_[7]||(_[7]=e("div",{class:"label"},"预设模板",-1)),a(n,{modelValue:H.value,"onUpdate:modelValue":_[1]||(_[1]=d=>H.value=d),placeholder:"选择预设模板 (可选)",style:{width:"100%"},clearable:"",onChange:Q},{default:I(()=>[(t(true),s(S,null,K(p.value,d=>(t(),ee(l,{key:d.id,label:d.name,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),e("div",Hn,[e("div",Gn,[a(V,{name:"edit"}),_[8]||(_[8]=R(" 提示词 ",-1))]),a(U,{modelValue:y.value.prompt,"onUpdate:modelValue":_[2]||(_[2]=d=>y.value.prompt=d),type:"textarea",rows:8,placeholder:"输入提示词,支持自然语言描述...",resize:"none",class:"prompt-input"},null,8,["modelValue"])]),o(" 文件上传区域 "),e("div",Jn,[e("div",jn,[a(V,{name:"image"}),_[9]||(_[9]=R(" 参考图片 ",-1))]),e("div",Wn,[o(" 已上传的图片列表 "),b.value.length>0?(t(),s("div",Kn,[(t(true),s(S,null,K(b.value,(d,B)=>(t(),s("div",{key:d.uid,class:"upload-item"},[e("img",{src:d.url,class:"upload-thumb"},null,8,Qn),e("div",{class:"upload-overlay",onClick:le=>re(B)},[a(V,{name:"delete"})],8,Xn)]))),128))])):o("v-if",true),o(" 上传按钮 "),b.value.length<4?(t(),s("div",{key:1,class:"upload-trigger",onClick:q,onDragover:_[3]||(_[3]=de(()=>{},["prevent"])),onDrop:de(W,["prevent"])},[e("input",{ref_key:"fileInput",ref:T,type:"file",accept:"image/*",multiple:"",style:{display:"none"},onChange:g},null,544),a(V,{name:"add",class:"upload-icon"})],32)):o("v-if",true),_[10]||(_[10]=e("div",{class:"upload-tip"},"点击或拖拽上传,最多 4 张",-1))])]),e("div",Yn,[a(j,{solid:"",type:"primary",loading:x.value,onClick:P,class:"generate-btn"},{icon:I(()=>[a(V,{name:"magic"})]),default:I(()=>[_[11]||(_[11]=R(" 生成图片 ",-1))]),_:1},8,["loading"])])]),_:1})]),o(" 右侧预览区 "),e("div",Zn,[c.value?(t(),s("div",eo,[c.value.success?(t(),s("div",to,[c.value.output&&c.value.output.length?(t(),s("div",lo,[(t(true),s(S,null,K(c.value.output,(d,B)=>{var le;return t(),s("div",{key:B,class:"output-wrapper"},[o(" 图片 "),d.kind==="image"?(t(),s(S,{key:0},[e("img",{src:d.url,onClick:ce=>A(B),class:"clickable-image"},null,8,so),e("div",ao,[e("a",{href:d.url,target:"_blank",class:"action-btn",download:""},[a(V,{name:"download"})],8,no)])],64)):d.kind==="video"?(t(),s(S,{key:1},[o(" 视频 "),e("video",{src:d.url,controls:"",class:"output-video"},null,8,oo)],64)):d.kind==="audio"?(t(),s(S,{key:2},[o(" 音频 "),e("audio",{src:d.url,controls:"",class:"output-audio"},null,8,io)],64)):d.kind==="file"?(t(),s(S,{key:3},[o(" 其他文件 "),e("a",{href:d.url,target:"_blank",class:"file-link"},[a(V,{name:"file"}),R(" "+u(((le=d.meta)==null?void 0:le.filename)||"下载文件"),1)],8,ro)],64)):d.kind==="text"?(t(),s(S,{key:4},[o(" 文本 "),e("div",co,u(d.content),1)],64)):d.url?(t(),s(S,{key:5},[o(" 兜底:有 url 则显示链接 "),e("a",{href:d.url,target:"_blank"},u(d.url),9,uo)],64)):o("v-if",true)])}),128))])):o("v-if",true),e("div",vo,[c.value.duration?(t(),s("span",mo,[a(V,{name:"stopwatch"}),R(" 耗时: "+u((c.value.duration/1e3).toFixed(2))+"s ",1)])):o("v-if",true),c.value.taskId?(t(),s("span",po,[a(V,{name:"list-alt"}),R(" 任务 ID: "+u(c.value.taskId),1)])):o("v-if",true)])])):(t(),s("div",go,[a(V,{name:"warning",class:"error-icon"}),e("div",fo,u(c.value.error||"生成失败"),1)]))])):x.value?(t(),s("div",_o,[..._[12]||(_[12]=[e("div",{class:"loader"},null,-1),e("p",null,"正在生成中,请稍候...",-1)])])):(t(),s("div",ho,[a(V,{name:"image",class:"empty-icon"}),_[13]||(_[13]=e("p",null,"在左侧配置并点击生成",-1))]))]),o(" 右侧历史画廊 "),a(Pn,{ref_key:"historyGalleryRef",ref:f,onSelect:$},null,512)])]),o(" 图片预览弹窗 "),a(Ie,{visible:z.value,"onUpdate:visible":_[4]||(_[4]=d=>z.value=d),images:r.value,"initial-index":k.value,prompt:v.value,duration:(w=c.value)==null?void 0:w.duration},null,8,["visible","images","initial-index","prompt","duration"])])}}}),ze=oe(yo,[["__scopeId","data-v-c6c9e1c0"]]),bo={class:"pipeline-panel"},ko={class:"pipeline-flow"},$o={class:"phase-icon"},wo={class:"phase-info"},Vo={class:"phase-name"},Co={class:"phase-desc"},xo={class:"phase-badge"},Io={key:0,class:"phase-middlewares"},Uo={class:"mw-card"},So={class:"mw-content"},Oo={class:"mw-name"},To={class:"mw-desc"},Do=["title"],zo=["checked","onChange"],Fo={key:2,class:"phase-connector"},Po={class:"connector-arrow"},Lo=ne({__name:"MiddlewaresPanel",setup(i){const C=h([]),p=[{id:"lifecycle-prepare",label:"准备",description:"验证、权限检查、任务创建",icon:"clipboard-check",colorClass:"phase-prepare"},{id:"lifecycle-pre-request",label:"预处理",description:"预设应用、参数处理",icon:"settings",colorClass:"phase-pre"},{id:"lifecycle-request",label:"执行",description:"调用连接器生成",icon:"play",colorClass:"phase-request"},{id:"lifecycle-post-request",label:"后处理",description:"结果缓存、格式转换",icon:"package",colorClass:"phase-post"},{id:"lifecycle-finalize",label:"完成",description:"计费结算、记录保存",icon:"check-circle",colorClass:"phase-finalize"}],x={billing:"计费模块",transform:"转换处理",validation:"验证检查",preset:"预设系统",cache:"缓存管理",recording:"任务记录",request:"请求执行",custom:"自定义"},c=T=>C.value.filter(f=>f.phase===T),b=async()=>{try{C.value=await $e.list()}catch{J.error("加载中间件列表失败")}},D=async T=>{const f=!T.enabled;try{await $e.update(T.name,{enabled:f}),T.enabled=f,J.success(f?"已启用":"已禁用")}catch{J.error("操作失败")}};return ve(b),(T,f)=>{const m=M("k-icon");return t(),s("div",bo,[o(" 标题区 "),f[5]||(f[5]=e("div",{class:"panel-header"},[e("div",{class:"header-title"},[e("h3",null,"请求执行流程"),e("span",{class:"subtitle"},"每个生成请求按以下阶段依次处理")])],-1)),o(" 流程图 "),e("div",ko,[(t(),s(S,null,K(p,(y,H)=>e("div",{key:y.id,class:"phase-section"},[o(" 阶段标题 "),e("div",{class:Z(["phase-header",y.colorClass])},[e("div",$o,[a(m,{name:y.icon},null,8,["name"])]),e("div",wo,[e("span",Vo,u(y.label),1),e("span",Co,u(y.description),1)]),e("span",xo,u(c(y.id).length),1)],2),o(" 中间件列表 "),c(y.id).length>0?(t(),s("div",Io,[(t(true),s(S,null,K(c(y.id),(z,r)=>(t(),s("div",{key:z.name,class:Z(["mw-item",{disabled:!z.enabled}])},[e("div",Uo,[e("div",{class:Z(["mw-status",{active:z.enabled}])},null,2),e("div",So,[e("span",Oo,u(z.displayName),1),e("span",To,u(z.description||x[z.category]||z.category),1)]),e("label",{class:"toggle-switch",onClick:f[0]||(f[0]=de(()=>{},["stop"])),title:z.enabled?"点击禁用":"点击启用"},[e("input",{type:"checkbox",checked:z.enabled,onChange:k=>D(z)},null,40,zo),f[1]||(f[1]=e("span",{class:"slider"},null,-1))],8,Do)])],2))),128))])):(t(),s(S,{key:1},[o(" 空状态 "),f[2]||(f[2]=e("div",{class:"empty-phase"},[e("span",null,"无中间件")],-1))],2112)),o(" 阶段间连接箭头 "),H<p.length-1?(t(),s("div",Fo,[f[3]||(f[3]=e("div",{class:"connector-line"},null,-1)),e("div",Po,[a(m,{name:"chevron-down"})]),f[4]||(f[4]=e("div",{class:"connector-line"},null,-1))])):o("v-if",true)])),64))]),o(" 底部说明 "),f[6]||(f[6]=Ce('<div class="pipeline-footer" data-v-b4b0cf47><div class="footer-item" data-v-b4b0cf47><span class="dot active" data-v-b4b0cf47></span><span data-v-b4b0cf47>启用 - 中间件将在请求中执行</span></div><div class="footer-item" data-v-b4b0cf47><span class="dot" data-v-b4b0cf47></span><span data-v-b4b0cf47>禁用 - 中间件将被跳过</span></div><p class="footer-hint" data-v-b4b0cf47>同一阶段内的中间件可能并行执行。详细配置请前往「扩展插件」面板。</p></div>',1))])}}}),Ao=oe(Lo,[["__scopeId","data-v-b4b0cf47"]]),Mo={class:"plugins-panel"},Eo={key:0,class:"loading-state"},qo={class:"empty-state"},No={class:"plugins-list"},Ro=["onClick"],Bo={class:"plugin-info"},Ho={class:"plugin-header"},Go={class:"plugin-name"},Jo={key:0,class:"plugin-version"},jo={class:"plugin-description"},Wo={class:"plugin-status"},Ko={key:0,class:"plugin-badge connector"},Qo={key:1,class:"plugin-badge middleware"},Xo={key:0,class:"plugin-detail"},Yo={class:"detail-header"},Zo={class:"header-left"},ei={key:0,class:"version"},ti={class:"header-actions"},li={key:0,class:"connector-info"},si={class:"connector-meta"},ai={class:"connector-id"},ni={class:"connector-types"},oi={key:1,class:"middlewares-list"},ii={class:"middleware-tags"},di={class:"phase-badge"},ri={key:2,class:"config-section"},ci={class:"config-actions"},ui={class:"no-config"},vi={class:"no-selection"},mi=ne({__name:"PluginsPanel",setup(i){const C=h(true),p=h([]),x=h(null),c=h({}),b=h(false),D={"lifecycle-prepare":"准备","lifecycle-pre-request":"前置","lifecycle-request":"请求","lifecycle-post-request":"后置","lifecycle-finalize":"完成"},T=z=>D[z]||z,f=async()=>{try{C.value=true,p.value=await Ve.list()}catch(z){console.error("Failed to load plugins:",z),p.value=[]}finally{C.value=false}},m=z=>{x.value=z,c.value={...z.config};for(const r of z.configFields||[])c.value[r.key]===void 0&&r.default!==void 0&&(c.value[r.key]=r.default)},y=async()=>{if(x.value){b.value=true;try{await Ve.updateConfig(x.value.id,c.value),J.success("保存成功"),await f();const z=p.value.find(r=>{var k;return r.id===((k=x.value)==null?void 0:k.id)});z&&(x.value=z,c.value={...z.config})}catch{J.error("保存失败")}finally{b.value=false}}},H=async z=>{var r;try{const{send:k}=await import("@koishijs/client"),v=await k(z.apiEvent);if((v==null?void 0:v.success)===false)throw new Error(v.error||"操作失败");if(z.apiEvent==="media-luna/presets/sync"&&(v!=null&&v.data)){const{added:A,updated:G,removed:Q,notModified:N}=v.data;N?J.info("数据未变化,无需更新"):J.success(`同步完成:新增 ${A},更新 ${G},删除 ${Q}`)}else(r=v==null?void 0:v.data)!=null&&r.message?J.success(v.data.message):J.success(`${z.label} 完成`);await f()}catch(k){J.error(`${z.label} 失败: ${k instanceof Error?k.message:"未知错误"}`)}};return ve(f),(z,r)=>{var A,G,Q;const k=M("k-icon"),v=M("k-button");return t(),s("div",Mo,[o(" 加载状态 "),C.value?(t(),s("div",Eo,[a(k,{name:"sync",class:"spin"}),r[1]||(r[1]=e("span",null,"加载中...",-1))])):p.value.length===0?(t(),s(S,{key:1},[o(" 空状态 "),e("div",qo,[a(k,{name:"apps"}),r[2]||(r[2]=e("p",null,"暂无扩展插件",-1)),r[3]||(r[3]=e("p",{class:"hint"},[R("第三方扩展插件将在这里显示"),e("br"),R('内置功能请在"功能模块"中配置')],-1))])],2112)):(t(),s(S,{key:2},[o(" 插件列表 "),e("div",No,[(t(true),s(S,null,K(p.value,N=>{var q,g;return t(),s("div",{key:N.id,class:Z(["plugin-card",{active:((q=x.value)==null?void 0:q.id)===N.id,disabled:!N.enabled}]),onClick:W=>m(N)},[e("div",Bo,[e("div",Ho,[e("span",Go,u(N.name),1),N.version?(t(),s("span",Jo,"v"+u(N.version),1)):o("v-if",true)]),e("p",jo,u(N.description||"暂无描述"),1)]),e("div",Wo,[N.connector?(t(),s("span",Ko,"连接器")):o("v-if",true),(g=N.middlewares)!=null&&g.length?(t(),s("span",Qo,u(N.middlewares.length)+" 个中间件 ",1)):o("v-if",true),a(k,{name:N.enabled?"check-circle":"close-circle",class:Z(N.enabled?"enabled":"disabled")},null,8,["name","class"])])],10,Ro)}),128))]),o(" 插件详情 "),x.value?(t(),s("div",Xo,[e("header",Yo,[e("div",Zo,[e("h3",null,u(x.value.name),1),x.value.version?(t(),s("span",ei,"v"+u(x.value.version),1)):o("v-if",true)]),e("div",ti,[(t(true),s(S,null,K(x.value.actions,N=>(t(),ee(v,{key:N.name,type:N.type||"default",size:"small",onClick:q=>H(N)},Re({default:I(()=>[R(" "+u(N.label),1)]),_:2},[N.icon?{name:"icon",fn:I(()=>[a(k,{name:N.icon},null,8,["name"])]),key:"0"}:void 0]),1032,["type","onClick"]))),128))])]),o(" 连接器信息 "),x.value.connector?(t(),s("div",li,[r[4]||(r[4]=e("h4",null,"连接器",-1)),e("div",si,[e("span",ai,u(x.value.connector.id),1),e("span",ni," 支持: "+u(((A=x.value.connector.supportedTypes)==null?void 0:A.join(", "))||"无"),1)])])):o("v-if",true),o(" 中间件列表 "),(G=x.value.middlewares)!=null&&G.length?(t(),s("div",oi,[r[5]||(r[5]=e("h4",null,"中间件",-1)),e("div",ii,[(t(true),s(S,null,K(x.value.middlewares,N=>(t(),s("span",{key:N.name,class:Z(["middleware-tag",{enabled:N.enabled}])},[R(u(N.displayName||N.name)+" ",1),e("span",di,u(T(N.phase)),1)],2))),128))])])):o("v-if",true),o(" 配置表单 "),(Q=x.value.configFields)!=null&&Q.length?(t(),s("div",ri,[r[7]||(r[7]=e("h4",null,"配置",-1)),a(xe,{fields:x.value.configFields,modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=N=>c.value=N)},null,8,["fields","modelValue"]),e("div",ci,[a(v,{type:"primary",onClick:y,loading:b.value},{icon:I(()=>[a(k,{name:"save"})]),default:I(()=>[r[6]||(r[6]=R(" 保存配置 ",-1))]),_:1},8,["loading"])])])):(t(),s(S,{key:3},[o(" 无配置提示 "),e("div",ui,[a(k,{name:"info-circle"}),r[8]||(r[8]=e("span",null,"该插件暂无可配置项",-1))])],2112))])):(t(),s(S,{key:1},[o(" 无选中提示 "),e("div",vi,[a(k,{name:"apps"}),r[9]||(r[9]=e("p",null,"请从左侧选择一个插件查看详情",-1))])],2112))],64))])}}}),pi=oe(mi,[["__scopeId","data-v-bfb4a81f"]]),gi={class:"settings-view"},fi={class:"sidebar"},_i={class:"nav-list"},hi=["onClick"],yi={class:"main-content"},bi={key:0,class:"loading"},ki={class:"panel-header"},$i={key:0},wi={class:"custom-panel"},Vi={class:"actions"},Ci=ne({__name:"SettingsView",setup(i){const C=h(true),p=h([]),x=h(""),c=h({}),b=ae(()=>p.value.find(m=>m.id===x.value)),D=async()=>{try{p.value=await Oe.panels(),p.value.length&&!x.value&&(x.value=p.value[0].id)}catch{J.error("加载设置面板失败")}},T=()=>{var m;if(((m=b.value)==null?void 0:m.type)==="custom"){c.value={...b.value.config||{}};for(const y of b.value.configFields||[])c.value[y.key]===void 0&&y.default!==void 0&&(c.value[y.key]=y.default)}},f=async()=>{if(b.value)try{await Oe.update(b.value.id,c.value),J.success("保存成功"),await D()}catch{J.error("保存失败")}};return pe(x,()=>{var m;((m=b.value)==null?void 0:m.type)==="custom"&&T()}),ve(async()=>{await D(),C.value=false}),(m,y)=>{const H=M("k-icon"),z=M("k-button");return t(),s("div",gi,[o(" 侧边栏导航 "),e("aside",fi,[e("nav",_i,[(t(true),s(S,null,K(p.value,r=>(t(),s("div",{key:r.id,class:Z(["nav-item",{active:x.value===r.id}]),onClick:k=>x.value=r.id},[a(H,{name:r.icon},null,8,["name"]),e("span",null,u(r.name),1)],10,hi))),128))])]),o(" 主内容区 "),e("main",yi,[C.value?(t(),s("div",bi,[a(H,{name:"sync",class:"spin"}),y[1]||(y[1]=R(" 加载中... ",-1))])):b.value?(t(),s(S,{key:1},[o(" 面板标题 "),e("header",ki,[e("h2",null,u(b.value.name),1),b.value.description?(t(),s("p",$i,u(b.value.description),1)):o("v-if",true)]),o(" 功能模块面板 "),b.value.component==="middlewares"?(t(),ee(Ao,{key:0})):b.value.component==="plugins"?(t(),s(S,{key:1},[o(" 扩展插件面板 "),a(pi)],64)):b.value.type==="custom"&&b.value.configFields?(t(),s(S,{key:2},[o(" 自定义面板 "),e("div",wi,[a(xe,{fields:b.value.configFields,modelValue:c.value,"onUpdate:modelValue":y[0]||(y[0]=r=>c.value=r)},null,8,["fields","modelValue"]),e("div",Vi,[a(z,{type:"primary",onClick:f},{icon:I(()=>[a(H,{name:"save"})]),default:I(()=>[y[2]||(y[2]=R(" 保存 ",-1))]),_:1})])])],64)):o("v-if",true)],64)):o("v-if",true)])])}}}),xi=oe(Ci,[["__scopeId","data-v-122e70ff"]]),Ii={class:"top-nav"},Ui={class:"nav-container"},Si={class:"nav-tabs",role:"tablist"},Oi=["onClick","aria-selected"],Ti={class:"main-content"},Di=ne({__name:"index",setup(i){const C=h("generate"),p=ae(()=>{switch(C.value){case"generate":return ze;case"channels":return Ll;case"presets":return Ts;case"tasks":return mn;case"settings":return xi;default:return ze}}),x=f=>()=>Ue("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[Ue("path",{d:f})]),c=[{id:"generate",label:"生成",icon:x("M7.5 5.6L10 7 8.6 4.5 10 2 7.5 3.4 5 2 6.4 4.5 5 7zM19 2l-2.5 1.4L14 2l1.4 2.5L14 7l2.5-1.4L19 7l-1.4-2.5zm-5.6 5.4L9 12l4.4 4.6L17.8 12zM2 13l2.5 1.4L6 17l1.4-2.5L10 13 7.5 11.6 6 9l-1.4 2.5z")},{id:"channels",label:"渠道",icon:x("M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z")},{id:"presets",label:"预设",icon:x("M17 3H7c-1.1 0-2 .9-2 2v16l7-3 7 3V5c0-1.1-.9-2-2-2z")},{id:"tasks",label:"任务",icon:x("M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z")},{id:"settings",label:"设置",icon:x("M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.58 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z")}];let b="";function D(){const f=document.querySelector(".layout-header");f&&(b=f.style.display,f.style.display="none")}function T(){const f=document.querySelector(".layout-header");f&&(f.style.display=b||"")}return ve(D),Be(T),(f,m)=>{const y=M("k-layout");return t(),ee(y,{class:"app-layout media-luna-app"},{default:I(()=>[e("div",Ii,[e("div",Ui,[m[0]||(m[0]=e("div",{class:"logo-area"},[e("span",{class:"logo-text"},"MEDIA LUNA")],-1)),e("div",Si,[(t(),s(S,null,K(c,H=>e("div",{key:H.id,class:Z(["nav-tab",{active:C.value===H.id}]),onClick:z=>C.value=H.id,role:"tab","aria-selected":C.value===H.id},[(t(),ee(Se(H.icon),{class:"tab-icon"})),e("span",null,u(H.label),1)],10,Oi)),64))])])]),e("div",Ti,[(t(),ee(He,null,[(t(),ee(Se(p.value)))],1024))])]),_:1})}}}),zi=oe(Di,[["__scopeId","data-v-7e4d3d55"]]),Li=i=>{i.page({name:"Media Luna",path:"/media-luna",component:zi,order:500})};export{Li as default};
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.tag-filter[data-v-61b504c8]{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.filter-tags[data-v-61b504c8]{display:flex;flex-wrap:wrap;gap:.5rem}.filter-tag[data-v-61b504c8]{padding:4px 12px;font-size:.85rem;border-radius:16px;border:1px solid var(--k-color-border);background-color:transparent;color:var(--k-color-text-description);cursor:pointer;transition:all .2s ease;-webkit-user-select:none;user-select:none}.filter-tag[data-v-61b504c8]:hover{border-color:var(--k-color-active);color:var(--k-color-active)}.filter-tag.active[data-v-61b504c8]{background-color:var(--k-color-active);border-color:var(--k-color-active);color:#fff}.filter-input-wrapper[data-v-61b504c8]{flex-shrink:0}.filter-input[data-v-61b504c8]{width:180px}.view-mode-switch[data-v-ae3ef498]{display:flex;gap:2px;background-color:var(--k-color-bg-2);border:1px solid var(--k-color-border);border-radius:6px;padding:2px}.mode-btn[data-v-ae3ef498]{display:flex;align-items:center;justify-content:center;width:32px;height:28px;border:none;background:transparent;color:var(--k-color-text-description);cursor:pointer;border-radius:4px;transition:all .2s ease;font-size:16px}.mode-btn[data-v-ae3ef498]:hover{color:var(--k-color-text);background-color:var(--k-color-bg-1)}.mode-btn.active[data-v-ae3ef498]{color:var(--k-color-active);background-color:var(--k-card-bg);box-shadow:0 1px 3px #0000001a}.tag-input[data-v-68388640],.tag-select[data-v-68388640]{width:100%}.tag-select[data-v-68388640] .el-tag{background-color:var(--k-color-bg-3);color:var(--k-color-text);border-color:transparent;border-radius:4px}.tag-select[data-v-68388640] .el-tag .el-tag__close{color:var(--k-color-text-description)}.tag-select[data-v-68388640] .el-tag .el-tag__close:hover{background-color:var(--k-color-text);color:var(--k-color-bg-1)}.config-renderer[data-v-d82952a0]{display:flex;flex-direction:column;gap:.25rem}.form-row[data-v-d82952a0]{display:flex;align-items:flex-start;margin-bottom:1.25rem}.form-label[data-v-d82952a0]{width:120px;flex-shrink:0;color:var(--k-color-text-description);padding-top:6px;font-size:.9rem}.form-label.required[data-v-d82952a0]:after{content:"*";color:var(--k-color-error, #f56c6c);margin-left:4px}.field-container[data-v-d82952a0]{flex:1;display:flex;flex-direction:column;gap:.25rem}.field-desc[data-v-d82952a0]{font-size:.8rem;color:var(--k-color-text-description);margin-top:.25rem}.channel-config-dialog[data-v-74bfe0c7] .el-dialog__body{padding:0}.dialog-layout[data-v-74bfe0c7]{display:flex;height:560px}.tab-nav[data-v-74bfe0c7]{width:180px;flex-shrink:0;background:var(--k-color-bg-2);border-right:1px solid var(--k-color-border);padding:1rem 0}.tab-item[data-v-74bfe0c7]{display:flex;align-items:center;gap:10px;padding:12px 20px;cursor:pointer;color:var(--k-color-text-description);transition:all .2s;border-left:3px solid transparent}.tab-item[data-v-74bfe0c7]:hover{background:var(--k-color-bg-1);color:var(--k-color-text)}.tab-item.active[data-v-74bfe0c7]{background:var(--k-card-bg);color:var(--k-color-active);border-left-color:var(--k-color-active)}.tab-item .k-icon[data-v-74bfe0c7]{font-size:16px}.tab-badge[data-v-74bfe0c7]{margin-left:auto;min-width:20px;height:20px;padding:0 6px;background:var(--k-color-bg-1);border-radius:10px;font-size:11px;display:flex;align-items:center;justify-content:center}.tab-item.active .tab-badge[data-v-74bfe0c7]{background:var(--k-color-active);color:#fff}.tab-content[data-v-74bfe0c7]{flex:1;overflow-y:auto;padding:1.5rem;background:var(--k-card-bg)}.content-section[data-v-74bfe0c7]{max-width:560px}.section-header[data-v-74bfe0c7]{margin-bottom:1.5rem}.section-header h4[data-v-74bfe0c7]{margin:0 0 4px;font-size:16px;font-weight:600;color:var(--k-color-text)}.section-header p[data-v-74bfe0c7]{margin:0;font-size:13px;color:var(--k-color-text-description)}.form-group[data-v-74bfe0c7]{margin-bottom:1.25rem}.form-row[data-v-74bfe0c7]{display:flex;gap:1.5rem}.flex-1[data-v-74bfe0c7]{flex:1}.form-label[data-v-74bfe0c7]{display:block;margin-bottom:6px;font-size:13px;color:var(--k-color-text);font-weight:500}.form-label.required[data-v-74bfe0c7]:after{content:"*";color:var(--k-color-error, #f56c6c);margin-left:4px}.form-hint[data-v-74bfe0c7]{margin-top:6px;font-size:12px;color:var(--k-color-text-description)}.switch-wrapper[data-v-74bfe0c7]{display:flex;align-items:center;gap:8px;height:32px}.switch-label[data-v-74bfe0c7]{font-size:13px;color:var(--k-color-text-description)}.section-divider[data-v-74bfe0c7]{display:flex;align-items:center;margin:1.5rem 0 1rem;font-size:13px;font-weight:500;color:var(--k-color-text)}.section-divider[data-v-74bfe0c7]:before,.section-divider[data-v-74bfe0c7]:after{content:"";flex:1;height:1px;background:var(--k-color-border)}.section-divider[data-v-74bfe0c7]:before{margin-right:12px}.section-divider[data-v-74bfe0c7]:after{margin-left:12px}.empty-hint[data-v-74bfe0c7]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:3rem;color:var(--k-color-text-description)}.empty-hint .k-icon[data-v-74bfe0c7]{font-size:2rem;opacity:.5}.override-hint-bar[data-v-74bfe0c7]{display:flex;align-items:center;gap:8px;padding:10px 14px;background:var(--k-color-bg-2);border-radius:8px;font-size:13px;color:var(--k-color-text-description);margin-bottom:1.5rem}.override-hint-bar .k-icon[data-v-74bfe0c7]{color:var(--k-color-active)}.pipeline-flow[data-v-74bfe0c7],.phase-section[data-v-74bfe0c7]{display:flex;flex-direction:column}.phase-header[data-v-74bfe0c7]{display:flex;align-items:center;gap:12px;padding:12px 16px;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:10px;transition:all .2s}.phase-icon[data-v-74bfe0c7]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;font-size:16px}.phase-prepare .phase-icon[data-v-74bfe0c7]{background:#3b82f626;color:#3b82f6}.phase-pre .phase-icon[data-v-74bfe0c7]{background:#8b5cf626;color:#8b5cf6}.phase-request .phase-icon[data-v-74bfe0c7]{background:#22c55e26;color:#22c55e}.phase-post .phase-icon[data-v-74bfe0c7]{background:#f9731626;color:#f97316}.phase-finalize .phase-icon[data-v-74bfe0c7]{background:#6366f126;color:#6366f1}.phase-info[data-v-74bfe0c7]{flex:1;display:flex;flex-direction:column;gap:2px}.phase-name[data-v-74bfe0c7]{font-size:14px;font-weight:600;color:var(--k-color-text)}.phase-desc[data-v-74bfe0c7]{font-size:11px;color:var(--k-color-text-description)}.phase-badge[data-v-74bfe0c7]{min-width:24px;height:24px;padding:0 8px;background:var(--k-color-bg-2);border-radius:12px;font-size:12px;font-weight:500;color:var(--k-color-text-description);display:flex;align-items:center;justify-content:center}.phase-middlewares[data-v-74bfe0c7]{display:flex;flex-direction:column;margin-left:24px;padding-left:24px;border-left:2px solid var(--k-color-border)}.mw-item[data-v-74bfe0c7]{position:relative}.mw-item[data-v-74bfe0c7]:before{content:"";position:absolute;left:-25px;top:50%;width:12px;height:2px;background:var(--k-color-border)}.mw-item.has-override[data-v-74bfe0c7]:before{background:var(--k-color-active)}.mw-card[data-v-74bfe0c7]{display:flex;align-items:center;gap:12px;padding:10px 14px;margin:6px 0;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:8px;transition:all .2s}.mw-item.has-override .mw-card[data-v-74bfe0c7]{border-color:var(--k-color-active);background:var(--k-color-active-bg)}.mw-status[data-v-74bfe0c7]{width:8px;height:8px;border-radius:50%;background:var(--k-color-text-description);flex-shrink:0}.mw-status.active[data-v-74bfe0c7]{background:#22c55e;box-shadow:0 0 8px #22c55e66}.mw-status.override[data-v-74bfe0c7]{background:var(--k-color-active);box-shadow:0 0 8px var(--k-color-active)}.mw-content[data-v-74bfe0c7]{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.mw-name[data-v-74bfe0c7]{font-size:13px;font-weight:500;color:var(--k-color-text)}.mw-desc[data-v-74bfe0c7]{font-size:11px;color:var(--k-color-text-description);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mw-switch[data-v-74bfe0c7]{width:120px;flex-shrink:0}.empty-phase[data-v-74bfe0c7]{margin-left:24px;padding:12px 24px;border-left:2px dashed var(--k-color-border);color:var(--k-color-text-description);font-size:12px;font-style:italic}.phase-connector[data-v-74bfe0c7]{display:flex;flex-direction:column;align-items:center;padding:4px 0}.connector-line[data-v-74bfe0c7]{width:2px;height:8px;background:var(--k-color-border)}.connector-arrow[data-v-74bfe0c7]{display:flex;align-items:center;justify-content:center;width:20px;height:20px;color:var(--k-color-text-description);font-size:12px}.pipeline-footer[data-v-74bfe0c7]{display:flex;flex-wrap:wrap;gap:16px;margin-top:1.5rem;padding:12px 16px;background:var(--k-color-bg-2);border-radius:10px}.footer-item[data-v-74bfe0c7]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--k-color-text-description)}.dot[data-v-74bfe0c7]{width:8px;height:8px;border-radius:50%;background:var(--k-color-text-description)}.dot.active[data-v-74bfe0c7]{background:#22c55e}.dot.override[data-v-74bfe0c7]{background:var(--k-color-active)}.plugins-override-list[data-v-74bfe0c7]{display:flex;flex-direction:column;gap:12px}.plugin-override-card[data-v-74bfe0c7]{border:1px solid var(--k-color-border);border-radius:10px;overflow:hidden;transition:all .2s}.plugin-override-card.expanded[data-v-74bfe0c7]{border-color:var(--k-color-active)}.plugin-header[data-v-74bfe0c7]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:var(--k-color-bg-2);cursor:pointer;transition:background .2s}.plugin-header[data-v-74bfe0c7]:hover{background:var(--k-color-bg-1)}.plugin-info[data-v-74bfe0c7]{display:flex;align-items:center;gap:10px}.plugin-name[data-v-74bfe0c7]{font-weight:500;color:var(--k-color-text)}.override-badge[data-v-74bfe0c7]{font-size:11px;padding:2px 8px;background:var(--k-color-active);color:#fff;border-radius:10px}.plugin-actions[data-v-74bfe0c7]{display:flex;align-items:center;gap:8px}.plugin-config-fields[data-v-74bfe0c7]{padding:16px;background:var(--k-card-bg);border-top:1px solid var(--k-color-border)}.override-field-row[data-v-74bfe0c7]{margin-bottom:1rem}.override-field-row[data-v-74bfe0c7]:last-child{margin-bottom:0}.field-label[data-v-74bfe0c7]{display:block;margin-bottom:6px;font-size:13px;color:var(--k-color-text);font-weight:500}.field-input[data-v-74bfe0c7],.field-input .el-select[data-v-74bfe0c7],.field-input .el-input[data-v-74bfe0c7]{width:100%}.field-hint[data-v-74bfe0c7]{margin-top:4px;font-size:12px;color:var(--k-color-text-description)}.dialog-footer[data-v-74bfe0c7]{display:flex;justify-content:flex-end;gap:12px}.loading-state[data-v-99cf565d]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--k-color-text-description)}.loading-state.size-small[data-v-99cf565d]{padding:1.5rem;gap:8px}.loading-state.size-small .loading-icon[data-v-99cf565d]{font-size:1.25rem}.loading-state.size-default[data-v-99cf565d]{padding:3rem}.loading-state.size-default .loading-icon[data-v-99cf565d]{font-size:1.5rem}.loading-state.size-large[data-v-99cf565d]{padding:4rem}.loading-state.size-large .loading-icon[data-v-99cf565d]{font-size:2rem}.loading-icon[data-v-99cf565d]{animation:spin-99cf565d 1s linear infinite;opacity:.6}@keyframes spin-99cf565d{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.view-container[data-v-e6ec7ca7]{height:100%;display:flex;flex-direction:column;min-height:0}.view-header[data-v-e6ec7ca7]{flex-shrink:0;display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.header-left[data-v-e6ec7ca7]{display:flex;align-items:center;gap:1.5rem;flex-wrap:wrap}.view-content[data-v-e6ec7ca7]{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden;padding:.5rem 0}.channel-grid[data-v-e6ec7ca7]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem;padding:.5rem}.channel-card[data-v-e6ec7ca7]{height:100%;display:flex;flex-direction:column;transition:all .2s cubic-bezier(.4,0,.2,1);border:1px solid var(--k-color-border);border-radius:8px;background-color:var(--k-card-bg);position:relative;overflow:hidden}.channel-card[data-v-e6ec7ca7]:hover{border-color:var(--k-color-active);box-shadow:0 8px 16px -4px #0000000d;transform:translateY(-1px)}.card-header[data-v-e6ec7ca7]{padding:1rem 1.25rem .75rem;display:flex;flex-direction:column;gap:.5rem}.header-main[data-v-e6ec7ca7]{display:flex;justify-content:space-between;align-items:center}.header-meta[data-v-e6ec7ca7]{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.channel-name[data-v-e6ec7ca7]{font-size:1.1rem;font-weight:600;color:var(--k-color-text);display:flex;align-items:center;gap:.5rem}.channel-id[data-v-e6ec7ca7]{font-size:.8rem;color:var(--k-color-text-description);font-weight:400}.connector-badge[data-v-e6ec7ca7]{display:inline-flex;align-items:center;gap:.35rem;padding:2px 8px;background-color:var(--k-color-bg-2);border-radius:4px;font-size:.8rem;color:var(--k-color-text-description)}.cost-badge[data-v-e6ec7ca7]{display:inline-flex;align-items:center;padding:2px 8px;background-color:var(--k-color-success-light, rgba(103, 194, 58, .1));color:var(--k-color-success, #67c23a);border-radius:4px;font-size:.8rem;font-weight:500}.card-body[data-v-e6ec7ca7]{flex-grow:1;padding:0 1.25rem 1rem;min-height:40px}.field-list[data-v-e6ec7ca7]{display:flex;flex-direction:column;gap:.25rem;margin-bottom:.75rem}.field-item[data-v-e6ec7ca7]{display:flex;justify-content:space-between;align-items:center;font-size:.85rem;padding:.25rem 0;border-bottom:1px dashed var(--k-color-border)}.field-item[data-v-e6ec7ca7]:last-child{border-bottom:none}.field-label[data-v-e6ec7ca7]{color:var(--k-color-text-description)}.field-value[data-v-e6ec7ca7]{font-weight:500;color:var(--k-color-text)}.tags-list[data-v-e6ec7ca7]{display:flex;flex-wrap:wrap;gap:6px}.tag-pill[data-v-e6ec7ca7]{font-size:.75rem;padding:1px 6px;color:var(--k-color-text-description);border:1px solid var(--k-color-border);border-radius:12px;background-color:transparent}.no-tags[data-v-e6ec7ca7]{color:var(--k-color-text-description);font-size:.85rem;font-style:italic;opacity:.7}.card-footer[data-v-e6ec7ca7]{padding:.75rem 1.25rem;border-top:1px solid var(--k-color-border);display:flex;align-items:center;gap:.5rem;background-color:#00000005}.spacer[data-v-e6ec7ca7]{flex-grow:1}.list-view[data-v-e6ec7ca7]{background-color:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:8px;overflow:hidden}.channel-table[data-v-e6ec7ca7]{width:100%;border-collapse:collapse;table-layout:fixed}.channel-table thead[data-v-e6ec7ca7]{background-color:var(--k-color-bg-2)}.channel-table th[data-v-e6ec7ca7]{padding:.875rem 1rem;font-size:.8rem;font-weight:600;color:var(--k-color-text-description);text-align:left;border-bottom:1px solid var(--k-color-border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.channel-table .channel-row[data-v-e6ec7ca7]{cursor:pointer;transition:background-color .15s ease}.channel-table .channel-row[data-v-e6ec7ca7]:hover{background-color:var(--k-color-bg-1)}.channel-table .channel-row td[data-v-e6ec7ca7]{padding:.75rem 1rem;border-bottom:1px solid var(--k-color-border);vertical-align:middle;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.channel-table .channel-row:last-child td[data-v-e6ec7ca7]{border-bottom:none}.channel-table .col-name[data-v-e6ec7ca7]{width:20%}.channel-table .col-connector[data-v-e6ec7ca7]{width:15%}.channel-table .col-tags[data-v-e6ec7ca7]{width:auto}.channel-table .col-cost[data-v-e6ec7ca7]{width:12%}.channel-table .col-status[data-v-e6ec7ca7]{width:8%}.channel-table .col-actions[data-v-e6ec7ca7]{width:15%}.channel-table .name-text[data-v-e6ec7ca7]{font-weight:600;color:var(--k-color-text);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.channel-table .connector-badge[data-v-e6ec7ca7]{display:inline-flex;align-items:center;gap:.35rem;padding:2px 8px;background-color:var(--k-color-bg-2);border-radius:4px;font-size:.8rem;color:var(--k-color-text-description)}.tags-wrapper[data-v-e6ec7ca7]{display:flex;flex-wrap:wrap;gap:4px}.mini-tag[data-v-e6ec7ca7]{font-size:.7rem;padding:1px 6px;color:var(--k-color-text-description);border:1px solid var(--k-color-border);border-radius:10px;background-color:transparent}.mini-tag.more[data-v-e6ec7ca7]{background-color:var(--k-color-bg-2)}.cost-value[data-v-e6ec7ca7]{font-size:.85rem;color:var(--k-color-success, #67c23a);font-weight:500}.action-btns[data-v-e6ec7ca7]{display:flex;gap:.5rem}.view-header[data-v-e6ec7ca7]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding:0 .5rem}.header-right[data-v-e6ec7ca7]{display:flex;align-items:center;gap:1rem}.copy-btn[data-v-e6ec7ca7]{color:var(--k-color-active)!important;border-color:var(--k-color-active)!important}.copy-btn[data-v-e6ec7ca7]:hover{background-color:var(--k-color-active)!important;color:#fff!important}.delete-btn[data-v-e6ec7ca7]{color:var(--k-color-error, #f56c6c)!important;border-color:var(--k-color-error, #f56c6c)!important}.delete-btn[data-v-e6ec7ca7]:hover{background-color:var(--k-color-error, #f56c6c)!important;color:#fff!important}.json-editor[data-v-4d47b7db]{width:100%}.code-input[data-v-4d47b7db] textarea{font-family:monospace;font-size:.85rem;background-color:var(--k-color-bg-2);line-height:1.5;border-radius:4px}.error-msg[data-v-4d47b7db]{color:var(--k-color-error);font-size:.75rem;margin-top:4px;display:flex;align-items:center;gap:4px}.error-msg[data-v-4d47b7db]:before{content:"⚠"}.image-upload[data-v-47f2485e]{display:flex;flex-direction:column;gap:.75rem}.image-list[data-v-47f2485e]{display:flex;flex-wrap:wrap;gap:.75rem}.image-item[data-v-47f2485e]{width:80px}.image-preview[data-v-47f2485e]{width:80px;height:80px;border-radius:6px;overflow:hidden;position:relative;border:1px solid var(--k-color-border);background-color:var(--k-color-bg-2)}.image-preview img[data-v-47f2485e]{width:100%;height:100%;object-fit:cover}.image-overlay[data-v-47f2485e]{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#00000080;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease}.image-preview:hover .image-overlay[data-v-47f2485e]{opacity:1}.remove-btn[data-v-47f2485e]{background-color:var(--k-color-error, #f56c6c)!important;color:#fff!important;border:none!important}.image-name[data-v-47f2485e]{font-size:.7rem;color:var(--k-color-text-description);margin-top:.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.upload-area[data-v-47f2485e]{border:2px dashed var(--k-color-border);border-radius:8px;padding:1.5rem;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;background-color:var(--k-color-bg-2)}.upload-area[data-v-47f2485e]:hover{border-color:var(--k-color-active);background-color:var(--k-color-bg-1)}.upload-content[data-v-47f2485e]{display:flex;flex-direction:column;align-items:center;gap:.5rem;color:var(--k-color-text-description)}.upload-icon[data-v-47f2485e]{font-size:1.5rem;color:var(--k-color-active)}.upload-text[data-v-47f2485e]{font-size:.85rem}.upload-loading[data-v-47f2485e]{display:flex;align-items:center;gap:.5rem;color:var(--k-color-text-description);font-size:.85rem}.loading-icon[data-v-47f2485e]{animation:spin-47f2485e 1s linear infinite}@keyframes spin-47f2485e{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.view-container[data-v-99691cb5]{height:100%;display:flex;flex-direction:column;min-height:0}.view-header[data-v-99691cb5]{flex-shrink:0;display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:1rem}.header-left[data-v-99691cb5]{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}.header-right[data-v-99691cb5]{display:flex;align-items:center;gap:1rem}.view-content[data-v-99691cb5]{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden;padding:.5rem 0}.masonry-grid[data-v-99691cb5]{columns:5;column-gap:1rem}@media (max-width: 1400px){.masonry-grid[data-v-99691cb5]{columns:4}}@media (max-width: 1100px){.masonry-grid[data-v-99691cb5]{columns:3}}@media (max-width: 800px){.masonry-grid[data-v-99691cb5]{columns:2}}@media (max-width: 500px){.masonry-grid[data-v-99691cb5]{columns:1}}.masonry-item[data-v-99691cb5]{break-inside:avoid;margin-bottom:1rem}.preset-card[data-v-99691cb5]{background-color:var(--k-color-bg-1);border:1px solid var(--k-color-border);border-radius:8px;overflow:hidden;cursor:pointer;transition:all .2s ease;position:relative}.preset-card[data-v-99691cb5]:hover{border-color:var(--k-color-active);box-shadow:0 4px 12px #0000001a}.card-thumbnail[data-v-99691cb5]{width:100%;aspect-ratio:auto;position:relative;overflow:hidden;background-color:var(--k-color-bg-2)}.card-thumbnail img[data-v-99691cb5]{width:100%;height:auto;display:block;object-fit:cover}.card-thumbnail.placeholder[data-v-99691cb5]{aspect-ratio:4/3;display:flex;align-items:center;justify-content:center}.placeholder-icon[data-v-99691cb5]{font-size:2rem;color:var(--k-color-text-description);opacity:.5}.thumbnail-overlay[data-v-99691cb5]{position:absolute;bottom:0;left:0;right:0;padding:.5rem;background:linear-gradient(transparent,#0009);display:flex;justify-content:flex-end}.ref-count[data-v-99691cb5]{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#fff;background-color:#00000080;padding:2px 6px;border-radius:4px}.card-content[data-v-99691cb5]{padding:.75rem}.card-title[data-v-99691cb5]{font-size:.9rem;font-weight:600;color:var(--k-color-text);margin-bottom:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card-tags[data-v-99691cb5]{display:flex;flex-wrap:wrap;gap:4px}.mini-tag[data-v-99691cb5]{font-size:.7rem;padding:2px 6px;background-color:var(--k-color-bg-2);color:var(--k-color-text-description);border-radius:4px}.mini-tag.more[data-v-99691cb5]{background-color:var(--k-color-active);color:#fff}.card-actions[data-v-99691cb5]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-top:1px solid var(--k-color-border);background-color:var(--k-color-bg-2)}.source-indicator[data-v-99691cb5]{position:absolute;top:.5rem;left:.5rem;font-size:.65rem;padding:2px 6px;border-radius:4px;font-weight:600}.source-indicator.api[data-v-99691cb5]{background-color:var(--k-color-active);color:#fff}.source-indicator.user[data-v-99691cb5]{background-color:var(--k-color-warning, #e6a23c);color:#fff}.list-view[data-v-99691cb5]{background-color:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:8px;overflow:hidden}.preset-table[data-v-99691cb5]{width:100%;border-collapse:collapse;table-layout:fixed}.preset-table thead[data-v-99691cb5]{background-color:var(--k-color-bg-2)}.preset-table th[data-v-99691cb5]{padding:.875rem 1rem;font-size:.8rem;font-weight:600;color:var(--k-color-text-description);text-align:left;border-bottom:1px solid var(--k-color-border);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preset-table .preset-row[data-v-99691cb5]{cursor:pointer;transition:background-color .15s ease}.preset-table .preset-row[data-v-99691cb5]:hover{background-color:var(--k-color-bg-1)}.preset-table .preset-row td[data-v-99691cb5]{padding:.75rem 1rem;border-bottom:1px solid var(--k-color-border);vertical-align:middle;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preset-table .preset-row:last-child td[data-v-99691cb5]{border-bottom:none}.preset-table .col-thumb[data-v-99691cb5]{width:60px}.preset-table .col-name[data-v-99691cb5]{width:15%}.preset-table .col-template[data-v-99691cb5]{width:auto}.preset-table .col-refs[data-v-99691cb5]{width:10%;text-align:center!important}.preset-table th.col-refs[data-v-99691cb5]{text-align:center!important}.preset-table .col-source[data-v-99691cb5]{width:10%}.preset-table .col-status[data-v-99691cb5]{width:8%}.preset-table .col-actions[data-v-99691cb5]{width:15%}.thumb-wrapper[data-v-99691cb5]{width:40px;height:40px;border-radius:6px;overflow:hidden;background-color:var(--k-color-bg-2)}.thumb-wrapper img[data-v-99691cb5]{width:100%;height:100%;object-fit:cover}.preset-table .name-text[data-v-99691cb5]{font-weight:600;color:var(--k-color-text);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.template-preview[data-v-99691cb5]{font-size:.85rem;color:var(--k-color-text-description);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:300px}.action-btns[data-v-99691cb5]{display:flex;gap:.5rem}.loading-state[data-v-99691cb5]{display:flex;align-items:center;justify-content:center;padding:4rem;color:var(--k-color-text-description);gap:.5rem}.loading-icon[data-v-99691cb5]{animation:spin-99691cb5 1s linear infinite}@keyframes spin-99691cb5{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.form-tip[data-v-99691cb5]{font-size:.8rem;color:var(--k-color-text-description);margin-top:.25rem}.ref-image-input[data-v-99691cb5]{margin-bottom:8px}.copy-btn[data-v-99691cb5]{color:var(--k-color-active)!important;border-color:var(--k-color-active)!important}.copy-btn[data-v-99691cb5]:hover{background-color:var(--k-color-active)!important;color:#fff!important}.delete-btn[data-v-99691cb5]{color:var(--k-color-error, #f56c6c)!important;border-color:var(--k-color-error, #f56c6c)!important}.delete-btn[data-v-99691cb5]:hover{background-color:var(--k-color-error, #f56c6c)!important;color:#fff!important}.thumb-placeholder[data-v-99691cb5]{width:44px;height:44px;display:flex;align-items:center;justify-content:center;background-color:var(--k-color-bg-2);border-radius:4px;color:var(--k-color-text-description)}.name-text[data-v-99691cb5]{font-weight:500;color:var(--k-color-text)}.source-badge[data-v-99691cb5]{display:inline-block;font-size:.75rem;padding:2px 8px;border-radius:4px}.source-badge.api[data-v-99691cb5]{background-color:var(--k-color-active);color:#fff}.source-badge.user[data-v-99691cb5]{background-color:var(--k-color-warning, #e6a23c);color:#fff}.no-data[data-v-99691cb5]{color:var(--k-color-text-description);opacity:.5}.ref-badge[data-v-99691cb5]{display:inline-flex;align-items:center;gap:4px;font-size:.8rem;color:var(--k-color-text-description);background-color:var(--k-color-bg-2);padding:2px 8px;border-radius:4px}.status-badge[data-v-0bc21896]{display:inline-flex;align-items:center;padding:2px 8px;border-radius:4px;font-size:.75rem;font-weight:500;line-height:1.2}.status-badge.pending[data-v-0bc21896]{background-color:var(--k-color-bg-2);color:var(--k-color-text-description)}.status-badge.processing[data-v-0bc21896]{background-color:var(--k-color-primary-bg);color:var(--k-color-primary)}.status-badge.success[data-v-0bc21896]{background-color:var(--k-color-success-bg);color:var(--k-color-success)}.status-badge.failed[data-v-0bc21896]{background-color:var(--k-color-error-bg);color:var(--k-color-error)}.lightbox-overlay[data-v-bd68872f]{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000e6;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:9999;display:flex;align-items:center;justify-content:center;padding:24px}.lightbox-container[data-v-bd68872f]{width:100%;max-width:1100px;height:90vh;max-height:850px;background:var(--k-card-bg);border-radius:12px;overflow:hidden;position:relative;box-shadow:0 25px 60px #00000080}.lightbox-content[data-v-bd68872f]{display:flex;height:100%}.lightbox-image-area[data-v-bd68872f]{flex:1;background:#0a0a0a;display:flex;align-items:center;justify-content:center;position:relative;cursor:zoom-out;min-width:0}.lightbox-image[data-v-bd68872f]{max-width:100%;max-height:100%;object-fit:contain;display:block}.close-btn[data-v-bd68872f]{position:absolute;top:16px;left:16px;z-index:10;background:#ffffff26;border:none;color:#fff;width:40px;height:40px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;font-size:1.1rem}.close-btn[data-v-bd68872f]:hover{background:#ffffff40;transform:scale(1.05)}.nav-btn[data-v-bd68872f]{position:absolute;top:50%;transform:translateY(-50%);background:#ffffff26;border:none;color:#fff;width:48px;height:48px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;font-size:1.5rem}.nav-btn[data-v-bd68872f]:hover{background:#ffffff40;transform:translateY(-50%) scale(1.08)}.nav-btn.prev[data-v-bd68872f]{left:16px}.nav-btn.next[data-v-bd68872f]{right:16px}.image-counter[data-v-bd68872f]{position:absolute;bottom:16px;left:50%;transform:translate(-50%);background:#0009;color:#fff;padding:6px 14px;border-radius:20px;font-size:.85rem;font-weight:500}.lightbox-sidebar[data-v-bd68872f]{width:280px;background:var(--k-card-bg);display:flex;flex-direction:column;border-left:1px solid var(--k-color-border);flex-shrink:0}.sidebar-header[data-v-bd68872f]{padding:14px 16px;border-bottom:1px solid var(--k-color-border);display:flex;align-items:center;justify-content:space-between}.info-title[data-v-bd68872f]{font-weight:600;font-size:.95rem;color:var(--k-color-text)}.header-close-btn[data-v-bd68872f]{background:transparent;border:none;color:var(--k-color-text-description);width:28px;height:28px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;font-size:.9rem}.header-close-btn[data-v-bd68872f]:hover{background:var(--k-color-bg-2);color:var(--k-color-text)}.sidebar-body[data-v-bd68872f]{flex:1;overflow-y:auto;padding:16px}.info-block[data-v-bd68872f]{margin-bottom:16px}.info-block[data-v-bd68872f]:last-child{margin-bottom:0}.block-header[data-v-bd68872f]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:.7rem;font-weight:600;color:var(--k-color-text-description);text-transform:uppercase;letter-spacing:.5px}.copy-btn[data-v-bd68872f]{background:transparent;border:none;color:var(--k-color-active);cursor:pointer;font-size:.7rem;padding:2px 8px;border-radius:4px;transition:background .2s;font-weight:500}.copy-btn[data-v-bd68872f]:hover{background:var(--k-color-bg-2)}.prompt-content[data-v-bd68872f]{font-size:.82rem;line-height:1.5;color:var(--k-color-text);background:var(--k-color-bg-2);padding:10px 12px;border-radius:6px;white-space:pre-wrap;word-break:break-word;max-height:300px;overflow-y:auto}.prompt-content.empty[data-v-bd68872f]{color:var(--k-color-text-description);font-style:italic}.info-value[data-v-bd68872f]{font-size:.85rem;color:var(--k-color-text)}.sidebar-footer[data-v-bd68872f]{padding:12px 16px;border-top:1px solid var(--k-color-border);display:flex;gap:8px}.action-btn[data-v-bd68872f]{flex:1;padding:10px 12px;border-radius:8px;border:none;cursor:pointer;font-size:.8rem;font-weight:500;display:flex;align-items:center;justify-content:center;gap:6px;transition:all .2s}.action-btn.primary[data-v-bd68872f]{background:var(--k-color-active);color:#fff}.action-btn.primary[data-v-bd68872f]:hover{filter:brightness(1.1);transform:translateY(-1px)}.action-btn.secondary[data-v-bd68872f]{background:var(--k-color-bg-2);color:var(--k-color-text);border:1px solid var(--k-color-border)}.action-btn.secondary[data-v-bd68872f]:hover{background:var(--k-color-bg-1);border-color:var(--k-color-active);color:var(--k-color-active)}.lightbox-fade-enter-active[data-v-bd68872f],.lightbox-fade-leave-active[data-v-bd68872f]{transition:opacity .25s ease}.lightbox-fade-enter-from[data-v-bd68872f],.lightbox-fade-leave-to[data-v-bd68872f]{opacity:0}@media (max-width: 768px){.lightbox-overlay[data-v-bd68872f]{padding:0}.lightbox-container[data-v-bd68872f]{height:100%;max-height:none;border-radius:0}.lightbox-content[data-v-bd68872f]{flex-direction:column}.lightbox-image-area[data-v-bd68872f]{min-height:50vh}.lightbox-sidebar[data-v-bd68872f]{width:100%;border-left:none;border-top:1px solid var(--k-color-border)}.close-btn[data-v-bd68872f]{top:12px;left:12px}}.view-container[data-v-7992e681]{height:100%;display:flex;flex-direction:column;min-height:0}.view-header[data-v-7992e681]{flex-shrink:0;display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding:0 .5rem}.header-left[data-v-7992e681]{display:flex;align-items:center;gap:1rem}.header-actions[data-v-7992e681]{display:flex;gap:10px;align-items:center}.view-mode-switch[data-v-7992e681]{display:flex;gap:2px;background-color:var(--k-color-bg-2);border:1px solid var(--k-color-border);border-radius:6px;padding:2px}.mode-btn[data-v-7992e681]{display:flex;align-items:center;justify-content:center;width:32px;height:28px;border:none;background:transparent;color:var(--k-color-text-description);cursor:pointer;border-radius:4px;transition:all .2s ease;font-size:16px}.mode-btn[data-v-7992e681]:hover{color:var(--k-color-text);background-color:var(--k-color-bg-1)}.mode-btn.active[data-v-7992e681]{color:var(--k-color-active);background-color:var(--k-card-bg);box-shadow:0 1px 3px #0000001a}.view-content[data-v-7992e681]{flex:1 1 0;min-height:0;overflow-y:auto;overflow-x:hidden}.stats-grid[data-v-7992e681]{flex-shrink:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1rem;margin-bottom:2rem}.stat-card[data-v-7992e681]{background:var(--k-card-bg);border:1px solid transparent;border-radius:16px;padding:1.5rem;display:flex;flex-direction:row;align-items:center;justify-content:space-between;transition:all .3s cubic-bezier(.25,.8,.25,1);position:relative;overflow:hidden;box-shadow:0 2px 8px #0000000a}.stat-card[data-v-7992e681]:hover{transform:translateY(-4px);box-shadow:0 8px 24px #00000014}.stat-icon[data-v-7992e681]{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:1.5rem;flex-shrink:0;background-color:var(--k-color-bg-2);color:var(--k-color-text-description);transition:all .3s ease}.stat-card:hover .stat-icon[data-v-7992e681]{transform:scale(1.1)}.stat-icon.total[data-v-7992e681]{background-color:rgba(var(--k-color-primary-rgb),.1);color:var(--k-color-primary)}.stat-icon.success[data-v-7992e681]{background-color:rgba(var(--k-color-success-rgb),.1);color:var(--k-color-success)}.stat-icon.failed[data-v-7992e681]{background-color:rgba(var(--k-color-error-rgb),.1);color:var(--k-color-error)}.stat-icon.processing[data-v-7992e681]{background-color:rgba(var(--k-color-warning-rgb),.1);color:var(--k-color-warning)}.stat-icon.rate[data-v-7992e681]{background-color:rgba(var(--k-color-info-rgb),.1);color:var(--k-color-info)}.stat-content[data-v-7992e681]{display:flex;flex-direction:column-reverse;align-items:flex-end;flex-grow:1;margin-left:1rem}.stat-label[data-v-7992e681]{font-size:.85rem;color:var(--k-color-text-description);margin-top:.5rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em}.stat-value[data-v-7992e681]{font-size:2rem;font-weight:700;color:var(--k-color-text);line-height:1;letter-spacing:-.03em}.stat-value.success[data-v-7992e681]{color:var(--k-color-success)}.stat-value.failed[data-v-7992e681]{color:var(--k-color-error)}.stat-value.pending[data-v-7992e681]{color:var(--k-color-warning)}.filter-bar[data-v-7992e681]{flex-shrink:0;display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;background-color:var(--k-card-bg);padding:1rem;border-radius:12px;border:1px solid var(--k-color-border)}.filter-group[data-v-7992e681]{display:flex;gap:1rem;flex-wrap:wrap}.pagination-info[data-v-7992e681]{color:var(--k-color-text-description);font-size:.9rem}.task-table[data-v-7992e681]{border:1px solid var(--k-color-border);border-radius:12px;cursor:pointer;overflow:hidden;--el-table-header-bg-color: var(--k-color-bg-1);--el-table-row-hover-bg-color: var(--k-color-bg-2);--el-table-border-color: var(--k-color-border)}.task-table[data-v-7992e681] .el-table__row{transition:background-color .15s ease}.task-table[data-v-7992e681] th.el-table__cell{font-weight:600;color:var(--k-color-text-description);text-transform:uppercase;font-size:.75rem;letter-spacing:.05em}.mono-text[data-v-7992e681]{font-family:monospace;color:var(--k-color-text-description)}.prompt-cell[data-v-7992e681]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--k-color-text)}.time-text[data-v-7992e681]{font-size:.85rem;color:var(--k-color-text-description)}.text-muted[data-v-7992e681]{color:var(--k-color-text-description)}.masonry-grid[data-v-7992e681]{columns:5;column-gap:1rem}@media (max-width: 1400px){.masonry-grid[data-v-7992e681]{columns:4}}@media (max-width: 1100px){.masonry-grid[data-v-7992e681]{columns:3}}@media (max-width: 800px){.masonry-grid[data-v-7992e681]{columns:2}}@media (max-width: 500px){.masonry-grid[data-v-7992e681]{columns:1}}.masonry-item[data-v-7992e681]{break-inside:avoid;margin-bottom:1rem}.gallery-item[data-v-7992e681]{background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:8px;overflow:hidden;cursor:pointer;transition:all .2s ease}.gallery-item[data-v-7992e681]:hover{border-color:var(--k-color-active);box-shadow:0 4px 12px #0000001a}.gallery-image-wrapper[data-v-7992e681]{position:relative;width:100%;overflow:hidden;background:var(--k-color-bg-2)}.gallery-image[data-v-7992e681],.gallery-video[data-v-7992e681]{width:100%;display:block;transition:transform .3s}.gallery-item:hover .gallery-image[data-v-7992e681],.gallery-item:hover .gallery-video[data-v-7992e681]{transform:scale(1.03)}.gallery-overlay[data-v-7992e681]{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to top,#000c,#0000 50%);display:flex;flex-direction:column;justify-content:flex-end;padding:1.5rem;opacity:0;transition:opacity .3s}.gallery-item:hover .gallery-overlay[data-v-7992e681]{opacity:1}.zoom-icon[data-v-7992e681]{font-size:2rem;color:#fff;margin-bottom:auto;align-self:center;opacity:0;transform:scale(.8);transition:all .3s}.gallery-item:hover .zoom-icon[data-v-7992e681]{opacity:1;transform:scale(1)}.gallery-info[data-v-7992e681]{padding:.75rem}.gallery-prompt[data-v-7992e681]{font-size:.85rem;color:var(--k-color-text);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.4}.gallery-meta[data-v-7992e681]{margin-top:.5rem;font-size:.75rem;color:var(--k-color-text-description)}.empty-gallery[data-v-7992e681]{text-align:center;padding:4rem 2rem;color:var(--k-color-text-description)}.empty-icon[data-v-7992e681]{font-size:3rem;margin-bottom:1rem;opacity:.5}.pagination[data-v-7992e681]{flex-shrink:0;margin-top:1rem;padding-top:1rem;display:flex;justify-content:center;border-top:1px solid var(--k-color-border)}.task-detail[data-v-7992e681]{display:flex;flex-direction:column;gap:1.5rem}.detail-section h3[data-v-7992e681]{font-size:1.1rem;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid var(--k-color-border);color:var(--k-color-text)}.detail-grid[data-v-7992e681]{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;background-color:var(--k-color-bg-2);padding:1rem;border-radius:8px}.detail-item[data-v-7992e681]{display:flex;align-items:center;gap:.5rem}.label[data-v-7992e681]{font-weight:600;color:var(--k-color-text-description);flex-shrink:0}.code-block[data-v-7992e681]{background-color:var(--k-color-bg-2);padding:1rem;border-radius:6px;font-family:Fira Code,monospace;font-size:.9rem;white-space:pre-wrap;word-break:break-all;max-height:300px;overflow-y:auto;border:1px solid var(--k-color-border)}.code-block.error[data-v-7992e681]{background-color:var(--k-color-error-bg);color:var(--k-color-error);border-color:var(--k-color-error)}.output-gallery[data-v-7992e681]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:1rem}.output-item[data-v-7992e681]{border:1px solid var(--k-color-border);border-radius:8px;overflow:hidden;background-color:var(--k-color-bg-2);transition:transform .2s}.output-item[data-v-7992e681]:hover{transform:scale(1.02);box-shadow:0 4px 12px #0000001a}.output-image[data-v-7992e681]{width:100%;height:150px;object-fit:cover;display:block}.text-asset[data-v-7992e681]{padding:.75rem;font-size:.85rem;white-space:pre-wrap;word-break:break-word;max-height:150px;overflow-y:auto}.file-link[data-v-7992e681]{display:flex;align-items:center;gap:.5rem;padding:1rem;color:var(--k-color-active);text-decoration:none;font-size:.85rem;word-break:break-all}.gallery-detail-dialog[data-v-7992e681] .el-dialog__header{display:none}.gallery-detail-dialog[data-v-7992e681] .el-dialog__body{padding:0}.gallery-detail[data-v-7992e681]{display:flex;height:80vh;background:var(--k-card-bg);border-radius:12px;overflow:hidden}.gallery-detail-media[data-v-7992e681]{flex:1;background:#000;display:flex;align-items:center;justify-content:center;overflow:hidden}.gallery-detail-media img[data-v-7992e681],.gallery-detail-media video[data-v-7992e681]{max-width:100%;max-height:100%;object-fit:contain}.gallery-detail-sidebar[data-v-7992e681]{width:320px;display:flex;flex-direction:column;border-left:1px solid var(--k-color-border);background:var(--k-card-bg)}.sidebar-header[data-v-7992e681]{padding:1rem;border-bottom:1px solid var(--k-color-border);display:flex;justify-content:space-between;align-items:center}.sidebar-header h3[data-v-7992e681]{margin:0;font-size:1.1rem;color:var(--k-color-text)}.sidebar-content[data-v-7992e681]{flex:1;padding:1rem;overflow-y:auto}.info-block[data-v-7992e681]{margin-bottom:1.5rem}.info-label[data-v-7992e681]{font-size:.75rem;font-weight:600;color:var(--k-color-text-description);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem}.info-value[data-v-7992e681]{color:var(--k-color-text);font-size:.9rem}.info-value.prompt[data-v-7992e681]{background:var(--k-color-bg-2);padding:.75rem;border-radius:6px;font-family:monospace;font-size:.85rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;margin-bottom:.5rem;max-height:200px;overflow-y:auto}.sidebar-footer[data-v-7992e681]{padding:1rem;border-top:1px solid var(--k-color-border);display:flex;gap:.5rem}.download-btn[data-v-7992e681]{text-decoration:none}.cleanup-form[data-v-7992e681]{text-align:center}.cleanup-form p[data-v-7992e681]{margin-bottom:1rem;color:var(--k-color-text)}.dialog-footer[data-v-7992e681]{display:flex;gap:10px;justify-content:flex-end}.history-gallery[data-v-77080b46]{width:240px;max-height:100%;flex-shrink:0;display:flex;flex-direction:column;background-color:var(--k-card-bg);border-radius:12px;border:1px solid var(--k-color-border);overflow:hidden;transition:width .3s ease}.history-gallery.collapsed[data-v-77080b46]{width:40px}.collapsed-bar[data-v-77080b46]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;cursor:pointer;color:var(--k-color-text-description);transition:all .2s;gap:.5rem;padding:1rem 0}.collapsed-bar[data-v-77080b46]:hover{color:var(--k-color-active);background-color:var(--k-color-bg-2)}.collapsed-bar .k-icon[data-v-77080b46]{font-size:1.1rem}.collapsed-text[data-v-77080b46]{writing-mode:vertical-rl;font-size:.75rem;font-weight:500}.gallery-content[data-v-77080b46]{display:flex;flex-direction:column;flex:1 1 0;min-height:0;overflow:hidden}.gallery-header[data-v-77080b46]{padding:.75rem;border-bottom:1px solid var(--k-color-border);display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.header-left[data-v-77080b46]{display:flex;align-items:center;gap:.5rem}.gallery-title[data-v-77080b46]{font-size:.85rem;font-weight:600;color:var(--k-color-text)}.gallery-count[data-v-77080b46]{font-size:.7rem;background-color:var(--k-color-active);color:#fff;padding:.1rem .4rem;border-radius:10px;font-weight:500}.header-actions[data-v-77080b46]{display:flex;align-items:center;gap:.25rem}.action-icon[data-v-77080b46]{padding:.3rem;border-radius:4px;cursor:pointer;color:var(--k-color-text-description);transition:all .2s;font-size:.85rem}.action-icon[data-v-77080b46]:hover{color:var(--k-color-active);background-color:var(--k-color-bg-2)}.action-icon.spinning[data-v-77080b46]{animation:spin-77080b46 1s linear infinite}.gallery-list[data-v-77080b46]{flex:1 1 auto;max-height:calc(100vh - 200px);overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;gap:.5rem}.gallery-list[data-v-77080b46]::-webkit-scrollbar{width:4px}.gallery-list[data-v-77080b46]::-webkit-scrollbar-track{background:transparent}.gallery-list[data-v-77080b46]::-webkit-scrollbar-thumb{background-color:var(--k-color-border);border-radius:2px}.task-card[data-v-77080b46]{background-color:var(--k-color-bg-2);border-radius:8px;flex-shrink:0;overflow:hidden;transition:all .2s;position:relative}.task-card.clickable[data-v-77080b46]{cursor:pointer}.task-card.clickable[data-v-77080b46]:hover{background-color:var(--k-color-bg-1);box-shadow:0 2px 8px #0000001a}.task-image-wrapper[data-v-77080b46]{position:relative;width:100%;background-color:var(--k-color-bg-1)}.task-image[data-v-77080b46]{width:100%;height:auto;display:block}.more-images[data-v-77080b46]{position:absolute;right:6px;top:6px;background:#000000b3;color:#fff;font-size:.7rem;padding:.15rem .4rem;border-radius:4px}.task-processing[data-v-77080b46]{padding:1.5rem 1rem;display:flex;flex-direction:column;align-items:center;gap:.5rem}.processing-animation[data-v-77080b46]{display:flex;gap:.3rem}.processing-animation .dot[data-v-77080b46]{width:6px;height:6px;background-color:var(--k-color-active);border-radius:50%;animation:bounce-77080b46 1.4s ease-in-out infinite both}.processing-animation .dot[data-v-77080b46]:nth-child(1){animation-delay:-.32s}.processing-animation .dot[data-v-77080b46]:nth-child(2){animation-delay:-.16s}@keyframes bounce-77080b46{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.processing-text[data-v-77080b46]{font-size:.75rem;color:var(--k-color-text-description)}.task-failed[data-v-77080b46]{padding:1.5rem 1rem;display:flex;flex-direction:column;align-items:center;gap:.5rem;color:var(--k-color-error)}.failed-icon[data-v-77080b46]{font-size:1.25rem;opacity:.7}.task-failed span[data-v-77080b46]{font-size:.75rem}.task-info[data-v-77080b46]{padding:.5rem}.task-prompt[data-v-77080b46]{font-size:.75rem;color:var(--k-color-text);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.4;word-break:break-all}.task-meta[data-v-77080b46]{display:flex;justify-content:space-between;align-items:center;margin-top:.35rem;font-size:.65rem;color:var(--k-color-text-description)}.gallery-empty[data-v-77080b46],.gallery-loading[data-v-77080b46]{flex-grow:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--k-color-text-description);padding:2rem 1rem;gap:.5rem}.empty-icon[data-v-77080b46]{font-size:2rem;opacity:.3}.gallery-empty p[data-v-77080b46]{font-size:.8rem;margin:0}.loading-more[data-v-77080b46]{display:flex;justify-content:center;padding:.5rem}.loader-small[data-v-77080b46]{border:2px solid var(--k-color-bg-1);border-top:2px solid var(--k-color-active);border-radius:50%;width:20px;height:20px;animation:spin-77080b46 1s linear infinite}@keyframes spin-77080b46{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.view-container[data-v-c6c9e1c0]{height:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden}.view-content[data-v-c6c9e1c0]{flex:1 1 0;min-height:0;overflow:hidden}.generate-layout[data-v-c6c9e1c0]{display:flex;gap:20px;height:100%;min-height:0}.config-panel[data-v-c6c9e1c0]{width:380px;flex-shrink:0;display:flex;flex-direction:column}.config-card[data-v-c6c9e1c0]{padding:1.5rem;height:100%;overflow-y:auto;display:flex;flex-direction:column;border-radius:12px;background-color:var(--k-card-bg);border:1px solid transparent;box-shadow:0 2px 8px #0000000a;transition:all .3s cubic-bezier(.25,.8,.25,1)}.config-card[data-v-c6c9e1c0]:hover{box-shadow:0 4px 16px #00000014}.config-card[data-v-c6c9e1c0]::-webkit-scrollbar{width:6px}.config-card[data-v-c6c9e1c0]::-webkit-scrollbar-track{background:transparent}.config-card[data-v-c6c9e1c0]::-webkit-scrollbar-thumb{background-color:var(--k-color-border);border-radius:3px}.form-section[data-v-c6c9e1c0]{margin-bottom:1.5rem}.form-section.flex-grow[data-v-c6c9e1c0]{flex-grow:1;display:flex;flex-direction:column}.form-section.flex-grow[data-v-c6c9e1c0] .el-textarea{flex-grow:1}.form-section.flex-grow[data-v-c6c9e1c0] .el-textarea__inner{height:100%!important}.section-title[data-v-c6c9e1c0]{font-weight:600;margin-bottom:.75rem;color:var(--k-color-text);font-size:.95rem;display:flex;align-items:center;gap:.5rem}.section-title .k-icon[data-v-c6c9e1c0]{color:var(--k-color-active)}.form-item[data-v-c6c9e1c0]{margin-bottom:1rem}.label[data-v-c6c9e1c0]{font-size:.85rem;color:var(--k-color-text-description);margin-bottom:.35rem}.form-actions[data-v-c6c9e1c0]{margin-top:1.5rem}.generate-btn[data-v-c6c9e1c0]{width:100%;height:44px;font-size:1rem;font-weight:600;transition:all .2s;background:linear-gradient(135deg,var(--k-color-primary) 0%,var(--k-color-primary-dark, var(--k-color-primary)) 100%);border:none}.generate-btn[data-v-c6c9e1c0]:not(:disabled):hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(var(--k-color-primary-rgb),.4);filter:brightness(1.1)}.preview-panel[data-v-c6c9e1c0]{flex-grow:1;background-color:var(--k-color-bg-2);border-radius:12px;border:1px dashed var(--k-color-border);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;position:relative;overflow-y:auto;transition:background-color .3s}.preview-panel[data-v-c6c9e1c0]:hover{background-color:var(--k-color-bg-1)}.empty-state[data-v-c6c9e1c0],.generating-state[data-v-c6c9e1c0]{text-align:center;color:var(--k-color-text-description);display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.empty-icon[data-v-c6c9e1c0]{font-size:5rem;margin-bottom:1.5rem;opacity:.2;color:var(--k-color-text)}.loader[data-v-c6c9e1c0]{border:4px solid var(--k-color-bg-2);border-top:4px solid var(--k-color-active);border-radius:50%;width:40px;height:40px;animation:spin-c6c9e1c0 1s linear infinite;margin:0 auto 1rem}@keyframes spin-c6c9e1c0{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.result-container[data-v-c6c9e1c0]{width:100%;height:100%;display:flex;flex-direction:column}.success-result[data-v-c6c9e1c0]{flex-grow:1;display:flex;flex-direction:column}.output-grid[data-v-c6c9e1c0]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem;flex-grow:1;align-content:start}.output-wrapper[data-v-c6c9e1c0]{position:relative;border-radius:12px;overflow:hidden;border:1px solid var(--k-color-border);background-color:var(--k-card-bg);transition:all .3s cubic-bezier(.25,.8,.25,1);box-shadow:0 2px 8px #0000000a}.output-wrapper[data-v-c6c9e1c0]:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000001f;border-color:transparent}.output-wrapper img[data-v-c6c9e1c0]{width:100%;height:100%;object-fit:contain;display:block}.output-wrapper img.clickable-image[data-v-c6c9e1c0]{cursor:zoom-in}.output-wrapper video[data-v-c6c9e1c0],.output-wrapper audio[data-v-c6c9e1c0]{width:100%;display:block}.output-actions[data-v-c6c9e1c0]{position:absolute;bottom:0;left:0;right:0;padding:.5rem;background:#00000080;display:flex;justify-content:flex-end;opacity:0;transition:opacity .2s}.output-wrapper:hover .output-actions[data-v-c6c9e1c0]{opacity:1}.action-btn[data-v-c6c9e1c0]{color:#fff;padding:4px;cursor:pointer}.result-meta[data-v-c6c9e1c0]{margin-top:1.5rem;display:flex;gap:1.5rem;color:var(--k-color-text-description);font-size:.9rem;border-top:1px solid var(--k-color-border);padding-top:1rem}.meta-item[data-v-c6c9e1c0]{display:flex;align-items:center;gap:.5rem}.error-result[data-v-c6c9e1c0]{text-align:center;color:var(--k-color-error)}.error-icon[data-v-c6c9e1c0]{font-size:3rem;margin-bottom:1rem}.upload-area[data-v-c6c9e1c0]{margin-top:.5rem}.upload-list[data-v-c6c9e1c0]{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.upload-item[data-v-c6c9e1c0]{position:relative;width:64px;height:64px;border-radius:8px;overflow:hidden;border:1px solid var(--k-color-border);background-color:var(--k-color-bg-2)}.upload-thumb[data-v-c6c9e1c0]{width:100%;height:100%;object-fit:cover}.upload-overlay[data-v-c6c9e1c0]{position:absolute;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s;cursor:pointer;color:#fff}.upload-item:hover .upload-overlay[data-v-c6c9e1c0]{opacity:1}.upload-trigger[data-v-c6c9e1c0]{width:64px;height:64px;border:2px dashed var(--k-color-border);border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s;background-color:var(--k-color-bg-2)}.upload-trigger[data-v-c6c9e1c0]:hover{border-color:var(--k-color-active);background-color:var(--k-color-bg-1)}.upload-icon[data-v-c6c9e1c0]{font-size:1.25rem;color:var(--k-color-text-description);transition:color .2s}.upload-trigger:hover .upload-icon[data-v-c6c9e1c0]{color:var(--k-color-active)}.upload-tip[data-v-c6c9e1c0]{font-size:.75rem;color:var(--k-color-text-description);margin-top:.5rem}.text-output[data-v-c6c9e1c0]{padding:1rem;background-color:var(--k-color-bg-2);border-radius:6px;white-space:pre-wrap;word-break:break-word;font-family:inherit;line-height:1.6}.file-link[data-v-c6c9e1c0]{display:flex;align-items:center;gap:.5rem;padding:1rem;background-color:var(--k-color-bg-2);border-radius:6px;color:var(--k-color-active);text-decoration:none;transition:background-color .2s}.file-link[data-v-c6c9e1c0]:hover{background-color:var(--k-color-bg-3)}.pipeline-panel[data-v-b4b0cf47]{display:flex;flex-direction:column;gap:24px;max-width:560px;padding:8px}.panel-header[data-v-b4b0cf47]{display:flex;align-items:center;justify-content:space-between}.header-title h3[data-v-b4b0cf47]{margin:0;font-size:16px;font-weight:600;color:var(--k-color-text)}.header-title .subtitle[data-v-b4b0cf47]{display:block;margin-top:4px;font-size:12px;color:var(--k-color-text-description)}.pipeline-flow[data-v-b4b0cf47]{display:flex;flex-direction:column;gap:0}.phase-section[data-v-b4b0cf47]{display:flex;flex-direction:column;align-items:stretch}.phase-header[data-v-b4b0cf47]{display:flex;align-items:center;gap:12px;padding:12px 16px;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:10px;transition:all .2s}.phase-header[data-v-b4b0cf47]:hover{border-color:var(--k-color-active)}.phase-icon[data-v-b4b0cf47]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;font-size:16px}.phase-prepare .phase-icon[data-v-b4b0cf47]{background:#3b82f626;color:#3b82f6}.phase-pre .phase-icon[data-v-b4b0cf47]{background:#8b5cf626;color:#8b5cf6}.phase-request .phase-icon[data-v-b4b0cf47]{background:#22c55e26;color:#22c55e}.phase-post .phase-icon[data-v-b4b0cf47]{background:#f9731626;color:#f97316}.phase-finalize .phase-icon[data-v-b4b0cf47]{background:#6366f126;color:#6366f1}.phase-info[data-v-b4b0cf47]{flex:1;display:flex;flex-direction:column;gap:2px}.phase-name[data-v-b4b0cf47]{font-size:14px;font-weight:600;color:var(--k-color-text)}.phase-desc[data-v-b4b0cf47]{font-size:11px;color:var(--k-color-text-description)}.phase-badge[data-v-b4b0cf47]{display:flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 8px;background:var(--k-color-bg-2);border-radius:12px;font-size:12px;font-weight:500;color:var(--k-color-text-description)}.phase-middlewares[data-v-b4b0cf47]{display:flex;flex-direction:column;gap:0;margin-left:24px;padding-left:24px;border-left:2px solid var(--k-color-border)}.mw-item[data-v-b4b0cf47]{position:relative}.mw-item[data-v-b4b0cf47]:before{content:"";position:absolute;left:-25px;top:50%;width:12px;height:2px;background:var(--k-color-border)}.mw-card[data-v-b4b0cf47]{display:flex;align-items:center;gap:12px;padding:10px 14px;margin:6px 0;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:8px;transition:all .2s}.mw-card[data-v-b4b0cf47]:hover{border-color:var(--k-color-active);background:var(--k-color-bg-1)}.mw-item.disabled .mw-card[data-v-b4b0cf47]{opacity:.6;background:var(--k-color-bg-2)}.mw-status[data-v-b4b0cf47]{width:8px;height:8px;border-radius:50%;background:var(--k-color-text-description);flex-shrink:0}.mw-status.active[data-v-b4b0cf47]{background:#22c55e;box-shadow:0 0 8px #22c55e66}.mw-content[data-v-b4b0cf47]{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.mw-name[data-v-b4b0cf47]{font-size:13px;font-weight:500;color:var(--k-color-text)}.mw-desc[data-v-b4b0cf47]{font-size:11px;color:var(--k-color-text-description);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.toggle-switch[data-v-b4b0cf47]{position:relative;display:inline-block;width:40px;height:22px;cursor:pointer;flex-shrink:0}.toggle-switch input[data-v-b4b0cf47]{opacity:0;width:0;height:0}.slider[data-v-b4b0cf47]{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:var(--k-color-bg-2);border:1px solid var(--k-color-border);border-radius:22px;transition:.2s}.slider[data-v-b4b0cf47]:before{position:absolute;content:"";height:16px;width:16px;left:2px;bottom:2px;background-color:var(--k-color-text-description);border-radius:50%;transition:.2s}.toggle-switch input:checked+.slider[data-v-b4b0cf47]{background-color:var(--k-color-active);border-color:var(--k-color-active)}.toggle-switch input:checked+.slider[data-v-b4b0cf47]:before{transform:translate(18px);background-color:#fff}.empty-phase[data-v-b4b0cf47]{margin-left:24px;padding:12px 24px;border-left:2px dashed var(--k-color-border);color:var(--k-color-text-description);font-size:12px;font-style:italic}.phase-connector[data-v-b4b0cf47]{display:flex;flex-direction:column;align-items:center;padding:4px 0}.connector-line[data-v-b4b0cf47]{width:2px;height:8px;background:var(--k-color-border)}.connector-arrow[data-v-b4b0cf47]{display:flex;align-items:center;justify-content:center;width:20px;height:20px;color:var(--k-color-text-description);font-size:12px}.pipeline-footer[data-v-b4b0cf47]{display:flex;flex-direction:column;gap:8px;padding:16px;background:var(--k-color-bg-2);border-radius:10px}.footer-item[data-v-b4b0cf47]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--k-color-text-description)}.dot[data-v-b4b0cf47]{width:8px;height:8px;border-radius:50%;background:var(--k-color-text-description)}.dot.active[data-v-b4b0cf47]{background:#22c55e}.footer-hint[data-v-b4b0cf47]{margin:8px 0 0;padding-top:8px;border-top:1px solid var(--k-color-border);font-size:11px;color:var(--k-color-text-description);opacity:.8}.plugins-panel[data-v-bfb4a81f]{display:flex;gap:1.5rem;height:100%}.loading-state[data-v-bfb4a81f],.empty-state[data-v-bfb4a81f]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:3rem;color:var(--k-color-text-description);width:100%}.loading-state .k-icon[data-v-bfb4a81f],.empty-state .k-icon[data-v-bfb4a81f]{font-size:2rem;opacity:.5}.empty-state .hint[data-v-bfb4a81f]{font-size:12px;opacity:.7}.spin[data-v-bfb4a81f]{animation:spin-bfb4a81f 1s linear infinite}@keyframes spin-bfb4a81f{to{transform:rotate(360deg)}}.plugins-list[data-v-bfb4a81f]{width:280px;flex-shrink:0;display:flex;flex-direction:column;gap:8px;max-height:calc(100vh - 200px);overflow-y:auto}.plugin-card[data-v-bfb4a81f]{background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:10px;padding:12px 14px;cursor:pointer;transition:all .2s}.plugin-card[data-v-bfb4a81f]:hover{border-color:var(--k-color-active);box-shadow:0 2px 8px #00000014}.plugin-card.active[data-v-bfb4a81f]{border-color:var(--k-color-active);background:var(--k-color-active-bg)}.plugin-card.disabled[data-v-bfb4a81f]{opacity:.6}.plugin-info[data-v-bfb4a81f]{margin-bottom:8px}.plugin-header[data-v-bfb4a81f]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.plugin-name[data-v-bfb4a81f]{font-weight:500;color:var(--k-color-text)}.plugin-version[data-v-bfb4a81f]{font-size:11px;color:var(--k-color-text-description);background:var(--k-color-bg-2);padding:1px 6px;border-radius:4px}.plugin-description[data-v-bfb4a81f]{font-size:12px;color:var(--k-color-text-description);margin:0;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.plugin-status[data-v-bfb4a81f]{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.plugin-badge[data-v-bfb4a81f]{font-size:10px;padding:2px 6px;border-radius:4px;background:var(--k-color-bg-2);color:var(--k-color-text-description)}.plugin-badge.connector[data-v-bfb4a81f]{background:rgba(var(--k-color-active-rgb),.15);color:var(--k-color-active)}.plugin-badge.middleware[data-v-bfb4a81f]{background:rgba(var(--k-color-success-rgb),.15);color:var(--k-color-success)}.plugin-status .k-icon[data-v-bfb4a81f]{margin-left:auto}.plugin-status .enabled[data-v-bfb4a81f]{color:var(--k-color-success)}.plugin-status .disabled[data-v-bfb4a81f]{color:var(--k-color-text-description)}.plugin-detail[data-v-bfb4a81f]{flex:1;min-width:0;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:12px;padding:1.5rem;overflow-y:auto;max-height:calc(100vh - 200px)}.detail-header[data-v-bfb4a81f]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid var(--k-color-border)}.header-left[data-v-bfb4a81f]{display:flex;align-items:center;gap:8px}.header-left h3[data-v-bfb4a81f]{margin:0;font-size:1.1rem;font-weight:600}.header-left .version[data-v-bfb4a81f]{font-size:12px;color:var(--k-color-text-description)}.header-actions[data-v-bfb4a81f]{display:flex;gap:8px}.connector-info[data-v-bfb4a81f],.middlewares-list[data-v-bfb4a81f],.config-section[data-v-bfb4a81f]{margin-bottom:1.5rem}.connector-info h4[data-v-bfb4a81f],.middlewares-list h4[data-v-bfb4a81f],.config-section h4[data-v-bfb4a81f]{font-size:14px;font-weight:500;color:var(--k-color-text);margin:0 0 .75rem}.connector-meta[data-v-bfb4a81f]{display:flex;gap:12px;font-size:13px;color:var(--k-color-text-description)}.connector-id[data-v-bfb4a81f]{font-family:monospace;background:var(--k-color-bg-2);padding:2px 8px;border-radius:4px}.middleware-tags[data-v-bfb4a81f]{display:flex;flex-wrap:wrap;gap:8px}.middleware-tag[data-v-bfb4a81f]{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--k-color-bg-2);border-radius:6px;font-size:12px;color:var(--k-color-text-description)}.middleware-tag.enabled[data-v-bfb4a81f]{color:var(--k-color-text)}.phase-badge[data-v-bfb4a81f]{font-size:10px;padding:1px 4px;background:var(--k-color-bg-1);border-radius:3px}.config-actions[data-v-bfb4a81f]{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--k-color-border)}.no-config[data-v-bfb4a81f],.no-selection[data-v-bfb4a81f]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:3rem;color:var(--k-color-text-description)}.no-config .k-icon[data-v-bfb4a81f],.no-selection .k-icon[data-v-bfb4a81f]{font-size:2rem;opacity:.5}.no-selection[data-v-bfb4a81f]{flex:1;background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:12px}.settings-view[data-v-122e70ff]{display:flex;gap:2rem;height:100%;min-height:0}.sidebar[data-v-122e70ff]{width:180px;flex-shrink:0}.nav-list[data-v-122e70ff]{display:flex;flex-direction:column;gap:4px;background:var(--k-color-bg-2);border-radius:12px;padding:8px}.nav-item[data-v-122e70ff]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:8px;cursor:pointer;color:var(--k-color-text-description);font-size:14px;transition:all .2s}.nav-item[data-v-122e70ff]:hover{background:var(--k-color-bg-1);color:var(--k-color-text)}.nav-item.active[data-v-122e70ff]{background:var(--k-card-bg);color:var(--k-color-active);box-shadow:0 1px 3px #00000014}.main-content[data-v-122e70ff]{flex:1;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden}.loading[data-v-122e70ff]{display:flex;align-items:center;justify-content:center;gap:8px;padding:4rem;color:var(--k-color-text-description)}.spin[data-v-122e70ff]{animation:spin-122e70ff 1s linear infinite}@keyframes spin-122e70ff{to{transform:rotate(360deg)}}.panel-header[data-v-122e70ff]{margin-bottom:1.5rem}.panel-header h2[data-v-122e70ff]{font-size:1.25rem;font-weight:600;color:var(--k-color-text);margin:0 0 .5rem}.panel-header p[data-v-122e70ff]{color:var(--k-color-text-description);font-size:14px;margin:0}.custom-panel[data-v-122e70ff]{background:var(--k-card-bg);border:1px solid var(--k-color-border);border-radius:12px;padding:1.5rem}.actions[data-v-122e70ff]{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--k-color-border)}.app-layout[data-v-7e4d3d55]{background:var(--k-color-bg-1);height:100vh;min-height:0}.top-nav[data-v-7e4d3d55]{position:sticky;top:0;z-index:10;background:var(--k-color-bg-2);border-bottom:1px solid var(--k-color-border);height:50px}.nav-container[data-v-7e4d3d55]{max-width:1200px;margin:0 auto;padding:0 20px;height:50px;display:flex;flex-direction:row;align-items:center;gap:16px}.nav-tabs[data-v-7e4d3d55]{display:flex;flex-direction:row;gap:8px;margin-left:auto}.nav-tab[data-v-7e4d3d55]{display:inline-flex;flex-direction:row;align-items:center;gap:6px;padding:6px 12px;cursor:pointer;color:var(--k-color-text-description);border-bottom:2px solid transparent;transition:color .15s ease,border-color .15s ease;white-space:nowrap}.nav-tab[data-v-7e4d3d55]:hover{color:var(--k-color-text)}.nav-tab.active[data-v-7e4d3d55]{color:var(--k-color-active);border-bottom-color:var(--k-color-active);font-weight:600}.tab-icon[data-v-7e4d3d55]{display:inline-flex;font-size:14px;width:14px;height:14px;flex-shrink:0}.main-content[data-v-7e4d3d55]{max-width:1200px;margin:0 auto;padding:20px;height:calc(100vh - 50px);overflow:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.main-content[data-v-7e4d3d55]::-webkit-scrollbar{width:0;height:0}.logo-area .logo-text[data-v-7e4d3d55]{font-weight:600;letter-spacing:.5px;color:var(--k-color-text);white-space:nowrap}.app-layout[data-v-7e4d3d55] .k-header,.app-layout[data-v-7e4d3d55] .k-view-header,.app-layout[data-v-7e4d3d55] .k-page-header,.app-layout[data-v-7e4d3d55] .k-toolbar{display:none!important;height:0!important;margin:0!important;padding:0!important}.el-dialog{background-color:var(--k-card-bg)!important;border-radius:12px!important;box-shadow:0 8px 32px #00000026!important;border:1px solid var(--k-color-border)!important;--el-dialog-bg-color: var(--k-card-bg) !important}.el-dialog__header{padding:1.25rem 1.5rem!important;border-bottom:1px solid var(--k-color-border)!important;margin-right:0!important}.el-dialog__title{font-weight:600!important;color:var(--k-color-text)!important;font-size:1.1rem!important}.el-dialog__headerbtn{top:1.25rem!important}.el-dialog__body{padding:1.5rem!important;color:var(--k-color-text)!important}.el-dialog__footer{padding:1.25rem 1.5rem!important;border-top:1px solid var(--k-color-border)!important;background-color:var(--k-color-bg-1)!important}.el-input__wrapper,.el-textarea__inner{background-color:var(--k-color-bg-2)!important;box-shadow:0 0 0 1px var(--k-color-border) inset!important}.el-input__wrapper:hover,.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--k-color-active) inset!important}.el-input__wrapper.is-focus,.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--k-color-active) inset!important;background-color:var(--k-color-bg-1)!important}.el-input__inner,.el-select-dropdown__item{color:var(--k-color-text)!important}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:var(--k-color-bg-2)!important}.el-popper.is-light{background:var(--k-card-bg)!important;border:1px solid var(--k-color-border)!important}
|