Browse Source

上传最新的版本代码

main
liwei1dao 2 months ago
parent
commit
554a4ab501
  1. 2
      apps/admin/.nuxt/components.d.ts
  2. 7
      apps/admin/.nuxt/imports.d.ts
  3. 1
      apps/admin/.nuxt/manifest/meta/9e59d46c-ae70-43ce-82b4-ed0ffc368f78.json
  4. 2
      apps/admin/.nuxt/nuxt.d.ts
  5. 2
      apps/admin/.nuxt/nuxt.node.d.ts
  6. 2
      apps/admin/.nuxt/tailwind/postcss.mjs
  7. 2
      apps/admin/.nuxt/tsconfig.app.json
  8. 2
      apps/admin/.nuxt/tsconfig.json
  9. 2
      apps/admin/.nuxt/tsconfig.shared.json
  10. 2
      apps/admin/.nuxt/types/components.d.ts
  11. 26
      apps/admin/.nuxt/types/imports.d.ts
  12. 2
      apps/admin/.output/nitro.json
  13. 1
      apps/admin/.output/public/_nuxt/0sLOmni-.js
  14. 2
      apps/admin/.output/public/_nuxt/32rNuZwS.js
  15. 1
      apps/admin/.output/public/_nuxt/5wqzuVoy.js
  16. 2
      apps/admin/.output/public/_nuxt/B8hrjpgL.js
  17. 2
      apps/admin/.output/public/_nuxt/B9UHsPCY.js
  18. 2
      apps/admin/.output/public/_nuxt/BAkLwAvM.js
  19. 1
      apps/admin/.output/public/_nuxt/BDDumZok.js
  20. 2
      apps/admin/.output/public/_nuxt/BFjsaYIf.js
  21. 2
      apps/admin/.output/public/_nuxt/BKXYxnNU.js
  22. 2
      apps/admin/.output/public/_nuxt/BSO50kj0.js
  23. 2
      apps/admin/.output/public/_nuxt/BZKwWPxz.js
  24. 2
      apps/admin/.output/public/_nuxt/Bad2XFSd.js
  25. 2
      apps/admin/.output/public/_nuxt/Bm2Gu08J.js
  26. 2
      apps/admin/.output/public/_nuxt/Bp86Q8ON.js
  27. 2
      apps/admin/.output/public/_nuxt/Bs6lDwyi.js
  28. 2
      apps/admin/.output/public/_nuxt/C9zSjFPi.js
  29. 2
      apps/admin/.output/public/_nuxt/CLee_yMD.js
  30. 1
      apps/admin/.output/public/_nuxt/CP0kHyLA.js
  31. 2
      apps/admin/.output/public/_nuxt/CUR2rcGX.js
  32. 2
      apps/admin/.output/public/_nuxt/ChqjEN2N.js
  33. 2
      apps/admin/.output/public/_nuxt/Cy52Ecc0.js
  34. 2
      apps/admin/.output/public/_nuxt/D4Um3zt0.js
  35. 2
      apps/admin/.output/public/_nuxt/D5EVRMZE.js
  36. 2
      apps/admin/.output/public/_nuxt/D5UrQ7F3.js
  37. 2
      apps/admin/.output/public/_nuxt/D8jvJLAX.js
  38. 1
      apps/admin/.output/public/_nuxt/DAaIRqev.js
  39. 2
      apps/admin/.output/public/_nuxt/DBJku-16.js
  40. 2
      apps/admin/.output/public/_nuxt/DBzpctzV.js
  41. 1
      apps/admin/.output/public/_nuxt/DGABB0pc.js
  42. 4
      apps/admin/.output/public/_nuxt/DSy_gLdM.js
  43. 2
      apps/admin/.output/public/_nuxt/DVest5s8.js
  44. 2
      apps/admin/.output/public/_nuxt/DhKR78CK.js
  45. 2
      apps/admin/.output/public/_nuxt/DlgycG-C.js
  46. 2
      apps/admin/.output/public/_nuxt/EeX3zgoF.js
  47. 2
      apps/admin/.output/public/_nuxt/GUJrhX2S.js
  48. 2
      apps/admin/.output/public/_nuxt/NtXZuCUg.js
  49. 1
      apps/admin/.output/public/_nuxt/PbGQRI_R.js
  50. 1
      apps/admin/.output/public/_nuxt/agents.Ba_0YWqu.css
  51. 1
      apps/admin/.output/public/_nuxt/agents.DyZqnyeq.css
  52. 2
      apps/admin/.output/public/_nuxt/builds/latest.json
  53. 1
      apps/admin/.output/public/_nuxt/builds/meta/12df8bde-c7e1-423a-8c26-514d561b95ec.json
  54. 1
      apps/admin/.output/public/_nuxt/builds/meta/997f9c5b-5ea7-4cda-a9d8-aeefc19242d7.json
  55. 1
      apps/admin/.output/public/_nuxt/calltranslate.CJXjjd14.css
  56. 1
      apps/admin/.output/public/_nuxt/calltranslate.blzoinPN.css
  57. 1
      apps/admin/.output/public/_nuxt/channels.4kXMd4_X.css
  58. 1
      apps/admin/.output/public/_nuxt/channels.DbnY_8Am.css
  59. 2
      apps/admin/.output/public/_nuxt/entry.CF8jJHbs.css
  60. 2
      apps/admin/.output/public/_nuxt/obp34o1K.js
  61. 2
      apps/admin/.output/public/_nuxt/rUi_Q6ng.js
  62. 1
      apps/admin/.output/public/_nuxt/serviceconfig.FDgyvVo4.css
  63. 1
      apps/admin/.output/public/_nuxt/serviceconfig.UIJazB1z.css
  64. 1
      apps/admin/.output/public/_nuxt/w_7nuVJ9.js
  65. 2
      apps/admin/.output/public/_nuxt/yis2MfHE.js
  66. 310
      apps/admin/.output/server/chunks/build/agents-Bh_gLb1p.mjs
  67. 1
      apps/admin/.output/server/chunks/build/agents-Bh_gLb1p.mjs.map
  68. 240
      apps/admin/.output/server/chunks/build/agents-DbiFqwig.mjs
  69. 1
      apps/admin/.output/server/chunks/build/agents-DbiFqwig.mjs.map
  70. 8
      apps/admin/.output/server/chunks/build/agents-styles.CKxmVBlz.mjs
  71. 1
      apps/admin/.output/server/chunks/build/agents-styles.CKxmVBlz.mjs.map
  72. 8
      apps/admin/.output/server/chunks/build/agents-styles.GXWAwNko.mjs
  73. 1
      apps/admin/.output/server/chunks/build/agents-styles.GXWAwNko.mjs.map
  74. 1
      apps/admin/.output/server/chunks/build/calltranslate-BllxIxWZ.mjs.map
  75. 78
      apps/admin/.output/server/chunks/build/calltranslate-Typ2E2m-.mjs
  76. 1
      apps/admin/.output/server/chunks/build/calltranslate-Typ2E2m-.mjs.map
  77. 8
      apps/admin/.output/server/chunks/build/calltranslate-styles.DejCdNUq.mjs
  78. 1
      apps/admin/.output/server/chunks/build/calltranslate-styles.DejCdNUq.mjs.map
  79. 8
      apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs
  80. 1
      apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs.map
  81. 74
      apps/admin/.output/server/chunks/build/channels-CtM7-nvg.mjs
  82. 1
      apps/admin/.output/server/chunks/build/channels-CtM7-nvg.mjs.map
  83. 1
      apps/admin/.output/server/chunks/build/channels-DdtjGoxx.mjs.map
  84. 8
      apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs
  85. 1
      apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs.map
  86. 8
      apps/admin/.output/server/chunks/build/channels-styles.YMd5B91-.mjs
  87. 1
      apps/admin/.output/server/chunks/build/channels-styles.YMd5B91-.mjs.map
  88. 2
      apps/admin/.output/server/chunks/build/client.precomputed.mjs
  89. 8
      apps/admin/.output/server/chunks/build/server.mjs
  90. 577
      apps/admin/.output/server/chunks/build/serviceconfig-Bq9We0Qx.mjs
  91. 1
      apps/admin/.output/server/chunks/build/serviceconfig-Bq9We0Qx.mjs.map
  92. 454
      apps/admin/.output/server/chunks/build/serviceconfig-DH60tzBJ.mjs
  93. 1
      apps/admin/.output/server/chunks/build/serviceconfig-DH60tzBJ.mjs.map
  94. 8
      apps/admin/.output/server/chunks/build/serviceconfig-styles.BSTefNde.mjs
  95. 1
      apps/admin/.output/server/chunks/build/serviceconfig-styles.BSTefNde.mjs.map
  96. 8
      apps/admin/.output/server/chunks/build/serviceconfig-styles.BoVuqbov.mjs
  97. 1
      apps/admin/.output/server/chunks/build/serviceconfig-styles.BoVuqbov.mjs.map
  98. 16
      apps/admin/.output/server/chunks/build/styles.mjs
  99. 498
      apps/admin/.output/server/chunks/nitro/nitro.mjs
  100. 216
      apps/admin/app/pages/agents.vue

2
apps/admin/.nuxt/components.d.ts

@ -14,6 +14,7 @@ type HydrationStrategies = {
type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T
export const AccountCredentialDialog: typeof import("../app/components/AccountCredentialDialog.vue")['default']
export const AppDeployTab: typeof import("../app/components/AppDeployTab.vue")['default'] export const AppDeployTab: typeof import("../app/components/AppDeployTab.vue")['default']
export const AppLoading: typeof import("../app/components/AppLoading.vue")['default'] export const AppLoading: typeof import("../app/components/AppLoading.vue")['default']
export const AppModuleTab: typeof import("../app/components/AppModuleTab.vue")['default'] export const AppModuleTab: typeof import("../app/components/AppModuleTab.vue")['default']
@ -44,6 +45,7 @@ export const Head: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin
export const Html: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Html'] export const Html: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Html']
export const Body: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Body'] export const Body: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Body']
export const NuxtIsland: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-island")['default'] export const NuxtIsland: typeof import("../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-island")['default']
export const LazyAccountCredentialDialog: LazyComponent<typeof import("../app/components/AccountCredentialDialog.vue")['default']>
export const LazyAppDeployTab: LazyComponent<typeof import("../app/components/AppDeployTab.vue")['default']> export const LazyAppDeployTab: LazyComponent<typeof import("../app/components/AppDeployTab.vue")['default']>
export const LazyAppLoading: LazyComponent<typeof import("../app/components/AppLoading.vue")['default']> export const LazyAppLoading: LazyComponent<typeof import("../app/components/AppLoading.vue")['default']>
export const LazyAppModuleTab: LazyComponent<typeof import("../app/components/AppModuleTab.vue")['default']> export const LazyAppModuleTab: LazyComponent<typeof import("../app/components/AppModuleTab.vue")['default']>

7
apps/admin/.nuxt/imports.d.ts

@ -32,10 +32,11 @@ export { setInterval } from '#app/compat/interval';
export { definePageMeta, PageMeta } from '#app/composables/pages'; export { definePageMeta, PageMeta } from '#app/composables/pages';
export { defineLazyHydrationComponent } from '#app/composables/lazy-hydration'; export { defineLazyHydrationComponent } from '#app/composables/lazy-hydration';
export { useApi } from '../app/composables/useApi'; export { useApi } from '../app/composables/useApi';
export { LANG_OPTIONS, langName, LangOption } from '../app/composables/useLangOptions'; export { LANG_OPTIONS, langName, ALL_LANG_OPTIONS, LangOption } from '../app/composables/useLangOptions';
export { useLoading } from '../app/composables/useLoading'; export { useLoading } from '../app/composables/useLoading';
export { useToast, ToastType, Toast } from '../app/composables/useToast'; export { useToast, ToastType, Toast } from '../app/composables/useToast';
export { MENU_GROUPS, ALL_MENU_IDS, DEFAULT_ADMIN_ACCESS, menuItemByPath, MenuItem, MenuGroup } from '../app/utils/menus'; export { MENU_GROUPS, ALL_MENU_IDS, DEFAULT_ADMIN_ACCESS, DEFAULT_BRAND_ACCESS, DEFAULT_DEALER_ACCESS, menuItemByPath, MenuItem, MenuGroup } from '../app/utils/menus';
export { REGION_CN, REGION_OVERSEAS, REGION_OPTIONS, normalizeRegion, regionLabel } from '../app/utils/regions';
export { REGION_LABEL, CAT_LABEL, STATUS_META, PROBE_META, healthReason, healthLastRunText, parseCats, SvcHealth } from '../app/utils/svchealth'; export { REGION_LABEL, CAT_LABEL, STATUS_META, PROBE_META, healthReason, healthLastRunText, parseCats, SvcHealth } from '../app/utils/svchealth';
export { IDENTITY_LABELS, useAuthStore } from '../app/stores/auth'; export { IDENTITY_LABELS, IDENTITY_ADMIN, IDENTITY_MANAGER, IDENTITY_BRAND, IDENTITY_OPERATOR, IDENTITY_DEALER, useAuthStore } from '../app/stores/auth';
export { defineStore, acceptHMRUpdate, usePinia, storeToRefs } from '../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables'; export { defineStore, acceptHMRUpdate, usePinia, storeToRefs } from '../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables';

1
apps/admin/.nuxt/manifest/meta/9e59d46c-ae70-43ce-82b4-ed0ffc368f78.json

@ -0,0 +1 @@
{}

2
apps/admin/.nuxt/nuxt.d.ts

@ -1,5 +1,5 @@
/// <reference types="@nuxtjs/tailwindcss" />
/// <reference types="@pinia/nuxt" /> /// <reference types="@pinia/nuxt" />
/// <reference types="@nuxtjs/tailwindcss" />
/// <reference types="@nuxt/telemetry" /> /// <reference types="@nuxt/telemetry" />
/// <reference types="@nuxt/devtools" /> /// <reference types="@nuxt/devtools" />
/// <reference path="types/nitro-layouts.d.ts" /> /// <reference path="types/nitro-layouts.d.ts" />

2
apps/admin/.nuxt/nuxt.node.d.ts

@ -1,5 +1,5 @@
/// <reference types="@nuxtjs/tailwindcss" />
/// <reference types="@pinia/nuxt" /> /// <reference types="@pinia/nuxt" />
/// <reference types="@nuxtjs/tailwindcss" />
/// <reference types="@nuxt/telemetry" /> /// <reference types="@nuxt/telemetry" />
/// <reference types="@nuxt/devtools" /> /// <reference types="@nuxt/devtools" />
/// <reference path="types/nitro-layouts.d.ts" /> /// <reference path="types/nitro-layouts.d.ts" />

2
apps/admin/.nuxt/tailwind/postcss.mjs

@ -1,4 +1,4 @@
// generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 8/8/2026, 11:27:28 AM // generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 8/14/2026, 11:41:43 AM
import "@nuxtjs/tailwindcss/config-ctx" import "@nuxtjs/tailwindcss/config-ctx"
import configMerger from "@nuxtjs/tailwindcss/merger"; import configMerger from "@nuxtjs/tailwindcss/merger";

2
apps/admin/.nuxt/tsconfig.app.json

@ -107,7 +107,7 @@
"./imports" "./imports"
], ],
"#app-manifest": [ "#app-manifest": [
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json" "./manifest/meta/9e59d46c-ae70-43ce-82b4-ed0ffc368f78.json"
], ],
"#components": [ "#components": [
"./components" "./components"

2
apps/admin/.nuxt/tsconfig.json

@ -107,7 +107,7 @@
"./imports" "./imports"
], ],
"#app-manifest": [ "#app-manifest": [
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json" "./manifest/meta/9e59d46c-ae70-43ce-82b4-ed0ffc368f78.json"
], ],
"#components": [ "#components": [
"./components" "./components"

2
apps/admin/.nuxt/tsconfig.shared.json

@ -107,7 +107,7 @@
"./imports" "./imports"
], ],
"#app-manifest": [ "#app-manifest": [
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json" "./manifest/meta/9e59d46c-ae70-43ce-82b4-ed0ffc368f78.json"
], ],
"#build": [ "#build": [
"." "."

2
apps/admin/.nuxt/types/components.d.ts

@ -14,6 +14,7 @@ type HydrationStrategies = {
type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T
interface _GlobalComponents { interface _GlobalComponents {
AccountCredentialDialog: typeof import("../../app/components/AccountCredentialDialog.vue")['default']
AppDeployTab: typeof import("../../app/components/AppDeployTab.vue")['default'] AppDeployTab: typeof import("../../app/components/AppDeployTab.vue")['default']
AppLoading: typeof import("../../app/components/AppLoading.vue")['default'] AppLoading: typeof import("../../app/components/AppLoading.vue")['default']
AppModuleTab: typeof import("../../app/components/AppModuleTab.vue")['default'] AppModuleTab: typeof import("../../app/components/AppModuleTab.vue")['default']
@ -44,6 +45,7 @@ interface _GlobalComponents {
Html: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Html'] Html: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Html']
Body: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Body'] Body: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/head/runtime/components")['Body']
NuxtIsland: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-island")['default'] NuxtIsland: typeof import("../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-island")['default']
LazyAccountCredentialDialog: LazyComponent<typeof import("../../app/components/AccountCredentialDialog.vue")['default']>
LazyAppDeployTab: LazyComponent<typeof import("../../app/components/AppDeployTab.vue")['default']> LazyAppDeployTab: LazyComponent<typeof import("../../app/components/AppDeployTab.vue")['default']>
LazyAppLoading: LazyComponent<typeof import("../../app/components/AppLoading.vue")['default']> LazyAppLoading: LazyComponent<typeof import("../../app/components/AppLoading.vue")['default']>
LazyAppModuleTab: LazyComponent<typeof import("../../app/components/AppModuleTab.vue")['default']> LazyAppModuleTab: LazyComponent<typeof import("../../app/components/AppModuleTab.vue")['default']>

26
apps/admin/.nuxt/types/imports.d.ts

@ -1,14 +1,25 @@
// Generated by auto imports // Generated by auto imports
export {} export {}
declare global { declare global {
const ALL_LANG_OPTIONS: typeof import('../../app/composables/useLangOptions').ALL_LANG_OPTIONS
const ALL_MENU_IDS: typeof import('../../app/utils/menus').ALL_MENU_IDS const ALL_MENU_IDS: typeof import('../../app/utils/menus').ALL_MENU_IDS
const CAT_LABEL: typeof import('../../app/utils/svchealth').CAT_LABEL const CAT_LABEL: typeof import('../../app/utils/svchealth').CAT_LABEL
const DEFAULT_ADMIN_ACCESS: typeof import('../../app/utils/menus').DEFAULT_ADMIN_ACCESS const DEFAULT_ADMIN_ACCESS: typeof import('../../app/utils/menus').DEFAULT_ADMIN_ACCESS
const DEFAULT_BRAND_ACCESS: typeof import('../../app/utils/menus').DEFAULT_BRAND_ACCESS
const DEFAULT_DEALER_ACCESS: typeof import('../../app/utils/menus').DEFAULT_DEALER_ACCESS
const IDENTITY_ADMIN: typeof import('../../app/stores/auth').IDENTITY_ADMIN
const IDENTITY_BRAND: typeof import('../../app/stores/auth').IDENTITY_BRAND
const IDENTITY_DEALER: typeof import('../../app/stores/auth').IDENTITY_DEALER
const IDENTITY_LABELS: typeof import('../../app/stores/auth').IDENTITY_LABELS const IDENTITY_LABELS: typeof import('../../app/stores/auth').IDENTITY_LABELS
const IDENTITY_MANAGER: typeof import('../../app/stores/auth').IDENTITY_MANAGER
const IDENTITY_OPERATOR: typeof import('../../app/stores/auth').IDENTITY_OPERATOR
const LANG_OPTIONS: typeof import('../../app/composables/useLangOptions').LANG_OPTIONS const LANG_OPTIONS: typeof import('../../app/composables/useLangOptions').LANG_OPTIONS
const MENU_GROUPS: typeof import('../../app/utils/menus').MENU_GROUPS const MENU_GROUPS: typeof import('../../app/utils/menus').MENU_GROUPS
const PROBE_META: typeof import('../../app/utils/svchealth').PROBE_META const PROBE_META: typeof import('../../app/utils/svchealth').PROBE_META
const REGION_CN: typeof import('../../app/utils/regions').REGION_CN
const REGION_LABEL: typeof import('../../app/utils/svchealth').REGION_LABEL const REGION_LABEL: typeof import('../../app/utils/svchealth').REGION_LABEL
const REGION_OPTIONS: typeof import('../../app/utils/regions').REGION_OPTIONS
const REGION_OVERSEAS: typeof import('../../app/utils/regions').REGION_OVERSEAS
const STATUS_META: typeof import('../../app/utils/svchealth').STATUS_META const STATUS_META: typeof import('../../app/utils/svchealth').STATUS_META
const abortNavigation: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router').abortNavigation const abortNavigation: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router').abortNavigation
const acceptHMRUpdate: typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables').acceptHMRUpdate const acceptHMRUpdate: typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables').acceptHMRUpdate
@ -63,6 +74,7 @@ declare global {
const menuItemByPath: typeof import('../../app/utils/menus').menuItemByPath const menuItemByPath: typeof import('../../app/utils/menus').menuItemByPath
const navigateTo: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router').navigateTo const navigateTo: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router').navigateTo
const nextTick: typeof import('vue').nextTick const nextTick: typeof import('vue').nextTick
const normalizeRegion: typeof import('../../app/utils/regions').normalizeRegion
const onActivated: typeof import('vue').onActivated const onActivated: typeof import('vue').onActivated
const onBeforeMount: typeof import('vue').onBeforeMount const onBeforeMount: typeof import('vue').onBeforeMount
const onBeforeRouteLeave: typeof import('../../node_modules/.pnpm/vue-router@5.1.0_@vue+compiler-sfc@3.5.38_esbuild@0.28.1_pinia@3.0.4_typescript@5.9.3_v_e9d2979651266ddc95cb9659efaeda1e/node_modules/vue-router').onBeforeRouteLeave const onBeforeRouteLeave: typeof import('../../node_modules/.pnpm/vue-router@5.1.0_@vue+compiler-sfc@3.5.38_esbuild@0.28.1_pinia@3.0.4_typescript@5.9.3_v_e9d2979651266ddc95cb9659efaeda1e/node_modules/vue-router').onBeforeRouteLeave
@ -94,6 +106,7 @@ declare global {
const ref: typeof import('vue').ref const ref: typeof import('vue').ref
const refreshCookie: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/cookie').refreshCookie const refreshCookie: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/cookie').refreshCookie
const refreshNuxtData: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/asyncData').refreshNuxtData const refreshNuxtData: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/asyncData').refreshNuxtData
const regionLabel: typeof import('../../app/utils/regions').regionLabel
const reloadNuxtApp: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/chunk').reloadNuxtApp const reloadNuxtApp: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/chunk').reloadNuxtApp
const requestIdleCallback: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/compat/idle-callback').requestIdleCallback const requestIdleCallback: typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/compat/idle-callback').requestIdleCallback
const resolveComponent: typeof import('vue').resolveComponent const resolveComponent: typeof import('vue').resolveComponent
@ -238,14 +251,25 @@ declare global {
import { UnwrapRef } from 'vue' import { UnwrapRef } from 'vue'
declare module 'vue' { declare module 'vue' {
interface ComponentCustomProperties { interface ComponentCustomProperties {
readonly ALL_LANG_OPTIONS: UnwrapRef<typeof import('../../app/composables/useLangOptions')['ALL_LANG_OPTIONS']>
readonly ALL_MENU_IDS: UnwrapRef<typeof import('../../app/utils/menus')['ALL_MENU_IDS']> readonly ALL_MENU_IDS: UnwrapRef<typeof import('../../app/utils/menus')['ALL_MENU_IDS']>
readonly CAT_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['CAT_LABEL']> readonly CAT_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['CAT_LABEL']>
readonly DEFAULT_ADMIN_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_ADMIN_ACCESS']> readonly DEFAULT_ADMIN_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_ADMIN_ACCESS']>
readonly DEFAULT_BRAND_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_BRAND_ACCESS']>
readonly DEFAULT_DEALER_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_DEALER_ACCESS']>
readonly IDENTITY_ADMIN: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_ADMIN']>
readonly IDENTITY_BRAND: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_BRAND']>
readonly IDENTITY_DEALER: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_DEALER']>
readonly IDENTITY_LABELS: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_LABELS']> readonly IDENTITY_LABELS: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_LABELS']>
readonly IDENTITY_MANAGER: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_MANAGER']>
readonly IDENTITY_OPERATOR: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_OPERATOR']>
readonly LANG_OPTIONS: UnwrapRef<typeof import('../../app/composables/useLangOptions')['LANG_OPTIONS']> readonly LANG_OPTIONS: UnwrapRef<typeof import('../../app/composables/useLangOptions')['LANG_OPTIONS']>
readonly MENU_GROUPS: UnwrapRef<typeof import('../../app/utils/menus')['MENU_GROUPS']> readonly MENU_GROUPS: UnwrapRef<typeof import('../../app/utils/menus')['MENU_GROUPS']>
readonly PROBE_META: UnwrapRef<typeof import('../../app/utils/svchealth')['PROBE_META']> readonly PROBE_META: UnwrapRef<typeof import('../../app/utils/svchealth')['PROBE_META']>
readonly REGION_CN: UnwrapRef<typeof import('../../app/utils/regions')['REGION_CN']>
readonly REGION_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['REGION_LABEL']> readonly REGION_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['REGION_LABEL']>
readonly REGION_OPTIONS: UnwrapRef<typeof import('../../app/utils/regions')['REGION_OPTIONS']>
readonly REGION_OVERSEAS: UnwrapRef<typeof import('../../app/utils/regions')['REGION_OVERSEAS']>
readonly STATUS_META: UnwrapRef<typeof import('../../app/utils/svchealth')['STATUS_META']> readonly STATUS_META: UnwrapRef<typeof import('../../app/utils/svchealth')['STATUS_META']>
readonly abortNavigation: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router')['abortNavigation']> readonly abortNavigation: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router')['abortNavigation']>
readonly acceptHMRUpdate: UnwrapRef<typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables')['acceptHMRUpdate']> readonly acceptHMRUpdate: UnwrapRef<typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables')['acceptHMRUpdate']>
@ -300,6 +324,7 @@ declare module 'vue' {
readonly menuItemByPath: UnwrapRef<typeof import('../../app/utils/menus')['menuItemByPath']> readonly menuItemByPath: UnwrapRef<typeof import('../../app/utils/menus')['menuItemByPath']>
readonly navigateTo: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router')['navigateTo']> readonly navigateTo: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/router')['navigateTo']>
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']> readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly normalizeRegion: UnwrapRef<typeof import('../../app/utils/regions')['normalizeRegion']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']> readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']> readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
readonly onBeforeRouteLeave: UnwrapRef<typeof import('../../node_modules/.pnpm/vue-router@5.1.0_@vue+compiler-sfc@3.5.38_esbuild@0.28.1_pinia@3.0.4_typescript@5.9.3_v_e9d2979651266ddc95cb9659efaeda1e/node_modules/vue-router')['onBeforeRouteLeave']> readonly onBeforeRouteLeave: UnwrapRef<typeof import('../../node_modules/.pnpm/vue-router@5.1.0_@vue+compiler-sfc@3.5.38_esbuild@0.28.1_pinia@3.0.4_typescript@5.9.3_v_e9d2979651266ddc95cb9659efaeda1e/node_modules/vue-router')['onBeforeRouteLeave']>
@ -331,6 +356,7 @@ declare module 'vue' {
readonly ref: UnwrapRef<typeof import('vue')['ref']> readonly ref: UnwrapRef<typeof import('vue')['ref']>
readonly refreshCookie: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/cookie')['refreshCookie']> readonly refreshCookie: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/cookie')['refreshCookie']>
readonly refreshNuxtData: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/asyncData')['refreshNuxtData']> readonly refreshNuxtData: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/asyncData')['refreshNuxtData']>
readonly regionLabel: UnwrapRef<typeof import('../../app/utils/regions')['regionLabel']>
readonly reloadNuxtApp: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/chunk')['reloadNuxtApp']> readonly reloadNuxtApp: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/composables/chunk')['reloadNuxtApp']>
readonly requestIdleCallback: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/compat/idle-callback')['requestIdleCallback']> readonly requestIdleCallback: UnwrapRef<typeof import('../../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/compat/idle-callback')['requestIdleCallback']>
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']> readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>

2
apps/admin/.output/nitro.json

@ -1,5 +1,5 @@
{ {
"date": "2026-08-13T01:47:09.171Z", "date": "2026-08-14T08:52:12.283Z",
"preset": "node-server", "preset": "node-server",
"framework": { "framework": {
"name": "nuxt", "name": "nuxt",

1
apps/admin/.output/public/_nuxt/0sLOmni-.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DBs5psLk.js → apps/admin/.output/public/_nuxt/32rNuZwS.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/5wqzuVoy.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DhK7Qd_G.js → apps/admin/.output/public/_nuxt/B8hrjpgL.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BZjLILU0.js → apps/admin/.output/public/_nuxt/B9UHsPCY.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BIbETX06.js → apps/admin/.output/public/_nuxt/BAkLwAvM.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/BDDumZok.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/Bj3tUDmW.js → apps/admin/.output/public/_nuxt/BFjsaYIf.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DOqVQ2Td.js → apps/admin/.output/public/_nuxt/BKXYxnNU.js

@ -1 +1 @@
import{g as h,j as x,k as w,C as y,c as r,a as e,t as d,l as b,p as _,q as v,v as f,n as k,z as M,y as u,o as p,_ as z}from"./DMxDLVSv.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},q={style:{"margin-bottom":"24px"}},D=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function g(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(g,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[f,o.account]])]),e("div",q,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[f,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=z(D,[["__scopeId","data-v-4f88fb34"]]);export{O as default}; import{g as h,j as x,k as w,C as y,c as r,a as e,t as d,l as b,p as _,q as v,v as f,n as k,z as M,y as u,o as p,_ as z}from"./DSy_gLdM.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},q={style:{"margin-bottom":"24px"}},D=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function g(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(g,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[f,o.account]])]),e("div",q,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[f,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=z(D,[["__scopeId","data-v-4f88fb34"]]);export{O as default};

2
apps/admin/.output/public/_nuxt/SCeBFRND.js → apps/admin/.output/public/_nuxt/BSO50kj0.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/ByX5RcOZ.js → apps/admin/.output/public/_nuxt/BZKwWPxz.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/8OwDPhJR.js → apps/admin/.output/public/_nuxt/Bad2XFSd.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DhTcVEsy.js → apps/admin/.output/public/_nuxt/Bm2Gu08J.js

@ -1 +1 @@
import{_ as s}from"./DBs5psLk.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./DMxDLVSv.js";import{u as f}from"./CYxZMiFx.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default}; import{_ as s}from"./32rNuZwS.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./DSy_gLdM.js";import{u as f}from"./obp34o1K.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default};

2
apps/admin/.output/public/_nuxt/DWZBXvpA.js → apps/admin/.output/public/_nuxt/Bp86Q8ON.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DckJLiId.js → apps/admin/.output/public/_nuxt/Bs6lDwyi.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Da7TefDj.js → apps/admin/.output/public/_nuxt/C9zSjFPi.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BnVZ5TlV.js → apps/admin/.output/public/_nuxt/CLee_yMD.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CP0kHyLA.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/B_xVdhjt.js → apps/admin/.output/public/_nuxt/CUR2rcGX.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/65zzvdWo.js → apps/admin/.output/public/_nuxt/ChqjEN2N.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BVhsT8W5.js → apps/admin/.output/public/_nuxt/Cy52Ecc0.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/mgru9RGc.js → apps/admin/.output/public/_nuxt/D4Um3zt0.js

@ -1 +1 @@
import{L as y,l as x}from"./DD3V9C6_.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,A as h,o as s,d as B,_ as N}from"./DMxDLVSv.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},A={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},z=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",A,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,z))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _}; import{L as y,l as x}from"./DD3V9C6_.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,A as h,o as s,d as B,_ as N}from"./DSy_gLdM.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},A={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},z=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",A,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,z))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _};

2
apps/admin/.output/public/_nuxt/9ezUT6H5.js → apps/admin/.output/public/_nuxt/D5EVRMZE.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BCQoRucv.js → apps/admin/.output/public/_nuxt/D5UrQ7F3.js

@ -1 +1 @@
import{_ as t,o,c as s,R as c}from"./DMxDLVSv.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; import{_ as t,o,c as s,R as c}from"./DSy_gLdM.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default};

2
apps/admin/.output/public/_nuxt/Cx8Ep4Vy.js → apps/admin/.output/public/_nuxt/D8jvJLAX.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./DMxDLVSv.js";import{u as i}from"./CYxZMiFx.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default}; import{_ as o,o as s,c as a,a as t,t as r}from"./DSy_gLdM.js";import{u as i}from"./obp34o1K.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default};

1
apps/admin/.output/public/_nuxt/DAaIRqev.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/Dp8jCjr5.js → apps/admin/.output/public/_nuxt/DBJku-16.js

@ -1 +1 @@
import{g as t,C as n,P as a,c as o,a as s,o as c}from"./DMxDLVSv.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default}; import{g as t,C as n,P as a,c as o,a as s,o as c}from"./DSy_gLdM.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BY3rg8Ld.js → apps/admin/.output/public/_nuxt/DBzpctzV.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/DGABB0pc.js

File diff suppressed because one or more lines are too long

4
apps/admin/.output/public/_nuxt/DMxDLVSv.js → apps/admin/.output/public/_nuxt/DSy_gLdM.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DiAHNWP8.js → apps/admin/.output/public/_nuxt/DVest5s8.js

@ -1,2 +1,2 @@
import{u as r}from"./B-sqZCu-.js";import{g as x,c as i,a as t,t as o,l as f,o as l}from"./DMxDLVSv.js";const b={key:0,class:"modal modal-open"},u={class:"modal-box max-w-md"},p={class:"font-bold text-base mb-1"},y={class:"rounded-xl border border-slate-200 bg-slate-50 p-3 space-y-2"},g={class:"flex items-center justify-between gap-3"},v={class:"font-mono font-semibold text-sm"},_={class:"flex items-center justify-between gap-3"},w={class:"font-mono font-semibold text-sm"},h={key:0,class:"mt-3 text-xs text-emerald-600"},k={key:1,class:"mt-3 text-xs text-amber-600"},C={class:"modal-action"},T=x({__name:"AccountCredentialDialog",props:{info:{}},emits:["close"],setup(s){const n=s,{success:c,warn:m}=r();async function d(){if(!n.info)return;const a=`用户名:${n.info.username} import{u as r}from"./EeX3zgoF.js";import{g as x,c as i,a as t,t as o,l as f,o as l}from"./DSy_gLdM.js";const b={key:0,class:"modal modal-open"},u={class:"modal-box max-w-md"},p={class:"font-bold text-base mb-1"},y={class:"rounded-xl border border-slate-200 bg-slate-50 p-3 space-y-2"},g={class:"flex items-center justify-between gap-3"},v={class:"font-mono font-semibold text-sm"},_={class:"flex items-center justify-between gap-3"},w={class:"font-mono font-semibold text-sm"},h={key:0,class:"mt-3 text-xs text-emerald-600"},k={key:1,class:"mt-3 text-xs text-amber-600"},C={class:"modal-action"},T=x({__name:"AccountCredentialDialog",props:{info:{}},emits:["close"],setup(s){const n=s,{success:c,warn:m}=r();async function d(){if(!n.info)return;const a=`用户名:${n.info.username}
初始密码:${n.info.password}`;try{await navigator.clipboard.writeText(a),c("凭据已复制")}catch{m("复制失败,请手工记录")}}return(a,e)=>s.info?(l(),i("div",b,[t("div",u,[t("h3",p,o(s.info.title),1),e[3]||(e[3]=t("p",{class:"text-xs text-slate-400 mb-3"},"初始密码仅在此显示一次,关闭后无法再查看(如需重设请到「后台账号」改密)。",-1)),t("div",y,[t("div",g,[e[1]||(e[1]=t("span",{class:"text-xs text-slate-500"},"登录用户名",-1)),t("span",v,o(s.info.username),1)]),t("div",_,[e[2]||(e[2]=t("span",{class:"text-xs text-slate-500"},"初始密码",-1)),t("span",w,o(s.info.password),1)])]),s.info.mailTo?(l(),i("div",h," ✓ 凭据已邮件发送至 "+o(s.info.mailTo),1)):(l(),i("div",k," ⚠ 凭据未能邮件送达"+o(s.info.mailError?":"+s.info.mailError:"")+",请手工转达上面的用户名和密码。 ",1)),t("div",C,[t("button",{class:"btn btn-ghost btn-sm",onClick:d},"复制"),t("button",{class:"btn btn-primary btn-sm text-white",onClick:e[0]||(e[0]=$=>a.$emit("close"))},"我已记录,关闭")])])])):f("",!0)}}),D=Object.assign(T,{__name:"AccountCredentialDialog"});export{D as _}; 初始密码:${n.info.password}`;try{await navigator.clipboard.writeText(a),c("凭据已复制")}catch{m("复制失败,请手工记录")}}return(a,e)=>s.info?(l(),i("div",b,[t("div",u,[t("h3",p,o(s.info.title),1),e[3]||(e[3]=t("p",{class:"text-xs text-slate-400 mb-3"},"初始密码仅在此显示一次,关闭后无法再查看(如需重设请到「后台账号」改密)。",-1)),t("div",y,[t("div",g,[e[1]||(e[1]=t("span",{class:"text-xs text-slate-500"},"登录用户名",-1)),t("span",v,o(s.info.username),1)]),t("div",_,[e[2]||(e[2]=t("span",{class:"text-xs text-slate-500"},"初始密码",-1)),t("span",w,o(s.info.password),1)])]),s.info.mailTo?(l(),i("div",h," ✓ 凭据已邮件发送至 "+o(s.info.mailTo),1)):(l(),i("div",k," ⚠ 凭据未能邮件送达"+o(s.info.mailError?":"+s.info.mailError:"")+",请手工转达上面的用户名和密码。 ",1)),t("div",C,[t("button",{class:"btn btn-ghost btn-sm",onClick:d},"复制"),t("button",{class:"btn btn-primary btn-sm text-white",onClick:e[0]||(e[0]=$=>a.$emit("close"))},"我已记录,关闭")])])])):f("",!0)}}),D=Object.assign(T,{__name:"AccountCredentialDialog"});export{D as _};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D8hp1fqj.js → apps/admin/.output/public/_nuxt/DhKR78CK.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/D2MTseeT.js → apps/admin/.output/public/_nuxt/DlgycG-C.js

@ -1,4 +1,4 @@
import{g as G,C as K,Q as P,c as a,a as e,d as u,q as g,s as U,F as f,r as B,v as Q,x as Y,t as n,y as i,A as E,o,n as F,l as A,_ as Z}from"./DMxDLVSv.js";import{u as J}from"./CCZrj3X-.js";import{u as W}from"./B-sqZCu-.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},_t={key:1,class:"muted"},gt={class:"muted"},xt={class:"muted"},yt={class:"muted"},bt={class:"muted"},ht={key:0,class:"muted"},wt={class:"t"},kt={key:0,class:"late"},Ct=G({__name:"statlog",setup(Tt){const{webApi:I}=J(),{success:O,error:R}=W(),H={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?H[l]||l:"-"}const c=i([]),x=i(!1),_=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function M(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function j(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.channel_id||"")+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){x.value=!0,_.value="";try{const l=await I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){_.value=l?.message||"网络异常"}finally{x.value=!1}}async function q(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗? import{g as G,C as K,Q as P,c as a,a as e,d as u,q as g,s as U,F as f,r as B,v as Q,x as Y,t as n,y as i,A as E,o,n as F,l as A,_ as Z}from"./DSy_gLdM.js";import{u as J}from"./NtXZuCUg.js";import{u as W}from"./EeX3zgoF.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},_t={key:1,class:"muted"},gt={class:"muted"},xt={class:"muted"},yt={class:"muted"},bt={class:"muted"},ht={key:0,class:"muted"},wt={class:"t"},kt={key:0,class:"late"},Ct=G({__name:"statlog",setup(Tt){const{webApi:I}=J(),{success:O,error:R}=W(),H={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?H[l]||l:"-"}const c=i([]),x=i(!1),_=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function M(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function j(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.channel_id||"")+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){x.value=!0,_.value="";try{const l=await I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){_.value=l?.message||"网络异常"}finally{x.value=!1}}async function q(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
只清除本核对面板的记录,不影响已落库的统计数据。 只清除本核对面板的记录,不影响已落库的统计数据。
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function z(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),g(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[U,b.value]]),g(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品/渠道商"},null,512),[[Q,h.value]]),e("label",st,[g(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:z},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:q},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品 · 渠道商"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[x.value?(o(),a("div",ct,"加载中...")):_.value?(o(),a("div",dt,"加载失败:"+n(_.value),1)):T.value.length?(o(!0),a(f,{key:3},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",_t,"(无应用名)")),e("span",gt," · "+n(D(t.region)),1),e("span",xt," · "+n(S(t.product_id)),1),e("span",yt," · "+n(t.channel_id||"未分配渠道"),1)]),e("div",bt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",ht," · "+n(t.summary),1)):A("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",wt,[u(n(C(t.snap_ts)),1),j(t)?(o(),a("span",kt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(Ct,[["__scopeId","data-v-e7a3debc"]]);export{Lt as default}; 清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function z(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),g(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[U,b.value]]),g(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品/渠道商"},null,512),[[Q,h.value]]),e("label",st,[g(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:z},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:q},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品 · 渠道商"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[x.value?(o(),a("div",ct,"加载中...")):_.value?(o(),a("div",dt,"加载失败:"+n(_.value),1)):T.value.length?(o(!0),a(f,{key:3},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",_t,"(无应用名)")),e("span",gt," · "+n(D(t.region)),1),e("span",xt," · "+n(S(t.product_id)),1),e("span",yt," · "+n(t.channel_id||"未分配渠道"),1)]),e("div",bt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",ht," · "+n(t.summary),1)):A("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",wt,[u(n(C(t.snap_ts)),1),j(t)?(o(),a("span",kt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(Ct,[["__scopeId","data-v-e7a3debc"]]);export{Lt as default};

2
apps/admin/.output/public/_nuxt/B-sqZCu-.js → apps/admin/.output/public/_nuxt/EeX3zgoF.js

@ -1 +1 @@
import{b as a}from"./CCZrj3X-.js";let i=0;function f(){const o=a("app:toasts",()=>[]);function e(s,t="info",r=3e3){const n=++i;o.value.push({id:n,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(u=>u.id!==n)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u}; import{b as a}from"./NtXZuCUg.js";let i=0;function f(){const o=a("app:toasts",()=>[]);function e(s,t="info",r=3e3){const n=++i;o.value.push({id:n,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(u=>u.id!==n)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u};

2
apps/admin/.output/public/_nuxt/BEUZObrB.js → apps/admin/.output/public/_nuxt/GUJrhX2S.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CCZrj3X-.js → apps/admin/.output/public/_nuxt/NtXZuCUg.js

@ -1 +1 @@
import{e as y,a9 as h,aa as w,A as g,j as d,k}from"./DMxDLVSv.js";const A="$s";function b(...t){const s=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(s);const[a,o]=t;if(!a||typeof a!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+a);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const i=A+a,r=y(),n=h(r.payload.state,i);if(o&&(r._state[i]??={_default:o}),n.value===void 0&&o){const e=o();if(w(e))return r.payload.state[i]=e,e;n.value=e}return n}function m(){const t=b("app:loading",()=>0),s=g(()=>t.value>0);function a(){t.value++}function o(){t.value=Math.max(0,t.value-1)}return{count:t,loading:s,begin:a,end:o}}async function f(t,s,a){const o=d(),i=k(),r={"Content-Type":"application/json"};o.token&&(r.Authorization=o.token),a&&Object.assign(r,a);const n=await fetch(t,{method:"POST",headers:r,body:JSON.stringify(s)});if(!n.ok)throw new Error(`HTTP error: ${n.status}`);const e=await n.json();if(e.code===18)throw o.logout(),i.push("/"),new Error(e.msg||"Unauthorized");if(e.code!==0)throw new Error(e.msg||"Unknown error");return e.data}const S=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function v(t){return!S.test(t)}function x(){const t=d(),{begin:s,end:a}=m();async function o(n,e){const u={};if(t.currentAppId&&(u["X-App-Id"]=String(t.currentAppId)),!v(n))return f(`/web/api/api_${n}`,e??{},u);s();try{return await f(`/web/api/api_${n}`,e??{},u)}finally{a()}}async function i(n,e){return f(`/console/api/${n}`,e??{})}async function r(n,e){const u=n.type||"application/octet-stream",c=await o("getcostoken",{path:e,filename:n.name,content_type:u}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":u},body:n});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:o,consoleApi:i,uploadFile:r}}export{m as a,b,x as u}; import{e as y,a9 as h,aa as w,A as g,j as d,k}from"./DSy_gLdM.js";const A="$s";function b(...t){const s=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(s);const[a,o]=t;if(!a||typeof a!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+a);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const i=A+a,r=y(),n=h(r.payload.state,i);if(o&&(r._state[i]??={_default:o}),n.value===void 0&&o){const e=o();if(w(e))return r.payload.state[i]=e,e;n.value=e}return n}function m(){const t=b("app:loading",()=>0),s=g(()=>t.value>0);function a(){t.value++}function o(){t.value=Math.max(0,t.value-1)}return{count:t,loading:s,begin:a,end:o}}async function f(t,s,a){const o=d(),i=k(),r={"Content-Type":"application/json"};o.token&&(r.Authorization=o.token),a&&Object.assign(r,a);const n=await fetch(t,{method:"POST",headers:r,body:JSON.stringify(s)});if(!n.ok)throw new Error(`HTTP error: ${n.status}`);const e=await n.json();if(e.code===18)throw o.logout(),i.push("/"),new Error(e.msg||"Unauthorized");if(e.code!==0)throw new Error(e.msg||"Unknown error");return e.data}const S=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function v(t){return!S.test(t)}function x(){const t=d(),{begin:s,end:a}=m();async function o(n,e){const u={};if(t.currentAppId&&(u["X-App-Id"]=String(t.currentAppId)),!v(n))return f(`/web/api/api_${n}`,e??{},u);s();try{return await f(`/web/api/api_${n}`,e??{},u)}finally{a()}}async function i(n,e){return f(`/console/api/${n}`,e??{})}async function r(n,e){const u=n.type||"application/octet-stream",c=await o("getcostoken",{path:e,filename:n.name,content_type:u}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":u},body:n});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:o,consoleApi:i,uploadFile:r}}export{m as a,b,x as u};

1
apps/admin/.output/public/_nuxt/PbGQRI_R.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/agents.Ba_0YWqu.css

@ -1 +0,0 @@
.type-tag[data-v-4a81d81a]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-4a81d81a]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-4a81d81a]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-4a81d81a]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-4a81d81a]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-4a81d81a]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-4a81d81a]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-4a81d81a]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-4a81d81a]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-4a81d81a]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-4a81d81a]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-4a81d81a]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-4a81d81a]{display:inline-block;margin-left:6px}.ed-tip[data-v-4a81d81a]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-4a81d81a]{color:#dc2626;font-style:normal}.type-row[data-v-4a81d81a]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-4a81d81a]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-4a81d81a]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-4a81d81a]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-4a81d81a]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-4a81d81a]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-4a81d81a]{font-size:10px;color:#94a3b8}.slot-row[data-v-4a81d81a]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-4a81d81a]{flex:1;min-width:0}.slot-arrow[data-v-4a81d81a]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-4a81d81a]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-4a81d81a]{gap:8px;margin-bottom:6px}.ed-footer[data-v-4a81d81a],.voice-row[data-v-4a81d81a]{display:flex;align-items:center}.ed-footer[data-v-4a81d81a]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-4a81d81a]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-4a81d81a]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-4a81d81a]{display:none}}

1
apps/admin/.output/public/_nuxt/agents.DyZqnyeq.css

@ -0,0 +1 @@
.type-tag[data-v-dcf87e76]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-dcf87e76]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-dcf87e76]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-dcf87e76]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-dcf87e76]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-dcf87e76]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-dcf87e76]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-dcf87e76]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-dcf87e76]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-dcf87e76]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-dcf87e76]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-dcf87e76]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-dcf87e76]{display:inline-block;margin-left:6px}.ed-tip[data-v-dcf87e76]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-dcf87e76]{color:#dc2626;font-style:normal}.type-row[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-dcf87e76]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-dcf87e76]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-dcf87e76]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-dcf87e76]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-dcf87e76]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-dcf87e76]{font-size:10px;color:#94a3b8}.slot-row[data-v-dcf87e76]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-dcf87e76]{flex:1;min-width:0}.slot-arrow[data-v-dcf87e76]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-dcf87e76]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.var-row[data-v-dcf87e76],.voice-row[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mcp-grid[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.mcp-item[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;min-width:0;padding:7px 10px;border:1.5px solid #e2e8f0;border-radius:9px;font-size:12.5px;color:#475569;cursor:pointer;transition:all .15s}.mcp-item[data-v-dcf87e76]:hover{border-color:#c7d2fe;background:#f8fafc}.mcp-item.on[data-v-dcf87e76]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.ed-footer[data-v-dcf87e76]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-dcf87e76]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-dcf87e76]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-dcf87e76]{display:none}}

2
apps/admin/.output/public/_nuxt/builds/latest.json

@ -1 +1 @@
{"id":"997f9c5b-5ea7-4cda-a9d8-aeefc19242d7","timestamp":1786585621230} {"id":"12df8bde-c7e1-423a-8c26-514d561b95ec","timestamp":1786697524151}

1
apps/admin/.output/public/_nuxt/builds/meta/12df8bde-c7e1-423a-8c26-514d561b95ec.json

@ -0,0 +1 @@
{"id":"12df8bde-c7e1-423a-8c26-514d561b95ec","timestamp":1786697524151,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/builds/meta/997f9c5b-5ea7-4cda-a9d8-aeefc19242d7.json

@ -1 +0,0 @@
{"id":"997f9c5b-5ea7-4cda-a9d8-aeefc19242d7","timestamp":1786585621230,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/calltranslate.CJXjjd14.css

@ -1 +0,0 @@
.rule-list[data-v-c0bab860]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-c0bab860]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-c0bab860]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-c0bab860]:last-child{border-bottom:none}.rule-row[data-v-c0bab860]:hover{background:#f8fafc}.rule-row.off[data-v-c0bab860]{opacity:.55}.prio-cell[data-v-c0bab860]{display:flex;align-items:baseline;gap:6px}.prio[data-v-c0bab860]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-c0bab860]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-c0bab860]{min-width:0}.agent-cell[data-v-c0bab860]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-c0bab860]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-c0bab860]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-c0bab860]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-c0bab860]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-c0bab860]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-c0bab860]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-c0bab860]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-c0bab860]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-c0bab860]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-c0bab860]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-c0bab860]{color:#dc2626;font-style:normal}.any-toggle[data-v-c0bab860]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-c0bab860],.any-toggle[data-v-c0bab860]{display:flex;align-items:center;color:#64748b}.any-box[data-v-c0bab860]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-c0bab860]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-c0bab860]{min-width:0}.dir-col[data-v-c0bab860]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-c0bab860]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-c0bab860]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-c0bab860]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-c0bab860],.ed-footer[data-v-c0bab860]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-c0bab860]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-c0bab860]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-c0bab860]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-c0bab860]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-c0bab860]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-c0bab860]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-c0bab860]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-c0bab860]>:nth-child(4),.rule-row[data-v-c0bab860]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-c0bab860]{grid-template-columns:1fr}.dir-col[data-v-c0bab860]{flex-direction:row;padding-top:0}}

1
apps/admin/.output/public/_nuxt/calltranslate.blzoinPN.css

@ -0,0 +1 @@
.rule-list[data-v-0fc4ec7d]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-0fc4ec7d]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-0fc4ec7d]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-0fc4ec7d]:last-child{border-bottom:none}.rule-row[data-v-0fc4ec7d]:hover{background:#f8fafc}.rule-row.off[data-v-0fc4ec7d]{opacity:.55}.prio-cell[data-v-0fc4ec7d]{display:flex;align-items:baseline;gap:6px}.prio[data-v-0fc4ec7d]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-0fc4ec7d]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-0fc4ec7d]{min-width:0}.agent-cell[data-v-0fc4ec7d]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-0fc4ec7d]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-0fc4ec7d]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-0fc4ec7d]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-0fc4ec7d]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-0fc4ec7d]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-0fc4ec7d]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-0fc4ec7d]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-0fc4ec7d]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-0fc4ec7d]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-0fc4ec7d]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-0fc4ec7d]{color:#dc2626;font-style:normal}.any-toggle[data-v-0fc4ec7d]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-0fc4ec7d],.any-toggle[data-v-0fc4ec7d]{display:flex;align-items:center;color:#64748b}.any-box[data-v-0fc4ec7d]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-0fc4ec7d]{min-width:0}.dir-col[data-v-0fc4ec7d]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-0fc4ec7d]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-0fc4ec7d]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-0fc4ec7d]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-0fc4ec7d],.ed-footer[data-v-0fc4ec7d]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-0fc4ec7d]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-0fc4ec7d]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-0fc4ec7d]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-0fc4ec7d]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-0fc4ec7d]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-0fc4ec7d]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-0fc4ec7d]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-0fc4ec7d]>:nth-child(4),.rule-row[data-v-0fc4ec7d]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-0fc4ec7d]{grid-template-columns:1fr}.dir-col[data-v-0fc4ec7d]{flex-direction:row;padding-top:0}}

1
apps/admin/.output/public/_nuxt/channels.4kXMd4_X.css

@ -1 +0,0 @@
.group-tag[data-v-6057a5c9]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-6057a5c9]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-6057a5c9]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-6057a5c9]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-6057a5c9]{opacity:.55}.ch-empty[data-v-6057a5c9]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-6057a5c9]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-6057a5c9]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-6057a5c9]{display:flex;flex-direction:column}.ver-label[data-v-6057a5c9]{font-size:10px;color:#94a3b8}.ver-val[data-v-6057a5c9]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-6057a5c9]{color:#b45309}.ver-val.review[data-v-6057a5c9]{color:#7c3aed}.flag[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.flag-off[data-v-6057a5c9]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.pay-warn[data-v-6057a5c9]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-6057a5c9]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-6057a5c9]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-6057a5c9]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-6057a5c9]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-6057a5c9]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-6057a5c9]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-6057a5c9]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-6057a5c9]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-6057a5c9]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-6057a5c9]{color:#b45309}.ed-tip[data-v-6057a5c9],.ed-warn[data-v-6057a5c9]{font-size:11px;margin-top:8px}.ed-tip[data-v-6057a5c9]{color:#94a3b8}.req[data-v-6057a5c9]{color:#dc2626;font-style:normal}.link[data-v-6057a5c9]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-6057a5c9]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-6057a5c9]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-6057a5c9]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-6057a5c9]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-6057a5c9]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-6057a5c9]{grid-template-columns:repeat(2,1fr)}}

1
apps/admin/.output/public/_nuxt/channels.DbnY_8Am.css

@ -0,0 +1 @@
.group-tag[data-v-66a7d845]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-66a7d845]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-66a7d845]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-66a7d845]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-66a7d845]{opacity:.55}.ch-empty[data-v-66a7d845]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-66a7d845]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-66a7d845]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-66a7d845]{display:flex;flex-direction:column}.ver-label[data-v-66a7d845]{font-size:10px;color:#94a3b8}.ver-val[data-v-66a7d845]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-66a7d845]{color:#b45309}.ver-val.review[data-v-66a7d845]{color:#7c3aed}.flag[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-66a7d845]{background:#fef3c7;color:#b45309}.flag-off[data-v-66a7d845]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-66a7d845]{background:#fef3c7;color:#b45309}.pay-warn[data-v-66a7d845]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-66a7d845]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-66a7d845]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-66a7d845]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-66a7d845]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-66a7d845]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-66a7d845]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-66a7d845]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-66a7d845]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-66a7d845]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-66a7d845]{color:#b45309}.ed-tip[data-v-66a7d845],.ed-warn[data-v-66a7d845]{font-size:11px;margin-top:8px}.ed-tip[data-v-66a7d845]{color:#94a3b8}.req[data-v-66a7d845]{color:#dc2626;font-style:normal}.link[data-v-66a7d845]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-66a7d845]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-66a7d845]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-66a7d845]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-66a7d845]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-66a7d845]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-66a7d845]{grid-template-columns:repeat(2,1fr)}}

2
apps/admin/.output/public/_nuxt/entry.w5iImZWY.css → apps/admin/.output/public/_nuxt/entry.CF8jJHbs.css

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CYxZMiFx.js → apps/admin/.output/public/_nuxt/obp34o1K.js

@ -1 +1 @@
import{u as a,e as s,h as u,i as r,f as h}from"./DMxDLVSv.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u}; import{u as a,e as s,h as u,i as r,f as h}from"./DSy_gLdM.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BcKMjwDj.js → apps/admin/.output/public/_nuxt/rUi_Q6ng.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/serviceconfig.FDgyvVo4.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/serviceconfig.UIJazB1z.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/w_7nuVJ9.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C8NU4rs1.js → apps/admin/.output/public/_nuxt/yis2MfHE.js

File diff suppressed because one or more lines are too long

310
apps/admin/.output/server/chunks/build/agents-Bh_gLb1p.mjs

@ -0,0 +1,310 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderComponent } from 'vue/server-renderer';
import { u as useApi } from './useApi-BNSkSrat.mjs';
import { u as useToast } from './useToast-MBvLaNjH.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-CXXbv5NM.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { _ as _export_sfc } from './server.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const CAT_STT = 1;
const CAT_TTS = 2;
const CAT_MT = 3;
const CAT_AST = 4;
const CAT_LLM = 5;
const CAT_STS = 7;
const CAT_LLM_VISION = 9;
const CAT_MCP = 10;
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "agents",
__ssrInlineRender: true,
setup(__props) {
const AGENT_TYPES = [
{ value: "chat", label: "chat-agent 对话", icon: "💬", hint: "STT → LLM → TTS 三段拼接", color: "#b45309", bg: "#fef9c3" },
{ value: "sts-chat", label: "sts-chat-agent 端到端对话", icon: "⚡", hint: "单个 STS 服务直接完成语音对话", color: "#be185d", bg: "#fce7f3" }
];
const LEGACY_TYPES = {
translate: { label: "翻译(已下线)", icon: "🧩", color: "#64748b", bg: "#f1f5f9" },
"ast-translate": { label: "端到端翻译(已下线)", icon: "🚀", color: "#64748b", bg: "#f1f5f9" }
};
const SLOTS = {
chat: [
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" },
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cats: [CAT_LLM, CAT_LLM_VISION], color: "#b45309" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" }
],
translate: [
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" },
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cats: [CAT_MT], color: "#059669" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" }
],
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cats: [CAT_STS], color: "#be185d" }],
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cats: [CAT_AST], color: "#f97316" }]
};
function slotsOfType(t) {
return SLOTS[t] ?? [];
}
useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
const agents2 = ref([]);
const allSvcs = ref([]);
const ttsVoices = ref([]);
const modalOpen = ref(false);
const isEditing = ref(false);
const submitting = ref(false);
function emptyForm() {
return {
app_name: "",
id: "",
name: "",
type: "chat",
description: "",
avatar_url: "",
enable: true,
stt_svc_id: "",
llm_svc_id: "",
tts_svc_id: "",
mt_svc_id: "",
sts_svc_id: "",
ast_svc_id: "",
system_prompt: "",
gender: 0,
greeting_enabled: false,
greeting_text: "",
support_langs: "",
default_lang: "",
voice_map: [],
mcp_svc_ids: [],
variables: [],
sort: 0
};
}
const form = reactive(emptyForm());
const isChatType = computed(() => form.type === "chat" || form.type === "sts-chat");
const supportedLangOptions = computed(() => {
const codes = (form.support_langs || "").split(",").map((x) => x.trim()).filter(Boolean);
if (!codes.length) return LANG_OPTIONS;
return LANG_OPTIONS.filter((o) => codes.includes(o.code));
});
const bySort = (a, b) => (b.sort || 0) - (a.sort || 0) || (a.name || "").localeCompare(b.name || "");
const grouped = computed(() => {
const groups = AGENT_TYPES.map((t) => ({
...t,
type: t.value,
items: agents2.value.filter((a) => a.type === t.value).sort(bySort)
})).filter((g) => g.items.length);
for (const [type, meta] of Object.entries(LEGACY_TYPES)) {
const items = agents2.value.filter((a) => a.type === type).sort(bySort);
if (items.length) groups.push({ value: type, type, hint: "已下线的类型,仅供查看与清理", ...meta, items });
}
return groups;
});
const voiceSvcId = computed(() => form.type === "sts-chat" ? form.sts_svc_id : form.tts_svc_id);
const voiceProvider = computed(() => allSvcs.value.find((s) => s.id === voiceSvcId.value)?.provider ?? "");
const voiceTableSupported = computed(() => !!voiceProvider.value && ttsVoices.value.some((v) => v.provider === voiceProvider.value));
function voiceOptions(language, gender) {
const provider = voiceProvider.value;
if (!provider || !language) return [];
const base = (language.split("-")[0] || "").toLowerCase();
const hit = ttsVoices.value.filter((v) => {
if (v.provider !== provider) return false;
if (gender && v.gender !== gender) return false;
return v.language.toLowerCase() === language.toLowerCase();
});
if (hit.length) return hit;
return ttsVoices.value.filter((v) => {
if (v.provider !== provider) return false;
if (gender && v.gender !== gender) return false;
return (v.language.split("-")[0] || "").toLowerCase() === base;
});
}
const mcpSvcs = computed(() => svcsByCats([CAT_MCP]));
function svcCats(s) {
return (s.categories || "").split(",").map(Number);
}
function svcsByCats(cats) {
return allSvcs.value.filter((s) => s.enable && svcCats(s).some((c) => cats.includes(c)));
}
function isVisionSvc(s) {
return svcCats(s).includes(CAT_LLM_VISION);
}
function svcName(id) {
if (!id) return "未配置";
const s = allSvcs.value.find((x) => x.id === id);
return s ? s.name : id;
}
function pipelineOf(a) {
return slotsOfType(a.type).map((s) => ({ slot: s.slot, color: s.color, id: a[s.key] }));
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-dcf87e76><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-dcf87e76><div data-v-dcf87e76><h2 class="text-lg font-semibold text-slate-800" data-v-dcf87e76>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-dcf87e76> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-dcf87e76><span class="text-sm text-slate-500" data-v-dcf87e76>作用域</span><select class="select select-bordered select-sm" data-v-dcf87e76><option value="" data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-dcf87e76>+ 新建 Agent</button></div></div>`);
if (!agents2.value.length) {
_push(`<div class="text-center py-20 text-slate-300" data-v-dcf87e76><div class="text-5xl mb-3" data-v-dcf87e76>🤖</div><p class="text-sm" data-v-dcf87e76>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-dcf87e76>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(grouped.value, (g) => {
_push(`<div class="mb-6" data-v-dcf87e76><div class="flex items-center gap-2 mb-3" data-v-dcf87e76><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-dcf87e76>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-dcf87e76>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-dcf87e76>·</span><span class="text-xs text-slate-400" data-v-dcf87e76>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-dcf87e76><!--[-->`);
ssrRenderList(g.items, (a) => {
_push(`<div class="agent-card" data-v-dcf87e76><div class="flex items-start justify-between gap-2" data-v-dcf87e76><div class="min-w-0" data-v-dcf87e76><div class="font-semibold text-sm text-slate-800 truncate" data-v-dcf87e76>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-dcf87e76>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-dcf87e76>`);
if (a.enable) {
_push(`<span class="badge badge-success badge-xs" data-v-dcf87e76>启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-xs" data-v-dcf87e76>停用</span>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div></div>`);
if (a.description) {
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-dcf87e76>${ssrInterpolate(a.description)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-dcf87e76><!--[-->`);
ssrRenderList(pipelineOf(a), (s) => {
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-dcf87e76>${ssrInterpolate(s.slot)}: ${ssrInterpolate(svcName(s.id))}</span>`);
});
_push(`<!--]--></div>`);
if (a.support_langs) {
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-dcf87e76> 支持语言:${ssrInterpolate(a.support_langs)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]--><div class="ag-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-dcf87e76><div class="ag-box" data-v-dcf87e76><div class="flex items-center justify-between mb-4" data-v-dcf87e76><div class="flex items-center gap-3" data-v-dcf87e76><h3 class="text-base font-semibold text-slate-800" data-v-dcf87e76>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-dcf87e76>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-dcf87e76>✕ 关闭</button></div><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>类型</div><div class="type-row" data-v-dcf87e76><!--[-->`);
ssrRenderList(AGENT_TYPES, (t) => {
_push(`<button type="button" class="${ssrRenderClass([{ on: form.type === t.value, locked: isEditing.value && form.type !== t.value }, "ttab"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} data-v-dcf87e76><span class="ttab-title" data-v-dcf87e76>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-dcf87e76>${ssrInterpolate(t.hint)}</span></button>`);
});
_push(`<!--]--></div>`);
if (isEditing.value) {
_push(`<p class="ed-tip" data-v-dcf87e76>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`);
} else {
_push(`<!---->`);
}
_push(`</section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>Agent ID <i class="req" data-v-dcf87e76>*</i></span><input${ssrRenderAttr("value", form.id)}${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="如 trans-cn-en(作用域内唯一,创建后不可改)" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>名称 <i class="req" data-v-dcf87e76>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-dcf87e76></div></div><div class="mt-3" data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-dcf87e76></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-dcf87e76><option${ssrRenderAttr("value", 0)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 2) : ssrLooseEqual(form.gender, 2)) ? " selected" : ""}>女</option></select></div></div></section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>服务编排</div><div class="slot-row" data-v-dcf87e76><!--[-->`);
ssrRenderList(slotsOfType(form.type), (s, i) => {
_push(`<!--[--><div class="slot-item" data-v-dcf87e76><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-dcf87e76>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-dcf87e76>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-dcf87e76><option value="" disabled data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCats(s.cats).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`);
ssrRenderList(svcsByCats(s.cats), (v) => {
_push(`<option${ssrRenderAttr("value", v.id)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}${ssrInterpolate(isVisionSvc(v) ? " 🖼" : "")}</option>`);
});
_push(`<!--]--></select></div>`);
if (i < slotsOfType(form.type).length - 1) {
_push(`<span class="slot-arrow" data-v-dcf87e76>→</span>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
});
_push(`<!--]--></div></section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>支持语言(多选)</span>`);
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: form.support_langs,
"onUpdate:modelValue": ($event) => form.support_langs = $event,
multiple: ""
}, null, _parent));
_push(`</div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>默认语言</span>`);
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: form.default_lang,
"onUpdate:modelValue": ($event) => form.default_lang = $event,
options: supportedLangOptions.value
}, null, _parent));
_push(`</div></div><div class="mt-3" data-v-dcf87e76><div class="flex items-center justify-between mb-1" data-v-dcf87e76><span class="ed-label mb-0" data-v-dcf87e76>音色(按语言+性别配,Agent 切语言时自动换音色)</span><div class="flex gap-1" data-v-dcf87e76><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(!voiceTableSupported.value) ? " disabled" : ""} data-v-dcf87e76>按支持语言补全</button><button class="btn btn-ghost btn-xs" data-v-dcf87e76>+ 添加一行</button></div></div><p class="ed-tip mb-1" data-v-dcf87e76>`);
if (!voiceSvcId.value) {
_push(`<!--[-->先在上方选好语音服务,这里才能列出可用音色。<!--]-->`);
} else if (voiceTableSupported.value) {
_push(`<!--[--> 候选来自内置音色表(${ssrInterpolate(voiceProvider.value)});同一语言+性别有多个时默认第一个,可在下拉里换。没配到的语言走服务商默认音色。 <!--]-->`);
} else {
_push(`<!--[-->「${ssrInterpolate(voiceProvider.value || "该服务商")}」不在内置音色表里,请手填服务商的音色 id。<!--]-->`);
}
_push(`</p>`);
if (!form.voice_map.length) {
_push(`<div class="text-xs text-slate-300 py-2" data-v-dcf87e76>未设置,全部走服务商默认音色</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(form.voice_map, (v, i) => {
_push(`<div class="voice-row" data-v-dcf87e76><select class="select select-bordered select-xs" data-v-dcf87e76><option value="" data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, "") : ssrLooseEqual(v.language, "")) ? " selected" : ""}>(语言)</option><!--[-->`);
ssrRenderList(supportedLangOptions.value, (o) => {
_push(`<option${ssrRenderAttr("value", o.code)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, o.code) : ssrLooseEqual(v.language, o.code)) ? " selected" : ""}>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-xs" data-v-dcf87e76><option${ssrRenderAttr("value", 0)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 2) : ssrLooseEqual(v.gender, 2)) ? " selected" : ""}>女</option></select>`);
if (voiceTableSupported.value && voiceOptions(v.language, v.gender).length) {
_push(`<select class="select select-bordered select-xs flex-1" data-v-dcf87e76><!--[-->`);
ssrRenderList(voiceOptions(v.language, v.gender), (o, oi) => {
_push(`<option${ssrRenderAttr("value", o.voice_id)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.voice) ? ssrLooseContain(v.voice, o.voice_id) : ssrLooseEqual(v.voice, o.voice_id)) ? " selected" : ""}>${ssrInterpolate(o.name)} · ${ssrInterpolate(o.voice_id)}${ssrInterpolate(oi === 0 ? "(默认)" : "")}</option>`);
});
_push(`<!--]--></select>`);
} else {
_push(`<input${ssrRenderAttr("value", v.voice)} class="input input-bordered input-xs flex-1" placeholder="音色 id,如 zh-CN-XiaoxiaoNeural" data-v-dcf87e76>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div>`);
});
_push(`<!--]--></div></section>`);
if (isChatType.value) {
_push(`<section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>对话设定</div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-dcf87e76>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-dcf87e76><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-dcf87e76><input${ssrIncludeBooleanAttr(Array.isArray(form.greeting_enabled) ? ssrLooseContain(form.greeting_enabled, null) : form.greeting_enabled) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-dcf87e76><span data-v-dcf87e76>开场白</span></label>`);
if (form.greeting_enabled) {
_push(`<input${ssrRenderAttr("value", form.greeting_text)} class="input input-bordered input-sm w-full mt-2" placeholder="接通后先说的一句话" data-v-dcf87e76>`);
} else {
_push(`<!---->`);
}
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
_push(`<section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>MCP 服务(可选,给 Agent 挂工具)</div>`);
if (!mcpSvcs.value.length) {
_push(`<p class="ed-tip" data-v-dcf87e76>还没有启用的 MCP 服务,先去「第三方服务配置 → MCP 服务」添加。</p>`);
} else {
_push(`<div class="mcp-grid" data-v-dcf87e76><!--[-->`);
ssrRenderList(mcpSvcs.value, (m) => {
_push(`<label class="${ssrRenderClass([{ on: form.mcp_svc_ids.includes(m.id) }, "mcp-item"])}" data-v-dcf87e76><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(form.mcp_svc_ids.includes(m.id)) ? " checked" : ""} data-v-dcf87e76><span class="min-w-0" data-v-dcf87e76><span class="block truncate" data-v-dcf87e76>${ssrInterpolate(m.name)}</span><span class="block truncate text-[10px] text-slate-400 font-mono" data-v-dcf87e76>${ssrInterpolate(m.id)}</span></span></label>`);
});
_push(`<!--]--></div>`);
}
_push(`</section><section class="ed-section" data-v-dcf87e76><div class="flex items-center justify-between mb-1" data-v-dcf87e76><div class="ed-section-title mb-0" data-v-dcf87e76>变量(提示词/开场白里用 {{key}} 占位)</div><button class="btn btn-ghost btn-xs" data-v-dcf87e76>+ 添加变量</button></div>`);
if (!form.variables.length) {
_push(`<div class="text-xs text-slate-300 py-2" data-v-dcf87e76>未定义变量</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(form.variables, (v, i) => {
_push(`<div class="var-row" data-v-dcf87e76><input${ssrRenderAttr("value", v.key)} class="input input-bordered input-xs" placeholder="key" data-v-dcf87e76><input${ssrRenderAttr("value", v.label)} class="input input-bordered input-xs" placeholder="展示名" data-v-dcf87e76><input${ssrRenderAttr("value", v.def_value)} class="input input-bordered input-xs flex-1" placeholder="默认值(客户端没传时用它)" data-v-dcf87e76><button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div>`);
});
_push(`<!--]--></section><div class="ed-footer" data-v-dcf87e76><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-dcf87e76><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-dcf87e76><span data-v-dcf87e76>启用</span></label><div class="flex gap-2" data-v-dcf87e76><button class="btn btn-ghost btn-sm" data-v-dcf87e76>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-dcf87e76>保存</button></div></div></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/agents.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const agents = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-dcf87e76"]]);
export { agents as default };
//# sourceMappingURL=agents-Bh_gLb1p.mjs.map

1
apps/admin/.output/server/chunks/build/agents-Bh_gLb1p.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"agents-Bh_gLb1p.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-Bh_gLb1p.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

240
apps/admin/.output/server/chunks/build/agents-DbiFqwig.mjs

@ -1,240 +0,0 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderComponent } from 'vue/server-renderer';
import { u as useApi } from './useApi-BNSkSrat.mjs';
import { u as useToast } from './useToast-MBvLaNjH.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-CXXbv5NM.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { _ as _export_sfc } from './server.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const CAT_STT = 1;
const CAT_TTS = 2;
const CAT_MT = 3;
const CAT_AST = 4;
const CAT_LLM = 5;
const CAT_STS = 7;
const CAT_LLM_VISION = 9;
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "agents",
__ssrInlineRender: true,
setup(__props) {
const AGENT_TYPES = [
{ value: "chat", label: "对话", icon: "💬", hint: "STT → LLM → TTS 三段拼接", color: "#b45309", bg: "#fef9c3" },
{ value: "translate", label: "翻译", icon: "🧩", hint: "STT → MT → TTS 三段拼接", color: "#059669", bg: "#dcfce7" },
{ value: "sts-chat", label: "端到端对话", icon: "⚡", hint: "单个 STS 服务直接完成语音对话", color: "#be185d", bg: "#fce7f3" },
{ value: "ast-translate", label: "端到端翻译", icon: "🚀", hint: "单个 AST 服务直接完成语音翻译", color: "#c2410c", bg: "#fff7ed" }
];
const SLOTS = {
chat: [
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" },
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cats: [CAT_LLM, CAT_LLM_VISION], color: "#b45309" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" }
],
translate: [
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" },
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cats: [CAT_MT], color: "#059669" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" }
],
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cats: [CAT_STS], color: "#be185d" }],
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cats: [CAT_AST], color: "#f97316" }]
};
function slotsOfType(t) {
return SLOTS[t] ?? [];
}
useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
const agents2 = ref([]);
const allSvcs = ref([]);
const modalOpen = ref(false);
const isEditing = ref(false);
const submitting = ref(false);
function emptyForm() {
return {
app_name: "",
id: "",
name: "",
type: "translate",
description: "",
avatar_url: "",
enable: true,
stt_svc_id: "",
llm_svc_id: "",
tts_svc_id: "",
mt_svc_id: "",
sts_svc_id: "",
ast_svc_id: "",
system_prompt: "",
gender: 0,
greeting_enabled: false,
greeting_text: "",
support_langs: "",
default_lang: "",
voice_map: [],
sort: 0
};
}
const form = reactive(emptyForm());
const isChatType = computed(() => form.type === "chat" || form.type === "sts-chat");
const supportedLangOptions = computed(() => {
const codes = (form.support_langs || "").split(",").map((x) => x.trim()).filter(Boolean);
if (!codes.length) return LANG_OPTIONS;
return LANG_OPTIONS.filter((o) => codes.includes(o.code));
});
const grouped = computed(
() => AGENT_TYPES.map((t) => ({
...t,
type: t.value,
items: agents2.value.filter((a) => a.type === t.value).sort((a, b) => (b.sort || 0) - (a.sort || 0) || (a.name || "").localeCompare(b.name || ""))
})).filter((g) => g.items.length)
);
function svcCats(s) {
return (s.categories || "").split(",").map(Number);
}
function svcsByCats(cats) {
return allSvcs.value.filter((s) => s.enable && svcCats(s).some((c) => cats.includes(c)));
}
function isVisionSvc(s) {
return svcCats(s).includes(CAT_LLM_VISION);
}
function svcName(id) {
if (!id) return "未配置";
const s = allSvcs.value.find((x) => x.id === id);
return s ? s.name : id;
}
function pipelineOf(a) {
return slotsOfType(a.type).map((s) => ({ slot: s.slot, color: s.color, id: a[s.key] }));
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-4a81d81a><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-4a81d81a><div data-v-4a81d81a><h2 class="text-lg font-semibold text-slate-800" data-v-4a81d81a>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-4a81d81a> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-4a81d81a><span class="text-sm text-slate-500" data-v-4a81d81a>作用域</span><select class="select select-bordered select-sm" data-v-4a81d81a><option value="" data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-4a81d81a>+ 新建 Agent</button></div></div>`);
if (!agents2.value.length) {
_push(`<div class="text-center py-20 text-slate-300" data-v-4a81d81a><div class="text-5xl mb-3" data-v-4a81d81a>🤖</div><p class="text-sm" data-v-4a81d81a>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-4a81d81a>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(grouped.value, (g) => {
_push(`<div class="mb-6" data-v-4a81d81a><div class="flex items-center gap-2 mb-3" data-v-4a81d81a><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-4a81d81a>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-4a81d81a>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-4a81d81a>·</span><span class="text-xs text-slate-400" data-v-4a81d81a>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-4a81d81a><!--[-->`);
ssrRenderList(g.items, (a) => {
_push(`<div class="agent-card" data-v-4a81d81a><div class="flex items-start justify-between gap-2" data-v-4a81d81a><div class="min-w-0" data-v-4a81d81a><div class="font-semibold text-sm text-slate-800 truncate" data-v-4a81d81a>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-4a81d81a>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-4a81d81a>`);
if (a.enable) {
_push(`<span class="badge badge-success badge-xs" data-v-4a81d81a>启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-xs" data-v-4a81d81a>停用</span>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-4a81d81a>删除</button></div></div>`);
if (a.description) {
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-4a81d81a>${ssrInterpolate(a.description)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-4a81d81a><!--[-->`);
ssrRenderList(pipelineOf(a), (s) => {
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-4a81d81a>${ssrInterpolate(s.slot)}: ${ssrInterpolate(svcName(s.id))}</span>`);
});
_push(`<!--]--></div>`);
if (a.support_langs) {
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-4a81d81a> 支持语言:${ssrInterpolate(a.support_langs)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]--><div class="ag-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-4a81d81a><div class="ag-box" data-v-4a81d81a><div class="flex items-center justify-between mb-4" data-v-4a81d81a><div class="flex items-center gap-3" data-v-4a81d81a><h3 class="text-base font-semibold text-slate-800" data-v-4a81d81a>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-4a81d81a>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-4a81d81a>✕ 关闭</button></div><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>类型</div><div class="type-row" data-v-4a81d81a><!--[-->`);
ssrRenderList(AGENT_TYPES, (t) => {
_push(`<button type="button" class="${ssrRenderClass([{ on: form.type === t.value, locked: isEditing.value && form.type !== t.value }, "ttab"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} data-v-4a81d81a><span class="ttab-title" data-v-4a81d81a>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-4a81d81a>${ssrInterpolate(t.hint)}</span></button>`);
});
_push(`<!--]--></div>`);
if (isEditing.value) {
_push(`<p class="ed-tip" data-v-4a81d81a>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`);
} else {
_push(`<!---->`);
}
_push(`</section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>Agent ID <i class="req" data-v-4a81d81a>*</i></span><input${ssrRenderAttr("value", form.id)}${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="如 trans-cn-en(作用域内唯一,创建后不可改)" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>名称 <i class="req" data-v-4a81d81a>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-4a81d81a></div></div><div class="mt-3" data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-4a81d81a></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-4a81d81a><option${ssrRenderAttr("value", 0)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 2) : ssrLooseEqual(form.gender, 2)) ? " selected" : ""}>女</option></select></div></div></section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>服务编排</div><div class="slot-row" data-v-4a81d81a><!--[-->`);
ssrRenderList(slotsOfType(form.type), (s, i) => {
_push(`<!--[--><div class="slot-item" data-v-4a81d81a><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-4a81d81a>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-4a81d81a>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-4a81d81a><option value="" disabled data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCats(s.cats).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`);
ssrRenderList(svcsByCats(s.cats), (v) => {
_push(`<option${ssrRenderAttr("value", v.id)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}${ssrInterpolate(isVisionSvc(v) ? " 🖼" : "")}</option>`);
});
_push(`<!--]--></select></div>`);
if (i < slotsOfType(form.type).length - 1) {
_push(`<span class="slot-arrow" data-v-4a81d81a>→</span>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
});
_push(`<!--]--></div></section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>支持语言(多选)</span>`);
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: form.support_langs,
"onUpdate:modelValue": ($event) => form.support_langs = $event,
multiple: ""
}, null, _parent));
_push(`</div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>默认语言</span>`);
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: form.default_lang,
"onUpdate:modelValue": ($event) => form.default_lang = $event,
options: supportedLangOptions.value
}, null, _parent));
_push(`</div></div><div class="mt-3" data-v-4a81d81a><div class="flex items-center justify-between mb-1" data-v-4a81d81a><span class="ed-label mb-0" data-v-4a81d81a>音色覆盖(不填则用 TTS 服务自带默认音色)</span><button class="btn btn-ghost btn-xs" data-v-4a81d81a>+ 添加一行</button></div>`);
if (!form.voice_map.length) {
_push(`<div class="text-xs text-slate-300 py-2" data-v-4a81d81a>未设置音色覆盖</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(form.voice_map, (v, i) => {
_push(`<div class="voice-row" data-v-4a81d81a><select class="select select-bordered select-xs" data-v-4a81d81a><option value="" data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, "") : ssrLooseEqual(v.language, "")) ? " selected" : ""}>(语言)</option><!--[-->`);
ssrRenderList(supportedLangOptions.value, (o) => {
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, o.code) : ssrLooseEqual(v.language, o.code)) ? " selected" : ""}>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-xs" data-v-4a81d81a><option${ssrRenderAttr("value", 0)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 2) : ssrLooseEqual(v.gender, 2)) ? " selected" : ""}>女</option></select><input${ssrRenderAttr("value", v.voice)} class="input input-bordered input-xs flex-1" placeholder="音色名,如 zh-CN-XiaoxiaoNeural" data-v-4a81d81a><button class="btn btn-ghost btn-xs text-error" data-v-4a81d81a>删除</button></div>`);
});
_push(`<!--]--></div></section>`);
if (isChatType.value) {
_push(`<section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>对话设定</div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-4a81d81a>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-4a81d81a><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-4a81d81a><input${ssrIncludeBooleanAttr(Array.isArray(form.greeting_enabled) ? ssrLooseContain(form.greeting_enabled, null) : form.greeting_enabled) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-4a81d81a><span data-v-4a81d81a>开场白</span></label>`);
if (form.greeting_enabled) {
_push(`<input${ssrRenderAttr("value", form.greeting_text)} class="input input-bordered input-sm w-full mt-2" placeholder="接通后先说的一句话" data-v-4a81d81a>`);
} else {
_push(`<!---->`);
}
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
_push(`<div class="ed-footer" data-v-4a81d81a><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-4a81d81a><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-4a81d81a><span data-v-4a81d81a>启用</span></label><div class="flex gap-2" data-v-4a81d81a><button class="btn btn-ghost btn-sm" data-v-4a81d81a>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-4a81d81a>保存</button></div></div></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/agents.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const agents = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4a81d81a"]]);
export { agents as default };
//# sourceMappingURL=agents-DbiFqwig.mjs.map

1
apps/admin/.output/server/chunks/build/agents-DbiFqwig.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"agents-DbiFqwig.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-DbiFqwig.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/agents-styles.CKxmVBlz.mjs

@ -0,0 +1,8 @@
const agents_vue_vue_type_style_index_0_scoped_dcf87e76_lang = ".type-tag[data-v-dcf87e76]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-dcf87e76]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-dcf87e76]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-dcf87e76]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-dcf87e76]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-dcf87e76]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-dcf87e76]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-dcf87e76]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-dcf87e76]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-dcf87e76]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-dcf87e76]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-dcf87e76]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-dcf87e76]{display:inline-block;margin-left:6px}.ed-tip[data-v-dcf87e76]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-dcf87e76]{color:#dc2626;font-style:normal}.type-row[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-dcf87e76]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-dcf87e76]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-dcf87e76]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-dcf87e76]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-dcf87e76]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-dcf87e76]{font-size:10px;color:#94a3b8}.slot-row[data-v-dcf87e76]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-dcf87e76]{flex:1;min-width:0}.slot-arrow[data-v-dcf87e76]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-dcf87e76]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.var-row[data-v-dcf87e76],.voice-row[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mcp-grid[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.mcp-item[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;min-width:0;padding:7px 10px;border:1.5px solid #e2e8f0;border-radius:9px;font-size:12.5px;color:#475569;cursor:pointer;transition:all .15s}.mcp-item[data-v-dcf87e76]:hover{border-color:#c7d2fe;background:#f8fafc}.mcp-item.on[data-v-dcf87e76]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.ed-footer[data-v-dcf87e76]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-dcf87e76]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-dcf87e76]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-dcf87e76]{display:none}}";
const agentsStyles_CKxmVBlz = [
agents_vue_vue_type_style_index_0_scoped_dcf87e76_lang
];
export { agentsStyles_CKxmVBlz as default };
//# sourceMappingURL=agents-styles.CKxmVBlz.mjs.map

1
apps/admin/.output/server/chunks/build/agents-styles.CKxmVBlz.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"agents-styles.CKxmVBlz.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles-1.mjs-C8pM4_Q2.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles.CKxmVBlz.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/agents-styles.GXWAwNko.mjs

@ -1,8 +0,0 @@
const agents_vue_vue_type_style_index_0_scoped_4a81d81a_lang = ".type-tag[data-v-4a81d81a]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-4a81d81a]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-4a81d81a]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-4a81d81a]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-4a81d81a]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-4a81d81a]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-4a81d81a]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-4a81d81a]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-4a81d81a]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-4a81d81a]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-4a81d81a]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-4a81d81a]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-4a81d81a]{display:inline-block;margin-left:6px}.ed-tip[data-v-4a81d81a]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-4a81d81a]{color:#dc2626;font-style:normal}.type-row[data-v-4a81d81a]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-4a81d81a]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-4a81d81a]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-4a81d81a]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-4a81d81a]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-4a81d81a]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-4a81d81a]{font-size:10px;color:#94a3b8}.slot-row[data-v-4a81d81a]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-4a81d81a]{flex:1;min-width:0}.slot-arrow[data-v-4a81d81a]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-4a81d81a]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-4a81d81a]{gap:8px;margin-bottom:6px}.ed-footer[data-v-4a81d81a],.voice-row[data-v-4a81d81a]{display:flex;align-items:center}.ed-footer[data-v-4a81d81a]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-4a81d81a]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-4a81d81a]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-4a81d81a]{display:none}}";
const agentsStyles_GXWAwNko = [
agents_vue_vue_type_style_index_0_scoped_4a81d81a_lang
];
export { agentsStyles_GXWAwNko as default };
//# sourceMappingURL=agents-styles.GXWAwNko.mjs.map

1
apps/admin/.output/server/chunks/build/agents-styles.GXWAwNko.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"agents-styles.GXWAwNko.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles-1.mjs-BzkXHx2D.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles.GXWAwNko.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

1
apps/admin/.output/server/chunks/build/calltranslate-BllxIxWZ.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"calltranslate-BllxIxWZ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-BllxIxWZ.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

78
apps/admin/.output/server/chunks/build/calltranslate-BllxIxWZ.mjs → apps/admin/.output/server/chunks/build/calltranslate-Typ2E2m-.mjs

@ -128,17 +128,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const testDst = ref("en-US"); const testDst = ref("en-US");
const testResult = ref(null); const testResult = ref(null);
return (_ctx, _push, _parent, _attrs) => { return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-c0bab860><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-c0bab860><div data-v-c0bab860><h2 class="text-lg font-semibold text-slate-800" data-v-c0bab860>通话翻译规则</h2><p class="text-xs text-slate-400 mt-1" data-v-c0bab860> 一条规则覆盖「多源语言 × 多目标语言」,命中后走它指定的 Agent。多条规则按优先级从高到低匹配,第一条命中的生效。 </p></div><div class="flex items-center gap-3 flex-wrap" data-v-c0bab860><span class="text-sm text-slate-500" data-v-c0bab860>作用域</span><select class="select select-bordered select-sm" data-v-c0bab860><option value="" data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); _push(`<div${ssrRenderAttrs(_attrs)} data-v-0fc4ec7d><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-0fc4ec7d><div data-v-0fc4ec7d><h2 class="text-lg font-semibold text-slate-800" data-v-0fc4ec7d>通话翻译规则</h2><p class="text-xs text-slate-400 mt-1" data-v-0fc4ec7d> 一条规则覆盖「多源语言 × 多目标语言」,命中后走它指定的 Agent。多条规则按优先级从高到低匹配,第一条命中的生效。 </p></div><div class="flex items-center gap-3 flex-wrap" data-v-0fc4ec7d><span class="text-sm text-slate-500" data-v-0fc4ec7d>作用域</span><select class="select select-bordered select-sm" data-v-0fc4ec7d><option value="" data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => { ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`); _push(`<option${ssrRenderAttr("value", a)} data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`);
}); });
_push(`<!--]--></select><span class="text-sm text-slate-500" data-v-c0bab860>区域</span><select class="select select-bordered select-sm" data-v-c0bab860><!--[-->`); _push(`<!--]--></select><span class="text-sm text-slate-500" data-v-0fc4ec7d>区域</span><select class="select select-bordered select-sm" data-v-0fc4ec7d><!--[-->`);
ssrRenderList(REGIONS, (r) => { ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); _push(`<option${ssrRenderAttr("value", r.value)} data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
}); });
_push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-c0bab860>🔍 选路试算</button><button class="btn btn-primary btn-sm text-white" data-v-c0bab860>+ 新增规则</button></div></div><div class="editor-panel" style="${ssrRenderStyle(editorOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="flex items-center justify-between mb-5" data-v-c0bab860><div class="flex items-center gap-3" data-v-c0bab860><h3 class="font-semibold text-slate-800 text-sm" data-v-c0bab860>${ssrInterpolate(editing.value ? "编辑规则" : "新增规则")}</h3><span class="region-chip" data-v-c0bab860>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-c0bab860>✕ 关闭</button></div><section class="ed-section" data-v-c0bab860><div class="ed-section-title" data-v-c0bab860>匹配条件</div><div class="lang-row" data-v-c0bab860><div class="lang-field" data-v-c0bab860><div class="flex items-center justify-between" data-v-c0bab860><span class="ed-label" data-v-c0bab860>源语言</span><label class="any-toggle" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.srcAny) ? " checked" : ""} data-v-c0bab860> 任意语言 </label></div>`); _push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-0fc4ec7d>🔍 选路试算</button><button class="btn btn-primary btn-sm text-white" data-v-0fc4ec7d>+ 新增规则</button></div></div><div class="editor-panel" style="${ssrRenderStyle(editorOpen.value ? null : { display: "none" })}" data-v-0fc4ec7d><div class="flex items-center justify-between mb-5" data-v-0fc4ec7d><div class="flex items-center gap-3" data-v-0fc4ec7d><h3 class="font-semibold text-slate-800 text-sm" data-v-0fc4ec7d>${ssrInterpolate(editing.value ? "编辑规则" : "新增规则")}</h3><span class="region-chip" data-v-0fc4ec7d>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-0fc4ec7d>✕ 关闭</button></div><section class="ed-section" data-v-0fc4ec7d><div class="ed-section-title" data-v-0fc4ec7d>匹配条件</div><div class="lang-row" data-v-0fc4ec7d><div class="lang-field" data-v-0fc4ec7d><div class="flex items-center justify-between" data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>源语言</span><label class="any-toggle" data-v-0fc4ec7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.srcAny) ? " checked" : ""} data-v-0fc4ec7d> 任意语言 </label></div>`);
if (ed.srcAny) { if (ed.srcAny) {
_push(`<div class="any-box" data-v-c0bab860>任意源语言</div>`); _push(`<div class="any-box" data-v-0fc4ec7d>任意源语言</div>`);
} else { } else {
_push(ssrRenderComponent(__nuxt_component_0, { _push(ssrRenderComponent(__nuxt_component_0, {
modelValue: ed.srcLangs, modelValue: ed.srcLangs,
@ -146,9 +146,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
multiple: "" multiple: ""
}, null, _parent)); }, null, _parent));
} }
_push(`</div><div class="dir-col" data-v-c0bab860><button type="button" class="${ssrRenderClass([{ on: ed.bidir }, "dir-btn"])}"${ssrRenderAttr("title", ed.bidir ? "点击改为单向" : "点击改为双向(反向也走这条规则)")} data-v-c0bab860>${ssrInterpolate(ed.bidir ? "⇄" : "→")}</button><span class="dir-tip" data-v-c0bab860>${ssrInterpolate(ed.bidir ? "双向互译" : "单向翻译")}</span></div><div class="lang-field" data-v-c0bab860><div class="flex items-center justify-between" data-v-c0bab860><span class="ed-label" data-v-c0bab860>目标语言</span><label class="any-toggle" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.dstAny) ? " checked" : ""} data-v-c0bab860> 任意语言 </label></div>`); _push(`</div><div class="dir-col" data-v-0fc4ec7d><button type="button" class="${ssrRenderClass([{ on: ed.bidir }, "dir-btn"])}"${ssrRenderAttr("title", ed.bidir ? "点击改为单向" : "点击改为双向(反向也走这条规则)")} data-v-0fc4ec7d>${ssrInterpolate(ed.bidir ? "⇄" : "→")}</button><span class="dir-tip" data-v-0fc4ec7d>${ssrInterpolate(ed.bidir ? "双向互译" : "单向翻译")}</span></div><div class="lang-field" data-v-0fc4ec7d><div class="flex items-center justify-between" data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>目标语言</span><label class="any-toggle" data-v-0fc4ec7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.dstAny) ? " checked" : ""} data-v-0fc4ec7d> 任意语言 </label></div>`);
if (ed.dstAny) { if (ed.dstAny) {
_push(`<div class="any-box" data-v-c0bab860>任意目标语言</div>`); _push(`<div class="any-box" data-v-0fc4ec7d>任意目标语言</div>`);
} else { } else {
_push(ssrRenderComponent(__nuxt_component_0, { _push(ssrRenderComponent(__nuxt_component_0, {
modelValue: ed.dstLangs, modelValue: ed.dstLangs,
@ -156,28 +156,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
multiple: "" multiple: ""
}, null, _parent)); }, null, _parent));
} }
_push(`</div></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>生效区域</span><select class="select select-bordered select-sm w-full" data-v-c0bab860><option${ssrRenderAttr("value", 0)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, 0) : ssrLooseEqual(ed.region, 0)) ? " selected" : ""}>全部区域(兜底)</option><!--[-->`); _push(`</div></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-0fc4ec7d><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>生效区域</span><select class="select select-bordered select-sm w-full" data-v-0fc4ec7d><option${ssrRenderAttr("value", 0)} data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, 0) : ssrLooseEqual(ed.region, 0)) ? " selected" : ""}>全部区域(兜底)</option><!--[-->`);
ssrRenderList(REGIONS, (r) => { ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, r.value) : ssrLooseEqual(ed.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); _push(`<option${ssrRenderAttr("value", r.value)} data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, r.value) : ssrLooseEqual(ed.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
}); });
_push(`<!--]--></select></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>优先级(越大越先匹配)</span><input${ssrRenderAttr("value", ed.priority)} type="number" class="input input-bordered input-sm w-full" data-v-c0bab860></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>规则名(便于识别)</span><input${ssrRenderAttr("value", ed.name)} class="input input-bordered input-sm w-full" placeholder="如 中日韩端到端" data-v-c0bab860></div></div></section><section class="ed-section" data-v-c0bab860><div class="ed-section-title" data-v-c0bab860>命中后使用的 Agent</div><div class="grid grid-cols-2 gap-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>翻译 Agent <i class="req" data-v-c0bab860>*</i></span><select class="select select-bordered select-sm w-full" data-v-c0bab860><option value="" disabled data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, "") : ssrLooseEqual(ed.agentId, "")) ? " selected" : ""}>${ssrInterpolate(transAgents.value.length ? "请选择 Agent" : "(无可用 Agent,请先去 Agent 配置里创建)")}</option><!--[-->`); _push(`<!--]--></select></div><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>优先级(越大越先匹配)</span><input${ssrRenderAttr("value", ed.priority)} type="number" class="input input-bordered input-sm w-full" data-v-0fc4ec7d></div><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>规则名(便于识别)</span><input${ssrRenderAttr("value", ed.name)} class="input input-bordered input-sm w-full" placeholder="如 中日韩端到端" data-v-0fc4ec7d></div></div></section><section class="ed-section" data-v-0fc4ec7d><div class="ed-section-title" data-v-0fc4ec7d>命中后使用的 Agent</div><div class="grid grid-cols-2 gap-3" data-v-0fc4ec7d><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>翻译 Agent <i class="req" data-v-0fc4ec7d>*</i></span><select class="select select-bordered select-sm w-full" data-v-0fc4ec7d><option value="" disabled data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, "") : ssrLooseEqual(ed.agentId, "")) ? " selected" : ""}>${ssrInterpolate(transAgents.value.length ? "请选择 Agent" : "(无可用 Agent,请先去 Agent 配置里创建)")}</option><!--[-->`);
ssrRenderList(agentGroups.value, (g) => { ssrRenderList(agentGroups.value, (g) => {
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-c0bab860><!--[-->`); _push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-0fc4ec7d><!--[-->`);
ssrRenderList(g.items, (a) => { ssrRenderList(g.items, (a) => {
_push(`<option${ssrRenderAttr("value", a.id)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, a.id) : ssrLooseEqual(ed.agentId, a.id)) ? " selected" : ""}>${ssrInterpolate(a.name || a.id)}</option>`); _push(`<option${ssrRenderAttr("value", a.id)} data-v-0fc4ec7d${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, a.id) : ssrLooseEqual(ed.agentId, a.id)) ? " selected" : ""}>${ssrInterpolate(a.name || a.id)}</option>`);
}); });
_push(`<!--]--></optgroup>`); _push(`<!--]--></optgroup>`);
}); });
_push(`<!--]--></select></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>备注</span><input${ssrRenderAttr("value", ed.remark)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-c0bab860></div></div>`); _push(`<!--]--></select></div><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>备注</span><input${ssrRenderAttr("value", ed.remark)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-0fc4ec7d></div></div>`);
if (curAgent.value) { if (curAgent.value) {
_push(`<div class="agent-preview" data-v-c0bab860><span class="type-badge" style="${ssrRenderStyle(typeStyle(curAgent.value.type))}" data-v-c0bab860>${ssrInterpolate(typeLabel(curAgent.value.type))}</span><span class="text-xs text-slate-500" data-v-c0bab860>${ssrInterpolate(curAgent.value.description || "(无描述)")}</span>`); _push(`<div class="agent-preview" data-v-0fc4ec7d><span class="type-badge" style="${ssrRenderStyle(typeStyle(curAgent.value.type))}" data-v-0fc4ec7d>${ssrInterpolate(typeLabel(curAgent.value.type))}</span><span class="text-xs text-slate-500" data-v-0fc4ec7d>${ssrInterpolate(curAgent.value.description || "(无描述)")}</span>`);
if (curAgent.value.support_langs) { if (curAgent.value.support_langs) {
_push(`<span class="text-[11px] text-slate-400" data-v-c0bab860>支持:${ssrInterpolate(curAgent.value.support_langs)}</span>`); _push(`<span class="text-[11px] text-slate-400" data-v-0fc4ec7d>支持:${ssrInterpolate(curAgent.value.support_langs)}</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (!curAgent.value.enable) { if (!curAgent.value.enable) {
_push(`<span class="text-[11px] text-amber-600" data-v-c0bab860>⚠ 该 Agent 当前为停用状态</span>`); _push(`<span class="text-[11px] text-amber-600" data-v-0fc4ec7d>⚠ 该 Agent 当前为停用状态</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
@ -186,21 +186,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
_push(`<!---->`); _push(`<!---->`);
} }
if (langWarn.value) { if (langWarn.value) {
_push(`<p class="ed-warn" data-v-c0bab860>⚠ ${ssrInterpolate(langWarn.value)}</p>`); _push(`<p class="ed-warn" data-v-0fc4ec7d>⚠ ${ssrInterpolate(langWarn.value)}</p>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</section><div class="ed-footer" data-v-c0bab860><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-c0bab860><input${ssrIncludeBooleanAttr(Array.isArray(ed.enable) ? ssrLooseContain(ed.enable, null) : ed.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-c0bab860><span data-v-c0bab860>启用</span><span class="text-xs text-slate-400" data-v-c0bab860>停用的规则不参与选路</span></label><div class="flex gap-2" data-v-c0bab860><button class="btn btn-ghost btn-sm" data-v-c0bab860>取消</button><button class="btn btn-outline btn-sm" data-v-c0bab860>保存并同步…</button><button class="btn btn-primary btn-sm text-white" data-v-c0bab860>保存</button></div></div></div>`); _push(`</section><div class="ed-footer" data-v-0fc4ec7d><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-0fc4ec7d><input${ssrIncludeBooleanAttr(Array.isArray(ed.enable) ? ssrLooseContain(ed.enable, null) : ed.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-0fc4ec7d><span data-v-0fc4ec7d>启用</span><span class="text-xs text-slate-400" data-v-0fc4ec7d>停用的规则不参与选路</span></label><div class="flex gap-2" data-v-0fc4ec7d><button class="btn btn-ghost btn-sm" data-v-0fc4ec7d>取消</button><button class="btn btn-outline btn-sm" data-v-0fc4ec7d>保存并同步…</button><button class="btn btn-primary btn-sm text-white" data-v-0fc4ec7d>保存</button></div></div></div>`);
if (!rules.value.length) { if (!rules.value.length) {
_push(`<div class="text-center py-20 text-slate-300" data-v-c0bab860><div class="text-5xl mb-3" data-v-c0bab860>🌐</div><p class="text-sm" data-v-c0bab860>当前区域还没有翻译规则</p><p class="text-xs mt-1" data-v-c0bab860>建议先加一条「任意 → 任意」的兜底规则,再往上叠精确规则</p></div>`); _push(`<div class="text-center py-20 text-slate-300" data-v-0fc4ec7d><div class="text-5xl mb-3" data-v-0fc4ec7d>🌐</div><p class="text-sm" data-v-0fc4ec7d>当前区域还没有翻译规则</p><p class="text-xs mt-1" data-v-0fc4ec7d>建议先加一条「任意 → 任意」的兜底规则,再往上叠精确规则</p></div>`);
} else { } else {
_push(`<div class="rule-list" data-v-c0bab860><div class="rule-head" data-v-c0bab860><span data-v-c0bab860>优先级</span><span data-v-c0bab860>匹配条件</span><span data-v-c0bab860>Agent</span><span data-v-c0bab860>区域</span><span class="text-right" data-v-c0bab860>操作</span></div><!--[-->`); _push(`<div class="rule-list" data-v-0fc4ec7d><div class="rule-head" data-v-0fc4ec7d><span data-v-0fc4ec7d>优先级</span><span data-v-0fc4ec7d>匹配条件</span><span data-v-0fc4ec7d>Agent</span><span data-v-0fc4ec7d>区域</span><span class="text-right" data-v-0fc4ec7d>操作</span></div><!--[-->`);
ssrRenderList(rules.value, (r, i) => { ssrRenderList(rules.value, (r, i) => {
_push(`<div class="${ssrRenderClass([{ off: !r.enable }, "rule-row"])}" data-v-c0bab860><div class="prio-cell" data-v-c0bab860><span class="prio" data-v-c0bab860>${ssrInterpolate(r.priority)}</span><span class="order" data-v-c0bab860>#${ssrInterpolate(i + 1)}</span></div><div class="cond-cell" data-v-c0bab860><div class="flex items-center gap-2 flex-wrap" data-v-c0bab860><span class="${ssrRenderClass([{ any: isAny(r.src_langs) }, "lang-badge"])}" data-v-c0bab860>${ssrInterpolate(langsLabel(r.src_langs))}</span><span class="text-slate-400 font-bold" data-v-c0bab860>${ssrInterpolate(r.bidir ? "⇄" : "→")}</span><span class="${ssrRenderClass([{ any: isAny(r.dst_langs) }, "lang-badge"])}" data-v-c0bab860>${ssrInterpolate(langsLabel(r.dst_langs))}</span></div>`); _push(`<div class="${ssrRenderClass([{ off: !r.enable }, "rule-row"])}" data-v-0fc4ec7d><div class="prio-cell" data-v-0fc4ec7d><span class="prio" data-v-0fc4ec7d>${ssrInterpolate(r.priority)}</span><span class="order" data-v-0fc4ec7d>#${ssrInterpolate(i + 1)}</span></div><div class="cond-cell" data-v-0fc4ec7d><div class="flex items-center gap-2 flex-wrap" data-v-0fc4ec7d><span class="${ssrRenderClass([{ any: isAny(r.src_langs) }, "lang-badge"])}" data-v-0fc4ec7d>${ssrInterpolate(langsLabel(r.src_langs))}</span><span class="text-slate-400 font-bold" data-v-0fc4ec7d>${ssrInterpolate(r.bidir ? "⇄" : "→")}</span><span class="${ssrRenderClass([{ any: isAny(r.dst_langs) }, "lang-badge"])}" data-v-0fc4ec7d>${ssrInterpolate(langsLabel(r.dst_langs))}</span></div>`);
if (r.name || r.remark) { if (r.name || r.remark) {
_push(`<div class="text-[11px] text-slate-400 mt-1" data-v-c0bab860>${ssrInterpolate(r.name)}`); _push(`<div class="text-[11px] text-slate-400 mt-1" data-v-0fc4ec7d>${ssrInterpolate(r.name)}`);
if (r.remark) { if (r.remark) {
_push(`<span data-v-c0bab860> · ${ssrInterpolate(r.remark)}</span>`); _push(`<span data-v-0fc4ec7d> · ${ssrInterpolate(r.remark)}</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
@ -208,49 +208,49 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</div><div class="agent-cell" data-v-c0bab860><span class="type-badge" style="${ssrRenderStyle(typeStyle(agentType(r.agent_id)))}" data-v-c0bab860>${ssrInterpolate(typeLabel(agentType(r.agent_id)))}</span><span class="text-xs text-slate-700" data-v-c0bab860>${ssrInterpolate(agentName(r.agent_id))}</span></div><div class="text-xs text-slate-500" data-v-c0bab860>${ssrInterpolate(r.region === 0 ? "全部区域" : regionLabel(r.region))}</div><div class="text-right" data-v-c0bab860>`); _push(`</div><div class="agent-cell" data-v-0fc4ec7d><span class="type-badge" style="${ssrRenderStyle(typeStyle(agentType(r.agent_id)))}" data-v-0fc4ec7d>${ssrInterpolate(typeLabel(agentType(r.agent_id)))}</span><span class="text-xs text-slate-700" data-v-0fc4ec7d>${ssrInterpolate(agentName(r.agent_id))}</span></div><div class="text-xs text-slate-500" data-v-0fc4ec7d>${ssrInterpolate(r.region === 0 ? "全部区域" : regionLabel(r.region))}</div><div class="text-right" data-v-0fc4ec7d>`);
if (r.enable) { if (r.enable) {
_push(`<span class="badge badge-success badge-xs mr-2" data-v-c0bab860>启用</span>`); _push(`<span class="badge badge-success badge-xs mr-2" data-v-0fc4ec7d>启用</span>`);
} else { } else {
_push(`<span class="badge badge-ghost badge-xs mr-2" data-v-c0bab860>停用</span>`); _push(`<span class="badge badge-ghost badge-xs mr-2" data-v-0fc4ec7d>停用</span>`);
} }
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-c0bab860>删除</button></div></div>`); _push(`<button class="btn btn-ghost btn-xs text-error" data-v-0fc4ec7d>删除</button></div></div>`);
}); });
_push(`<!--]--></div>`); _push(`<!--]--></div>`);
} }
_push(`<div class="ct-overlay" style="${ssrRenderStyle(testOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="ct-box" data-v-c0bab860><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-c0bab860>选路试算</h3><p class="text-xs text-slate-400 mb-4" data-v-c0bab860>用后端运行时同一套匹配逻辑,算一遍这个方向实际会走哪条规则。</p><div class="grid grid-cols-2 gap-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>源语言</span>`); _push(`<div class="ct-overlay" style="${ssrRenderStyle(testOpen.value ? null : { display: "none" })}" data-v-0fc4ec7d><div class="ct-box" data-v-0fc4ec7d><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-0fc4ec7d>选路试算</h3><p class="text-xs text-slate-400 mb-4" data-v-0fc4ec7d>用后端运行时同一套匹配逻辑,算一遍这个方向实际会走哪条规则。</p><div class="grid grid-cols-2 gap-3" data-v-0fc4ec7d><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>源语言</span>`);
_push(ssrRenderComponent(__nuxt_component_0, { _push(ssrRenderComponent(__nuxt_component_0, {
modelValue: testSrc.value, modelValue: testSrc.value,
"onUpdate:modelValue": ($event) => testSrc.value = $event "onUpdate:modelValue": ($event) => testSrc.value = $event
}, null, _parent)); }, null, _parent));
_push(`</div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>目标语言</span>`); _push(`</div><div data-v-0fc4ec7d><span class="ed-label" data-v-0fc4ec7d>目标语言</span>`);
_push(ssrRenderComponent(__nuxt_component_0, { _push(ssrRenderComponent(__nuxt_component_0, {
modelValue: testDst.value, modelValue: testDst.value,
"onUpdate:modelValue": ($event) => testDst.value = $event "onUpdate:modelValue": ($event) => testDst.value = $event
}, null, _parent)); }, null, _parent));
_push(`</div></div>`); _push(`</div></div>`);
if (testResult.value) { if (testResult.value) {
_push(`<div class="${ssrRenderClass([{ miss: !testResult.value.matched }, "test-result"])}" data-v-c0bab860>`); _push(`<div class="${ssrRenderClass([{ miss: !testResult.value.matched }, "test-result"])}" data-v-0fc4ec7d>`);
if (testResult.value.matched) { if (testResult.value.matched) {
_push(`<!--[--><div class="text-sm font-semibold text-slate-800 mb-1" data-v-c0bab860> 命中规则:${ssrInterpolate(testResult.value.rule?.name || "#" + testResult.value.rule?.id)}(优先级 ${ssrInterpolate(testResult.value.rule?.priority)}) </div><div class="text-xs text-slate-600" data-v-c0bab860>${ssrInterpolate(langsLabel(testResult.value.rule?.src_langs))} ${ssrInterpolate(testResult.value.rule?.bidir ? "⇄" : "→")} ${ssrInterpolate(langsLabel(testResult.value.rule?.dst_langs))} · Agent:${ssrInterpolate(testResult.value.agent?.name || testResult.value.rule?.agent_id)} `); _push(`<!--[--><div class="text-sm font-semibold text-slate-800 mb-1" data-v-0fc4ec7d> 命中规则:${ssrInterpolate(testResult.value.rule?.name || "#" + testResult.value.rule?.id)}(优先级 ${ssrInterpolate(testResult.value.rule?.priority)}) </div><div class="text-xs text-slate-600" data-v-0fc4ec7d>${ssrInterpolate(langsLabel(testResult.value.rule?.src_langs))} ${ssrInterpolate(testResult.value.rule?.bidir ? "⇄" : "→")} ${ssrInterpolate(langsLabel(testResult.value.rule?.dst_langs))} · Agent:${ssrInterpolate(testResult.value.agent?.name || testResult.value.rule?.agent_id)} `);
if (testResult.value.agent) { if (testResult.value.agent) {
_push(`<span data-v-c0bab860>(${ssrInterpolate(typeLabel(testResult.value.agent.type))})</span>`); _push(`<span data-v-0fc4ec7d>(${ssrInterpolate(typeLabel(testResult.value.agent.type))})</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</div><!--]-->`); _push(`</div><!--]-->`);
} else { } else {
_push(`<div class="text-sm text-amber-700" data-v-c0bab860>没有任何规则命中 —— 这个方向的通话翻译会不可用,建议补一条兜底规则。</div>`); _push(`<div class="text-sm text-amber-700" data-v-0fc4ec7d>没有任何规则命中 —— 这个方向的通话翻译会不可用,建议补一条兜底规则。</div>`);
} }
_push(`</div>`); _push(`</div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`<div class="flex gap-3 justify-end mt-5" data-v-c0bab860><button class="btn btn-ghost" data-v-c0bab860>关闭</button><button class="btn btn-primary text-white" data-v-c0bab860>试算</button></div></div></div><div class="ct-overlay" style="${ssrRenderStyle(syncOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="ct-box" data-v-c0bab860><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-c0bab860>同步到其他区域</h3><p class="text-xs text-slate-400 mb-3" data-v-c0bab860>${ssrInterpolate(syncDesc.value)}</p><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-c0bab860> ✦ 同步内容:语言条件、Agent、优先级、启停状态一并复制到目标区域。 </div><div class="flex items-center justify-between mb-1" data-v-c0bab860><span class="text-xs font-semibold text-slate-500" data-v-c0bab860>选择目标区域</span><div class="flex gap-2" data-v-c0bab860><button class="btn btn-ghost btn-xs" data-v-c0bab860>全选</button><button class="btn btn-ghost btn-xs" data-v-c0bab860>清空</button></div></div><div class="sync-region-grid" data-v-c0bab860><!--[-->`); _push(`<div class="flex gap-3 justify-end mt-5" data-v-0fc4ec7d><button class="btn btn-ghost" data-v-0fc4ec7d>关闭</button><button class="btn btn-primary text-white" data-v-0fc4ec7d>试算</button></div></div></div><div class="ct-overlay" style="${ssrRenderStyle(syncOpen.value ? null : { display: "none" })}" data-v-0fc4ec7d><div class="ct-box" data-v-0fc4ec7d><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-0fc4ec7d>同步到其他区域</h3><p class="text-xs text-slate-400 mb-3" data-v-0fc4ec7d>${ssrInterpolate(syncDesc.value)}</p><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-0fc4ec7d> ✦ 同步内容:语言条件、Agent、优先级、启停状态一并复制到目标区域。 </div><div class="flex items-center justify-between mb-1" data-v-0fc4ec7d><span class="text-xs font-semibold text-slate-500" data-v-0fc4ec7d>选择目标区域</span><div class="flex gap-2" data-v-0fc4ec7d><button class="btn btn-ghost btn-xs" data-v-0fc4ec7d>全选</button><button class="btn btn-ghost btn-xs" data-v-0fc4ec7d>清空</button></div></div><div class="sync-region-grid" data-v-0fc4ec7d><!--[-->`);
ssrRenderList(syncRegions.value, (r) => { ssrRenderList(syncRegions.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-c0bab860><span data-v-c0bab860>${ssrInterpolate(r.label)}</span></label>`); _push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-0fc4ec7d><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-0fc4ec7d><span data-v-0fc4ec7d>${ssrInterpolate(r.label)}</span></label>`);
}); });
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-c0bab860>⚠ 目标区域已有「同 Agent + 同语言条件」的规则则覆盖,否则新建。</p><div class="flex gap-3 justify-end" data-v-c0bab860><button class="btn btn-ghost" data-v-c0bab860>取消</button><button class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!syncTargets.value.length) ? " disabled" : ""} data-v-c0bab860> 保存并同步${ssrInterpolate(syncTargets.value.length ? "(" + syncTargets.value.length + " 个区域)" : "")}</button></div></div></div></div>`); _push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-0fc4ec7d>⚠ 目标区域已有「同 Agent + 同语言条件」的规则则覆盖,否则新建。</p><div class="flex gap-3 justify-end" data-v-0fc4ec7d><button class="btn btn-ghost" data-v-0fc4ec7d>取消</button><button class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!syncTargets.value.length) ? " disabled" : ""} data-v-0fc4ec7d> 保存并同步${ssrInterpolate(syncTargets.value.length ? "(" + syncTargets.value.length + " 个区域)" : "")}</button></div></div></div></div>`);
}; };
} }
}); });
@ -260,7 +260,7 @@ _sfc_main.setup = (props, ctx) => {
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/calltranslate.vue"); (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/calltranslate.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
}; };
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c0bab860"]]); const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0fc4ec7d"]]);
export { calltranslate as default }; export { calltranslate as default };
//# sourceMappingURL=calltranslate-BllxIxWZ.mjs.map //# sourceMappingURL=calltranslate-Typ2E2m-.mjs.map

1
apps/admin/.output/server/chunks/build/calltranslate-Typ2E2m-.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"calltranslate-Typ2E2m-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-Typ2E2m-.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/calltranslate-styles.DejCdNUq.mjs

@ -0,0 +1,8 @@
const calltranslate_vue_vue_type_style_index_0_scoped_0fc4ec7d_lang = ".rule-list[data-v-0fc4ec7d]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-0fc4ec7d]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-0fc4ec7d]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-0fc4ec7d]:last-child{border-bottom:none}.rule-row[data-v-0fc4ec7d]:hover{background:#f8fafc}.rule-row.off[data-v-0fc4ec7d]{opacity:.55}.prio-cell[data-v-0fc4ec7d]{display:flex;align-items:baseline;gap:6px}.prio[data-v-0fc4ec7d]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-0fc4ec7d]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-0fc4ec7d]{min-width:0}.agent-cell[data-v-0fc4ec7d]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-0fc4ec7d]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-0fc4ec7d]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-0fc4ec7d]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-0fc4ec7d]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-0fc4ec7d]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-0fc4ec7d]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-0fc4ec7d]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-0fc4ec7d]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-0fc4ec7d]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-0fc4ec7d]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-0fc4ec7d]{color:#dc2626;font-style:normal}.any-toggle[data-v-0fc4ec7d]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-0fc4ec7d],.any-toggle[data-v-0fc4ec7d]{display:flex;align-items:center;color:#64748b}.any-box[data-v-0fc4ec7d]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-0fc4ec7d]{min-width:0}.dir-col[data-v-0fc4ec7d]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-0fc4ec7d]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-0fc4ec7d]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-0fc4ec7d]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-0fc4ec7d],.ed-footer[data-v-0fc4ec7d]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-0fc4ec7d]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-0fc4ec7d]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-0fc4ec7d]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-0fc4ec7d]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-0fc4ec7d]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-0fc4ec7d]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-0fc4ec7d]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-0fc4ec7d]>:nth-child(4),.rule-row[data-v-0fc4ec7d]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-0fc4ec7d]{grid-template-columns:1fr}.dir-col[data-v-0fc4ec7d]{flex-direction:row;padding-top:0}}";
const calltranslateStyles_DejCdNUq = [
calltranslate_vue_vue_type_style_index_0_scoped_0fc4ec7d_lang
];
export { calltranslateStyles_DejCdNUq as default };
//# sourceMappingURL=calltranslate-styles.DejCdNUq.mjs.map

1
apps/admin/.output/server/chunks/build/calltranslate-styles.DejCdNUq.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"calltranslate-styles.DejCdNUq.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles-1.mjs-DXbisy9K.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles.DejCdNUq.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs

@ -1,8 +0,0 @@
const calltranslate_vue_vue_type_style_index_0_scoped_c0bab860_lang = ".rule-list[data-v-c0bab860]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-c0bab860]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-c0bab860]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-c0bab860]:last-child{border-bottom:none}.rule-row[data-v-c0bab860]:hover{background:#f8fafc}.rule-row.off[data-v-c0bab860]{opacity:.55}.prio-cell[data-v-c0bab860]{display:flex;align-items:baseline;gap:6px}.prio[data-v-c0bab860]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-c0bab860]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-c0bab860]{min-width:0}.agent-cell[data-v-c0bab860]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-c0bab860]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-c0bab860]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-c0bab860]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-c0bab860]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-c0bab860]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-c0bab860]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-c0bab860]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-c0bab860]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-c0bab860]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-c0bab860]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-c0bab860]{color:#dc2626;font-style:normal}.any-toggle[data-v-c0bab860]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-c0bab860],.any-toggle[data-v-c0bab860]{display:flex;align-items:center;color:#64748b}.any-box[data-v-c0bab860]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-c0bab860]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-c0bab860]{min-width:0}.dir-col[data-v-c0bab860]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-c0bab860]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-c0bab860]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-c0bab860]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-c0bab860],.ed-footer[data-v-c0bab860]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-c0bab860]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-c0bab860]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-c0bab860]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-c0bab860]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-c0bab860]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-c0bab860]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-c0bab860]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-c0bab860]>:nth-child(4),.rule-row[data-v-c0bab860]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-c0bab860]{grid-template-columns:1fr}.dir-col[data-v-c0bab860]{flex-direction:row;padding-top:0}}";
const calltranslateStyles_T5wE0P9E = [
calltranslate_vue_vue_type_style_index_0_scoped_c0bab860_lang
];
export { calltranslateStyles_T5wE0P9E as default };
//# sourceMappingURL=calltranslate-styles.T5wE0P9E.mjs.map

1
apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"calltranslate-styles.T5wE0P9E.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles-1.mjs-DvCjyXm1.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles.T5wE0P9E.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

74
apps/admin/.output/server/chunks/build/channels-DdtjGoxx.mjs → apps/admin/.output/server/chunks/build/channels-CtM7-nvg.mjs

@ -144,68 +144,68 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
return payList(form).includes(key); return payList(form).includes(key);
} }
return (_ctx, _push, _parent, _attrs) => { return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-6057a5c9><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-6057a5c9><div data-v-6057a5c9><h2 class="text-lg font-semibold text-slate-800" data-v-6057a5c9>渠道分发</h2><p class="text-xs text-slate-400 mt-1" data-v-6057a5c9> 管理各应用在各分发渠道上的版本、强制更新与能力开关。支付渠道在这里控制「开放哪几种支付入口」,商户凭据在应用的业务功能配置里填。 </p></div><div class="flex items-center gap-3" data-v-6057a5c9><span class="text-sm text-slate-500" data-v-6057a5c9>应用</span><select class="select select-bordered select-sm" data-v-6057a5c9><option value="" data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认(所有应用兜底)</option><!--[-->`); _push(`<div${ssrRenderAttrs(_attrs)} data-v-66a7d845><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-66a7d845><div data-v-66a7d845><h2 class="text-lg font-semibold text-slate-800" data-v-66a7d845>渠道分发</h2><p class="text-xs text-slate-400 mt-1" data-v-66a7d845> 管理各应用在各分发渠道上的版本、强制更新与能力开关。支付渠道在这里控制「开放哪几种支付入口」,商户凭据在应用的业务功能配置里填。 </p></div><div class="flex items-center gap-3" data-v-66a7d845><span class="text-sm text-slate-500" data-v-66a7d845>应用</span><select class="select select-bordered select-sm" data-v-66a7d845><option value="" data-v-66a7d845${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认(所有应用兜底)</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => { ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`); _push(`<option${ssrRenderAttr("value", a)} data-v-66a7d845${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`);
}); });
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-6057a5c9>+ 添加渠道</button></div></div>`); _push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-66a7d845>+ 添加渠道</button></div></div>`);
if (payWarnings.value.length) { if (payWarnings.value.length) {
_push(`<div class="pay-warn" data-v-6057a5c9><div class="flex items-start gap-2" data-v-6057a5c9><span data-v-6057a5c9>⚠</span><div class="flex-1" data-v-6057a5c9><div class="text-sm font-semibold" data-v-6057a5c9>以下支付方式已在渠道里开放,但商户凭据还没配:</div><div class="text-xs mt-1" data-v-6057a5c9><!--[-->`); _push(`<div class="pay-warn" data-v-66a7d845><div class="flex items-start gap-2" data-v-66a7d845><span data-v-66a7d845>⚠</span><div class="flex-1" data-v-66a7d845><div class="text-sm font-semibold" data-v-66a7d845>以下支付方式已在渠道里开放,但商户凭据还没配:</div><div class="text-xs mt-1" data-v-66a7d845><!--[-->`);
ssrRenderList(payWarnings.value, (w) => { ssrRenderList(payWarnings.value, (w) => {
_push(`<span class="warn-pill" data-v-6057a5c9>${ssrInterpolate(w.label)}(${ssrInterpolate(w.channels.join("、"))})</span>`); _push(`<span class="warn-pill" data-v-66a7d845>${ssrInterpolate(w.label)}(${ssrInterpolate(w.channels.join("、"))})</span>`);
}); });
_push(`<!--]--></div></div><button class="btn btn-xs btn-ghost" data-v-6057a5c9>去配置 →</button></div></div>`); _push(`<!--]--></div></div><button class="btn btn-xs btn-ghost" data-v-66a7d845>去配置 →</button></div></div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (!scopeApp.value) { if (!scopeApp.value) {
_push(`<div class="scope-tip" data-v-6057a5c9> 当前是<b data-v-6057a5c9>全局默认</b>作用域:这里配的渠道对所有应用生效,应用自己配了同渠道则以应用的为准。 </div>`); _push(`<div class="scope-tip" data-v-66a7d845> 当前是<b data-v-66a7d845>全局默认</b>作用域:这里配的渠道对所有应用生效,应用自己配了同渠道则以应用的为准。 </div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`<!--[-->`); _push(`<!--[-->`);
ssrRenderList(groups.value, (g) => { ssrRenderList(groups.value, (g) => {
_push(`<div class="mb-6" data-v-6057a5c9><div class="flex items-center gap-2 mb-3" data-v-6057a5c9><span class="group-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-6057a5c9>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-6057a5c9>${ssrInterpolate(g.items.length)} / ${ssrInterpolate(g.channels.length)} 已配置</span></div><div class="ch-grid" data-v-6057a5c9><!--[-->`); _push(`<div class="mb-6" data-v-66a7d845><div class="flex items-center gap-2 mb-3" data-v-66a7d845><span class="group-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-66a7d845>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-66a7d845>${ssrInterpolate(g.items.length)} / ${ssrInterpolate(g.channels.length)} 已配置</span></div><div class="ch-grid" data-v-66a7d845><!--[-->`);
ssrRenderList(g.items, (c) => { ssrRenderList(g.items, (c) => {
_push(`<div class="${ssrRenderClass([{ off: !c.enable }, "ch-card"])}" data-v-6057a5c9><div class="flex items-start justify-between gap-2" data-v-6057a5c9><div class="min-w-0" data-v-6057a5c9><div class="font-semibold text-sm text-slate-800" data-v-6057a5c9>${ssrInterpolate(channelName(c.channel))}</div><div class="text-[11px] text-slate-400 mt-0.5" data-v-6057a5c9>渠道号 ${ssrInterpolate(c.channel)}</div></div><span class="status-badge" style="${ssrRenderStyle(statusStyle(c.status))}" data-v-6057a5c9>${ssrInterpolate(statusLabel(c.status))}</span></div><div class="ver-row" data-v-6057a5c9><div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>线上版本</span><span class="ver-val" data-v-6057a5c9>${ssrInterpolate(c.version || "—")}</span></div><div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>最低支持</span><span class="${ssrRenderClass([{ warn: c.force_update }, "ver-val"])}" data-v-6057a5c9>${ssrInterpolate(c.min_version || "—")}</span></div>`); _push(`<div class="${ssrRenderClass([{ off: !c.enable }, "ch-card"])}" data-v-66a7d845><div class="flex items-start justify-between gap-2" data-v-66a7d845><div class="min-w-0" data-v-66a7d845><div class="font-semibold text-sm text-slate-800" data-v-66a7d845>${ssrInterpolate(channelName(c.channel))}</div><div class="text-[11px] text-slate-400 mt-0.5" data-v-66a7d845>渠道号 ${ssrInterpolate(c.channel)}</div></div><span class="status-badge" style="${ssrRenderStyle(statusStyle(c.status))}" data-v-66a7d845>${ssrInterpolate(statusLabel(c.status))}</span></div><div class="ver-row" data-v-66a7d845><div class="ver-box" data-v-66a7d845><span class="ver-label" data-v-66a7d845>线上版本</span><span class="ver-val" data-v-66a7d845>${ssrInterpolate(c.version || "—")}</span></div><div class="ver-box" data-v-66a7d845><span class="ver-label" data-v-66a7d845>最低支持</span><span class="${ssrRenderClass([{ warn: c.force_update }, "ver-val"])}" data-v-66a7d845>${ssrInterpolate(c.min_version || "—")}</span></div>`);
if (c.review_version) { if (c.review_version) {
_push(`<div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>审核中</span><span class="ver-val review" data-v-6057a5c9>${ssrInterpolate(c.review_version)}</span></div>`); _push(`<div class="ver-box" data-v-66a7d845><span class="ver-label" data-v-66a7d845>审核中</span><span class="ver-val review" data-v-66a7d845>${ssrInterpolate(c.review_version)}</span></div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</div><div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9>`); _push(`</div><div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-66a7d845>`);
if (c.force_update) { if (c.force_update) {
_push(`<span class="flag flag-warn" data-v-6057a5c9>强制更新</span>`); _push(`<span class="flag flag-warn" data-v-66a7d845>强制更新</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (c.tourists) { if (c.tourists) {
_push(`<span class="flag" data-v-6057a5c9>游客登录</span>`); _push(`<span class="flag" data-v-66a7d845>游客登录</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (c.allowskipdevicebinding) { if (c.allowskipdevicebinding) {
_push(`<span class="flag" data-v-6057a5c9>可跳过绑定</span>`); _push(`<span class="flag" data-v-66a7d845>可跳过绑定</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (!c.enable) { if (!c.enable) {
_push(`<span class="flag flag-off" data-v-6057a5c9>已停用</span>`); _push(`<span class="flag flag-off" data-v-66a7d845>已停用</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</div>`); _push(`</div>`);
if (payList(c).length) { if (payList(c).length) {
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9><!--[-->`); _push(`<div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-66a7d845><!--[-->`);
ssrRenderList(payList(c), (p) => { ssrRenderList(payList(c), (p) => {
_push(`<span class="${ssrRenderClass([{ missing: payMissing(p) }, "pay-pill"])}"${ssrRenderAttr("title", payMissing(p) ? "该支付方式的商户凭据尚未配置" : "")} data-v-6057a5c9>${ssrInterpolate(payLabel(p))}${ssrInterpolate(payMissing(p) ? " ⚠" : "")}</span>`); _push(`<span class="${ssrRenderClass([{ missing: payMissing(p) }, "pay-pill"])}"${ssrRenderAttr("title", payMissing(p) ? "该支付方式的商户凭据尚未配置" : "")} data-v-66a7d845>${ssrInterpolate(payLabel(p))}${ssrInterpolate(payMissing(p) ? " ⚠" : "")}</span>`);
}); });
_push(`<!--]--></div>`); _push(`<!--]--></div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
if (c.address) { if (c.address) {
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-6057a5c9>${ssrInterpolate(c.address)}</div>`); _push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-66a7d845>${ssrInterpolate(c.address)}</div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
@ -213,51 +213,51 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
}); });
_push(`<!--]--><!--[-->`); _push(`<!--]--><!--[-->`);
ssrRenderList(g.missing, (ch) => { ssrRenderList(g.missing, (ch) => {
_push(`<div class="ch-card ch-empty" data-v-6057a5c9><div class="text-sm text-slate-400" data-v-6057a5c9>${ssrInterpolate(channelName(ch))}</div><div class="text-[11px] text-slate-300 mt-1" data-v-6057a5c9>未配置 · 点击添加</div></div>`); _push(`<div class="ch-card ch-empty" data-v-66a7d845><div class="text-sm text-slate-400" data-v-66a7d845>${ssrInterpolate(channelName(ch))}</div><div class="text-[11px] text-slate-300 mt-1" data-v-66a7d845>未配置 · 点击添加</div></div>`);
}); });
_push(`<!--]--></div></div>`); _push(`<!--]--></div></div>`);
}); });
_push(`<!--]--><div class="ch-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-6057a5c9><div class="ch-box" data-v-6057a5c9><div class="flex items-center justify-between mb-4" data-v-6057a5c9><div class="flex items-center gap-3" data-v-6057a5c9><h3 class="text-base font-semibold text-slate-800" data-v-6057a5c9>${ssrInterpolate(isEditing.value ? "编辑渠道" : "添加渠道")}</h3><span class="scope-chip" data-v-6057a5c9>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-6057a5c9>✕ 关闭</button></div><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>渠道</div><div class="grid grid-cols-2 gap-3" data-v-6057a5c9><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>分发渠道 <i class="req" data-v-6057a5c9>*</i></span><select${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="select select-bordered select-sm w-full" data-v-6057a5c9><option${ssrRenderAttr("value", 0)} disabled data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, 0) : ssrLooseEqual(form.channel, 0)) ? " selected" : ""}>请选择渠道</option><!--[-->`); _push(`<!--]--><div class="ch-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-66a7d845><div class="ch-box" data-v-66a7d845><div class="flex items-center justify-between mb-4" data-v-66a7d845><div class="flex items-center gap-3" data-v-66a7d845><h3 class="text-base font-semibold text-slate-800" data-v-66a7d845>${ssrInterpolate(isEditing.value ? "编辑渠道" : "添加渠道")}</h3><span class="scope-chip" data-v-66a7d845>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-66a7d845>✕ 关闭</button></div><section class="ed-section" data-v-66a7d845><div class="ed-section-title" data-v-66a7d845>渠道</div><div class="grid grid-cols-2 gap-3" data-v-66a7d845><div data-v-66a7d845><span class="ed-label" data-v-66a7d845>分发渠道 <i class="req" data-v-66a7d845>*</i></span><select${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="select select-bordered select-sm w-full" data-v-66a7d845><option${ssrRenderAttr("value", 0)} disabled data-v-66a7d845${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, 0) : ssrLooseEqual(form.channel, 0)) ? " selected" : ""}>请选择渠道</option><!--[-->`);
ssrRenderList(CHANNEL_GROUPS, (g) => { ssrRenderList(CHANNEL_GROUPS, (g) => {
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-6057a5c9><!--[-->`); _push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-66a7d845><!--[-->`);
ssrRenderList(g.channels, (ch) => { ssrRenderList(g.channels, (ch) => {
_push(`<option${ssrRenderAttr("value", ch)} data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, ch) : ssrLooseEqual(form.channel, ch)) ? " selected" : ""}>${ssrInterpolate(channelName(ch))}(${ssrInterpolate(ch)})</option>`); _push(`<option${ssrRenderAttr("value", ch)} data-v-66a7d845${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, ch) : ssrLooseEqual(form.channel, ch)) ? " selected" : ""}>${ssrInterpolate(channelName(ch))}(${ssrInterpolate(ch)})</option>`);
}); });
_push(`<!--]--></optgroup>`); _push(`<!--]--></optgroup>`);
}); });
_push(`<!--]--></select></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>上架状态</span><select class="select select-bordered select-sm w-full" data-v-6057a5c9><!--[-->`); _push(`<!--]--></select></div><div data-v-66a7d845><span class="ed-label" data-v-66a7d845>上架状态</span><select class="select select-bordered select-sm w-full" data-v-66a7d845><!--[-->`);
ssrRenderList(STATUS, (s) => { ssrRenderList(STATUS, (s) => {
_push(`<option${ssrRenderAttr("value", s.v)} data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.status) ? ssrLooseContain(form.status, s.v) : ssrLooseEqual(form.status, s.v)) ? " selected" : ""}>${ssrInterpolate(s.label)}</option>`); _push(`<option${ssrRenderAttr("value", s.v)} data-v-66a7d845${ssrIncludeBooleanAttr(Array.isArray(form.status) ? ssrLooseContain(form.status, s.v) : ssrLooseEqual(form.status, s.v)) ? " selected" : ""}>${ssrInterpolate(s.label)}</option>`);
}); });
_push(`<!--]--></select></div></div><div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个渠道包的说明" data-v-6057a5c9></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>版本</div><div class="grid grid-cols-3 gap-3" data-v-6057a5c9><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>当前线上版本</span><input${ssrRenderAttr("value", form.version)} class="input input-bordered input-sm w-full" placeholder="如 1.4.2" data-v-6057a5c9></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>最低支持版本</span><input${ssrRenderAttr("value", form.min_version)} class="input input-bordered input-sm w-full" placeholder="低于它的客户端需更新" data-v-6057a5c9></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>审核中版本</span><input${ssrRenderAttr("value", form.review_version)} class="input input-bordered input-sm w-full" placeholder="过审后清空" data-v-6057a5c9></div></div><label class="flex items-center gap-2 text-sm cursor-pointer mt-3" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.force_update) ? ssrLooseContain(form.force_update, null) : form.force_update) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>强制更新</span><span class="text-xs text-slate-400" data-v-6057a5c9>低于「最低支持版本」的客户端必须更新才能继续使用</span></label>`); _push(`<!--]--></select></div></div><div class="mt-3" data-v-66a7d845><span class="ed-label" data-v-66a7d845>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个渠道包的说明" data-v-66a7d845></div></section><section class="ed-section" data-v-66a7d845><div class="ed-section-title" data-v-66a7d845>版本</div><div class="grid grid-cols-3 gap-3" data-v-66a7d845><div data-v-66a7d845><span class="ed-label" data-v-66a7d845>当前线上版本</span><input${ssrRenderAttr("value", form.version)} class="input input-bordered input-sm w-full" placeholder="如 1.4.2" data-v-66a7d845></div><div data-v-66a7d845><span class="ed-label" data-v-66a7d845>最低支持版本</span><input${ssrRenderAttr("value", form.min_version)} class="input input-bordered input-sm w-full" placeholder="低于它的客户端需更新" data-v-66a7d845></div><div data-v-66a7d845><span class="ed-label" data-v-66a7d845>审核中版本</span><input${ssrRenderAttr("value", form.review_version)} class="input input-bordered input-sm w-full" placeholder="过审后清空" data-v-66a7d845></div></div><label class="flex items-center gap-2 text-sm cursor-pointer mt-3" data-v-66a7d845><input${ssrIncludeBooleanAttr(Array.isArray(form.force_update) ? ssrLooseContain(form.force_update, null) : form.force_update) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-66a7d845><span data-v-66a7d845>强制更新</span><span class="text-xs text-slate-400" data-v-66a7d845>低于「最低支持版本」的客户端必须更新才能继续使用</span></label>`);
if (versionWarn.value) { if (versionWarn.value) {
_push(`<p class="ed-warn" data-v-6057a5c9>⚠ ${ssrInterpolate(versionWarn.value)}</p>`); _push(`<p class="ed-warn" data-v-66a7d845>⚠ ${ssrInterpolate(versionWarn.value)}</p>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`<div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>下载地址</span><input${ssrRenderAttr("value", form.address)} class="input input-bordered input-sm w-full" placeholder="应用商店链接或 apk 直链" data-v-6057a5c9></div><div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>更新日志</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="本次更新内容,会下发给客户端展示" data-v-6057a5c9>${ssrInterpolate(form.changelog)}</textarea></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>能力开关</div><div class="flex flex-col gap-2" data-v-6057a5c9><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.tourists) ? ssrLooseContain(form.tourists, null) : form.tourists) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>允许游客登录</span></label><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.allowskipdevicebinding) ? ssrLooseContain(form.allowskipdevicebinding, null) : form.allowskipdevicebinding) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>允许跳过设备绑定</span></label></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>支付渠道</div><div class="pay-grid" data-v-6057a5c9><!--[-->`); _push(`<div class="mt-3" data-v-66a7d845><span class="ed-label" data-v-66a7d845>下载地址</span><input${ssrRenderAttr("value", form.address)} class="input input-bordered input-sm w-full" placeholder="应用商店链接或 apk 直链" data-v-66a7d845></div><div class="mt-3" data-v-66a7d845><span class="ed-label" data-v-66a7d845>更新日志</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="本次更新内容,会下发给客户端展示" data-v-66a7d845>${ssrInterpolate(form.changelog)}</textarea></div></section><section class="ed-section" data-v-66a7d845><div class="ed-section-title" data-v-66a7d845>能力开关</div><div class="flex flex-col gap-2" data-v-66a7d845><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-66a7d845><input${ssrIncludeBooleanAttr(Array.isArray(form.tourists) ? ssrLooseContain(form.tourists, null) : form.tourists) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-66a7d845><span data-v-66a7d845>允许游客登录</span></label><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-66a7d845><input${ssrIncludeBooleanAttr(Array.isArray(form.allowskipdevicebinding) ? ssrLooseContain(form.allowskipdevicebinding, null) : form.allowskipdevicebinding) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-66a7d845><span data-v-66a7d845>允许跳过设备绑定</span></label></div></section><section class="ed-section" data-v-66a7d845><div class="ed-section-title" data-v-66a7d845>支付渠道</div><div class="pay-grid" data-v-66a7d845><!--[-->`);
ssrRenderList(PAY_CHANNELS, (p) => { ssrRenderList(PAY_CHANNELS, (p) => {
_push(`<label class="${ssrRenderClass([{ checked: payChecked(p.key) }, "pay-item"])}" data-v-6057a5c9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(payChecked(p.key)) ? " checked" : ""} data-v-6057a5c9><span data-v-6057a5c9>${ssrInterpolate(p.label)}</span>`); _push(`<label class="${ssrRenderClass([{ checked: payChecked(p.key) }, "pay-item"])}" data-v-66a7d845><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(payChecked(p.key)) ? " checked" : ""} data-v-66a7d845><span data-v-66a7d845>${ssrInterpolate(p.label)}</span>`);
if (payChecked(p.key) && payMissing(p.key)) { if (payChecked(p.key) && payMissing(p.key)) {
_push(`<span class="pay-miss" data-v-6057a5c9>未配凭据</span>`); _push(`<span class="pay-miss" data-v-66a7d845>未配凭据</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`</label>`); _push(`</label>`);
}); });
_push(`<!--]--></div><p class="ed-tip" data-v-6057a5c9> 这里只决定「这个渠道开放哪几种支付入口」;商户号、密钥等凭据在 `); _push(`<!--]--></div><p class="ed-tip" data-v-66a7d845> 这里只决定「这个渠道开放哪几种支付入口」;商户号、密钥等凭据在 `);
if (scopeApp.value) { if (scopeApp.value) {
_push(`<a class="link" data-v-6057a5c9>应用「${ssrInterpolate(scopeApp.value)}」→ 业务功能配置 → 支付</a>`); _push(`<a class="link" data-v-66a7d845>应用「${ssrInterpolate(scopeApp.value)}」→ 业务功能配置 → 支付</a>`);
} else { } else {
_push(`<span data-v-6057a5c9>各应用的「业务功能配置 → 支付」</span>`); _push(`<span data-v-66a7d845>各应用的「业务功能配置 → 支付」</span>`);
} }
_push(` 里填。 </p></section><div class="ed-footer" data-v-6057a5c9><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>启用</span><span class="text-xs text-slate-400" data-v-6057a5c9>停用后该渠道配置不下发客户端</span></label><div class="flex gap-2" data-v-6057a5c9>`); _push(` 里填。 </p></section><div class="ed-footer" data-v-66a7d845><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-66a7d845><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-66a7d845><span data-v-66a7d845>启用</span><span class="text-xs text-slate-400" data-v-66a7d845>停用后该渠道配置不下发客户端</span></label><div class="flex gap-2" data-v-66a7d845>`);
if (isEditing.value) { if (isEditing.value) {
_push(`<button class="btn btn-ghost btn-sm text-error mr-auto" data-v-6057a5c9>删除</button>`); _push(`<button class="btn btn-ghost btn-sm text-error mr-auto" data-v-66a7d845>删除</button>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`<button class="btn btn-ghost btn-sm" data-v-6057a5c9>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-6057a5c9>保存</button></div></div></div></div></div>`); _push(`<button class="btn btn-ghost btn-sm" data-v-66a7d845>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-66a7d845>保存</button></div></div></div></div></div>`);
}; };
} }
}); });
@ -267,7 +267,7 @@ _sfc_main.setup = (props, ctx) => {
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/channels.vue"); (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/channels.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
}; };
const channels = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6057a5c9"]]); const channels = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-66a7d845"]]);
export { channels as default }; export { channels as default };
//# sourceMappingURL=channels-DdtjGoxx.mjs.map //# sourceMappingURL=channels-CtM7-nvg.mjs.map

1
apps/admin/.output/server/chunks/build/channels-CtM7-nvg.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"channels-CtM7-nvg.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-CtM7-nvg.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/channels-DdtjGoxx.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"channels-DdtjGoxx.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-DdtjGoxx.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs

@ -1,8 +0,0 @@
const channels_vue_vue_type_style_index_0_scoped_6057a5c9_lang = ".group-tag[data-v-6057a5c9]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-6057a5c9]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-6057a5c9]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-6057a5c9]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-6057a5c9]{opacity:.55}.ch-empty[data-v-6057a5c9]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-6057a5c9]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-6057a5c9]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-6057a5c9]{display:flex;flex-direction:column}.ver-label[data-v-6057a5c9]{font-size:10px;color:#94a3b8}.ver-val[data-v-6057a5c9]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-6057a5c9]{color:#b45309}.ver-val.review[data-v-6057a5c9]{color:#7c3aed}.flag[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.flag-off[data-v-6057a5c9]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.pay-warn[data-v-6057a5c9]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-6057a5c9]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-6057a5c9]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-6057a5c9]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-6057a5c9]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-6057a5c9]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-6057a5c9]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-6057a5c9]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-6057a5c9]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-6057a5c9]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-6057a5c9]{color:#b45309}.ed-tip[data-v-6057a5c9],.ed-warn[data-v-6057a5c9]{font-size:11px;margin-top:8px}.ed-tip[data-v-6057a5c9]{color:#94a3b8}.req[data-v-6057a5c9]{color:#dc2626;font-style:normal}.link[data-v-6057a5c9]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-6057a5c9]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-6057a5c9]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-6057a5c9]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-6057a5c9]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-6057a5c9]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-6057a5c9]{grid-template-columns:repeat(2,1fr)}}";
const channelsStyles_BsiooF6f = [
channels_vue_vue_type_style_index_0_scoped_6057a5c9_lang
];
export { channelsStyles_BsiooF6f as default };
//# sourceMappingURL=channels-styles.BsiooF6f.mjs.map

1
apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"channels-styles.BsiooF6f.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles-1.mjs-Bc-0jlqg.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles.BsiooF6f.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/channels-styles.YMd5B91-.mjs

@ -0,0 +1,8 @@
const channels_vue_vue_type_style_index_0_scoped_66a7d845_lang = ".group-tag[data-v-66a7d845]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-66a7d845]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-66a7d845]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-66a7d845]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-66a7d845]{opacity:.55}.ch-empty[data-v-66a7d845]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-66a7d845]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-66a7d845]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-66a7d845]{display:flex;flex-direction:column}.ver-label[data-v-66a7d845]{font-size:10px;color:#94a3b8}.ver-val[data-v-66a7d845]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-66a7d845]{color:#b45309}.ver-val.review[data-v-66a7d845]{color:#7c3aed}.flag[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-66a7d845]{background:#fef3c7;color:#b45309}.flag-off[data-v-66a7d845]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-66a7d845]{background:#fef3c7;color:#b45309}.pay-warn[data-v-66a7d845]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-66a7d845]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-66a7d845]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-66a7d845]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-66a7d845]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-66a7d845]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-66a7d845]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-66a7d845]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-66a7d845]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-66a7d845]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-66a7d845]{color:#b45309}.ed-tip[data-v-66a7d845],.ed-warn[data-v-66a7d845]{font-size:11px;margin-top:8px}.ed-tip[data-v-66a7d845]{color:#94a3b8}.req[data-v-66a7d845]{color:#dc2626;font-style:normal}.link[data-v-66a7d845]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-66a7d845]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-66a7d845]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-66a7d845]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-66a7d845]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-66a7d845]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-66a7d845]{grid-template-columns:repeat(2,1fr)}}";
const channelsStyles_YMd5B91_ = [
channels_vue_vue_type_style_index_0_scoped_66a7d845_lang
];
export { channelsStyles_YMd5B91_ as default };
//# sourceMappingURL=channels-styles.YMd5B91-.mjs.map

1
apps/admin/.output/server/chunks/build/channels-styles.YMd5B91-.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"channels-styles.YMd5B91-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles-1.mjs-BAM8-7CK.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles.YMd5B91-.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

2
apps/admin/.output/server/chunks/build/client.precomputed.mjs

File diff suppressed because one or more lines are too long

8
apps/admin/.output/server/chunks/build/server.mjs

@ -1962,7 +1962,7 @@ const _routes = [
name: "agents", name: "agents",
path: "/agents", path: "/agents",
meta: __nuxt_page_meta$n || {}, meta: __nuxt_page_meta$n || {},
component: () => import('./agents-DbiFqwig.mjs') component: () => import('./agents-Bh_gLb1p.mjs')
}, },
{ {
name: "appconfig", name: "appconfig",
@ -1980,13 +1980,13 @@ const _routes = [
name: "calltranslate", name: "calltranslate",
path: "/calltranslate", path: "/calltranslate",
meta: __nuxt_page_meta$k || {}, meta: __nuxt_page_meta$k || {},
component: () => import('./calltranslate-BllxIxWZ.mjs') component: () => import('./calltranslate-Typ2E2m-.mjs')
}, },
{ {
name: "channels", name: "channels",
path: "/channels", path: "/channels",
meta: __nuxt_page_meta$j || {}, meta: __nuxt_page_meta$j || {},
component: () => import('./channels-DdtjGoxx.mjs') component: () => import('./channels-CtM7-nvg.mjs')
}, },
{ {
name: "code", name: "code",
@ -2064,7 +2064,7 @@ const _routes = [
name: "serviceconfig", name: "serviceconfig",
path: "/serviceconfig", path: "/serviceconfig",
meta: __nuxt_page_meta$6 || {}, meta: __nuxt_page_meta$6 || {},
component: () => import('./serviceconfig-DH60tzBJ.mjs') component: () => import('./serviceconfig-Bq9We0Qx.mjs')
}, },
{ {
name: "settlements", name: "settlements",

577
apps/admin/.output/server/chunks/build/serviceconfig-Bq9We0Qx.mjs

@ -0,0 +1,577 @@
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { defineComponent, ref, computed, reactive, watch, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicModel } from 'vue/server-renderer';
import { u as useApi } from './useApi-BNSkSrat.mjs';
import { u as useToast } from './useToast-MBvLaNjH.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLangOptions-CXXbv5NM.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const SCAT_MCP = 10;
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "serviceconfig",
__ssrInlineRender: true,
setup(__props) {
const REGIONS = [
{ value: 1, label: "中国" },
{ value: 2, label: "美国" },
{ value: 3, label: "东亚" },
{ value: 4, label: "东南亚" },
{ value: 5, label: "南亚" },
{ value: 6, label: "中东" },
{ value: 7, label: "欧洲" },
{ value: 8, label: "俄罗斯" },
{ value: 9, label: "非洲" },
{ value: 10, label: "南美" },
{ value: 11, label: "北美" },
{ value: 12, label: "大洋洲" },
{ value: 13, label: "巴西" },
{ value: 14, label: "印度" }
];
const SCAT = [
{ v: 1, label: "STT 语音识别", short: "STT", color: "#0369a1", bg: "#dbeafe" },
{ v: 8, label: "录音文件识别", short: "录音识别", color: "#0e7490", bg: "#cffafe" },
{ v: 2, label: "TTS 语音合成", short: "TTS", color: "#7c3aed", bg: "#ede9fe" },
{ v: 3, label: "MT 机器翻译", short: "MT", color: "#059669", bg: "#dcfce7" },
{ v: 4, label: "AST 端到端翻译", short: "AST", color: "#c2410c", bg: "#fff7ed" },
{ v: 5, label: "LLM 文本大模型", short: "文本LLM", color: "#b45309", bg: "#fef9c3" },
{ v: 9, label: "多媒体大模型", short: "多媒体LLM", color: "#9333ea", bg: "#f3e8ff" },
{ v: 7, label: "STS 端到端对话", short: "STS", color: "#be185d", bg: "#fce7f3" },
{ v: 6, label: "存储 OSS/COS", short: "存储", color: "#475569", bg: "#f1f5f9" },
{ v: 10, label: "MCP 服务", short: "MCP", color: "#0d9488", bg: "#ccfbf1" }
];
const { webApi } = useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
function scatInfo(v) {
return SCAT.find((s) => s.v === v) || { short: "?", color: "#999", bg: "#eee", v: 0, label: "" };
}
function isMcpType() {
if (editType.value === SCAT_MCP) return true;
return !!curSvc.value && parseCats(curSvc.value.categories).includes(SCAT_MCP);
}
function parseCats(s) {
return (s || "").split(",").map((x) => parseInt(x) || 0).filter((x) => x > 0);
}
function encCount(s) {
return (s.fields || []).filter((f) => f.encrypted).length;
}
function regionChip(s) {
const rs = svcRegions.value[s.id] || [];
const names = rs.map((v) => REGIONS.find((x) => x.value === v)?.label || "区域" + v);
if (curRegion.value === 0) {
if (!rs.length) return { text: "全区域通用", cls: "plain", title: "未做任何区域分叉,各区域都用默认配置" };
return { text: rs.length + " 区域分叉", cls: "has", title: "已分叉:" + names.join("、") };
}
if (rs.includes(curRegion.value)) {
return { text: "本区域已分叉", cls: "has", title: curRegionLabel.value + "有独立的字段配置" };
}
return { text: "继承默认", cls: "plain", title: curRegionLabel.value + "未分叉,使用默认配置" };
}
const VOICE_CATS = [2, 4, 7];
const voiceRows = ref([]);
const voicesLoading = ref(false);
const isVoiceCat = computed(() => VOICE_CATS.includes(editType.value));
const voiceLangGroups = computed(() => {
const map = /* @__PURE__ */ new Map();
for (const v of voiceRows.value) {
if (!map.has(v.language)) map.set(v.language, []);
map.get(v.language).push(v);
}
return Array.from(map, ([lang, items]) => ({ lang, items }));
});
async function loadVoicesForProvider(provider) {
const p = (provider || "").trim();
voiceRows.value = [];
if (!p) return;
voicesLoading.value = true;
try {
const d = await webApi("getttsvoices", { provider: p });
voiceRows.value = d?.voices ?? [];
} catch {
voiceRows.value = [];
} finally {
voicesLoading.value = false;
}
}
const backendReady = ref(true);
const allSvcs = ref([]);
const svcRegions = ref({});
const curSvc = ref(null);
const curRegion = ref(0);
const svcModalVisible = ref(false);
const detailMode = ref("default");
const editForm = reactive({ id: "", name: "", provider: "", description: "", enable: false });
const editType = ref(0);
const editFields = ref([]);
const selectedTemplateId = ref("");
const wizardStep = ref(1);
const overrideFields = ref([]);
const extraRegionFields = ref([]);
const regionLoading = ref(false);
const templates = ref([]);
const curRegionLabel = computed(() => {
const r = REGIONS.find((x) => x.value === curRegion.value);
return r ? r.label : "区域" + curRegion.value;
});
const groupedSvcs = computed(() => {
const groups = SCAT.map((sc) => ({
...sc,
items: allSvcs.value.filter((s) => parseCats(s.categories).includes(sc.v))
})).filter((g) => g.items.length);
const unclassified = allSvcs.value.filter((s) => !parseCats(s.categories).length);
if (unclassified.length) {
groups.push({ v: 0, label: "未分类", short: "未分类", color: "#64748b", bg: "#f1f5f9", items: unclassified });
}
return groups;
});
const folded = reactive({});
const allFolded = computed(() => groupedSvcs.value.length > 0 && groupedSvcs.value.every((g) => folded[g.v]));
const templatesByCat = computed(() => {
return SCAT.map((sc) => ({
cat: sc.v,
label: sc.label,
items: templates.value.filter((t) => t.category === sc.v)
})).filter((g) => g.items.length);
});
const templatesForType = computed(() => templates.value.filter((t) => t.category === editType.value));
const syncVisible = ref(false);
ref(false);
const syncDesc = ref("");
const syncScopeNote = ref("");
const syncTargets = ref([]);
const syncRegionList = computed(() => REGIONS.filter((r) => r.value !== curRegion.value));
const tplModalVisible = ref(false);
const tplView = ref("list");
const tplEditing = ref(false);
const tplForm = reactive({ id: "", category: 2, provider: "", name: "", description: "" });
const tplFields = ref([]);
watch([() => editForm.provider, isVoiceCat, svcModalVisible], ([provider, isVoice, visible]) => {
if (!visible || !isVoice) {
voiceRows.value = [];
return;
}
loadVoicesForProvider(provider);
}, { immediate: false });
return (_ctx, _push, _parent, _attrs) => {
const _component_LangSelect = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-e10e0bc9>`);
if (!backendReady.value) {
_push(`<div class="mb-4 rounded-lg px-4 py-3 text-sm" style="${ssrRenderStyle({ "background": "#fffbeb", "border": "1px solid #fde68a", "color": "#92400e" })}" data-v-e10e0bc9> ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div data-v-e10e0bc9><h2 class="text-lg font-semibold text-slate-800" data-v-e10e0bc9>第三方服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示<b data-v-e10e0bc9>全局默认</b>配置,可切换到具体应用;区域默认<b data-v-e10e0bc9>中国</b>,切换区域后点击卡片可为该区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-e10e0bc9><select class="select select-bordered select-sm" data-v-e10e0bc9><option value="" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-e10e0bc9><option${ssrRenderAttr("value", 0)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>${ssrInterpolate(allFolded.value ? "展开全部" : "折叠全部")}</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>服务商模板</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 添加服务</button></div></div>`);
if (curRegion.value !== 0) {
_push(`<div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-e10e0bc9> ✦ 当前处于「${ssrInterpolate(curRegionLabel.value)}」区域视图:点击服务卡片编辑该区域的字段分叉(覆盖值 / 停用字段 / 区域专属字段)。要改服务本身的默认配置,请切回「默认(全区域)」。 </div>`);
} else {
_push(`<!---->`);
}
if (groupedSvcs.value.length) {
_push(`<div class="flex flex-col gap-6" data-v-e10e0bc9><!--[-->`);
ssrRenderList(groupedSvcs.value, (g) => {
_push(`<section data-v-e10e0bc9><div class="group-head" data-v-e10e0bc9><span class="${ssrRenderClass([{ folded: folded[g.v] }, "fold-arrow"])}" data-v-e10e0bc9>▾</span><span class="cat-chip" style="${ssrRenderStyle({ color: g.color, background: g.bg })}" data-v-e10e0bc9>${ssrInterpolate(g.short)}</span><h3 class="text-sm font-semibold text-slate-700" data-v-e10e0bc9>${ssrInterpolate(g.label)}</h3><span class="text-xs text-slate-400" data-v-e10e0bc9>${ssrInterpolate(g.items.length)} 个服务</span><div class="flex-1 h-px bg-slate-100 ml-2" data-v-e10e0bc9></div></div><div class="svc-grid" style="${ssrRenderStyle(!folded[g.v] ? null : { display: "none" })}" data-v-e10e0bc9><!--[-->`);
ssrRenderList(g.items, (s) => {
_push(`<div class="${ssrRenderClass([{ off: !s.enable }, "svc-card"])}" data-v-e10e0bc9><div class="card-head" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-e10e0bc9>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div class="head-text" data-v-e10e0bc9><div class="name-line" data-v-e10e0bc9><span class="svc-name"${ssrRenderAttr("title", s.name)} data-v-e10e0bc9>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "on" : "off", "state-chip"])}" data-v-e10e0bc9>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><p class="svc-id"${ssrRenderAttr("title", s.id)} data-v-e10e0bc9>${ssrInterpolate(s.id)}</p></div></div><p class="svc-desc"${ssrRenderAttr("title", s.description || "")} data-v-e10e0bc9>${ssrInterpolate(s.description || "—")}</p><div class="meta-row" data-v-e10e0bc9>`);
if (s.provider) {
_push(`<span class="provider-chip"${ssrRenderAttr("title", s.provider)} data-v-e10e0bc9>${ssrInterpolate(s.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="field-count" data-v-e10e0bc9>${ssrInterpolate((s.fields || []).length)} 字段</span>`);
if (encCount(s)) {
_push(`<span class="lock-badge" data-v-e10e0bc9>🔒${ssrInterpolate(encCount(s))}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="region-row" data-v-e10e0bc9><span class="${ssrRenderClass([regionChip(s).cls, "region-chip"])}"${ssrRenderAttr("title", regionChip(s).title)} data-v-e10e0bc9>${ssrInterpolate(regionChip(s).text)}</span></div></div>`);
});
_push(`<!--]--><div class="svc-card add-card" data-v-e10e0bc9><span class="text-2xl text-slate-300" data-v-e10e0bc9>+</span><span class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>添加${ssrInterpolate(g.short)}服务</span></div></div></section>`);
});
_push(`<!--]--></div>`);
} else {
_push(`<div class="bg-white rounded-2xl border border-slate-100 shadow-sm text-center text-slate-300 py-20" data-v-e10e0bc9><div class="text-5xl mb-3" data-v-e10e0bc9>⚙️</div><p class="text-sm mb-4" data-v-e10e0bc9>尚未配置任何第三方服务</p><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 添加服务</button></div>`);
}
if (svcModalVisible.value) {
_push(`<div class="modal-overlay" data-v-e10e0bc9><div class="svc-box" data-v-e10e0bc9>`);
if (detailMode.value === "default" && curSvc.value) {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div class="flex items-center gap-3" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.id)}`);
if (editForm.provider) {
_push(`<span data-v-e10e0bc9> · 服务商 ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</p></div></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-error btn-sm btn-outline" data-v-e10e0bc9>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-e10e0bc9></div></div><div class="form-control mb-4" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-e10e0bc9></div><div class="mb-4" data-v-e10e0bc9><p class="text-sm font-medium text-slate-700 mb-2" data-v-e10e0bc9>服务类型</p>`);
if (editType.value) {
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-e10e0bc9>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-xs text-slate-500 ml-2" data-v-e10e0bc9>${ssrInterpolate(editType.value ? scatInfo(editType.value).label : "未设置")}</span><span class="text-[11px] text-slate-400 ml-2" data-v-e10e0bc9>(类型在创建时确定,不可更改)</span></div>`);
if (isVoiceCat.value) {
_push(`<div class="voice-card" data-v-e10e0bc9><div class="flex items-center justify-between" data-v-e10e0bc9><span class="text-sm font-medium text-slate-700" data-v-e10e0bc9>内置音色表</span><span class="flex items-center gap-2" data-v-e10e0bc9><span class="text-[11px] text-slate-400" data-v-e10e0bc9>`);
if (voicesLoading.value) {
_push(`<!--[-->加载中…<!--]-->`);
} else if (voiceRows.value.length) {
_push(`<!--[-->${ssrInterpolate(editForm.provider)} · ${ssrInterpolate(voiceRows.value.length)} 个音色 / ${ssrInterpolate(voiceLangGroups.value.length)} 种语言<!--]-->`);
} else {
_push(`<!--[-->未覆盖 ${ssrInterpolate(editForm.provider || "该服务商")}<!--]-->`);
}
_push(`</span>`);
if (voiceRows.value.length) {
_push(`<button class="btn btn-ghost btn-xs" data-v-e10e0bc9>填入 languages</button>`);
} else {
_push(`<!---->`);
}
_push(`</span></div>`);
if (!voicesLoading.value && !voiceRows.value.length) {
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 内置音色表里没有这家服务商,不影响接入——Agent 配音色时手填服务商的音色 id 即可。 </p>`);
} else if (voiceRows.value.length) {
_push(`<div class="voice-lang-list" data-v-e10e0bc9><!--[-->`);
ssrRenderList(voiceLangGroups.value, (g) => {
_push(`<div class="voice-lang-row" data-v-e10e0bc9><span class="voice-lang" data-v-e10e0bc9>${ssrInterpolate(g.lang)}</span><span class="voice-ids" data-v-e10e0bc9><!--[-->`);
ssrRenderList(g.items, (v, i) => {
_push(`<span class="voice-pill"${ssrRenderAttr("title", v.name)} data-v-e10e0bc9>${ssrInterpolate(v.gender === 1 ? "♂" : v.gender === 2 ? "♀" : "·")} ${ssrInterpolate(v.voice_id)}`);
if (i === 0) {
_push(`<em data-v-e10e0bc9>默认</em>`);
} else {
_push(`<!---->`);
}
_push(`</span>`);
});
_push(`<!--]--></span></div>`);
});
_push(`<!--]--></div>`);
} else {
_push(`<!---->`);
}
if (voiceRows.value.length) {
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 这 ${ssrInterpolate(voiceLangGroups.value.length)} 种语言就是该服务能说的语言,已作为下方 languages 的预填值——通话翻译、AI 助手排查「这条链路有没有服务支持」看的就是它。 音色本身是代码里的常量表(后端 comm/ttsvoice.go),实际用哪个在 Agent 里按语言+性别选,同组第一个是默认。 </p>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>配置字段(全区域共用)</div>`);
if (isMcpType()) {
_push(`<div class="rounded-lg px-3 py-2 mb-3 text-xs" style="${ssrRenderStyle({ "background": "#f0fdfa", "border": "1px solid #99f6e4", "color": "#0f766e" })}" data-v-e10e0bc9> ✦ MCP 服务与其他第三方服务同表存储(svc_config):这里填的 url/type/tools 为<b data-v-e10e0bc9>全区域默认</b>; 只在某些区域生效的地址,切到对应区域做分叉即可,卡片上会显示已分叉的区域数。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div data-v-e10e0bc9>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-e10e0bc9>尚无字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒 加密</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input" data-v-e10e0bc9><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-e10e0bc9>`);
}
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button></div><!--]-->`);
} else if (detailMode.value === "new") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>新增第三方服务</h3><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>取消</button></div><div class="wizard-steps mb-5" data-v-e10e0bc9><div class="${ssrRenderClass([{ on: wizardStep.value >= 1, cur: wizardStep.value === 1 }, "wstep"])}" data-v-e10e0bc9>① 服务类型`);
if (editType.value) {
_push(`<span data-v-e10e0bc9> · ${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-e10e0bc9></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 2, cur: wizardStep.value === 2, disabled: !editType.value }, "wstep"])}" data-v-e10e0bc9>② 服务商`);
if (editForm.provider) {
_push(`<span data-v-e10e0bc9> · ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-e10e0bc9></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 3, cur: wizardStep.value === 3, disabled: wizardStep.value < 3 }, "wstep"])}" data-v-e10e0bc9>③ 配置</div></div>`);
if (wizardStep.value === 1) {
_push(`<!--[--><p class="text-sm text-slate-500 mb-3" data-v-e10e0bc9>请选择要接入的服务类型(每个服务归属单一类型,独立配置):</p><div class="type-grid" data-v-e10e0bc9><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<div class="${ssrRenderClass([{ on: editType.value === sc.v }, "type-card"])}" data-v-e10e0bc9><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-e10e0bc9>${ssrInterpolate(sc.short)}</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>${ssrInterpolate(sc.label)}</span></div>`);
});
_push(`<!--]--></div><!--]-->`);
} else if (wizardStep.value === 2) {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-e10e0bc9><p class="text-sm text-slate-500" data-v-e10e0bc9>为「${ssrInterpolate(scatInfo(editType.value).label)}」选择服务商:</p><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>← 上一步</button></div><div class="type-grid" data-v-e10e0bc9><!--[-->`);
ssrRenderList(templatesForType.value, (t) => {
_push(`<div class="${ssrRenderClass([{ on: selectedTemplateId.value === t.id }, "type-card"])}" data-v-e10e0bc9><span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(t.provider)}</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>${ssrInterpolate(t.name)}</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate((t.fields || []).length)} 字段</span></div>`);
});
_push(`<!--]--><div class="type-card" data-v-e10e0bc9><span class="provider-chip" style="${ssrRenderStyle({ "background": "#f1f5f9", "color": "#475569" })}" data-v-e10e0bc9>自定义</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>空白自定义</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-e10e0bc9>手动添加字段</span></div></div>`);
if (!templatesForType.value.length) {
_push(`<p class="text-xs text-slate-400 mt-2" data-v-e10e0bc9>该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。</p>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-e10e0bc9><div class="flex items-center gap-2" data-v-e10e0bc9><span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-e10e0bc9>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
if (editForm.provider) {
_push(`<span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>← 上一步</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>创建</button></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务ID * <span class="text-slate-400 text-xs" data-v-e10e0bc9>(唯一,如 tts_azure)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="tts_azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="微软 Azure TTS" data-v-e10e0bc9></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务商标识 <span class="text-slate-400 text-xs" data-v-e10e0bc9>(如 azure/alibaba)</span></span></label><input${ssrRenderAttr("value", editForm.provider)} class="input input-bordered font-mono" placeholder="azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-e10e0bc9></div></div><div class="form-control mb-4" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-e10e0bc9></div>`);
if (isVoiceCat.value) {
_push(`<div class="voice-card" data-v-e10e0bc9><div class="flex items-center justify-between" data-v-e10e0bc9><span class="text-sm font-medium text-slate-700" data-v-e10e0bc9>内置音色表</span><span class="text-[11px] text-slate-400" data-v-e10e0bc9>`);
if (voicesLoading.value) {
_push(`<!--[-->加载中…<!--]-->`);
} else if (voiceRows.value.length) {
_push(`<!--[-->${ssrInterpolate(editForm.provider)} · ${ssrInterpolate(voiceRows.value.length)} 个音色 / ${ssrInterpolate(voiceLangGroups.value.length)} 种语言<!--]-->`);
} else {
_push(`<!--[-->未覆盖 ${ssrInterpolate(editForm.provider || "该服务商")}<!--]-->`);
}
_push(`</span></div>`);
if (!voicesLoading.value && !voiceRows.value.length) {
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 内置音色表里没有这家服务商,不影响接入——Agent 配音色时手填服务商的音色 id 即可。 </p>`);
} else if (voiceRows.value.length) {
_push(`<div class="voice-lang-list" data-v-e10e0bc9><!--[-->`);
ssrRenderList(voiceLangGroups.value, (g) => {
_push(`<div class="voice-lang-row" data-v-e10e0bc9><span class="voice-lang" data-v-e10e0bc9>${ssrInterpolate(g.lang)}</span><span class="voice-ids" data-v-e10e0bc9><!--[-->`);
ssrRenderList(g.items, (v, i) => {
_push(`<span class="voice-pill"${ssrRenderAttr("title", v.name)} data-v-e10e0bc9>${ssrInterpolate(v.gender === 1 ? "♂" : v.gender === 2 ? "♀" : "·")} ${ssrInterpolate(v.voice_id)}`);
if (i === 0) {
_push(`<em data-v-e10e0bc9>默认</em>`);
} else {
_push(`<!---->`);
}
_push(`</span>`);
});
_push(`<!--]--></span></div>`);
});
_push(`<!--]--></div>`);
} else {
_push(`<!---->`);
}
if (voiceRows.value.length) {
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 这 ${ssrInterpolate(voiceLangGroups.value.length)} 种语言就是该服务能说的语言,已作为下方 languages 的预填值——通话翻译、AI 助手排查「这条链路有没有服务支持」看的就是它。 音色本身是代码里的常量表(后端 comm/ttsvoice.go),实际用哪个在 Agent 里按语言+性别选,同组第一个是默认。 </p>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>配置字段</div><div data-v-e10e0bc9>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-e10e0bc9>尚无字段,选模板自动带出或点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒 加密</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input" data-v-e10e0bc9><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-e10e0bc9>`);
}
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else if (detailMode.value === "region" && curSvc.value) {
_push(`<!--[-->`);
if (regionLoading.value) {
_push(`<div class="text-center py-10 text-slate-400" data-v-e10e0bc9>加载中...</div>`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div class="flex items-center gap-3" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-e10e0bc9>${ssrInterpolate(curRegionLabel.value)} 分叉模式</span></div></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存分叉</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-e10e0bc9> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 </div><p class="text-sm font-medium text-slate-700 mb-2" data-v-e10e0bc9>默认字段</p><div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-24 text-center" data-v-e10e0bc9>状态</th><th class="w-20 text-center" data-v-e10e0bc9>本区域不适用</th><th data-v-e10e0bc9>有效值</th></tr></thead><tbody data-v-e10e0bc9><!--[-->`);
ssrRenderList(overrideFields.value, (f, i) => {
_push(`<tr class="${ssrRenderClass({ "opacity-50": f.disabled })}" data-v-e10e0bc9><td class="font-mono text-slate-700 break-all"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-e10e0bc9>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-e10e0bc9>`);
if (f.disabled) {
_push(`<span class="disabled-badge" data-v-e10e0bc9>停用</span>`);
} else if (f.is_overridden) {
_push(`<span class="override-badge" data-v-e10e0bc9>覆盖</span>`);
} else {
_push(`<span class="inherit-badge" data-v-e10e0bc9>继承</span>`);
}
_push(`</td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs"${ssrIncludeBooleanAttr(Array.isArray(f.disabled) ? ssrLooseContain(f.disabled, null) : f.disabled) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
multiple: true,
disabled: f.disabled
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
disabled: f.disabled
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} placeholder="留空继承默认" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input"${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} data-v-e10e0bc9><option value="" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "") : ssrLooseEqual(f._input, "")) ? " selected" : ""}>继承默认</option><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "0") : ssrLooseEqual(f._input, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "1") : ssrLooseEqual(f._input, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-e10e0bc9>`);
}
_push(`</td></tr>`);
});
_push(`<!--]-->`);
if (!overrideFields.value.length) {
_push(`<tr data-v-e10e0bc9><td colspan="5" class="text-center text-slate-400 py-3" data-v-e10e0bc9>该服务尚无默认字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>${ssrInterpolate(curRegionLabel.value)} 专属字段</div><div data-v-e10e0bc9>`);
if (!extraRegionFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-2 text-center" data-v-e10e0bc9>尚无区域专属字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`);
ssrRenderList(extraRegionFields.value, (f, i) => {
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)} data-v-e10e0bc9>`);
}
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加区域专属字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</div></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="modal-overlay" style="${ssrRenderStyle([
{ "z-index": "120" },
syncVisible.value ? null : { display: "none" }
])}" data-v-e10e0bc9><div class="sync-box" data-v-e10e0bc9><div class="flex items-start gap-3 mb-4" data-v-e10e0bc9><div style="${ssrRenderStyle({ "width": "42px", "height": "42px", "background": "linear-gradient(135deg,#4f46e5,#7c3aed)", "border-radius": "13px", "display": "flex", "align-items": "center", "justify-content": "center", "flex-shrink": "0" })}" data-v-e10e0bc9><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-e10e0bc9><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" data-v-e10e0bc9></path></svg></div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>${ssrInterpolate(syncDesc.value)}</p></div></div><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-e10e0bc9>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-e10e0bc9><span class="text-xs font-semibold text-slate-500" data-v-e10e0bc9>选择目标区域</span><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>全选</button><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>清空</button></div></div><div class="sync-region-grid" data-v-e10e0bc9><!--[-->`);
ssrRenderList(syncRegionList.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-e10e0bc9><span data-v-e10e0bc9>${ssrInterpolate(r.label)}</span></label>`);
});
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-e10e0bc9>⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-e10e0bc9><button class="btn btn-ghost" data-v-e10e0bc9>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-e10e0bc9>保存并同步</button></div></div></div><div class="modal-overlay" style="${ssrRenderStyle([
{ "z-index": "130" },
tplModalVisible.value ? null : { display: "none" }
])}" data-v-e10e0bc9><div class="tpl-box" data-v-e10e0bc9>`);
if (tplView.value === "list") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>服务商模板</h3><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。</p></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 新增模板</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="tpl-list" data-v-e10e0bc9><!--[-->`);
ssrRenderList(templatesByCat.value, (g) => {
_push(`<div class="mb-3" data-v-e10e0bc9><p class="text-xs font-semibold text-slate-500 mb-1" data-v-e10e0bc9>${ssrInterpolate(g.label)}</p><!--[-->`);
ssrRenderList(g.items, (t) => {
_push(`<div class="tpl-row" data-v-e10e0bc9><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-e10e0bc9><div class="flex items-center gap-2" data-v-e10e0bc9><span class="font-semibold text-sm text-slate-800 truncate" data-v-e10e0bc9>${ssrInterpolate(t.name)}</span><span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(t.provider)}</span>`);
if (t.builtin) {
_push(`<span class="badge badge-xs badge-ghost" data-v-e10e0bc9>内置</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><p class="text-xs text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate(t.id)} · ${ssrInterpolate((t.fields || []).length)} 字段</p></div><div class="flex gap-1" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>编辑</button><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>删除</button></div></div>`);
});
_push(`<!--]--></div>`);
});
_push(`<!--]-->`);
if (!templates.value.length) {
_push(`<p class="text-xs text-slate-400 text-center py-6" data-v-e10e0bc9>暂无模板</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(tplEditing.value ? "编辑模板" : "新增模板")}</h3><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>返回</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存</button></div></div><div class="grid grid-cols-2 gap-3 mb-3" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>模板ID *</span></label><input${ssrRenderAttr("value", tplForm.id)}${ssrIncludeBooleanAttr(tplEditing.value) ? " disabled" : ""} class="input input-bordered input-sm font-mono" placeholder="tts_azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>类别 *</span></label><select class="select select-bordered select-sm" data-v-e10e0bc9><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<option${ssrRenderAttr("value", sc.v)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(tplForm.category) ? ssrLooseContain(tplForm.category, sc.v) : ssrLooseEqual(tplForm.category, sc.v)) ? " selected" : ""}>${ssrInterpolate(sc.label)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>服务商标识 *</span></label><input${ssrRenderAttr("value", tplForm.provider)} class="input input-bordered input-sm font-mono" placeholder="azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>展示名 *</span></label><input${ssrRenderAttr("value", tplForm.name)} class="input input-bordered input-sm" placeholder="微软 Azure TTS" data-v-e10e0bc9></div></div><div class="form-control mb-3" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>描述</span></label><input${ssrRenderAttr("value", tplForm.description)} class="input input-bordered input-sm" data-v-e10e0bc9></div><p class="text-sm font-medium text-slate-700 mb-1" data-v-e10e0bc9>字段</p><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "34vh" })}" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认/提示值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`);
ssrRenderList(tplFields.value, (f, i) => {
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} placeholder="可留空" data-v-e10e0bc9>`);
}
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`);
});
_push(`<!--]-->`);
if (!tplFields.value.length) {
_push(`<tr data-v-e10e0bc9><td colspan="5" class="text-center text-slate-400 py-2" data-v-e10e0bc9>尚无字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button><!--]-->`);
}
_push(`</div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/serviceconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const serviceconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e10e0bc9"]]);
export { serviceconfig as default };
//# sourceMappingURL=serviceconfig-Bq9We0Qx.mjs.map

1
apps/admin/.output/server/chunks/build/serviceconfig-Bq9We0Qx.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"serviceconfig-Bq9We0Qx.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-Bq9We0Qx.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

454
apps/admin/.output/server/chunks/build/serviceconfig-DH60tzBJ.mjs

@ -1,454 +0,0 @@
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicModel } from 'vue/server-renderer';
import { u as useApi } from './useApi-BNSkSrat.mjs';
import { u as useToast } from './useToast-MBvLaNjH.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLangOptions-CXXbv5NM.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const SCAT_MCP = 10;
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "serviceconfig",
__ssrInlineRender: true,
setup(__props) {
const REGIONS = [
{ value: 1, label: "中国" },
{ value: 2, label: "美国" },
{ value: 3, label: "东亚" },
{ value: 4, label: "东南亚" },
{ value: 5, label: "南亚" },
{ value: 6, label: "中东" },
{ value: 7, label: "欧洲" },
{ value: 8, label: "俄罗斯" },
{ value: 9, label: "非洲" },
{ value: 10, label: "南美" },
{ value: 11, label: "北美" },
{ value: 12, label: "大洋洲" },
{ value: 13, label: "巴西" },
{ value: 14, label: "印度" }
];
const SCAT = [
{ v: 1, label: "STT 语音识别", short: "STT", color: "#0369a1", bg: "#dbeafe" },
{ v: 8, label: "录音文件识别", short: "录音识别", color: "#0e7490", bg: "#cffafe" },
{ v: 2, label: "TTS 语音合成", short: "TTS", color: "#7c3aed", bg: "#ede9fe" },
{ v: 3, label: "MT 机器翻译", short: "MT", color: "#059669", bg: "#dcfce7" },
{ v: 4, label: "AST 端到端翻译", short: "AST", color: "#c2410c", bg: "#fff7ed" },
{ v: 5, label: "LLM 文本大模型", short: "文本LLM", color: "#b45309", bg: "#fef9c3" },
{ v: 9, label: "多媒体大模型", short: "多媒体LLM", color: "#9333ea", bg: "#f3e8ff" },
{ v: 7, label: "STS 端到端对话", short: "STS", color: "#be185d", bg: "#fce7f3" },
{ v: 6, label: "存储 OSS/COS", short: "存储", color: "#475569", bg: "#f1f5f9" },
{ v: 10, label: "MCP 服务", short: "MCP", color: "#0d9488", bg: "#ccfbf1" }
];
useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
function scatInfo(v) {
return SCAT.find((s) => s.v === v) || { short: "?", color: "#999", bg: "#eee", v: 0, label: "" };
}
function isMcpType() {
if (editType.value === SCAT_MCP) return true;
return !!curSvc.value && parseCats(curSvc.value.categories).includes(SCAT_MCP);
}
function parseCats(s) {
return (s || "").split(",").map((x) => parseInt(x) || 0).filter((x) => x > 0);
}
function encCount(s) {
return (s.fields || []).filter((f) => f.encrypted).length;
}
function regionChip(s) {
const rs = svcRegions.value[s.id] || [];
const names = rs.map((v) => REGIONS.find((x) => x.value === v)?.label || "区域" + v);
if (curRegion.value === 0) {
if (!rs.length) return { text: "全区域通用", cls: "plain", title: "未做任何区域分叉,各区域都用默认配置" };
return { text: rs.length + " 区域分叉", cls: "has", title: "已分叉:" + names.join("、") };
}
if (rs.includes(curRegion.value)) {
return { text: "本区域已分叉", cls: "has", title: curRegionLabel.value + "有独立的字段配置" };
}
return { text: "继承默认", cls: "plain", title: curRegionLabel.value + "未分叉,使用默认配置" };
}
const backendReady = ref(true);
const allSvcs = ref([]);
const svcRegions = ref({});
const curSvc = ref(null);
const curRegion = ref(0);
const svcModalVisible = ref(false);
const detailMode = ref("default");
const editForm = reactive({ id: "", name: "", provider: "", description: "", enable: false });
const editType = ref(0);
const editFields = ref([]);
const selectedTemplateId = ref("");
const wizardStep = ref(1);
const overrideFields = ref([]);
const extraRegionFields = ref([]);
const regionLoading = ref(false);
const templates = ref([]);
const curRegionLabel = computed(() => {
const r = REGIONS.find((x) => x.value === curRegion.value);
return r ? r.label : "区域" + curRegion.value;
});
const groupedSvcs = computed(() => {
const groups = SCAT.map((sc) => ({
...sc,
items: allSvcs.value.filter((s) => parseCats(s.categories).includes(sc.v))
})).filter((g) => g.items.length);
const unclassified = allSvcs.value.filter((s) => !parseCats(s.categories).length);
if (unclassified.length) {
groups.push({ v: 0, label: "未分类", short: "未分类", color: "#64748b", bg: "#f1f5f9", items: unclassified });
}
return groups;
});
const templatesByCat = computed(() => {
return SCAT.map((sc) => ({
cat: sc.v,
label: sc.label,
items: templates.value.filter((t) => t.category === sc.v)
})).filter((g) => g.items.length);
});
const templatesForType = computed(() => templates.value.filter((t) => t.category === editType.value));
const syncVisible = ref(false);
ref(false);
const syncDesc = ref("");
const syncScopeNote = ref("");
const syncTargets = ref([]);
const syncRegionList = computed(() => REGIONS.filter((r) => r.value !== curRegion.value));
const tplModalVisible = ref(false);
const tplView = ref("list");
const tplEditing = ref(false);
const tplForm = reactive({ id: "", category: 2, provider: "", name: "", description: "" });
const tplFields = ref([]);
return (_ctx, _push, _parent, _attrs) => {
const _component_LangSelect = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-8fc1a20c>`);
if (!backendReady.value) {
_push(`<div class="mb-4 rounded-lg px-4 py-3 text-sm" style="${ssrRenderStyle({ "background": "#fffbeb", "border": "1px solid #fde68a", "color": "#92400e" })}" data-v-8fc1a20c> ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div data-v-8fc1a20c><h2 class="text-lg font-semibold text-slate-800" data-v-8fc1a20c>第三方服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示<b data-v-8fc1a20c>全局默认</b>配置,可切换到具体应用;区域默认<b data-v-8fc1a20c>中国</b>,切换区域后点击卡片可为该区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-8fc1a20c><select class="select select-bordered select-sm" data-v-8fc1a20c><option value="" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-8fc1a20c><option${ssrRenderAttr("value", 0)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>服务商模板</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 添加服务</button></div></div>`);
if (curRegion.value !== 0) {
_push(`<div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-8fc1a20c> ✦ 当前处于「${ssrInterpolate(curRegionLabel.value)}」区域视图:点击服务卡片编辑该区域的字段分叉(覆盖值 / 停用字段 / 区域专属字段)。要改服务本身的默认配置,请切回「默认(全区域)」。 </div>`);
} else {
_push(`<!---->`);
}
if (groupedSvcs.value.length) {
_push(`<div class="flex flex-col gap-6" data-v-8fc1a20c><!--[-->`);
ssrRenderList(groupedSvcs.value, (g) => {
_push(`<section data-v-8fc1a20c><div class="flex items-center gap-2 mb-3" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: g.color, background: g.bg })}" data-v-8fc1a20c>${ssrInterpolate(g.short)}</span><h3 class="text-sm font-semibold text-slate-700" data-v-8fc1a20c>${ssrInterpolate(g.label)}</h3><span class="text-xs text-slate-400" data-v-8fc1a20c>${ssrInterpolate(g.items.length)} 个服务</span><div class="flex-1 h-px bg-slate-100 ml-2" data-v-8fc1a20c></div></div><div class="svc-grid" data-v-8fc1a20c><!--[-->`);
ssrRenderList(g.items, (s) => {
_push(`<div class="${ssrRenderClass([{ off: !s.enable }, "svc-card"])}" data-v-8fc1a20c><div class="card-head" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-8fc1a20c>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div class="head-text" data-v-8fc1a20c><div class="name-line" data-v-8fc1a20c><span class="svc-name"${ssrRenderAttr("title", s.name)} data-v-8fc1a20c>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "on" : "off", "state-chip"])}" data-v-8fc1a20c>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><p class="svc-id"${ssrRenderAttr("title", s.id)} data-v-8fc1a20c>${ssrInterpolate(s.id)}</p></div></div><p class="svc-desc"${ssrRenderAttr("title", s.description || "")} data-v-8fc1a20c>${ssrInterpolate(s.description || "—")}</p><div class="chip-row" data-v-8fc1a20c>`);
if (s.provider) {
_push(`<span class="provider-chip"${ssrRenderAttr("title", s.provider)} data-v-8fc1a20c>${ssrInterpolate(s.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="field-count" data-v-8fc1a20c>${ssrInterpolate((s.fields || []).length)} 字段</span>`);
if (encCount(s)) {
_push(`<span class="lock-badge" data-v-8fc1a20c>🔒${ssrInterpolate(encCount(s))}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="${ssrRenderClass([regionChip(s).cls, "region-chip"])}"${ssrRenderAttr("title", regionChip(s).title)} data-v-8fc1a20c>${ssrInterpolate(regionChip(s).text)}</span></div></div>`);
});
_push(`<!--]--><div class="svc-card add-card" data-v-8fc1a20c><span class="text-2xl text-slate-300" data-v-8fc1a20c>+</span><span class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>添加${ssrInterpolate(g.short)}服务</span></div></div></section>`);
});
_push(`<!--]--></div>`);
} else {
_push(`<div class="bg-white rounded-2xl border border-slate-100 shadow-sm text-center text-slate-300 py-20" data-v-8fc1a20c><div class="text-5xl mb-3" data-v-8fc1a20c>⚙️</div><p class="text-sm mb-4" data-v-8fc1a20c>尚未配置任何第三方服务</p><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 添加服务</button></div>`);
}
if (svcModalVisible.value) {
_push(`<div class="modal-overlay" data-v-8fc1a20c><div class="svc-box" data-v-8fc1a20c>`);
if (detailMode.value === "default" && curSvc.value) {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div class="flex items-center gap-3" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.id)}`);
if (editForm.provider) {
_push(`<span data-v-8fc1a20c> · 服务商 ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</p></div></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-error btn-sm btn-outline" data-v-8fc1a20c>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-8fc1a20c></div></div><div class="form-control mb-4" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-8fc1a20c></div><div class="mb-4" data-v-8fc1a20c><p class="text-sm font-medium text-slate-700 mb-2" data-v-8fc1a20c>服务类型</p>`);
if (editType.value) {
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-8fc1a20c>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-xs text-slate-500 ml-2" data-v-8fc1a20c>${ssrInterpolate(editType.value ? scatInfo(editType.value).label : "未设置")}</span><span class="text-[11px] text-slate-400 ml-2" data-v-8fc1a20c>(类型在创建时确定,不可更改)</span></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>配置字段(全区域共用)</div>`);
if (isMcpType()) {
_push(`<div class="rounded-lg px-3 py-2 mb-3 text-xs" style="${ssrRenderStyle({ "background": "#f0fdfa", "border": "1px solid #99f6e4", "color": "#0f766e" })}" data-v-8fc1a20c> ✦ MCP 服务与其他第三方服务同表存储(svc_config):这里填的 url/type/tools 为<b data-v-8fc1a20c>全区域默认</b>; 只在某些区域生效的地址,切到对应区域做分叉即可,卡片上会显示已分叉的区域数。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div data-v-8fc1a20c>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8fc1a20c>尚无字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒 加密</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input" data-v-8fc1a20c><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8fc1a20c>`);
}
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button></div><!--]-->`);
} else if (detailMode.value === "new") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>新增第三方服务</h3><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>取消</button></div><div class="wizard-steps mb-5" data-v-8fc1a20c><div class="${ssrRenderClass([{ on: wizardStep.value >= 1, cur: wizardStep.value === 1 }, "wstep"])}" data-v-8fc1a20c>① 服务类型`);
if (editType.value) {
_push(`<span data-v-8fc1a20c> · ${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-8fc1a20c></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 2, cur: wizardStep.value === 2, disabled: !editType.value }, "wstep"])}" data-v-8fc1a20c>② 服务商`);
if (editForm.provider) {
_push(`<span data-v-8fc1a20c> · ${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="wline" data-v-8fc1a20c></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 3, cur: wizardStep.value === 3, disabled: wizardStep.value < 3 }, "wstep"])}" data-v-8fc1a20c>③ 配置</div></div>`);
if (wizardStep.value === 1) {
_push(`<!--[--><p class="text-sm text-slate-500 mb-3" data-v-8fc1a20c>请选择要接入的服务类型(每个服务归属单一类型,独立配置):</p><div class="type-grid" data-v-8fc1a20c><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<div class="${ssrRenderClass([{ on: editType.value === sc.v }, "type-card"])}" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-8fc1a20c>${ssrInterpolate(sc.short)}</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>${ssrInterpolate(sc.label)}</span></div>`);
});
_push(`<!--]--></div><!--]-->`);
} else if (wizardStep.value === 2) {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-8fc1a20c><p class="text-sm text-slate-500" data-v-8fc1a20c>为「${ssrInterpolate(scatInfo(editType.value).label)}」选择服务商:</p><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>← 上一步</button></div><div class="type-grid" data-v-8fc1a20c><!--[-->`);
ssrRenderList(templatesForType.value, (t) => {
_push(`<div class="${ssrRenderClass([{ on: selectedTemplateId.value === t.id }, "type-card"])}" data-v-8fc1a20c><span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(t.provider)}</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>${ssrInterpolate(t.name)}</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate((t.fields || []).length)} 字段</span></div>`);
});
_push(`<!--]--><div class="type-card" data-v-8fc1a20c><span class="provider-chip" style="${ssrRenderStyle({ "background": "#f1f5f9", "color": "#475569" })}" data-v-8fc1a20c>自定义</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>空白自定义</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-8fc1a20c>手动添加字段</span></div></div>`);
if (!templatesForType.value.length) {
_push(`<p class="text-xs text-slate-400 mt-2" data-v-8fc1a20c>该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。</p>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-8fc1a20c><div class="flex items-center gap-2" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-8fc1a20c>${ssrInterpolate(scatInfo(editType.value).short)}</span>`);
if (editForm.provider) {
_push(`<span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(editForm.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>← 上一步</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>创建</button></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务ID * <span class="text-slate-400 text-xs" data-v-8fc1a20c>(唯一,如 tts_azure)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="tts_azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="微软 Azure TTS" data-v-8fc1a20c></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务商标识 <span class="text-slate-400 text-xs" data-v-8fc1a20c>(如 azure/alibaba)</span></span></label><input${ssrRenderAttr("value", editForm.provider)} class="input input-bordered font-mono" placeholder="azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-8fc1a20c></div></div><div class="form-control mb-4" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-8fc1a20c></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>配置字段</div><div data-v-8fc1a20c>`);
if (!editFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8fc1a20c>尚无字段,选模板自动带出或点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`);
ssrRenderList(editFields.value, (f, i) => {
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒 加密</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input" data-v-8fc1a20c><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8fc1a20c>`);
}
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else if (detailMode.value === "region" && curSvc.value) {
_push(`<!--[-->`);
if (regionLoading.value) {
_push(`<div class="text-center py-10 text-slate-400" data-v-8fc1a20c>加载中...</div>`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div class="flex items-center gap-3" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-8fc1a20c>${ssrInterpolate(curRegionLabel.value)} 分叉模式</span></div></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存分叉</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-8fc1a20c> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 </div><p class="text-sm font-medium text-slate-700 mb-2" data-v-8fc1a20c>默认字段</p><div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-24 text-center" data-v-8fc1a20c>状态</th><th class="w-20 text-center" data-v-8fc1a20c>本区域不适用</th><th data-v-8fc1a20c>有效值</th></tr></thead><tbody data-v-8fc1a20c><!--[-->`);
ssrRenderList(overrideFields.value, (f, i) => {
_push(`<tr class="${ssrRenderClass({ "opacity-50": f.disabled })}" data-v-8fc1a20c><td class="font-mono text-slate-700 break-all"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-8fc1a20c>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-8fc1a20c>`);
if (f.disabled) {
_push(`<span class="disabled-badge" data-v-8fc1a20c>停用</span>`);
} else if (f.is_overridden) {
_push(`<span class="override-badge" data-v-8fc1a20c>覆盖</span>`);
} else {
_push(`<span class="inherit-badge" data-v-8fc1a20c>继承</span>`);
}
_push(`</td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs"${ssrIncludeBooleanAttr(Array.isArray(f.disabled) ? ssrLooseContain(f.disabled, null) : f.disabled) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
multiple: true,
disabled: f.disabled
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f._input,
"onUpdate:modelValue": ($event) => f._input = $event,
disabled: f.disabled
}, null, _parent));
} else if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} placeholder="留空继承默认" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒</span><!--]-->`);
} else if (isMcpType() && f.key === "type") {
_push(`<select class="field-input"${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} data-v-8fc1a20c><option value="" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "") : ssrLooseEqual(f._input, "")) ? " selected" : ""}>继承默认</option><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "0") : ssrLooseEqual(f._input, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "1") : ssrLooseEqual(f._input, "1")) ? " selected" : ""}>SSE</option></select>`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-8fc1a20c>`);
}
_push(`</td></tr>`);
});
_push(`<!--]-->`);
if (!overrideFields.value.length) {
_push(`<tr data-v-8fc1a20c><td colspan="5" class="text-center text-slate-400 py-3" data-v-8fc1a20c>该服务尚无默认字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>${ssrInterpolate(curRegionLabel.value)} 专属字段</div><div data-v-8fc1a20c>`);
if (!extraRegionFields.value.length) {
_push(`<p class="text-xs text-slate-400 py-2 text-center" data-v-8fc1a20c>尚无区域专属字段,点击下方添加</p>`);
} else {
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`);
ssrRenderList(extraRegionFields.value, (f, i) => {
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`);
if (f.encrypted) {
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒</span><!--]-->`);
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)} data-v-8fc1a20c>`);
}
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加区域专属字段</button></div><!--]-->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</div></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="modal-overlay" style="${ssrRenderStyle([
{ "z-index": "120" },
syncVisible.value ? null : { display: "none" }
])}" data-v-8fc1a20c><div class="sync-box" data-v-8fc1a20c><div class="flex items-start gap-3 mb-4" data-v-8fc1a20c><div style="${ssrRenderStyle({ "width": "42px", "height": "42px", "background": "linear-gradient(135deg,#4f46e5,#7c3aed)", "border-radius": "13px", "display": "flex", "align-items": "center", "justify-content": "center", "flex-shrink": "0" })}" data-v-8fc1a20c><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-8fc1a20c><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" data-v-8fc1a20c></path></svg></div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>${ssrInterpolate(syncDesc.value)}</p></div></div><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-8fc1a20c>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-8fc1a20c><span class="text-xs font-semibold text-slate-500" data-v-8fc1a20c>选择目标区域</span><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>全选</button><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>清空</button></div></div><div class="sync-region-grid" data-v-8fc1a20c><!--[-->`);
ssrRenderList(syncRegionList.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-8fc1a20c><span data-v-8fc1a20c>${ssrInterpolate(r.label)}</span></label>`);
});
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-8fc1a20c>⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-8fc1a20c><button class="btn btn-ghost" data-v-8fc1a20c>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-8fc1a20c>保存并同步</button></div></div></div><div class="modal-overlay" style="${ssrRenderStyle([
{ "z-index": "130" },
tplModalVisible.value ? null : { display: "none" }
])}" data-v-8fc1a20c><div class="tpl-box" data-v-8fc1a20c>`);
if (tplView.value === "list") {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>服务商模板</h3><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。</p></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 新增模板</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="tpl-list" data-v-8fc1a20c><!--[-->`);
ssrRenderList(templatesByCat.value, (g) => {
_push(`<div class="mb-3" data-v-8fc1a20c><p class="text-xs font-semibold text-slate-500 mb-1" data-v-8fc1a20c>${ssrInterpolate(g.label)}</p><!--[-->`);
ssrRenderList(g.items, (t) => {
_push(`<div class="tpl-row" data-v-8fc1a20c><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-8fc1a20c><div class="flex items-center gap-2" data-v-8fc1a20c><span class="font-semibold text-sm text-slate-800 truncate" data-v-8fc1a20c>${ssrInterpolate(t.name)}</span><span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(t.provider)}</span>`);
if (t.builtin) {
_push(`<span class="badge badge-xs badge-ghost" data-v-8fc1a20c>内置</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><p class="text-xs text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate(t.id)} · ${ssrInterpolate((t.fields || []).length)} 字段</p></div><div class="flex gap-1" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>编辑</button><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>删除</button></div></div>`);
});
_push(`<!--]--></div>`);
});
_push(`<!--]-->`);
if (!templates.value.length) {
_push(`<p class="text-xs text-slate-400 text-center py-6" data-v-8fc1a20c>暂无模板</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><!--]-->`);
} else {
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(tplEditing.value ? "编辑模板" : "新增模板")}</h3><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>返回</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存</button></div></div><div class="grid grid-cols-2 gap-3 mb-3" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>模板ID *</span></label><input${ssrRenderAttr("value", tplForm.id)}${ssrIncludeBooleanAttr(tplEditing.value) ? " disabled" : ""} class="input input-bordered input-sm font-mono" placeholder="tts_azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>类别 *</span></label><select class="select select-bordered select-sm" data-v-8fc1a20c><!--[-->`);
ssrRenderList(SCAT, (sc) => {
_push(`<option${ssrRenderAttr("value", sc.v)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(tplForm.category) ? ssrLooseContain(tplForm.category, sc.v) : ssrLooseEqual(tplForm.category, sc.v)) ? " selected" : ""}>${ssrInterpolate(sc.label)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>服务商标识 *</span></label><input${ssrRenderAttr("value", tplForm.provider)} class="input input-bordered input-sm font-mono" placeholder="azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>展示名 *</span></label><input${ssrRenderAttr("value", tplForm.name)} class="input input-bordered input-sm" placeholder="微软 Azure TTS" data-v-8fc1a20c></div></div><div class="form-control mb-3" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>描述</span></label><input${ssrRenderAttr("value", tplForm.description)} class="input input-bordered input-sm" data-v-8fc1a20c></div><p class="text-sm font-medium text-slate-700 mb-1" data-v-8fc1a20c>字段</p><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "34vh" })}" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认/提示值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`);
ssrRenderList(tplFields.value, (f, i) => {
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`);
if (f.type === "langs") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event,
multiple: true
}, null, _parent));
} else if (f.type === "lang") {
_push(ssrRenderComponent(_component_LangSelect, {
modelValue: f.def_value,
"onUpdate:modelValue": ($event) => f.def_value = $event
}, null, _parent));
} else {
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} placeholder="可留空" data-v-8fc1a20c>`);
}
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`);
});
_push(`<!--]-->`);
if (!tplFields.value.length) {
_push(`<tr data-v-8fc1a20c><td colspan="5" class="text-center text-slate-400 py-2" data-v-8fc1a20c>尚无字段</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div><button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button><!--]-->`);
}
_push(`</div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/serviceconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const serviceconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8fc1a20c"]]);
export { serviceconfig as default };
//# sourceMappingURL=serviceconfig-DH60tzBJ.mjs.map

1
apps/admin/.output/server/chunks/build/serviceconfig-DH60tzBJ.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"serviceconfig-DH60tzBJ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-DH60tzBJ.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/serviceconfig-styles.BSTefNde.mjs

File diff suppressed because one or more lines are too long

1
apps/admin/.output/server/chunks/build/serviceconfig-styles.BSTefNde.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"serviceconfig-styles.BSTefNde.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles-1.mjs-DG7WBEIW.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles.BSTefNde.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/serviceconfig-styles.BoVuqbov.mjs

File diff suppressed because one or more lines are too long

1
apps/admin/.output/server/chunks/build/serviceconfig-styles.BoVuqbov.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"serviceconfig-styles.BoVuqbov.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles-1.mjs-DX7FZj_N.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles.BoVuqbov.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

16
apps/admin/.output/server/chunks/build/styles.mjs

@ -1,24 +1,24 @@
const interopDefault = r => r.default || r || []; const interopDefault = r => r.default || r || [];
const styles = { const styles = {
"../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Dw8OeZuk.mjs').then(interopDefault),
"../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.CsxdYB__.mjs').then(interopDefault), "../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.CsxdYB__.mjs').then(interopDefault),
"pages/agents.vue": () => import('./agents-styles.GXWAwNko.mjs').then(interopDefault), "../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Dw8OeZuk.mjs').then(interopDefault),
"pages/accounts.vue": () => import('./accounts-styles.B912aimJ.mjs').then(interopDefault), "pages/agents.vue": () => import('./agents-styles.CKxmVBlz.mjs').then(interopDefault),
"pages/calltranslate.vue": () => import('./calltranslate-styles.DejCdNUq.mjs').then(interopDefault),
"pages/apps/[name].vue": () => import('./_name_-styles.CveqLyYu.mjs').then(interopDefault), "pages/apps/[name].vue": () => import('./_name_-styles.CveqLyYu.mjs').then(interopDefault),
"pages/accounts.vue": () => import('./accounts-styles.B912aimJ.mjs').then(interopDefault),
"pages/channels.vue": () => import('./channels-styles.YMd5B91-.mjs').then(interopDefault),
"components/AppDeployTab.vue": () => import('./AppDeployTab-styles.4FdVYf2u.mjs').then(interopDefault), "components/AppDeployTab.vue": () => import('./AppDeployTab-styles.4FdVYf2u.mjs').then(interopDefault),
"components/AppModuleTab.vue": () => import('./AppModuleTab-styles._m-oVrlE.mjs').then(interopDefault), "components/AppModuleTab.vue": () => import('./AppModuleTab-styles._m-oVrlE.mjs').then(interopDefault),
"pages/channels.vue": () => import('./channels-styles.BsiooF6f.mjs').then(interopDefault), "pages/apps/index.vue": () => import('./index-styles.DdwLJn9K.mjs').then(interopDefault),
"pages/dashboard.vue": () => import('./dashboard-styles.CnnmNtqM.mjs').then(interopDefault), "pages/dashboard.vue": () => import('./dashboard-styles.CnnmNtqM.mjs').then(interopDefault),
"pages/calltranslate.vue": () => import('./calltranslate-styles.T5wE0P9E.mjs').then(interopDefault),
"components/SvcAlertBanner.vue": () => import('./SvcAlertBanner-styles.C9CJuYwV.mjs').then(interopDefault), "components/SvcAlertBanner.vue": () => import('./SvcAlertBanner-styles.C9CJuYwV.mjs').then(interopDefault),
"pages/apps/index.vue": () => import('./index-styles.DdwLJn9K.mjs').then(interopDefault), "pages/serviceconfig.vue": () => import('./serviceconfig-styles.BoVuqbov.mjs').then(interopDefault),
"pages/meettemplates.vue": () => import('./meettemplates-styles.BmUIUT9b.mjs').then(interopDefault), "pages/meettemplates.vue": () => import('./meettemplates-styles.BmUIUT9b.mjs').then(interopDefault),
"pages/meetingsvc.vue": () => import('./meetingsvc-styles.CJmYxbsV.mjs').then(interopDefault), "pages/meetingsvc.vue": () => import('./meetingsvc-styles.CJmYxbsV.mjs').then(interopDefault),
"pages/serviceconfig.vue": () => import('./serviceconfig-styles.BSTefNde.mjs').then(interopDefault),
"pages/statlog.vue": () => import('./statlog-styles.tckJcIlw.mjs').then(interopDefault), "pages/statlog.vue": () => import('./statlog-styles.tckJcIlw.mjs').then(interopDefault),
"pages/index.vue": () => import('./index-styles.D3jm1SfB.mjs').then(interopDefault),
"pages/svcinspect.vue": () => import('./svcinspect-styles.DpDXXkHn.mjs').then(interopDefault), "pages/svcinspect.vue": () => import('./svcinspect-styles.DpDXXkHn.mjs').then(interopDefault),
"pages/systemconfig.vue": () => import('./systemconfig-styles.DqxAqW2L.mjs').then(interopDefault), "pages/systemconfig.vue": () => import('./systemconfig-styles.DqxAqW2L.mjs').then(interopDefault),
"pages/index.vue": () => import('./index-styles.D3jm1SfB.mjs').then(interopDefault),
"layouts/default.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault), "layouts/default.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault),
"components/AppLoading.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault), "components/AppLoading.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault),
"components/LangSelect.vue": () => import('./LangSelect-styles.Bi81RebM.mjs').then(interopDefault) "components/LangSelect.vue": () => import('./LangSelect-styles.Bi81RebM.mjs').then(interopDefault)

498
apps/admin/.output/server/chunks/nitro/nitro.mjs

@ -4028,7 +4028,7 @@ function _expandFromEnv(value) {
const _inlineRuntimeConfig = { const _inlineRuntimeConfig = {
"app": { "app": {
"baseURL": "/", "baseURL": "/",
"buildId": "997f9c5b-5ea7-4cda-a9d8-aeefc19242d7", "buildId": "12df8bde-c7e1-423a-8c26-514d561b95ec",
"buildAssetsDir": "/_nuxt/", "buildAssetsDir": "/_nuxt/",
"cdnURL": "" "cdnURL": ""
}, },
@ -4507,432 +4507,432 @@ const plugins = [
]; ];
const assets = { const assets = {
"/_nuxt/0sLOmni-.js": { "/_nuxt/32rNuZwS.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3a13-eZAQRdcTb3px3cD5PaOgyYUIVlY\"", "etag": "\"161c-xrBRvvJwitKtFm4ME6kMTCb03hE\"",
"mtime": "2026-08-13T01:47:07.137Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 14867, "size": 5660,
"path": "../public/_nuxt/0sLOmni-.js" "path": "../public/_nuxt/32rNuZwS.js"
},
"/_nuxt/5wqzuVoy.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"a1aa-n1/aO1TgeTzWJr7THd7HOv24yw8\"",
"mtime": "2026-08-13T01:47:07.138Z",
"size": 41386,
"path": "../public/_nuxt/5wqzuVoy.js"
},
"/_nuxt/65zzvdWo.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"4376-a5DhP4TvkoH/CHRiWy4Fr83tkSQ\"",
"mtime": "2026-08-13T01:47:07.138Z",
"size": 17270,
"path": "../public/_nuxt/65zzvdWo.js"
},
"/_nuxt/8OwDPhJR.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"585c-M8/84bTqYLHGMX8pZkr/rH7WMII\"",
"mtime": "2026-08-13T01:47:07.138Z",
"size": 22620,
"path": "../public/_nuxt/8OwDPhJR.js"
}, },
"/_nuxt/7m3DvxFn.js": { "/_nuxt/7m3DvxFn.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"124-bioeqTegIgwu2Bt0lWW2BhznYbU\"", "etag": "\"124-bioeqTegIgwu2Bt0lWW2BhznYbU\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 292, "size": 292,
"path": "../public/_nuxt/7m3DvxFn.js" "path": "../public/_nuxt/7m3DvxFn.js"
}, },
"/_nuxt/9ezUT6H5.js": { "/_nuxt/B8hrjpgL.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"185e-vxHAdqDS3krDgnbZsfXiAw4/9g8\"",
"mtime": "2026-08-13T01:47:07.138Z",
"size": 6238,
"path": "../public/_nuxt/9ezUT6H5.js"
},
"/_nuxt/B-sqZCu-.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"17a-u12ZNflSfNGNd95D0aBaYGGUyAg\"", "etag": "\"2f77-hGRLgkxIGfWL9wqwhnMqjKZUu0U\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 378, "size": 12151,
"path": "../public/_nuxt/B-sqZCu-.js" "path": "../public/_nuxt/B8hrjpgL.js"
}, },
"/_nuxt/BCQoRucv.js": { "/_nuxt/BAkLwAvM.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"df-dYOIXHKOeNdOMj5/UAzkpKrXphk\"", "etag": "\"4269-pjr/t3p/PskUq8oVk9kaHBiHnxg\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 223, "size": 17001,
"path": "../public/_nuxt/BCQoRucv.js" "path": "../public/_nuxt/BAkLwAvM.js"
}, },
"/_nuxt/BEUZObrB.js": { "/_nuxt/B9UHsPCY.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"224a-cFozUPswc2XjX+s1USNihe+oW5A\"", "etag": "\"4a85-XB/BiHyyeyTsvecuDXZV5W/5NpU\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 8778, "size": 19077,
"path": "../public/_nuxt/BEUZObrB.js" "path": "../public/_nuxt/B9UHsPCY.js"
}, },
"/_nuxt/BIbETX06.js": { "/_nuxt/BDDumZok.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4269-xV3ovnNssXyVyYl1VWhbzvKZDQs\"", "etag": "\"3a63-Jrrxhzd+FXdpDhIIh8PhVeBKc3c\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 17001, "size": 14947,
"path": "../public/_nuxt/BIbETX06.js" "path": "../public/_nuxt/BDDumZok.js"
}, },
"/_nuxt/BVhsT8W5.js": { "/_nuxt/BFjsaYIf.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1bc4-KuIfIyFW4Hf5XITyAp/WYmzYyBU\"", "etag": "\"3921-D+OPwLN6nNNQJHYigEISPaUXE94\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 7108, "size": 14625,
"path": "../public/_nuxt/BVhsT8W5.js" "path": "../public/_nuxt/BFjsaYIf.js"
}, },
"/_nuxt/BY3rg8Ld.js": { "/_nuxt/BKXYxnNU.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2224-TPl6nnp/kMLo6NAC2Tec6NU7tZA\"", "etag": "\"b1f-T0SCITQ9vojZhdzmltYlixS8XH0\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 8740, "size": 2847,
"path": "../public/_nuxt/BY3rg8Ld.js" "path": "../public/_nuxt/BKXYxnNU.js"
}, },
"/_nuxt/BZjLILU0.js": { "/_nuxt/BSO50kj0.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4a85-XPdx0M94mHUk5PL6p7VsoX4C5Xs\"", "etag": "\"1a6d-ijJpGHwGc5JfTjehpr+zcNsa+8k\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.251Z",
"size": 19077, "size": 6765,
"path": "../public/_nuxt/BZjLILU0.js" "path": "../public/_nuxt/BSO50kj0.js"
}, },
"/_nuxt/B_xVdhjt.js": { "/_nuxt/Bad2XFSd.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"ab0b-YeNIILgNf+ucY7Xj6KlaKjlKuTM\"", "etag": "\"585c-i9gNA+Lz6/+GzcR98xDe8eJEX6I\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 43787, "size": 22620,
"path": "../public/_nuxt/B_xVdhjt.js" "path": "../public/_nuxt/Bad2XFSd.js"
}, },
"/_nuxt/BcKMjwDj.js": { "/_nuxt/Bm2Gu08J.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2801-fvUVP4qy37CmSVjZnF3Y3W8gtns\"", "etag": "\"ecf-IrKRWzaW+yoGSCYmqYJ1J6ASNmA\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 10241, "size": 3791,
"path": "../public/_nuxt/BcKMjwDj.js" "path": "../public/_nuxt/Bm2Gu08J.js"
}, },
"/_nuxt/Bj3tUDmW.js": { "/_nuxt/Bp86Q8ON.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3921-XZgPl+PTT0SixPRkg9VsGknUgAo\"", "etag": "\"2c52-Okm3EPDQqdhbKZSoYRrALTH4Za4\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 14625, "size": 11346,
"path": "../public/_nuxt/Bj3tUDmW.js" "path": "../public/_nuxt/Bp86Q8ON.js"
}, },
"/_nuxt/BnVZ5TlV.js": { "/_nuxt/Bs6lDwyi.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"9918-lQIHfenbqbAJBv2bDj0sjJA6C98\"", "etag": "\"3234-Cwm9RQ5AxP/1La0jug5n0cT7j9U\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 39192, "size": 12852,
"path": "../public/_nuxt/BnVZ5TlV.js" "path": "../public/_nuxt/Bs6lDwyi.js"
}, },
"/_nuxt/C8NU4rs1.js": { "/_nuxt/C9zSjFPi.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3361-PmerV4M1/9bZ/Tl7zi1ROqCHpL8\"", "etag": "\"4d74-7WqzcJl7PLfQS2x/OCRCem35xtY\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 13153, "size": 19828,
"path": "../public/_nuxt/C8NU4rs1.js" "path": "../public/_nuxt/C9zSjFPi.js"
}, },
"/_nuxt/CCZrj3X-.js": { "/_nuxt/CLee_yMD.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"820-mVtpcpK/MCdxg+wB3MsPQjMmRV8\"", "etag": "\"9918-qI9LxWAxYeI8zxNeedt4EGcTC/o\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 2080, "size": 39192,
"path": "../public/_nuxt/CCZrj3X-.js" "path": "../public/_nuxt/CLee_yMD.js"
}, },
"/_nuxt/ByX5RcOZ.js": { "/_nuxt/BZKwWPxz.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2052-f7TQeW8huAxzxP0q6ZoXjgdxkjI\"", "etag": "\"2052-wnn0WEU+27sKP3SZQqxe4vsO7Nk\"",
"mtime": "2026-08-13T01:47:07.138Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 8274, "size": 8274,
"path": "../public/_nuxt/ByX5RcOZ.js" "path": "../public/_nuxt/BZKwWPxz.js"
}, },
"/_nuxt/CP0kHyLA.js": { "/_nuxt/CUR2rcGX.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4581-8tRHwyW00m+3cwbTsvxNmktoyUc\"", "etag": "\"ab0b-E4R9IhdQAdk5AeMaurqAhUAFHv8\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 17793, "size": 43787,
"path": "../public/_nuxt/CP0kHyLA.js" "path": "../public/_nuxt/CUR2rcGX.js"
},
"/_nuxt/CYxZMiFx.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"146-T3/G3NBhyJvTBPiF94xnsQzKKEI\"",
"mtime": "2026-08-13T01:47:07.139Z",
"size": 326,
"path": "../public/_nuxt/CYxZMiFx.js"
}, },
"/_nuxt/Cx8Ep4Vy.js": { "/_nuxt/ChqjEN2N.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"d96-YqrAQ1ODzhWVibid7dZOmnfJN5w\"", "etag": "\"4376-vHiSqf3pf8EM2IRApPC4z8vzXXk\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 3478, "size": 17270,
"path": "../public/_nuxt/Cx8Ep4Vy.js" "path": "../public/_nuxt/ChqjEN2N.js"
}, },
"/_nuxt/D2MTseeT.js": { "/_nuxt/Cy52Ecc0.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1c22-ZEX5eIut77z6wdPb5mTAgqFLP4A\"", "etag": "\"1bc4-xBCYPvI5gv6mE7Yl/aqkMoqlJOM\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 7202, "size": 7108,
"path": "../public/_nuxt/D2MTseeT.js" "path": "../public/_nuxt/Cy52Ecc0.js"
}, },
"/_nuxt/D8hp1fqj.js": { "/_nuxt/D4Um3zt0.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2251-FGk0LP+A7wdkvQl+XXFHZgve2z8\"", "etag": "\"868-tvHe4V2VBT2qFlTNG2ybuXr9i5E\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 8785, "size": 2152,
"path": "../public/_nuxt/D8hp1fqj.js" "path": "../public/_nuxt/D4Um3zt0.js"
}, },
"/_nuxt/DBs5psLk.js": { "/_nuxt/D5EVRMZE.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"161c-TmN03GYF63GJVJ4HKprtJg6bUKI\"", "etag": "\"185e-l27fNSlC0ZrgHjirXS6gdQ09ZK0\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 5660, "size": 6238,
"path": "../public/_nuxt/DBs5psLk.js" "path": "../public/_nuxt/D5EVRMZE.js"
}, },
"/_nuxt/DD3V9C6_.js": { "/_nuxt/D5UrQ7F3.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"6dc-zzPSx3jvZqwehMMA49ruje/F1NI\"", "etag": "\"df-Vpe6+w4O37bZbRfKwkmhV/5uJ/0\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 1756, "size": 223,
"path": "../public/_nuxt/DD3V9C6_.js" "path": "../public/_nuxt/D5UrQ7F3.js"
}, },
"/_nuxt/DGABB0pc.js": { "/_nuxt/D8jvJLAX.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3a73-FbYCCRegjQlGVBgkW40D50oppP4\"", "etag": "\"d96-MQjqcLH6rrs5z/JBKqZTc2pky4I\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 14963, "size": 3478,
"path": "../public/_nuxt/DGABB0pc.js" "path": "../public/_nuxt/D8jvJLAX.js"
}, },
"/_nuxt/DOqVQ2Td.js": { "/_nuxt/DAaIRqev.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"b1f-ThaJxn1fC7L8sQyPhMIdn8OVf8E\"", "etag": "\"b4f7-htOh1yrKjWatpHK70CxXvGFprSc\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 2847, "size": 46327,
"path": "../public/_nuxt/DOqVQ2Td.js" "path": "../public/_nuxt/DAaIRqev.js"
}, },
"/_nuxt/DWZBXvpA.js": { "/_nuxt/DBJku-16.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2c52-agIzl/cbd/EoboY41qBJia4ROHg\"", "etag": "\"1a5-JM0kJjeh2BCFcL9bJnPZoSalMHo\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 11346, "size": 421,
"path": "../public/_nuxt/DWZBXvpA.js" "path": "../public/_nuxt/DBJku-16.js"
}, },
"/_nuxt/DMxDLVSv.js": { "/_nuxt/DBzpctzV.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"327e8-WwfFWagWXxkM7UlHllRdLdGmTh0\"", "etag": "\"2224-hFH6p9RkJNoBHW1/2i3gQ6Tnr6k\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 206824, "size": 8740,
"path": "../public/_nuxt/DMxDLVSv.js" "path": "../public/_nuxt/DBzpctzV.js"
}, },
"/_nuxt/Da7TefDj.js": { "/_nuxt/DD3V9C6_.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4d74-BmxsBU+Bqd6FcIfKWFklYa0bn0g\"", "etag": "\"6dc-zzPSx3jvZqwehMMA49ruje/F1NI\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 19828, "size": 1756,
"path": "../public/_nuxt/Da7TefDj.js" "path": "../public/_nuxt/DD3V9C6_.js"
}, },
"/_nuxt/DckJLiId.js": { "/_nuxt/DVest5s8.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3234-UjdYkPvnZUvofNP6qbxhb85xyMA\"", "etag": "\"79c-kv9yX8M0p8L1+kS2HfRlQvaTNyU\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 12852, "size": 1948,
"path": "../public/_nuxt/DckJLiId.js" "path": "../public/_nuxt/DVest5s8.js"
}, },
"/_nuxt/DhK7Qd_G.js": { "/_nuxt/DhKR78CK.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2f77-UYIjHZCLsW+nYZG4RwVKbG9NVZk\"", "etag": "\"2251-jM3FqC+OzQ4UfDhKHF4yzQLMVFw\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 12151, "size": 8785,
"path": "../public/_nuxt/DhK7Qd_G.js" "path": "../public/_nuxt/DhKR78CK.js"
}, },
"/_nuxt/DhTcVEsy.js": { "/_nuxt/DlgycG-C.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"ecf-M9kygb8vigTNRRYjzO2UtZxTcf4\"", "etag": "\"1c22-5kRKn+HliLndZwWyJpR0S30/jeM\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.252Z",
"size": 3791, "size": 7202,
"path": "../public/_nuxt/DhTcVEsy.js" "path": "../public/_nuxt/DlgycG-C.js"
}, },
"/_nuxt/DiAHNWP8.js": { "/_nuxt/EeX3zgoF.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"79c-vKB909lVddoxPnWsQzc1UI1tH3Y\"", "etag": "\"17a-z+W6VxS3hfxBETeBUy7Cf49z/kg\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 1948, "size": 378,
"path": "../public/_nuxt/DiAHNWP8.js" "path": "../public/_nuxt/EeX3zgoF.js"
}, },
"/_nuxt/Dp8jCjr5.js": { "/_nuxt/GUJrhX2S.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1a5-h5MiHXvhuIx0yPokzrlsFaj5TNk\"", "etag": "\"224a-bpuN0R00By1R+d+6CqDpIKReyK4\"",
"mtime": "2026-08-13T01:47:07.139Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 421, "size": 8778,
"path": "../public/_nuxt/Dp8jCjr5.js" "path": "../public/_nuxt/GUJrhX2S.js"
}, },
"/_nuxt/LangSelect.Dkm6e8RK.css": { "/_nuxt/LangSelect.Dkm6e8RK.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"5c3-C4SkCgblTC2eBbJlNpFMUPfZZW8\"", "etag": "\"5c3-C4SkCgblTC2eBbJlNpFMUPfZZW8\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 1475, "size": 1475,
"path": "../public/_nuxt/LangSelect.Dkm6e8RK.css" "path": "../public/_nuxt/LangSelect.Dkm6e8RK.css"
}, },
"/_nuxt/DSy_gLdM.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"327e8-ofXh22atukXGgO3BK8kUSnn4Hz8\"",
"mtime": "2026-08-14T08:52:10.252Z",
"size": 206824,
"path": "../public/_nuxt/DSy_gLdM.js"
},
"/_nuxt/NtXZuCUg.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"820-JFINM6U1uIlZATaPNOMh0nubmak\"",
"mtime": "2026-08-14T08:52:10.253Z",
"size": 2080,
"path": "../public/_nuxt/NtXZuCUg.js"
},
"/_nuxt/PN667bHc.js": { "/_nuxt/PN667bHc.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"58d-Ep7a34IW34moz3HCr5MkNYgtj58\"", "etag": "\"58d-Ep7a34IW34moz3HCr5MkNYgtj58\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 1421, "size": 1421,
"path": "../public/_nuxt/PN667bHc.js" "path": "../public/_nuxt/PN667bHc.js"
}, },
"/_nuxt/_name_.Dk1VjRtn.css": { "/_nuxt/_name_.Dk1VjRtn.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"1a66-1dxYeVhpWEHP4N42J8xWTbXC/O0\"", "etag": "\"1a66-1dxYeVhpWEHP4N42J8xWTbXC/O0\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 6758, "size": 6758,
"path": "../public/_nuxt/_name_.Dk1VjRtn.css" "path": "../public/_nuxt/_name_.Dk1VjRtn.css"
}, },
"/_nuxt/SCeBFRND.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1a6d-0xmH511pPTipVfjZXaYR5QXR8og\"",
"mtime": "2026-08-13T01:47:07.140Z",
"size": 6765,
"path": "../public/_nuxt/SCeBFRND.js"
},
"/_nuxt/accounts.maMJCEm_.css": { "/_nuxt/accounts.maMJCEm_.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"13a-JufS/36sDSbUlUvboAenUt1gceo\"", "etag": "\"13a-JufS/36sDSbUlUvboAenUt1gceo\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 314, "size": 314,
"path": "../public/_nuxt/accounts.maMJCEm_.css" "path": "../public/_nuxt/accounts.maMJCEm_.css"
}, },
"/_nuxt/agents.Ba_0YWqu.css": { "/_nuxt/agents.DyZqnyeq.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"c07-ANglF3RoGJ86deGXSxkG2l7YvKk\"", "etag": "\"ddf-1zDtq4utyLScKyjKpP5Vl0kGrH0\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 3079, "size": 3551,
"path": "../public/_nuxt/agents.Ba_0YWqu.css" "path": "../public/_nuxt/agents.DyZqnyeq.css"
},
"/_nuxt/PbGQRI_R.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"4556-5M15W7wQigCpY5s0KAT/XoDNOFU\"",
"mtime": "2026-08-14T08:52:10.253Z",
"size": 17750,
"path": "../public/_nuxt/PbGQRI_R.js"
}, },
"/_nuxt/calltranslate.CJXjjd14.css": { "/_nuxt/calltranslate.blzoinPN.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"12bf-GWJtFmiGpAneLOM6lhOF8Yczqoc\"", "etag": "\"12bf-B3jQjoB9OO2WOeybQnvfI4S0Nko\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 4799, "size": 4799,
"path": "../public/_nuxt/calltranslate.CJXjjd14.css" "path": "../public/_nuxt/calltranslate.blzoinPN.css"
}, },
"/_nuxt/channels.4kXMd4_X.css": { "/_nuxt/channels.DbnY_8Am.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"fab-xNgT+6RhPcM6WuuTH+FQBwmlYkk\"", "etag": "\"fab-YPcS9+hI/kVgbpM78C7NfxKXxDw\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 4011, "size": 4011,
"path": "../public/_nuxt/channels.4kXMd4_X.css" "path": "../public/_nuxt/channels.DbnY_8Am.css"
}, },
"/_nuxt/dashboard.BgaEnlue.css": { "/_nuxt/dashboard.BgaEnlue.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"1674-ggQ76Yns/VcHCLK1Vkz0Fy6jv9E\"", "etag": "\"1674-ggQ76Yns/VcHCLK1Vkz0Fy6jv9E\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 5748, "size": 5748,
"path": "../public/_nuxt/dashboard.BgaEnlue.css" "path": "../public/_nuxt/dashboard.BgaEnlue.css"
}, },
"/_nuxt/default.miyQHb0v.css": { "/_nuxt/default.miyQHb0v.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"b2-O1zVvoAVcFlJDT9d+8Mq5HKgSwA\"", "etag": "\"b2-O1zVvoAVcFlJDT9d+8Mq5HKgSwA\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 178, "size": 178,
"path": "../public/_nuxt/default.miyQHb0v.css" "path": "../public/_nuxt/default.miyQHb0v.css"
}, },
"/_nuxt/entry.w5iImZWY.css": {
"type": "text/css; charset=utf-8",
"etag": "\"18789-8Y1/89OiH2kiEOvq4wQICGYiKTk\"",
"mtime": "2026-08-13T01:47:07.140Z",
"size": 100233,
"path": "../public/_nuxt/entry.w5iImZWY.css"
},
"/_nuxt/error-404.Dm-MYrAh.css": { "/_nuxt/error-404.Dm-MYrAh.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"97e-/v6mv+rmcBtKGiHr88cRdQNod1s\"", "etag": "\"97e-/v6mv+rmcBtKGiHr88cRdQNod1s\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 2430, "size": 2430,
"path": "../public/_nuxt/error-404.Dm-MYrAh.css" "path": "../public/_nuxt/error-404.Dm-MYrAh.css"
}, },
"/_nuxt/entry.CF8jJHbs.css": {
"type": "text/css; charset=utf-8",
"etag": "\"187cd-vRyzLqoJe81wEX3PvtPjQxByzu4\"",
"mtime": "2026-08-14T08:52:10.253Z",
"size": 100301,
"path": "../public/_nuxt/entry.CF8jJHbs.css"
},
"/_nuxt/error-500.DM8oqBl3.css": { "/_nuxt/error-500.DM8oqBl3.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"773-fnDg7l3rvJ5f8Hx4TwZqMlSCEdI\"", "etag": "\"773-fnDg7l3rvJ5f8Hx4TwZqMlSCEdI\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 1907, "size": 1907,
"path": "../public/_nuxt/error-500.DM8oqBl3.css" "path": "../public/_nuxt/error-500.DM8oqBl3.css"
}, },
"/_nuxt/index.B6hNDrw5.css": { "/_nuxt/index.B6hNDrw5.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"9bb-/UiGUQ9ZySUPo+TfZxQFmRAajvk\"", "etag": "\"9bb-/UiGUQ9ZySUPo+TfZxQFmRAajvk\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 2491, "size": 2491,
"path": "../public/_nuxt/index.B6hNDrw5.css" "path": "../public/_nuxt/index.B6hNDrw5.css"
}, },
"/_nuxt/index.dJfvJhMb.css": { "/_nuxt/index.dJfvJhMb.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"c9d-Q0Ilc9TjkNvm89dRCjMxXNLi/MA\"", "etag": "\"c9d-Q0Ilc9TjkNvm89dRCjMxXNLi/MA\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 3229, "size": 3229,
"path": "../public/_nuxt/index.dJfvJhMb.css" "path": "../public/_nuxt/index.dJfvJhMb.css"
}, },
"/_nuxt/meetingsvc.DgYSEQUA.css": { "/_nuxt/meetingsvc.DgYSEQUA.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"15b5-ihBIWfyVoCoSGDt99wujE0L7L7g\"", "etag": "\"15b5-ihBIWfyVoCoSGDt99wujE0L7L7g\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 5557, "size": 5557,
"path": "../public/_nuxt/meetingsvc.DgYSEQUA.css" "path": "../public/_nuxt/meetingsvc.DgYSEQUA.css"
}, },
"/_nuxt/meettemplates.DBfDdqB2.css": { "/_nuxt/meettemplates.DBfDdqB2.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"d49-TVYcNFQzlREsqQOJGNzA07JhwmQ\"", "etag": "\"d49-TVYcNFQzlREsqQOJGNzA07JhwmQ\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 3401, "size": 3401,
"path": "../public/_nuxt/meettemplates.DBfDdqB2.css" "path": "../public/_nuxt/meettemplates.DBfDdqB2.css"
}, },
"/_nuxt/mgru9RGc.js": { "/_nuxt/obp34o1K.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"868-65ePWVCuVQ0IyKtnzK++WCHcieE\"", "etag": "\"146-vZ+Lzqk947J/xG6zkYNonHoix/o\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.253Z",
"size": 2152, "size": 326,
"path": "../public/_nuxt/mgru9RGc.js" "path": "../public/_nuxt/obp34o1K.js"
},
"/_nuxt/rUi_Q6ng.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2801-6guWmyoUWx7UZbs69v6PRm3gLe8\"",
"mtime": "2026-08-14T08:52:10.253Z",
"size": 10241,
"path": "../public/_nuxt/rUi_Q6ng.js"
}, },
"/_nuxt/serviceconfig.FDgyvVo4.css": { "/_nuxt/serviceconfig.UIJazB1z.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"18aa-nJ56WlUCltOoUy1f15ItNO6/344\"", "etag": "\"1e79-kEtx7BtNj5nG/cCNlmQ0QQVPn38\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.254Z",
"size": 6314, "size": 7801,
"path": "../public/_nuxt/serviceconfig.FDgyvVo4.css" "path": "../public/_nuxt/serviceconfig.UIJazB1z.css"
}, },
"/_nuxt/statlog.DNW5XZ2N.css": { "/_nuxt/statlog.DNW5XZ2N.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"4f1-Yqyu5jOcireqWKtZ+4omiemN9AU\"", "etag": "\"4f1-Yqyu5jOcireqWKtZ+4omiemN9AU\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.254Z",
"size": 1265, "size": 1265,
"path": "../public/_nuxt/statlog.DNW5XZ2N.css" "path": "../public/_nuxt/statlog.DNW5XZ2N.css"
}, },
"/_nuxt/svcinspect.H9TdRqZ5.css": { "/_nuxt/svcinspect.H9TdRqZ5.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"709-X1szhhs8D9fMma7X8BsLOY0a31w\"", "etag": "\"709-X1szhhs8D9fMma7X8BsLOY0a31w\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.254Z",
"size": 1801, "size": 1801,
"path": "../public/_nuxt/svcinspect.H9TdRqZ5.css" "path": "../public/_nuxt/svcinspect.H9TdRqZ5.css"
}, },
"/_nuxt/systemconfig.MaL8_AEr.css": { "/_nuxt/systemconfig.MaL8_AEr.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"5f6-qMlVehTadQhvspNSgWfTP18KCiE\"", "etag": "\"5f6-qMlVehTadQhvspNSgWfTP18KCiE\"",
"mtime": "2026-08-13T01:47:07.140Z", "mtime": "2026-08-14T08:52:10.254Z",
"size": 1526, "size": 1526,
"path": "../public/_nuxt/systemconfig.MaL8_AEr.css" "path": "../public/_nuxt/systemconfig.MaL8_AEr.css"
}, },
"/_nuxt/w_7nuVJ9.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"4d37-uI6WtYyte9RrNfP2CqG0a3Dfkxs\"",
"mtime": "2026-08-14T08:52:10.254Z",
"size": 19767,
"path": "../public/_nuxt/w_7nuVJ9.js"
},
"/_nuxt/yis2MfHE.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"3361-zoc94hknJ/vh8V1IAnn1tSOmBl8\"",
"mtime": "2026-08-14T08:52:10.254Z",
"size": 13153,
"path": "../public/_nuxt/yis2MfHE.js"
},
"/_nuxt/builds/latest.json": { "/_nuxt/builds/latest.json": {
"type": "application/json", "type": "application/json",
"etag": "\"47-hPoXuIdO+yRmaq0dSjzqGghVdXU\"", "etag": "\"47-yuldLdByJUJ9lY60/tuyaHtw01M\"",
"mtime": "2026-08-13T01:47:07.132Z", "mtime": "2026-08-14T08:52:10.244Z",
"size": 71, "size": 71,
"path": "../public/_nuxt/builds/latest.json" "path": "../public/_nuxt/builds/latest.json"
}, },
"/_nuxt/builds/meta/997f9c5b-5ea7-4cda-a9d8-aeefc19242d7.json": { "/_nuxt/builds/meta/12df8bde-c7e1-423a-8c26-514d561b95ec.json": {
"type": "application/json", "type": "application/json",
"etag": "\"58-G7rqsTA+nTHV5FGfgW45xqBByCY\"", "etag": "\"58-VsfNIFumgAfownB62g17vvIcau8\"",
"mtime": "2026-08-13T01:47:07.129Z", "mtime": "2026-08-14T08:52:10.241Z",
"size": 88, "size": 88,
"path": "../public/_nuxt/builds/meta/997f9c5b-5ea7-4cda-a9d8-aeefc19242d7.json" "path": "../public/_nuxt/builds/meta/12df8bde-c7e1-423a-8c26-514d561b95ec.json"
} }
}; };

216
apps/admin/app/pages/agents.vue

@ -58,7 +58,7 @@
</div> </div>
<!-- 编辑弹窗 --> <!-- 编辑弹窗 -->
<div v-show="modalOpen" class="ag-overlay" @click.self="closeModal"> <div v-show="modalOpen" class="ag-overlay">
<div class="ag-box"> <div class="ag-box">
<div class="flex items-center justify-between mb-4"> <div class="flex items-center justify-between mb-4">
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
@ -163,21 +163,40 @@
</div> </div>
<div class="mt-3"> <div class="mt-3">
<div class="flex items-center justify-between mb-1"> <div class="flex items-center justify-between mb-1">
<span class="ed-label mb-0">音色覆盖(不填则用 TTS 服务自带默认音色)</span> <span class="ed-label mb-0">音色(按语言+性别配,Agent 切语言时自动换音色)</span>
<div class="flex gap-1">
<button class="btn btn-ghost btn-xs" :disabled="!voiceTableSupported" @click="fillVoicesBySupportLangs">按支持语言补全</button>
<button class="btn btn-ghost btn-xs" @click="addVoice">+ 添加一行</button> <button class="btn btn-ghost btn-xs" @click="addVoice">+ 添加一行</button>
</div> </div>
<div v-if="!form.voice_map.length" class="text-xs text-slate-300 py-2">未设置音色覆盖</div> </div>
<p class="ed-tip mb-1">
<template v-if="!voiceSvcId">先在上方选好语音服务,这里才能列出可用音色。</template>
<template v-else-if="voiceTableSupported">
候选来自内置音色表({{ voiceProvider }});同一语言+性别有多个时默认第一个,可在下拉里换。没配到的语言走服务商默认音色。
</template>
<template v-else>「{{ voiceProvider || '该服务商' }}」不在内置音色表里,请手填服务商的音色 id。</template>
</p>
<div v-if="!form.voice_map.length" class="text-xs text-slate-300 py-2">未设置,全部走服务商默认音色</div>
<div v-for="(v, i) in form.voice_map" :key="i" class="voice-row"> <div v-for="(v, i) in form.voice_map" :key="i" class="voice-row">
<select v-model="v.language" class="select select-bordered select-xs"> <select v-model="v.language" class="select select-bordered select-xs" @change="onVoiceRowChange(v)">
<option value="">(语言)</option> <option value="">(语言)</option>
<option v-for="o in supportedLangOptions" :key="o.code" :value="o.code">{{ o.code }} · {{ o.name }}</option> <option v-for="o in supportedLangOptions" :key="o.code" :value="o.code">{{ o.code }} · {{ o.name }}</option>
</select> </select>
<select v-model.number="v.gender" class="select select-bordered select-xs"> <select v-model.number="v.gender" class="select select-bordered select-xs" @change="onVoiceRowChange(v)">
<option :value="0">不限</option> <option :value="0">不限</option>
<option :value="1">男</option> <option :value="1">男</option>
<option :value="2">女</option> <option :value="2">女</option>
</select> </select>
<input v-model="v.voice" class="input input-bordered input-xs flex-1" placeholder="音色名,如 zh-CN-XiaoxiaoNeural" /> <select
v-if="voiceTableSupported && voiceOptions(v.language, v.gender).length"
v-model="v.voice"
class="select select-bordered select-xs flex-1"
>
<option v-for="(o, oi) in voiceOptions(v.language, v.gender)" :key="o.voice_id" :value="o.voice_id">
{{ o.name }} · {{ o.voice_id }}{{ oi === 0 ? '(默认)' : '' }}
</option>
</select>
<input v-else v-model="v.voice" class="input input-bordered input-xs flex-1" placeholder="音色 id,如 zh-CN-XiaoxiaoNeural" />
<button class="btn btn-ghost btn-xs text-error" @click="form.voice_map.splice(i, 1)">删除</button> <button class="btn btn-ghost btn-xs text-error" @click="form.voice_map.splice(i, 1)">删除</button>
</div> </div>
</div> </div>
@ -204,6 +223,46 @@
</div> </div>
</section> </section>
<!-- MCP 工具:agent 能调用哪些 MCP 服务 -->
<section class="ed-section">
<div class="ed-section-title">MCP 服务(可选,给 Agent 挂工具)</div>
<p v-if="!mcpSvcs.length" class="ed-tip">还没有启用的 MCP 服务,先去「第三方服务配置 → MCP 服务」添加。</p>
<div v-else class="mcp-grid">
<label
v-for="m in mcpSvcs"
:key="m.id"
class="mcp-item"
:class="{ on: form.mcp_svc_ids.includes(m.id) }"
>
<input
type="checkbox"
class="checkbox checkbox-xs checkbox-primary"
:checked="form.mcp_svc_ids.includes(m.id)"
@change="toggleMcp(m.id)"
/>
<span class="min-w-0">
<span class="block truncate">{{ m.name }}</span>
<span class="block truncate text-[10px] text-slate-400 font-mono">{{ m.id }}</span>
</span>
</label>
</div>
</section>
<!-- 变量:提示词/开场白里的占位符 -->
<section class="ed-section">
<div class="flex items-center justify-between mb-1">
<div class="ed-section-title mb-0">变量(提示词/开场白里用 &#123;&#123;key&#125;&#125; 占位)</div>
<button class="btn btn-ghost btn-xs" @click="addVariable">+ 添加变量</button>
</div>
<div v-if="!form.variables.length" class="text-xs text-slate-300 py-2">未定义变量</div>
<div v-for="(v, i) in form.variables" :key="i" class="var-row">
<input v-model="v.key" class="input input-bordered input-xs" placeholder="key" />
<input v-model="v.label" class="input input-bordered input-xs" placeholder="展示名" />
<input v-model="v.def_value" class="input input-bordered input-xs flex-1" placeholder="默认值(客户端没传时用它)" />
<button class="btn btn-ghost btn-xs text-error" @click="form.variables.splice(i, 1)">删除</button>
</div>
</section>
<div class="ed-footer"> <div class="ed-footer">
<label class="flex items-center gap-2 text-sm cursor-pointer"> <label class="flex items-center gap-2 text-sm cursor-pointer">
<input v-model="form.enable" type="checkbox" class="checkbox checkbox-sm checkbox-primary" /> <input v-model="form.enable" type="checkbox" class="checkbox checkbox-sm checkbox-primary" />
@ -232,6 +291,7 @@ definePageMeta({ title: 'Agent 配置' })
interface SvcConfig { interface SvcConfig {
id: string id: string
name: string name: string
provider?: string
enable: boolean enable: boolean
categories: string categories: string
} }
@ -261,8 +321,24 @@ interface Agent {
support_langs: string support_langs: string
default_lang: string default_lang: string
voice_map: AgentVoice[] voice_map: AgentVoice[]
mcp_svc_ids: string[]
variables: AgentVariable[]
sort: number sort: number
} }
interface AgentVariable {
key: string
label: string
def_value: string
description: string
}
// 音色表项(后端 comm/ttsvoice.go 常量表,经 api_getttsvoices 下发)
interface TTSVoice {
provider: string
language: string
gender: number
voice_id: string
name: string
}
// ===== 常量 ===== // ===== 常量 =====
// 服务类别(与后端 svcCatXxx / serviceconfig.vue 的 SCAT 一致) // 服务类别(与后端 svcCatXxx / serviceconfig.vue 的 SCAT 一致)
@ -273,14 +349,19 @@ const CAT_AST = 4
const CAT_LLM = 5 const CAT_LLM = 5
const CAT_STS = 7 const CAT_STS = 7
const CAT_LLM_VISION = 9 // 多媒体大模型:能力是文本模型的超集,LLM 槽位一并可选 const CAT_LLM_VISION = 9 // 多媒体大模型:能力是文本模型的超集,LLM 槽位一并可选
const CAT_MCP = 10 // MCP 服务:与其他第三方服务同表,agent 可绑定若干个当工具
// Agent 类型(值与后端 comm.AgentType* 常量严格一致) // Agent 类型(值与后端 comm.AgentType* 常量严格一致)
// 只保留两种对话型:agent 用来配「对话对象」,翻译走通话翻译规则那套按语言选路,不做成 agent。
const AGENT_TYPES = [ const AGENT_TYPES = [
{ value: 'chat', label: '对话', icon: '💬', hint: 'STT → LLM → TTS 三段拼接', color: '#b45309', bg: '#fef9c3' }, { value: 'chat', label: 'chat-agent 对话', icon: '💬', hint: 'STT → LLM → TTS 三段拼接', color: '#b45309', bg: '#fef9c3' },
{ value: 'translate', label: '翻译', icon: '🧩', hint: 'STT → MT → TTS 三段拼接', color: '#059669', bg: '#dcfce7' }, { value: 'sts-chat', label: 'sts-chat-agent 端到端对话', icon: '⚡', hint: '单个 STS 服务直接完成语音对话', color: '#be185d', bg: '#fce7f3' },
{ value: 'sts-chat', label: '端到端对话', icon: '⚡', hint: '单个 STS 服务直接完成语音对话', color: '#be185d', bg: '#fce7f3' },
{ value: 'ast-translate', label: '端到端翻译', icon: '🚀', hint: '单个 AST 服务直接完成语音翻译', color: '#c2410c', bg: '#fff7ed' },
] ]
// 已下线的类型:新建选不到,但库里可能有历史行,列表得能显示出来(否则数据像凭空消失)。
const LEGACY_TYPES: Record<string, { label: string; icon: string; color: string; bg: string }> = {
translate: { label: '翻译(已下线)', icon: '🧩', color: '#64748b', bg: '#f1f5f9' },
'ast-translate': { label: '端到端翻译(已下线)', icon: '🚀', color: '#64748b', bg: '#f1f5f9' },
}
// 每种类型的服务槽位:key 对应 AgentConfig 字段名,cats 用于筛选可选服务(命中任一即可选) // 每种类型的服务槽位:key 对应 AgentConfig 字段名,cats 用于筛选可选服务(命中任一即可选)
interface Slot { key: string; slot: string; label: string; cats: number[]; color: string } interface Slot { key: string; slot: string; label: string; cats: number[]; color: string }
@ -310,16 +391,17 @@ const scopeApp = ref('')
const scopeApps = ref<string[]>([]) const scopeApps = ref<string[]>([])
const agents = ref<Agent[]>([]) const agents = ref<Agent[]>([])
const allSvcs = ref<SvcConfig[]>([]) const allSvcs = ref<SvcConfig[]>([])
const ttsVoices = ref<TTSVoice[]>([])
const modalOpen = ref(false) const modalOpen = ref(false)
const isEditing = ref(false) const isEditing = ref(false)
const submitting = ref(false) const submitting = ref(false)
function emptyForm(): Agent { function emptyForm(): Agent {
return { return {
app_name: '', id: '', name: '', type: 'translate', description: '', avatar_url: '', enable: true, app_name: '', id: '', name: '', type: 'chat', description: '', avatar_url: '', enable: true,
stt_svc_id: '', llm_svc_id: '', tts_svc_id: '', mt_svc_id: '', sts_svc_id: '', ast_svc_id: '', stt_svc_id: '', llm_svc_id: '', tts_svc_id: '', mt_svc_id: '', sts_svc_id: '', ast_svc_id: '',
system_prompt: '', gender: 0, greeting_enabled: false, greeting_text: '', system_prompt: '', gender: 0, greeting_enabled: false, greeting_text: '',
support_langs: '', default_lang: '', voice_map: [], sort: 0, support_langs: '', default_lang: '', voice_map: [], mcp_svc_ids: [], variables: [], sort: 0,
} }
} }
const form = reactive<Agent>(emptyForm()) const form = reactive<Agent>(emptyForm())
@ -333,15 +415,20 @@ const supportedLangOptions = computed(() => {
return LANG_OPTIONS.filter((o) => codes.includes(o.code)) return LANG_OPTIONS.filter((o) => codes.includes(o.code))
}) })
const grouped = computed(() => const bySort = (a: Agent, b: Agent) => (b.sort || 0) - (a.sort || 0) || (a.name || '').localeCompare(b.name || '')
AGENT_TYPES.map((t) => ({ const grouped = computed(() => {
const groups = AGENT_TYPES.map((t) => ({
...t, ...t,
type: t.value, type: t.value,
items: agents.value items: agents.value.filter((a) => a.type === t.value).sort(bySort),
.filter((a) => a.type === t.value) })).filter((g) => g.items.length)
.sort((a, b) => (b.sort || 0) - (a.sort || 0) || (a.name || '').localeCompare(b.name || '')), // 库里可能还有已下线类型的历史 agent:单独成组展示,可以看、可以停用/删除,就是不能新建。
})).filter((g) => g.items.length), for (const [type, meta] of Object.entries(LEGACY_TYPES)) {
) const items = agents.value.filter((a) => a.type === type).sort(bySort)
if (items.length) groups.push({ value: type, type, hint: '已下线的类型,仅供查看与清理', ...meta, items })
}
return groups
})
// ===== 加载 ===== // ===== 加载 =====
async function loadScopeApps() { async function loadScopeApps() {
@ -363,16 +450,87 @@ async function loadSvcs() {
async function loadAgents() { async function loadAgents() {
try { try {
const d = await webApi<{ items: Agent[] }>('getagents', { app_name: scopeApp.value }) const d = await webApi<{ items: Agent[] }>('getagents', { app_name: scopeApp.value })
agents.value = (d?.items ?? []).map((a) => ({ ...a, voice_map: a.voice_map ?? [] })) agents.value = (d?.items ?? []).map((a) => ({
...a, voice_map: a.voice_map ?? [], mcp_svc_ids: a.mcp_svc_ids ?? [], variables: a.variables ?? [],
}))
} catch (e: any) { } catch (e: any) {
error(e?.message ?? '加载失败') error(e?.message ?? '加载失败')
agents.value = [] agents.value = []
} }
} }
// 音色表来自后端常量(comm/ttsvoice.go),不是后台数据——这里只读一次用于渲染候选。
async function loadVoices() {
try {
const d = await webApi<{ voices: TTSVoice[] }>('getttsvoices', {})
ttsVoices.value = d?.voices ?? []
} catch {
ttsVoices.value = []
}
}
async function loadAll() { async function loadAll() {
await Promise.all([loadSvcs(), loadAgents()]) await Promise.all([loadSvcs(), loadAgents()])
} }
// ===== 音色 =====
// 语音输出用的是哪个服务:对话类是 TTS,端到端对话由 STS 服务自己合成。
const voiceSvcId = computed(() => (form.type === 'sts-chat' ? form.sts_svc_id : form.tts_svc_id))
const voiceProvider = computed(() => allSvcs.value.find((s) => s.id === voiceSvcId.value)?.provider ?? '')
// 该服务商是否在内置音色表里:不在就退回手填(火山/OpenAI 等音色表没覆盖,不能把选择框变成死路)
const voiceTableSupported = computed(() => !!voiceProvider.value && ttsVoices.value.some((v) => v.provider === voiceProvider.value))
// 某(语言,性别)下的候选音色,顺序即优先级,第一个是默认——与后端 comm.PickVoice 口径一致
function voiceOptions(language: string, gender: number): TTSVoice[] {
const provider = voiceProvider.value
if (!provider || !language) return []
const base = (language.split('-')[0] || '').toLowerCase()
const hit = ttsVoices.value.filter((v) => {
if (v.provider !== provider) return false
if (gender && v.gender !== gender) return false
return v.language.toLowerCase() === language.toLowerCase()
})
if (hit.length) return hit
// 语言退化到主语言子标签(zh → zh-CN),绝不跨语言兜底
return ttsVoices.value.filter((v) => {
if (v.provider !== provider) return false
if (gender && v.gender !== gender) return false
return (v.language.split('-')[0] || '').toLowerCase() === base
})
}
function defaultVoiceOf(language: string, gender: number): string {
return voiceOptions(language, gender)[0]?.voice_id ?? ''
}
// 语言/性别变了就把音色重挑一个默认值(原值若仍在候选里则保留,避免覆盖运营的选择)
function onVoiceRowChange(v: AgentVoice) {
const opts = voiceOptions(v.language, v.gender)
if (!opts.length) return
if (!v.voice || !opts.some((o) => o.voice_id === v.voice)) v.voice = opts[0].voice_id
}
// 按「支持语言 × agent 性别」一键补全:每种语言取候选里的第一个,已配过的不动
function fillVoicesBySupportLangs() {
const codes = (form.support_langs || '').split(',').map((x) => x.trim()).filter(Boolean)
if (!codes.length) { error('请先选择支持语言'); return }
let added = 0
for (const code of codes) {
if (form.voice_map.some((v) => v.language === code && v.gender === form.gender)) continue
const voice = defaultVoiceOf(code, form.gender)
if (!voice) continue
form.voice_map.push({ language: code, gender: form.gender, voice })
added++
}
added ? success(`已补全 ${added} 种语言的默认音色`) : success('已是最新,无需补全')
}
// ===== MCP 绑定 =====
const mcpSvcs = computed(() => svcsByCats([CAT_MCP]))
function toggleMcp(id: string) {
const i = form.mcp_svc_ids.indexOf(id)
i >= 0 ? form.mcp_svc_ids.splice(i, 1) : form.mcp_svc_ids.push(id)
}
// ===== 变量 =====
function addVariable() {
form.variables.push({ key: '', label: '', def_value: '', description: '' })
}
// ===== 服务 ===== // ===== 服务 =====
function svcCats(s: SvcConfig): number[] { function svcCats(s: SvcConfig): number[] {
return (s.categories || '').split(',').map(Number) return (s.categories || '').split(',').map(Number)
@ -402,7 +560,11 @@ function startAdd() {
modalOpen.value = true modalOpen.value = true
} }
function startEdit(a: Agent) { function startEdit(a: Agent) {
Object.assign(form, emptyForm(), a, { voice_map: (a.voice_map ?? []).map((v) => ({ ...v })) }) Object.assign(form, emptyForm(), a, {
voice_map: (a.voice_map ?? []).map((v) => ({ ...v })),
mcp_svc_ids: [...(a.mcp_svc_ids ?? [])],
variables: (a.variables ?? []).map((v) => ({ ...v })),
})
isEditing.value = true isEditing.value = true
modalOpen.value = true modalOpen.value = true
} }
@ -410,7 +572,8 @@ function closeModal() {
modalOpen.value = false modalOpen.value = false
} }
function addVoice() { function addVoice() {
form.voice_map.push({ language: form.default_lang || '', gender: 0, voice: '' }) const lang = form.default_lang || ''
form.voice_map.push({ language: lang, gender: form.gender, voice: defaultVoiceOf(lang, form.gender) })
} }
async function save() { async function save() {
@ -439,6 +602,8 @@ async function save() {
;(payload as any)[s.key] = (form as any)[s.key] ;(payload as any)[s.key] = (form as any)[s.key]
} }
payload.voice_map = form.voice_map.filter((v) => v.language && v.voice) payload.voice_map = form.voice_map.filter((v) => v.language && v.voice)
payload.mcp_svc_ids = form.mcp_svc_ids.filter(Boolean)
payload.variables = form.variables.filter((v) => (v.key || '').trim())
await webApi(isEditing.value ? 'updateagent' : 'addagent', payload) await webApi(isEditing.value ? 'updateagent' : 'addagent', payload)
success('保存成功') success('保存成功')
closeModal() closeModal()
@ -459,7 +624,7 @@ function delAgent(a: Agent) {
onMounted(async () => { onMounted(async () => {
await loadScopeApps() await loadScopeApps()
await loadAll() await Promise.all([loadAll(), loadVoices()])
}) })
</script> </script>
@ -497,6 +662,11 @@ onMounted(async () => {
.stage-tag { display: inline-block; font-size: 10px; font-weight: 700; padding: 1px 7px; border-radius: 5px; color: #fff; vertical-align: middle; } .stage-tag { display: inline-block; font-size: 10px; font-weight: 700; padding: 1px 7px; border-radius: 5px; color: #fff; vertical-align: middle; }
.voice-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; } .voice-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.var-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.mcp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px; }
.mcp-item { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 7px 10px; border: 1.5px solid #e2e8f0; border-radius: 9px; font-size: 12.5px; color: #475569; cursor: pointer; transition: all .15s; }
.mcp-item:hover { border-color: #c7d2fe; background: #f8fafc; }
.mcp-item.on { border-color: #6366f1; background: #eef2ff; color: #4338ca; }
.ed-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 14px; border-top: 1px solid #eef2f7; } .ed-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 14px; border-top: 1px solid #eef2f7; }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save