Browse Source

上传新版本管理后台

main
liwei1dao 2 months ago
parent
commit
e270cf89b6
  1. 4
      apps/admin/.nuxt/imports.d.ts
  2. 1
      apps/admin/.nuxt/manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json
  3. 4
      apps/admin/.nuxt/nuxt.d.ts
  4. 4
      apps/admin/.nuxt/nuxt.node.d.ts
  5. 4
      apps/admin/.nuxt/tailwind/postcss.mjs
  6. 4
      apps/admin/.nuxt/tsconfig.app.json
  7. 2
      apps/admin/.nuxt/tsconfig.json
  8. 2
      apps/admin/.nuxt/tsconfig.shared.json
  9. 2
      apps/admin/.nuxt/types/build.d.ts
  10. 13
      apps/admin/.nuxt/types/imports.d.ts
  11. 4
      apps/admin/.nuxt/types/layouts.d.ts
  12. 4
      apps/admin/.nuxt/types/nitro-imports.d.ts
  13. 9
      apps/admin/.nuxt/types/plugins.d.ts
  14. 2
      apps/admin/.output/nitro.json
  15. 1
      apps/admin/.output/public/_nuxt/-jnCp83s.js
  16. 1
      apps/admin/.output/public/_nuxt/0WNSFMX1.js
  17. 2
      apps/admin/.output/public/_nuxt/B28BcwCz.js
  18. 2
      apps/admin/.output/public/_nuxt/BOVc_R-F.js
  19. 1
      apps/admin/.output/public/_nuxt/BPgWG32Q.js
  20. 2
      apps/admin/.output/public/_nuxt/BSFY2Kep.js
  21. 4
      apps/admin/.output/public/_nuxt/BSpPV7NB.js
  22. 1
      apps/admin/.output/public/_nuxt/BWhTtyw-.js
  23. 2
      apps/admin/.output/public/_nuxt/BfiStvNk.js
  24. 2
      apps/admin/.output/public/_nuxt/BtEuBlBw.js
  25. 2
      apps/admin/.output/public/_nuxt/CEsBRmS9.js
  26. 2
      apps/admin/.output/public/_nuxt/CFXePYDs.js
  27. 1
      apps/admin/.output/public/_nuxt/CSQN7OHo.js
  28. 2
      apps/admin/.output/public/_nuxt/CSir_6Sc.js
  29. 2
      apps/admin/.output/public/_nuxt/CTIvguo-.js
  30. 1
      apps/admin/.output/public/_nuxt/CZJGstC3.js
  31. 2
      apps/admin/.output/public/_nuxt/CmHlPuQb.js
  32. 2
      apps/admin/.output/public/_nuxt/CyIH3Sn4.js
  33. 2
      apps/admin/.output/public/_nuxt/CzRv6c7P.js
  34. 1
      apps/admin/.output/public/_nuxt/D0tNFWGx.js
  35. 2
      apps/admin/.output/public/_nuxt/D0vUT4uH.js
  36. 1
      apps/admin/.output/public/_nuxt/D1efUY0c.js
  37. 2
      apps/admin/.output/public/_nuxt/D7SVvy69.js
  38. 1
      apps/admin/.output/public/_nuxt/DA9Dlh7r.js
  39. 2
      apps/admin/.output/public/_nuxt/DCtqoj8h.js
  40. 2
      apps/admin/.output/public/_nuxt/DiInGhGc.js
  41. 1
      apps/admin/.output/public/_nuxt/Dm8P2zvb.js
  42. 6
      apps/admin/.output/public/_nuxt/Dv-LAQo6.js
  43. 1
      apps/admin/.output/public/_nuxt/DzMPECf6.js
  44. 2
      apps/admin/.output/public/_nuxt/Ge7z-opa.js
  45. 2
      apps/admin/.output/public/_nuxt/HFcFZ41D.js
  46. 1
      apps/admin/.output/public/_nuxt/LangSelect.Dkm6e8RK.css
  47. 2
      apps/admin/.output/public/_nuxt/N6ePFfck.js
  48. 2
      apps/admin/.output/public/_nuxt/OcSe_OeH.js
  49. 2
      apps/admin/.output/public/_nuxt/RjO_r9CD.js
  50. 8
      apps/admin/.output/public/_nuxt/YYaFY5m9.js
  51. 2
      apps/admin/.output/public/_nuxt/_name_.B5yFMG3g.css
  52. 1
      apps/admin/.output/public/_nuxt/agents.-kjpROzC.css
  53. 2
      apps/admin/.output/public/_nuxt/builds/latest.json
  54. 1
      apps/admin/.output/public/_nuxt/builds/meta/671440d9-9ac2-4158-bbf2-60c5639d616e.json
  55. 1
      apps/admin/.output/public/_nuxt/builds/meta/a9121ad7-d4b4-4265-bf91-57f220ed7baa.json
  56. 1
      apps/admin/.output/public/_nuxt/calltranslate.B6r4Q8-j.css
  57. 1
      apps/admin/.output/public/_nuxt/calltranslate.CJXjjd14.css
  58. 1
      apps/admin/.output/public/_nuxt/channels.4kXMd4_X.css
  59. 1
      apps/admin/.output/public/_nuxt/entry.B8AmFJkM.css
  60. 1
      apps/admin/.output/public/_nuxt/entry.CYb1FIZ0.css
  61. 2
      apps/admin/.output/public/_nuxt/mz7Huk5H.js
  62. 1
      apps/admin/.output/public/_nuxt/serviceconfig.C7KF_6ms.css
  63. 1
      apps/admin/.output/public/_nuxt/serviceconfig.D1-cnJwZ.css
  64. 1
      apps/admin/.output/public/_nuxt/uis8hfUF.js
  65. 2
      apps/admin/.output/public/_nuxt/xRPLHwov.js
  66. 69
      apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs
  67. 1
      apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs.map
  68. 8
      apps/admin/.output/server/chunks/build/LangSelect-styles.Bi81RebM.mjs
  69. 1
      apps/admin/.output/server/chunks/build/LangSelect-styles.Bi81RebM.mjs.map
  70. 8
      apps/admin/.output/server/chunks/build/LangSelect-styles.C7_U3Izz.mjs
  71. 1
      apps/admin/.output/server/chunks/build/LangSelect-styles.C7_U3Izz.mjs.map
  72. 26
      apps/admin/.output/server/chunks/build/_name_-BbBzwp8c.mjs
  73. 1
      apps/admin/.output/server/chunks/build/_name_-BbBzwp8c.mjs.map
  74. 1
      apps/admin/.output/server/chunks/build/_name_-QnyK8Xx9.mjs.map
  75. 13
      apps/admin/.output/server/chunks/build/_name_-styles.DbbtUQpB.mjs
  76. 1
      apps/admin/.output/server/chunks/build/_name_-styles.DbbtUQpB.mjs.map
  77. 13
      apps/admin/.output/server/chunks/build/_name_-styles.Dz82uZcJ.mjs
  78. 1
      apps/admin/.output/server/chunks/build/_name_-styles.Dz82uZcJ.mjs.map
  79. 236
      apps/admin/.output/server/chunks/build/agents-sIgrTlD1.mjs
  80. 1
      apps/admin/.output/server/chunks/build/agents-sIgrTlD1.mjs.map
  81. 8
      apps/admin/.output/server/chunks/build/agents-styles.DrcBfQcb.mjs
  82. 1
      apps/admin/.output/server/chunks/build/agents-styles.DrcBfQcb.mjs.map
  83. 100
      apps/admin/.output/server/chunks/build/appconfig-BTmHA76P.mjs
  84. 1
      apps/admin/.output/server/chunks/build/appconfig-BTmHA76P.mjs.map
  85. 211
      apps/admin/.output/server/chunks/build/calltranslate--sRmJf-u.mjs
  86. 1
      apps/admin/.output/server/chunks/build/calltranslate--sRmJf-u.mjs.map
  87. 267
      apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs
  88. 1
      apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs.map
  89. 8
      apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs
  90. 1
      apps/admin/.output/server/chunks/build/calltranslate-styles.T5wE0P9E.mjs.map
  91. 8
      apps/admin/.output/server/chunks/build/calltranslate-styles.hpAJUqsK.mjs
  92. 1
      apps/admin/.output/server/chunks/build/calltranslate-styles.hpAJUqsK.mjs.map
  93. 274
      apps/admin/.output/server/chunks/build/channels-CRuax8yi.mjs
  94. 1
      apps/admin/.output/server/chunks/build/channels-CRuax8yi.mjs.map
  95. 8
      apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs
  96. 1
      apps/admin/.output/server/chunks/build/channels-styles.BsiooF6f.mjs.map
  97. 2
      apps/admin/.output/server/chunks/build/client.precomputed.mjs
  98. 124
      apps/admin/.output/server/chunks/build/mcpconfig-CcWVtnKl.mjs
  99. 1
      apps/admin/.output/server/chunks/build/mcpconfig-CcWVtnKl.mjs.map
  100. 21
      apps/admin/.output/server/chunks/build/mcpconfig-O3oMJUPy.mjs

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

@ -35,6 +35,6 @@ export { useApi } from '../app/composables/useApi';
export { LANG_OPTIONS, langName, LangOption } from '../app/composables/useLangOptions';
export { useLoading } from '../app/composables/useLoading';
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 { IDENTITY_LABELS, 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 { useNuxtDevTools } from '../node_modules/.pnpm/@nuxt+devtools@3.2.4_vite@7.3.5_jiti@2.7.0_terser@5.48.0_yaml@2.9.0__vue@3.5.38_typescript@5.9.3_/node_modules/@nuxt/devtools/dist/runtime/use-nuxt-devtools';
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/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json

@ -0,0 +1 @@
{}

4
apps/admin/.nuxt/nuxt.d.ts

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

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

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

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

@ -1,10 +1,10 @@
// generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 7/11/2026, 2:53:24 PM
// generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 7/29/2026, 10:48:13 PM
import "@nuxtjs/tailwindcss/config-ctx"
import configMerger from "@nuxtjs/tailwindcss/merger";
import cfg2 from "./../../tailwind.config.ts";
const config = [
{"content":{"files":["/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/components/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/components/global/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/components/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/layouts/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/plugins/**/*.{js,ts,mjs}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/composables/**/*.{js,ts,mjs}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/utils/**/*.{js,ts,mjs}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/pages/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/{A,a}pp.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/{E,e}rror.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/app.config.{js,ts,mjs}"]}},
{"content":{"files":["/Users/liwei/work/pr/starpivot/apps/admin/app/components/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/components/global/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/components/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/layouts/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/plugins/**/*.{js,ts,mjs}","/Users/liwei/work/pr/starpivot/apps/admin/app/composables/**/*.{js,ts,mjs}","/Users/liwei/work/pr/starpivot/apps/admin/app/utils/**/*.{js,ts,mjs}","/Users/liwei/work/pr/starpivot/apps/admin/app/pages/**/*.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/{A,a}pp.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/{E,e}rror.{vue,js,jsx,mjs,ts,tsx}","/Users/liwei/work/pr/starpivot/apps/admin/app/app.config.{js,ts,mjs}"]}},
{},
cfg2
].reduce((acc, curr) => configMerger(acc, curr), {});

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

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/dev.json"
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
],
"#components": [
"./components"
@ -197,7 +197,7 @@
"../node_modules/.pnpm/@nuxt+telemetry@2.8.0_@nuxt+kit@4.4.8_magicast@0.5.3_/node_modules/dist/runtime/server",
"../node_modules/.pnpm/@nuxt+telemetry@2.8.0_@nuxt+kit@4.4.8_magicast@0.5.3_/node_modules/*.*",
"../node_modules/.pnpm/@nuxt+telemetry@2.8.0_@nuxt+kit@4.4.8_magicast@0.5.3_/node_modules/dist/*.*",
"dev",
"../.output",
"../server"
],
"vueCompilerOptions": {

2
apps/admin/.nuxt/tsconfig.json

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/dev.json"
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
],
"#components": [
"./components"

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

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/dev.json"
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
],
"#build": [
"."

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

@ -12,8 +12,6 @@ declare module "#build/paths.mjs";
declare module "#build/root-component.mjs";
declare module "#build/plugins.server.mjs";
declare module "#build/test-component-wrapper.mjs";
declare module "#build/devtools/settings.mjs";
declare module "#build/runtime.vue-devtools-client.8eTWAfLgVpINiZM922q1ozAHX8JlyUM2pBnpX1z932g.js";
declare module "#build/routes.mjs";
declare module "#build/pages.mjs";
declare module "#build/router.options.mjs";

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

@ -1,8 +1,11 @@
// Generated by auto imports
export {}
declare global {
const ALL_MENU_IDS: typeof import('../../app/utils/menus').ALL_MENU_IDS
const DEFAULT_ADMIN_ACCESS: typeof import('../../app/utils/menus').DEFAULT_ADMIN_ACCESS
const IDENTITY_LABELS: typeof import('../../app/stores/auth').IDENTITY_LABELS
const LANG_OPTIONS: typeof import('../../app/composables/useLangOptions').LANG_OPTIONS
const MENU_GROUPS: typeof import('../../app/utils/menus').MENU_GROUPS
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 addRouteMiddleware: 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').addRouteMiddleware
@ -51,6 +54,7 @@ declare global {
const langName: typeof import('../../app/composables/useLangOptions').langName
const loadPayload: 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/payload').loadPayload
const markRaw: typeof import('vue').markRaw
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 nextTick: typeof import('vue').nextTick
const onActivated: typeof import('vue').onActivated
@ -125,7 +129,6 @@ declare global {
const useModel: typeof import('vue').useModel
const useNuxtApp: 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/nuxt').useNuxtApp
const useNuxtData: 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').useNuxtData
const useNuxtDevTools: typeof import('../../node_modules/.pnpm/@nuxt+devtools@3.2.4_vite@7.3.5_jiti@2.7.0_terser@5.48.0_yaml@2.9.0__vue@3.5.38_typescript@5.9.3_/node_modules/@nuxt/devtools/dist/runtime/use-nuxt-devtools').useNuxtDevTools
const usePinia: 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').usePinia
const usePreviewMode: 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/preview').usePreviewMode
const useRequestEvent: 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/ssr').useRequestEvent
@ -217,13 +220,19 @@ declare global {
// @ts-ignore
export type { ToastType, Toast } from '../../app/composables/useToast'
import('../../app/composables/useToast')
// @ts-ignore
export type { MenuItem, MenuGroup } from '../../app/utils/menus'
import('../../app/utils/menus')
}
// for vue template auto import
import { UnwrapRef } from 'vue'
declare module 'vue' {
interface ComponentCustomProperties {
readonly ALL_MENU_IDS: UnwrapRef<typeof import('../../app/utils/menus')['ALL_MENU_IDS']>
readonly DEFAULT_ADMIN_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_ADMIN_ACCESS']>
readonly IDENTITY_LABELS: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_LABELS']>
readonly LANG_OPTIONS: UnwrapRef<typeof import('../../app/composables/useLangOptions')['LANG_OPTIONS']>
readonly MENU_GROUPS: UnwrapRef<typeof import('../../app/utils/menus')['MENU_GROUPS']>
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 addRouteMiddleware: 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')['addRouteMiddleware']>
@ -272,6 +281,7 @@ declare module 'vue' {
readonly langName: UnwrapRef<typeof import('../../app/composables/useLangOptions')['langName']>
readonly loadPayload: 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/payload')['loadPayload']>
readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
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 nextTick: UnwrapRef<typeof import('vue')['nextTick']>
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
@ -346,7 +356,6 @@ declare module 'vue' {
readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
readonly useNuxtApp: 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/nuxt')['useNuxtApp']>
readonly useNuxtData: 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')['useNuxtData']>
readonly useNuxtDevTools: UnwrapRef<typeof import('../../node_modules/.pnpm/@nuxt+devtools@3.2.4_vite@7.3.5_jiti@2.7.0_terser@5.48.0_yaml@2.9.0__vue@3.5.38_typescript@5.9.3_/node_modules/@nuxt/devtools/dist/runtime/use-nuxt-devtools')['useNuxtDevTools']>
readonly usePinia: 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')['usePinia']>
readonly usePreviewMode: 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/preview')['usePreviewMode']>
readonly useRequestEvent: 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/ssr')['useRequestEvent']>

4
apps/admin/.nuxt/types/layouts.d.ts

@ -6,8 +6,8 @@ type ComponentProps<T> = T extends new(...args: any) => { $props: infer P } ? No
declare module 'nuxt/app' {
interface NuxtLayouts {
auth: ComponentProps<typeof import("/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/layouts/auth.vue").default>
default: ComponentProps<typeof import("/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/app/layouts/default.vue").default>
auth: ComponentProps<typeof import("/Users/liwei/work/pr/starpivot/apps/admin/app/layouts/auth.vue").default>
default: ComponentProps<typeof import("/Users/liwei/work/pr/starpivot/apps/admin/app/layouts/default.vue").default>
}
export type LayoutKey = keyof NuxtLayouts extends never ? string : keyof NuxtLayouts
interface PageMeta {

4
apps/admin/.nuxt/types/nitro-imports.d.ts

@ -145,5 +145,5 @@ export { getRouteRules } from 'nitropack/runtime/internal/route-rules';
export { useEvent } from 'nitropack/runtime/internal/context';
export { defineTask, runTask } from 'nitropack/runtime/internal/task';
export { defineNitroErrorHandler } from 'nitropack/runtime/internal/error/utils';
export { buildAssetsURL as __buildAssetsURL, publicAssetsURL as __publicAssetsURL } from '/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/node_modules/.pnpm/@nuxt+nitro-server@4.4.8_@babel+plugin-syntax-typescript@7.29.7_@babel+core@7.29.7__db0_5045ebd3802f96c9dd021f3300fcdf4c/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths';
export { defineAppConfig } from '/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin/node_modules/.pnpm/@nuxt+nitro-server@4.4.8_@babel+plugin-syntax-typescript@7.29.7_@babel+core@7.29.7__db0_5045ebd3802f96c9dd021f3300fcdf4c/node_modules/@nuxt/nitro-server/dist/runtime/utils/config';
export { buildAssetsURL as __buildAssetsURL, publicAssetsURL as __publicAssetsURL } from '/Users/liwei/work/pr/starpivot/apps/admin/node_modules/.pnpm/@nuxt+nitro-server@4.4.8_@babel+plugin-syntax-typescript@7.29.7_@babel+core@7.29.7__db0_5045ebd3802f96c9dd021f3300fcdf4c/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths';
export { defineAppConfig } from '/Users/liwei/work/pr/starpivot/apps/admin/node_modules/.pnpm/@nuxt+nitro-server@4.4.8_@babel+plugin-syntax-typescript@7.29.7_@babel+core@7.29.7__db0_5045ebd3802f96c9dd021f3300fcdf4c/node_modules/@nuxt/nitro-server/dist/runtime/utils/config';

9
apps/admin/.nuxt/types/plugins.d.ts

@ -10,27 +10,20 @@ type NuxtAppInjections =
InjectionType<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/plugins/revive-payload.client.js")> &
InjectionType<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/plugins/unhead.js")> &
InjectionType<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/pages/runtime/plugins/router.js")> &
InjectionType<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/plugins/browser-devtools-timing.client.js")> &
InjectionType<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/plugins/payload.client.js")> &
InjectionType<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/plugins/dev-server-logs.js")> &
InjectionType<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/plugins/navigation-repaint.client.js")> &
InjectionType<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/plugins/check-outdated-build.client.js")> &
InjectionType<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/plugins/revive-payload.server.js")> &
InjectionType<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/plugins/chunk-reload.client.js")> &
InjectionType<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/plugin.vue3.js")> &
InjectionType<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/pages/runtime/plugins/prefetch.client.js")> &
InjectionType<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/pages/runtime/plugins/check-if-page-unused.js")> &
InjectionType<typeof import("../../node_modules/.pnpm/@nuxt+devtools@3.2.4_vite@7.3.5_jiti@2.7.0_terser@5.48.0_yaml@2.9.0__vue@3.5.38_typescript@5.9.3_/node_modules/@nuxt/devtools/dist/runtime/plugins/devtools.server.js")> &
InjectionType<typeof import("../../node_modules/.pnpm/@nuxt+devtools@3.2.4_vite@7.3.5_jiti@2.7.0_terser@5.48.0_yaml@2.9.0__vue@3.5.38_typescript@5.9.3_/node_modules/@nuxt/devtools/dist/runtime/plugins/devtools.client.js")> &
InjectionType<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/plugins/warn.dev.server.js")> &
InjectionType<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/plugins/check-if-layout-used.js")> &
InjectionType<typeof import("../../app/plugins/auth.client")>
declare module '#app' {
interface NuxtApp extends NuxtAppInjections { }
interface NuxtAppLiterals {
pluginName: 'vue-devtools-client' | 'nuxt:revive-payload:client' | 'nuxt:head' | 'nuxt:router' | 'nuxt:browser-devtools-timing' | 'nuxt:payload' | 'nuxt:revive-payload:server' | 'nuxt:chunk-reload' | 'pinia' | 'nuxt:global-components' | 'nuxt:prefetch' | 'nuxt:checkIfPageUnused' | 'nuxt:checkIfLayoutUsed'
pluginName: 'nuxt:revive-payload:client' | 'nuxt:head' | 'nuxt:router' | 'nuxt:payload' | 'nuxt:revive-payload:server' | 'nuxt:chunk-reload' | 'pinia' | 'nuxt:global-components' | 'nuxt:prefetch'
}
}

2
apps/admin/.output/nitro.json

@ -1,5 +1,5 @@
{
"date": "2026-07-24T09:05:46.727Z",
"date": "2026-07-29T14:48:33.461Z",
"preset": "node-server",
"framework": {
"name": "nuxt",

1
apps/admin/.output/public/_nuxt/-jnCp83s.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/0WNSFMX1.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/VY77fqvj.js → apps/admin/.output/public/_nuxt/B28BcwCz.js

@ -1 +1 @@
import{_ as t,o,c as s,Q as c}from"./CCjf5Io-.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"./Dv-LAQo6.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/DKuebVMC.js → apps/admin/.output/public/_nuxt/BOVc_R-F.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/B7QETiRo.js → apps/admin/.output/public/_nuxt/BSFY2Kep.js

File diff suppressed because one or more lines are too long

4
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CCes3qcB.js → apps/admin/.output/public/_nuxt/BSpPV7NB.js

@ -1,4 +1,4 @@
import{g as q,B as G,P as K,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Y,s as Z,t as n,x as i,z as E,o,n as F,l as I,_ as J}from"./CCjf5Io-.js";import{u as Q}from"./C-6Qe-lq.js";import{u as W}from"./DTVGNZEd.js";import"./42htcooJ.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 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=q({__name:"statlog",setup(Ct){const{webApi:A}=Q(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=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 B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(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.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("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){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function P(){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,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./Dv-LAQo6.js";import{u as J}from"./mz7Huk5H.js";import{u as W}from"./D7SVvy69.js";import"./D0vUT4uH.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 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=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 B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(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.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("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){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){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 A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function j(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return G(()=>{v.value=p(0),m()}),K(()=>{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,[x(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,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(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),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Y,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:j},null,544),[[Z,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:P},"清空本日")])]),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,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(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",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,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",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){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,[x(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,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(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),[[M,b.value]]),x(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,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},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:j},"清空本日")])]),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,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(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",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,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",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};

1
apps/admin/.output/public/_nuxt/BWhTtyw-.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BFMExc8z.js → apps/admin/.output/public/_nuxt/BfiStvNk.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/S5V4LTkJ.js → apps/admin/.output/public/_nuxt/BtEuBlBw.js

@ -1 +1 @@
import{_ as s}from"./CA44cC15.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CCjf5Io-.js";import{u as f}from"./b15UHpcb.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"./OcSe_OeH.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./Dv-LAQo6.js";import{u as f}from"./xRPLHwov.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/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C0cd7Vyx.js → apps/admin/.output/public/_nuxt/CEsBRmS9.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/JlX4SqFM.js → apps/admin/.output/public/_nuxt/CFXePYDs.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CFPPaSCZ.js → apps/admin/.output/public/_nuxt/CSir_6Sc.js

@ -1 +1 @@
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./CCjf5Io-.js";const A={class:"login-bg flex items-center justify-center px-4"},z={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"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({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 f(){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",z,[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:_(f,["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),[[g,o.account]])]),e("div",D,[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),[[g,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=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default};
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./Dv-LAQo6.js";const A={class:"login-bg flex items-center justify-center px-4"},z={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"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({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 f(){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",z,[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:_(f,["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),[[g,o.account]])]),e("div",D,[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),[[g,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=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default};

2
apps/admin/.output/public/_nuxt/D3KKJ_NK.js → apps/admin/.output/public/_nuxt/CTIvguo-.js

File diff suppressed because one or more lines are too long

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

@ -0,0 +1 @@
import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./Dv-LAQo6.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={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"},A=["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",z,[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,A))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _};

2
apps/admin/.output/public/_nuxt/-Au2A1Cv.js → apps/admin/.output/public/_nuxt/CmHlPuQb.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/swrhJgBy.js → apps/admin/.output/public/_nuxt/CyIH3Sn4.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/C8IUv0mA.js → apps/admin/.output/public/_nuxt/CzRv6c7P.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/42htcooJ.js → apps/admin/.output/public/_nuxt/D0vUT4uH.js

@ -1 +1 @@
import{e as f,a9 as p,aa as c,z as r}from"./CCjf5Io-.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u};
import{e as f,a9 as p,aa as c,z as r}from"./Dv-LAQo6.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u};

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DTVGNZEd.js → apps/admin/.output/public/_nuxt/D7SVvy69.js

@ -1 +1 @@
import{a as u}from"./42htcooJ.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},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{a as u}from"./D0vUT4uH.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},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};

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

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/1800ei7D.js → apps/admin/.output/public/_nuxt/DCtqoj8h.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DgtG1GpI.js → apps/admin/.output/public/_nuxt/DiInGhGc.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

6
apps/admin/.output/public/_nuxt/CCjf5Io-.js → apps/admin/.output/public/_nuxt/Dv-LAQo6.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BhbTh2Nc.js → apps/admin/.output/public/_nuxt/Ge7z-opa.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CWpRLpao.js → apps/admin/.output/public/_nuxt/HFcFZ41D.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/LangSelect.Dkm6e8RK.css

@ -0,0 +1 @@
.lang-select[data-v-4903af59]{font-size:12px}.lang-chips[data-v-4903af59]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px;min-height:22px}.lang-disabled[data-v-4903af59]{opacity:.5;pointer-events:none}.lang-chip[data-v-4903af59]{display:inline-flex;align-items:center;gap:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:9999px}.lang-chip-name[data-v-4903af59],.lang-x[data-v-4903af59]{color:#a78bfa;margin-left:3px}.lang-x[data-v-4903af59]{font-weight:700;line-height:1}.lang-x[data-v-4903af59]:hover{color:#6d28d9}.lang-empty[data-v-4903af59]{font-size:11px;color:#94a3b8}.lang-dd[data-v-4903af59]{position:relative}.lang-dd-sum[data-v-4903af59]{cursor:pointer;font-size:12px;color:#7c3aed;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.lang-dd-sum[data-v-4903af59]::-webkit-details-marker{display:none}.lang-dd-panel[data-v-4903af59]{position:absolute;z-index:30;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 8px 24px #0f172a24;padding:6px;max-height:260px;overflow-y:auto;width:230px}.lang-opt[data-v-4903af59]{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;cursor:pointer}.lang-opt[data-v-4903af59]:hover{background:#f1f5f9}.lang-opt-code[data-v-4903af59]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#334155}.lang-opt-name[data-v-4903af59]{color:#94a3b8}

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/1A4O2es5.js → apps/admin/.output/public/_nuxt/N6ePFfck.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CA44cC15.js → apps/admin/.output/public/_nuxt/OcSe_OeH.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/SwS86oeZ.js → apps/admin/.output/public/_nuxt/RjO_r9CD.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./CCjf5Io-.js";import{u as i}from"./b15UHpcb.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"./Dv-LAQo6.js";import{u as i}from"./xRPLHwov.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};

8
apps/admin/.output/public/_nuxt/vrAtns1A.js → apps/admin/.output/public/_nuxt/YYaFY5m9.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/_name_.DZJkgavl.css → apps/admin/.output/public/_nuxt/_name_.B5yFMG3g.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/agents.-kjpROzC.css

@ -0,0 +1 @@
.type-tag[data-v-463df649]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-463df649]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-463df649]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-463df649]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-463df649]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-463df649]{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-463df649]{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-463df649]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-463df649]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-463df649]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-463df649]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-463df649]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-463df649]{display:inline-block;margin-left:6px}.ed-tip[data-v-463df649]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-463df649]{color:#dc2626;font-style:normal}.type-row[data-v-463df649]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-463df649]{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-463df649]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-463df649]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-463df649]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-463df649]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-463df649]{font-size:10px;color:#94a3b8}.slot-row[data-v-463df649]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-463df649]{flex:1;min-width:0}.slot-arrow[data-v-463df649]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-463df649]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-463df649]{gap:8px;margin-bottom:6px}.ed-footer[data-v-463df649],.voice-row[data-v-463df649]{display:flex;align-items:center}.ed-footer[data-v-463df649]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-463df649]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-463df649]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-463df649]{display:none}}

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

@ -1 +1 @@
{"id":"a9121ad7-d4b4-4265-bf91-57f220ed7baa","timestamp":1784883938543}
{"id":"671440d9-9ac2-4158-bbf2-60c5639d616e","timestamp":1785336504226}

1
apps/admin/.output/public/_nuxt/builds/meta/671440d9-9ac2-4158-bbf2-60c5639d616e.json

@ -0,0 +1 @@
{"id":"671440d9-9ac2-4158-bbf2-60c5639d616e","timestamp":1785336504226,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/builds/meta/a9121ad7-d4b4-4265-bf91-57f220ed7baa.json

@ -1 +0,0 @@
{"id":"a9121ad7-d4b4-4265-bf91-57f220ed7baa","timestamp":1784883938543,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/calltranslate.B6r4Q8-j.css

@ -1 +0,0 @@
.pair-card[data-v-51f11136]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:16px;cursor:pointer;transition:all .15s}.pair-card[data-v-51f11136]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.lang-badge[data-v-51f11136]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.svc-pill[data-v-51f11136]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:8px;color:#fff}.mode-badge[data-v-51f11136]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px}.mode-pipeline[data-v-51f11136]{background:#dbeafe;color:#1e40af}.mode-e2e[data-v-51f11136]{background:#fff7ed;color:#c2410c}.editor-panel[data-v-51f11136]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.mtab[data-v-51f11136]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:10px;border:2px solid transparent;cursor:pointer;transition:all .15s;flex:1}.mtab.on[data-v-51f11136]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.sync-overlay[data-v-51f11136]{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)}.sync-box[data-v-51f11136]{background:#fff;border-radius:20px;padding:28px;width:520px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-51f11136]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-51f11136]{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-51f11136]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-51f11136]{border-color:#6366f1;background:#eef2ff;color:#4338ca}

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

@ -0,0 +1 @@
.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/channels.4kXMd4_X.css

@ -0,0 +1 @@
.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/entry.B8AmFJkM.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/entry.CYb1FIZ0.css

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/C-6Qe-lq.js → apps/admin/.output/public/_nuxt/mz7Huk5H.js

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

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

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/serviceconfig.D1-cnJwZ.css

@ -0,0 +1 @@
.svc-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:12px}.svc-card[data-v-4e0895d6]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px;cursor:pointer;transition:all .15s}.svc-card[data-v-4e0895d6]:hover{border-color:#c7d2fe;box-shadow:0 6px 18px #6366f11f;transform:translateY(-1px)}.add-card[data-v-4e0895d6]{display:flex;flex-direction:column;align-items:center;justify-content:center;border-style:dashed;border-color:#e2e8f0;background:#fafbff;min-height:120px}.add-card[data-v-4e0895d6]:hover{border-color:#a5b4fc;background:#f5f3ff}.field-count[data-v-4e0895d6]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9;color:#64748b}.line-clamp-2[data-v-4e0895d6]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.svc-logo[data-v-4e0895d6]{width:36px;height:36px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0;color:#fff;font-weight:700}.cat-chip[data-v-4e0895d6]{font-weight:700;padding:2px 7px}.cat-chip[data-v-4e0895d6],.provider-chip[data-v-4e0895d6]{display:inline-flex;font-size:10px;border-radius:6px}.provider-chip[data-v-4e0895d6]{font-weight:600;padding:1px 7px;background:#eef2ff;color:#4338ca;font-family:SF Mono,Menlo,monospace}.wizard-steps[data-v-4e0895d6]{display:flex;align-items:center;gap:8px}.wstep[data-v-4e0895d6]{font-size:12px;font-weight:600;color:#94a3b8;padding:5px 12px;border-radius:8px;background:#f1f5f9;cursor:pointer;white-space:nowrap}.wstep.on[data-v-4e0895d6]{color:#4338ca;background:#eef2ff}.wstep.cur[data-v-4e0895d6]{color:#fff;background:#6366f1}.wstep.disabled[data-v-4e0895d6]{cursor:not-allowed;opacity:.6}.wline[data-v-4e0895d6]{flex:1;height:1px;background:#e2e8f0}.type-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.type-card[data-v-4e0895d6]{display:flex;flex-direction:column;align-items:flex-start;padding:14px;border-radius:12px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;background:#fff}.type-card[data-v-4e0895d6]:hover{border-color:#c7d2fe;background:#f5f3ff}.type-card.on[data-v-4e0895d6]{border-color:#6366f1;background:#eef2ff;box-shadow:0 4px 12px #6366f11f}.lock-badge[data-v-4e0895d6]{display:inline-flex;align-items:center;gap:3px;background:#fef2f2;color:#dc2626}.inherit-badge[data-v-4e0895d6],.lock-badge[data-v-4e0895d6]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px}.inherit-badge[data-v-4e0895d6]{background:#f1f5f9;color:#94a3b8}.override-badge[data-v-4e0895d6]{background:#fef3c7;color:#b45309}.disabled-badge[data-v-4e0895d6],.override-badge[data-v-4e0895d6]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px}.disabled-badge[data-v-4e0895d6]{background:#fee2e2;color:#b91c1c}.field-input[data-v-4e0895d6]{border:1px solid #e2e8f0;border-radius:7px;padding:5px 9px;font-size:12.5px;font-family:SF Mono,Menlo,monospace;width:100%}.field-input[data-v-4e0895d6]:focus{border-color:#6366f1;box-shadow:0 0 0 3px #6366f11a;outline:none}.field-input[data-v-4e0895d6]:disabled{background:#f8fafc;color:#cbd5e1}.modal-overlay[data-v-4e0895d6]{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)}.svc-box[data-v-4e0895d6]{padding:26px;width:860px;max-width:96vw;max-height:90vh;overflow:auto}.svc-box[data-v-4e0895d6],.sync-box[data-v-4e0895d6]{background:#fff;border-radius:20px;box-shadow:0 24px 80px #0000002e}.sync-box[data-v-4e0895d6]{padding:28px;width:520px;max-width:95vw}.tpl-box[data-v-4e0895d6]{background:#fff;border-radius:20px;padding:24px;width:620px;max-width:96vw;max-height:88vh;overflow:auto;box-shadow:0 24px 80px #0000002e}.tpl-list[data-v-4e0895d6]{max-height:60vh;overflow:auto}.tpl-row[data-v-4e0895d6]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:9px;border:1px solid #eef2f7;margin-bottom:6px}.tpl-row[data-v-4e0895d6]:hover{border-color:#c7d2fe;background:#f8fafc}.sync-region-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-4e0895d6]{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-4e0895d6]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-4e0895d6]{border-color:#6366f1;background:#eef2ff;color:#4338ca}

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

@ -0,0 +1 @@
import{g as t,B as n,P as a,c as o,a as s,o as c}from"./Dv-LAQo6.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/.output/public/_nuxt/b15UHpcb.js → apps/admin/.output/public/_nuxt/xRPLHwov.js

@ -1 +1 @@
import{u as a,e as s,h as u,i as r,f as h}from"./CCjf5Io-.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"./Dv-LAQo6.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};

69
apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs

@ -0,0 +1,69 @@
import { defineComponent, computed, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr } from 'vue/server-renderer';
import { L as LANG_OPTIONS, l as langName } from './useLangOptions-DMhiAuTa.mjs';
import { _ as _export_sfc } from './server.mjs';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "LangSelect",
__ssrInlineRender: true,
props: {
modelValue: {},
multiple: { type: Boolean, default: false },
disabled: { type: Boolean, default: false },
options: { default: void 0 }
},
emits: ["update:modelValue"],
setup(__props, { emit: __emit }) {
const props = __props;
const opts = computed(() => props.options && props.options.length ? props.options : LANG_OPTIONS);
const selected = computed(
() => (props.modelValue || "").split(",").map((s) => s.trim()).filter(Boolean)
);
function nameOf(code) {
return langName(code);
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "lang-select" }, _attrs))} data-v-4903af59>`);
if (__props.multiple) {
_push(`<!--[--><div class="${ssrRenderClass([{ "lang-disabled": __props.disabled }, "lang-chips"])}" data-v-4903af59><!--[-->`);
ssrRenderList(selected.value, (code) => {
_push(`<span class="lang-chip" data-v-4903af59>${ssrInterpolate(code)}<span class="lang-chip-name" data-v-4903af59>${ssrInterpolate(nameOf(code))}</span><button type="button" class="lang-x" data-v-4903af59>×</button></span>`);
});
_push(`<!--]-->`);
if (!selected.value.length) {
_push(`<span class="lang-empty" data-v-4903af59>未选择语言</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
if (!__props.disabled) {
_push(`<details class="lang-dd" data-v-4903af59><summary class="lang-dd-sum" data-v-4903af59>+ 选择语言(已选 ${ssrInterpolate(selected.value.length)})</summary><div class="lang-dd-panel" data-v-4903af59><!--[-->`);
ssrRenderList(opts.value, (o) => {
_push(`<label class="lang-opt" data-v-4903af59><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(selected.value.includes(o.code)) ? " checked" : ""} data-v-4903af59><span class="lang-opt-code" data-v-4903af59>${ssrInterpolate(o.code)}</span><span class="lang-opt-name" data-v-4903af59>${ssrInterpolate(o.name)}</span></label>`);
});
_push(`<!--]--></div></details>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<select class="select select-bordered select-sm w-full text-xs"${ssrRenderAttr("value", __props.modelValue)}${ssrIncludeBooleanAttr(__props.disabled) ? " disabled" : ""} data-v-4903af59><option value="" data-v-4903af59>(未设置)</option><!--[-->`);
ssrRenderList(opts.value, (o) => {
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4903af59>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`);
});
_push(`<!--]--></select>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/LangSelect.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main, [["__scopeId", "data-v-4903af59"]]), { __name: "LangSelect" });
export { __nuxt_component_0 as _ };
//# sourceMappingURL=LangSelect-C_QPlcDf.mjs.map

1
apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs.map

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

8
apps/admin/.output/server/chunks/build/serviceconfig-styles-1.mjs-BjhBSOse.mjs → apps/admin/.output/server/chunks/build/LangSelect-styles.Bi81RebM.mjs

@ -1,4 +1,8 @@
const LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang = ".lang-select[data-v-4903af59]{font-size:12px}.lang-chips[data-v-4903af59]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px;min-height:22px}.lang-disabled[data-v-4903af59]{opacity:.5;pointer-events:none}.lang-chip[data-v-4903af59]{display:inline-flex;align-items:center;gap:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:9999px}.lang-chip-name[data-v-4903af59],.lang-x[data-v-4903af59]{color:#a78bfa;margin-left:3px}.lang-x[data-v-4903af59]{font-weight:700;line-height:1}.lang-x[data-v-4903af59]:hover{color:#6d28d9}.lang-empty[data-v-4903af59]{font-size:11px;color:#94a3b8}.lang-dd[data-v-4903af59]{position:relative}.lang-dd-sum[data-v-4903af59]{cursor:pointer;font-size:12px;color:#7c3aed;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.lang-dd-sum[data-v-4903af59]::-webkit-details-marker{display:none}.lang-dd-panel[data-v-4903af59]{position:absolute;z-index:30;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 8px 24px #0f172a24;padding:6px;max-height:260px;overflow-y:auto;width:230px}.lang-opt[data-v-4903af59]{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;cursor:pointer}.lang-opt[data-v-4903af59]:hover{background:#f1f5f9}.lang-opt-code[data-v-4903af59]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#334155}.lang-opt-name[data-v-4903af59]{color:#94a3b8}";
export { LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang as L };
//# sourceMappingURL=serviceconfig-styles-1.mjs-BjhBSOse.mjs.map
const LangSelectStyles_Bi81RebM = [
LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang
];
export { LangSelectStyles_Bi81RebM as default };
//# sourceMappingURL=LangSelect-styles.Bi81RebM.mjs.map

1
apps/admin/.output/server/chunks/build/LangSelect-styles.Bi81RebM.mjs.map

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

8
apps/admin/.output/server/chunks/build/LangSelect-styles.C7_U3Izz.mjs

@ -1,8 +0,0 @@
import { L as LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang } from './serviceconfig-styles-1.mjs-BjhBSOse.mjs';
const LangSelectStyles_C7_U3Izz = [
LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang
];
export { LangSelectStyles_C7_U3Izz as default };
//# sourceMappingURL=LangSelect-styles.C7_U3Izz.mjs.map

1
apps/admin/.output/server/chunks/build/LangSelect-styles.C7_U3Izz.mjs.map

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

26
apps/admin/.output/server/chunks/build/_name_-QnyK8Xx9.mjs → apps/admin/.output/server/chunks/build/_name_-BbBzwp8c.mjs

@ -427,7 +427,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const deployments = ref([]);
const envs = ref([]);
const loading = ref(false);
const tab = ref("deps");
const tab = ref(route.query.tab === "modules" ? "modules" : "deps");
const curDep = ref(0);
const deployTab = ref(null);
const okCount = computed(() => deployments.value.filter((d) => d.status !== "pending").length);
@ -471,25 +471,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
return (_ctx, _push, _parent, _attrs) => {
const _component_AppDeployTab = __nuxt_component_0;
const _component_AppModuleTab = __nuxt_component_1;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-3e1700b0><div class="flex items-center gap-2 mb-4 text-sm" data-v-3e1700b0><button class="btn btn-ghost btn-xs" data-v-3e1700b0>← 应用中心</button><span class="text-slate-300" data-v-3e1700b0>/</span><span class="font-semibold text-slate-700" data-v-3e1700b0>${ssrInterpolate(appName.value)}</span></div>`);
_push(`<div${ssrRenderAttrs(_attrs)} data-v-865381f4><div class="flex items-center gap-2 mb-4 text-sm" data-v-865381f4><button class="btn btn-ghost btn-xs" data-v-865381f4>← 应用中心</button><span class="text-slate-300" data-v-865381f4>/</span><span class="font-semibold text-slate-700" data-v-865381f4>${ssrInterpolate(appName.value)}</span></div>`);
if (loading.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-3e1700b0><span class="loading loading-spinner loading-sm" data-v-3e1700b0></span></div>`);
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-865381f4><span class="loading loading-spinner loading-sm" data-v-865381f4></span></div>`);
} else if (!product.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-3e1700b0><p class="text-slate-500" data-v-3e1700b0>找不到应用「${ssrInterpolate(appName.value)}」</p><button class="btn btn-sm mt-4" data-v-3e1700b0>返回应用中心</button></div>`);
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-865381f4><p class="text-slate-500" data-v-865381f4>找不到应用「${ssrInterpolate(appName.value)}」</p><button class="btn btn-sm mt-4" data-v-865381f4>返回应用中心</button></div>`);
} else {
_push(`<!--[--><div class="hero" data-v-3e1700b0><div class="hero-logo" data-v-3e1700b0>${ssrInterpolate((product.value.name || "?").charAt(0).toUpperCase())}</div><div class="flex-1 min-w-[240px]" data-v-3e1700b0><div class="hero-name" data-v-3e1700b0>${ssrInterpolate(product.value.name)} <span class="${ssrRenderClass([product.value.enabled ? "chip-ok" : "", "chip"])}" data-v-3e1700b0>${ssrInterpolate(product.value.enabled ? "启用" : "停用")}</span><span class="chip chip-mono" data-v-3e1700b0>🐳 ${ssrInterpolate(product.value.image_name || "未设置镜像")}</span></div><div class="text-xs text-slate-500 mt-1.5" data-v-3e1700b0>${ssrInterpolate(product.value.remark || "—")}</div></div><div class="flex gap-2" data-v-3e1700b0><button class="btn btn-sm" data-v-3e1700b0>编辑应用</button><button class="btn btn-primary btn-sm text-white" data-v-3e1700b0>+ 部署新环境</button></div></div><div class="kpis" data-v-3e1700b0><div class="kpi accent" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>部署</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(deployments.value.length)}<small data-v-3e1700b0>个区域</small></div></div><div class="kpi ok" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>已接入</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(okCount.value)}</div></div><div class="${ssrRenderClass([pendingCount.value ? "warn" : "", "kpi"])}" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>待部署</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(pendingCount.value)}</div></div><div class="kpi" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>版本分布</div><div class="kpi-v" style="${ssrRenderStyle({ "font-size": "14px", "padding-top": "5px" })}" data-v-3e1700b0>${ssrInterpolate(versionSpread.value)}</div></div></div><div class="tablist" role="tablist" data-v-3e1700b0><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "deps")} data-v-3e1700b0> 部署环境 <span class="tab-n" data-v-3e1700b0>${ssrInterpolate(deployments.value.length)}</span></button><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "modules")} data-v-3e1700b0>业务功能配置</button></div>`);
_push(`<!--[--><div class="hero" data-v-865381f4><div class="hero-logo" data-v-865381f4>${ssrInterpolate((product.value.name || "?").charAt(0).toUpperCase())}</div><div class="flex-1 min-w-[240px]" data-v-865381f4><div class="hero-name" data-v-865381f4>${ssrInterpolate(product.value.name)} <span class="${ssrRenderClass([product.value.enabled ? "chip-ok" : "", "chip"])}" data-v-865381f4>${ssrInterpolate(product.value.enabled ? "启用" : "停用")}</span><span class="chip chip-mono" data-v-865381f4>🐳 ${ssrInterpolate(product.value.image_name || "未设置镜像")}</span></div><div class="text-xs text-slate-500 mt-1.5" data-v-865381f4>${ssrInterpolate(product.value.remark || "—")}</div></div><div class="flex gap-2" data-v-865381f4><button class="btn btn-sm" data-v-865381f4>编辑应用</button><button class="btn btn-primary btn-sm text-white" data-v-865381f4>+ 部署新环境</button></div></div><div class="kpis" data-v-865381f4><div class="kpi accent" data-v-865381f4><div class="kpi-l" data-v-865381f4>部署</div><div class="kpi-v" data-v-865381f4>${ssrInterpolate(deployments.value.length)}<small data-v-865381f4>个区域</small></div></div><div class="kpi ok" data-v-865381f4><div class="kpi-l" data-v-865381f4>已接入</div><div class="kpi-v" data-v-865381f4>${ssrInterpolate(okCount.value)}</div></div><div class="${ssrRenderClass([pendingCount.value ? "warn" : "", "kpi"])}" data-v-865381f4><div class="kpi-l" data-v-865381f4>待部署</div><div class="kpi-v" data-v-865381f4>${ssrInterpolate(pendingCount.value)}</div></div><div class="kpi" data-v-865381f4><div class="kpi-l" data-v-865381f4>版本分布</div><div class="kpi-v" style="${ssrRenderStyle({ "font-size": "14px", "padding-top": "5px" })}" data-v-865381f4>${ssrInterpolate(versionSpread.value)}</div></div></div><div class="tablist" role="tablist" data-v-865381f4><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "deps")} data-v-865381f4> 部署环境 <span class="tab-n" data-v-865381f4>${ssrInterpolate(deployments.value.length)}</span></button><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "modules")} data-v-865381f4>业务功能配置</button></div>`);
if (tab.value === "modules") {
_push(`<div class="depbar" data-v-3e1700b0><span class="text-xs text-slate-500 font-semibold shrink-0" data-v-3e1700b0>配置目标</span><div class="flex gap-1.5 flex-wrap" data-v-3e1700b0><!--[-->`);
_push(`<div class="depbar" data-v-865381f4><span class="text-xs text-slate-500 font-semibold shrink-0" data-v-865381f4>配置目标</span><div class="flex gap-1.5 flex-wrap" data-v-865381f4><!--[-->`);
ssrRenderList(deployments.value, (d) => {
_push(`<button class="depchip"${ssrRenderAttr("aria-pressed", curDep.value === d.id)}${ssrRenderAttr("title", d.status === "pending" ? "待部署:业务库可能还未就绪" : "")} data-v-3e1700b0><span class="${ssrRenderClass([{ pending: d.status === "pending" }, "dot"])}" data-v-3e1700b0></span> ${ssrInterpolate(d.region || d.name || "部署#" + d.id)} <span class="text-[10.5px] text-slate-400 font-mono" data-v-3e1700b0>#${ssrInterpolate(d.id)}</span></button>`);
_push(`<button class="depchip"${ssrRenderAttr("aria-pressed", curDep.value === d.id)}${ssrRenderAttr("title", d.status === "pending" ? "待部署:业务库可能还未就绪" : "")} data-v-865381f4><span class="${ssrRenderClass([{ pending: d.status === "pending" }, "dot"])}" data-v-865381f4></span> ${ssrInterpolate(d.region || d.name || "部署#" + d.id)} <span class="text-[10.5px] text-slate-400 font-mono" data-v-865381f4>#${ssrInterpolate(d.id)}</span></button>`);
});
_push(`<!--]-->`);
if (!deployments.value.length) {
_push(`<span class="text-xs text-slate-400 py-1" data-v-3e1700b0>该应用还没有部署,无处存放配置</span>`);
_push(`<span class="text-xs text-slate-400 py-1" data-v-865381f4>该应用还没有部署,无处存放配置</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><span class="text-[11px] text-slate-400 ml-auto" data-v-3e1700b0>配置存在该部署自己的业务库里,各区域互不影响</span></div>`);
_push(`</div><span class="text-[11px] text-slate-400 ml-auto" data-v-865381f4>配置存在该部署自己的业务库里,各区域互不影响</span></div>`);
} else {
_push(`<!---->`);
}
@ -514,13 +514,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
_push(`<!---->`);
}
if (tab.value === "modules" && !curDep.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center text-slate-400" data-v-3e1700b0> 先在「部署环境」里创建一个部署,才能配置。 </div>`);
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center text-slate-400" data-v-865381f4> 先在「部署环境」里创建一个部署,才能配置。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
}
_push(`<dialog class="modal" data-v-3e1700b0><div class="modal-box max-w-lg" data-v-3e1700b0><h3 class="font-bold text-lg" data-v-3e1700b0>编辑应用</h3><p class="text-xs text-slate-400 mt-1" data-v-3e1700b0> 应用名是关联键:部署、账号作用域、第三方服务配置都按它挂载,改名会断开已有关联。 </p><form class="mt-4 space-y-3" data-v-3e1700b0><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered input-sm w-full" required data-v-3e1700b0></div><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered input-sm w-full font-mono text-xs" data-v-3e1700b0></div><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered input-sm w-full" data-v-3e1700b0></div><label class="flex items-center gap-2 cursor-pointer pt-1" data-v-3e1700b0><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-3e1700b0><span class="text-sm" data-v-3e1700b0>启用</span></label><div class="modal-action" data-v-3e1700b0><button type="button" class="btn btn-ghost btn-sm" data-v-3e1700b0>取消</button><button type="submit" class="btn btn-primary btn-sm text-white" data-v-3e1700b0>保存</button></div></form></div><form method="dialog" class="modal-backdrop" data-v-3e1700b0><button data-v-3e1700b0>close</button></form></dialog></div>`);
_push(`<dialog class="modal" data-v-865381f4><div class="modal-box max-w-lg" data-v-865381f4><h3 class="font-bold text-lg" data-v-865381f4>编辑应用</h3><p class="text-xs text-slate-400 mt-1" data-v-865381f4> 应用名是关联键:部署、账号作用域、第三方服务配置都按它挂载,改名会断开已有关联。 </p><form class="mt-4 space-y-3" data-v-865381f4><div class="form-control" data-v-865381f4><label class="label py-1" data-v-865381f4><span class="label-text text-sm font-medium" data-v-865381f4>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered input-sm w-full" required data-v-865381f4></div><div class="form-control" data-v-865381f4><label class="label py-1" data-v-865381f4><span class="label-text text-sm font-medium" data-v-865381f4>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered input-sm w-full font-mono text-xs" data-v-865381f4></div><div class="form-control" data-v-865381f4><label class="label py-1" data-v-865381f4><span class="label-text text-sm font-medium" data-v-865381f4>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered input-sm w-full" data-v-865381f4></div><label class="flex items-center gap-2 cursor-pointer pt-1" data-v-865381f4><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-865381f4><span class="text-sm" data-v-865381f4>启用</span></label><div class="modal-action" data-v-865381f4><button type="button" class="btn btn-ghost btn-sm" data-v-865381f4>取消</button><button type="submit" class="btn btn-primary btn-sm text-white" data-v-865381f4>保存</button></div></form></div><form method="dialog" class="modal-backdrop" data-v-865381f4><button data-v-865381f4>close</button></form></dialog></div>`);
};
}
});
@ -530,7 +530,7 @@ _sfc_main.setup = (props, ctx) => {
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/apps/[name].vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const _name_ = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3e1700b0"]]);
const _name_ = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-865381f4"]]);
export { _name_ as default };
//# sourceMappingURL=_name_-QnyK8Xx9.mjs.map
//# sourceMappingURL=_name_-BbBzwp8c.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-BbBzwp8c.mjs.map

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

1
apps/admin/.output/server/chunks/build/_name_-QnyK8Xx9.mjs.map

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

13
apps/admin/.output/server/chunks/build/_name_-styles.DbbtUQpB.mjs

@ -1,13 +0,0 @@
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang } from './_name_-styles-1.mjs-DV0K6DvJ.mjs';
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs';
const _name__vue_vue_type_style_index_0_scoped_3e1700b0_lang = '.hero[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:20px 22px;margin-bottom:16px;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;display:flex;gap:18px;align-items:center;flex-wrap:wrap}.hero-logo[data-v-3e1700b0]{width:58px;height:58px;border-radius:15px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:24px;box-shadow:0 8px 22px #4f46e54d}.hero-name[data-v-3e1700b0]{font-size:20px;font-weight:700;color:#1e293b;letter-spacing:-.015em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}.kpis[data-v-3e1700b0]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:12px;padding:13px 15px;position:relative;overflow:hidden;box-shadow:0 1px 2px #0f172a0a}.kpi[data-v-3e1700b0]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#e2e8f0}.kpi.ok[data-v-3e1700b0]:before{background:#16a34a}.kpi.warn[data-v-3e1700b0]:before{background:#d97706}.kpi.accent[data-v-3e1700b0]:before{background:#4f46e5}.kpi-l[data-v-3e1700b0]{font-size:10.5px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600}.kpi-v[data-v-3e1700b0]{font-size:22px;font-weight:700;color:#1e293b;margin-top:3px;letter-spacing:-.02em;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.kpi-v small[data-v-3e1700b0]{font-size:12px;color:#94a3b8;font-weight:500;margin-left:3px}.tablist[data-v-3e1700b0]{display:flex;gap:2px;border-bottom:1px solid #e2e8f0;margin-bottom:18px;overflow-x:auto}.tab[data-v-3e1700b0]{border:0;background:none;font-size:13.5px;color:#64748b;padding:10px 15px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;display:flex;align-items:center;gap:6px}.tab[data-v-3e1700b0]:hover{color:#1e293b}.tab[aria-selected=true][data-v-3e1700b0]{color:#4338ca;border-bottom-color:#4f46e5;font-weight:600}.tab-n[data-v-3e1700b0]{font-size:10.5px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b;border-radius:20px;padding:0 6px;font-family:SF Mono,Menlo,monospace}.tab[aria-selected=true] .tab-n[data-v-3e1700b0]{background:#eef2ff;color:#4338ca;border-color:transparent}.depbar[data-v-3e1700b0]{gap:10px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.depbar[data-v-3e1700b0],.depchip[data-v-3e1700b0]{display:flex;align-items:center}.depchip[data-v-3e1700b0]{border:1px solid #e2e8f0;background:#fff;border-radius:20px;padding:4px 12px;font-size:12px;cursor:pointer;color:#334155;gap:6px}.depchip[data-v-3e1700b0]:hover{border-color:#0e7490}.depchip[aria-pressed=true][data-v-3e1700b0]{background:#ecfeff;border-color:#0e7490;color:#0e7490;font-weight:600}.depchip .dot[data-v-3e1700b0]{width:6px;height:6px;border-radius:50%;background:#16a34a}.depchip .dot.pending[data-v-3e1700b0]{background:#d97706}.chip[data-v-3e1700b0]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-ok[data-v-3e1700b0]{background:#dcfce7;color:#15803d}.chip-mono[data-v-3e1700b0]{font-family:SF Mono,Menlo,monospace;font-weight:600}';
const _name_Styles_DbbtUQpB = [
AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang,
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang,
_name__vue_vue_type_style_index_0_scoped_3e1700b0_lang
];
export { _name_Styles_DbbtUQpB as default };
//# sourceMappingURL=_name_-styles.DbbtUQpB.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-styles.DbbtUQpB.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"_name_-styles.DbbtUQpB.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-3.mjs-7yUQQ2f9.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles.DbbtUQpB.mjs"],"names":["style_0","style_1","style_2"],"mappings":"","x_google_ignoreList":[0,1]}

13
apps/admin/.output/server/chunks/build/_name_-styles.Dz82uZcJ.mjs

@ -0,0 +1,13 @@
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang } from './_name_-styles-1.mjs-DV0K6DvJ.mjs';
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs';
const _name__vue_vue_type_style_index_0_scoped_865381f4_lang = '.hero[data-v-865381f4]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:20px 22px;margin-bottom:16px;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;display:flex;gap:18px;align-items:center;flex-wrap:wrap}.hero-logo[data-v-865381f4]{width:58px;height:58px;border-radius:15px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:24px;box-shadow:0 8px 22px #4f46e54d}.hero-name[data-v-865381f4]{font-size:20px;font-weight:700;color:#1e293b;letter-spacing:-.015em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}.kpis[data-v-865381f4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi[data-v-865381f4]{background:#fff;border:1px solid #eef2f7;border-radius:12px;padding:13px 15px;position:relative;overflow:hidden;box-shadow:0 1px 2px #0f172a0a}.kpi[data-v-865381f4]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#e2e8f0}.kpi.ok[data-v-865381f4]:before{background:#16a34a}.kpi.warn[data-v-865381f4]:before{background:#d97706}.kpi.accent[data-v-865381f4]:before{background:#4f46e5}.kpi-l[data-v-865381f4]{font-size:10.5px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600}.kpi-v[data-v-865381f4]{font-size:22px;font-weight:700;color:#1e293b;margin-top:3px;letter-spacing:-.02em;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.kpi-v small[data-v-865381f4]{font-size:12px;color:#94a3b8;font-weight:500;margin-left:3px}.tablist[data-v-865381f4]{display:flex;gap:2px;border-bottom:1px solid #e2e8f0;margin-bottom:18px;overflow-x:auto}.tab[data-v-865381f4]{border:0;background:none;font-size:13.5px;color:#64748b;padding:10px 15px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;display:flex;align-items:center;gap:6px}.tab[data-v-865381f4]:hover{color:#1e293b}.tab[aria-selected=true][data-v-865381f4]{color:#4338ca;border-bottom-color:#4f46e5;font-weight:600}.tab-n[data-v-865381f4]{font-size:10.5px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b;border-radius:20px;padding:0 6px;font-family:SF Mono,Menlo,monospace}.tab[aria-selected=true] .tab-n[data-v-865381f4]{background:#eef2ff;color:#4338ca;border-color:transparent}.depbar[data-v-865381f4]{gap:10px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.depbar[data-v-865381f4],.depchip[data-v-865381f4]{display:flex;align-items:center}.depchip[data-v-865381f4]{border:1px solid #e2e8f0;background:#fff;border-radius:20px;padding:4px 12px;font-size:12px;cursor:pointer;color:#334155;gap:6px}.depchip[data-v-865381f4]:hover{border-color:#0e7490}.depchip[aria-pressed=true][data-v-865381f4]{background:#ecfeff;border-color:#0e7490;color:#0e7490;font-weight:600}.depchip .dot[data-v-865381f4]{width:6px;height:6px;border-radius:50%;background:#16a34a}.depchip .dot.pending[data-v-865381f4]{background:#d97706}.chip[data-v-865381f4]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-ok[data-v-865381f4]{background:#dcfce7;color:#15803d}.chip-mono[data-v-865381f4]{font-family:SF Mono,Menlo,monospace;font-weight:600}';
const _name_Styles_Dz82uZcJ = [
AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang,
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang,
_name__vue_vue_type_style_index_0_scoped_865381f4_lang
];
export { _name_Styles_Dz82uZcJ as default };
//# sourceMappingURL=_name_-styles.Dz82uZcJ.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-styles.Dz82uZcJ.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"_name_-styles.Dz82uZcJ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-3.mjs-Uy9b9kOk.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles.Dz82uZcJ.mjs"],"names":["style_0","style_1","style_2"],"mappings":"","x_google_ignoreList":[0,1]}

236
apps/admin/.output/server/chunks/build/agents-sIgrTlD1.mjs

@ -0,0 +1,236 @@
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-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-DMhiAuTa.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.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 _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: "语音识别", cat: CAT_STT, color: "#1664ff" },
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cat: CAT_LLM, color: "#b45309" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cat: CAT_TTS, color: "#7c3aed" }
],
translate: [
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cat: CAT_STT, color: "#1664ff" },
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cat: CAT_MT, color: "#059669" },
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cat: CAT_TTS, color: "#7c3aed" }
],
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cat: CAT_STS, color: "#be185d" }],
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cat: 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 svcsByCat(cat) {
return allSvcs.value.filter(
(s) => s.enable && (s.categories || "").split(",").map(Number).includes(cat)
);
}
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-463df649><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-463df649><div data-v-463df649><h2 class="text-lg font-semibold text-slate-800" data-v-463df649>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-463df649> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-463df649><span class="text-sm text-slate-500" data-v-463df649>作用域</span><select class="select select-bordered select-sm" data-v-463df649><option value="" data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`);
ssrRenderList(scopeApps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-463df649${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-463df649>+ 新建 Agent</button></div></div>`);
if (!agents2.value.length) {
_push(`<div class="text-center py-20 text-slate-300" data-v-463df649><div class="text-5xl mb-3" data-v-463df649>🤖</div><p class="text-sm" data-v-463df649>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-463df649>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(grouped.value, (g) => {
_push(`<div class="mb-6" data-v-463df649><div class="flex items-center gap-2 mb-3" data-v-463df649><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-463df649>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-463df649>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-463df649>·</span><span class="text-xs text-slate-400" data-v-463df649>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-463df649><!--[-->`);
ssrRenderList(g.items, (a) => {
_push(`<div class="agent-card" data-v-463df649><div class="flex items-start justify-between gap-2" data-v-463df649><div class="min-w-0" data-v-463df649><div class="font-semibold text-sm text-slate-800 truncate" data-v-463df649>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-463df649>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-463df649>`);
if (a.enable) {
_push(`<span class="badge badge-success badge-xs" data-v-463df649>启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-xs" data-v-463df649>停用</span>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-463df649>删除</button></div></div>`);
if (a.description) {
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-463df649>${ssrInterpolate(a.description)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-463df649><!--[-->`);
ssrRenderList(pipelineOf(a), (s) => {
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-463df649>${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-463df649> 支持语言:${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-463df649><div class="ag-box" data-v-463df649><div class="flex items-center justify-between mb-4" data-v-463df649><div class="flex items-center gap-3" data-v-463df649><h3 class="text-base font-semibold text-slate-800" data-v-463df649>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-463df649>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-463df649>✕ 关闭</button></div><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>类型</div><div class="type-row" data-v-463df649><!--[-->`);
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-463df649><span class="ttab-title" data-v-463df649>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-463df649>${ssrInterpolate(t.hint)}</span></button>`);
});
_push(`<!--]--></div>`);
if (isEditing.value) {
_push(`<p class="ed-tip" data-v-463df649>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`);
} else {
_push(`<!---->`);
}
_push(`</section><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>Agent ID <i class="req" data-v-463df649>*</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-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>名称 <i class="req" data-v-463df649>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-463df649></div></div><div class="mt-3" data-v-463df649><span class="ed-label" data-v-463df649>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-463df649></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-463df649><option${ssrRenderAttr("value", 0)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-463df649${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-463df649><div class="ed-section-title" data-v-463df649>服务编排</div><div class="slot-row" data-v-463df649><!--[-->`);
ssrRenderList(slotsOfType(form.type), (s, i) => {
_push(`<!--[--><div class="slot-item" data-v-463df649><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-463df649>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-463df649>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-463df649><option value="" disabled data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCat(s.cat).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`);
ssrRenderList(svcsByCat(s.cat), (v) => {
_push(`<option${ssrRenderAttr("value", v.id)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}</option>`);
});
_push(`<!--]--></select></div>`);
if (i < slotsOfType(form.type).length - 1) {
_push(`<span class="slot-arrow" data-v-463df649>→</span>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
});
_push(`<!--]--></div></section><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>支持语言(多选)</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-463df649><span class="ed-label" data-v-463df649>默认语言</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-463df649><div class="flex items-center justify-between mb-1" data-v-463df649><span class="ed-label mb-0" data-v-463df649>音色覆盖(不填则用 TTS 服务自带默认音色)</span><button class="btn btn-ghost btn-xs" data-v-463df649>+ 添加一行</button></div>`);
if (!form.voice_map.length) {
_push(`<div class="text-xs text-slate-300 py-2" data-v-463df649>未设置音色覆盖</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(form.voice_map, (v, i) => {
_push(`<div class="voice-row" data-v-463df649><select class="select select-bordered select-xs" data-v-463df649><option value="" data-v-463df649${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-463df649${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-463df649><option${ssrRenderAttr("value", 0)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-463df649${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-463df649><button class="btn btn-ghost btn-xs text-error" data-v-463df649>删除</button></div>`);
});
_push(`<!--]--></div></section>`);
if (isChatType.value) {
_push(`<section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>对话设定</div><div data-v-463df649><span class="ed-label" data-v-463df649>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-463df649>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-463df649><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-463df649><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-463df649><span data-v-463df649>开场白</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-463df649>`);
} else {
_push(`<!---->`);
}
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
_push(`<div class="ed-footer" data-v-463df649><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-463df649><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-463df649><span data-v-463df649>启用</span></label><div class="flex gap-2" data-v-463df649><button class="btn btn-ghost btn-sm" data-v-463df649>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-463df649>保存</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-463df649"]]);
export { agents as default };
//# sourceMappingURL=agents-sIgrTlD1.mjs.map

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

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

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

@ -0,0 +1,8 @@
const agents_vue_vue_type_style_index_0_scoped_463df649_lang = ".type-tag[data-v-463df649]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-463df649]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-463df649]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-463df649]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-463df649]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-463df649]{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-463df649]{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-463df649]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-463df649]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-463df649]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-463df649]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-463df649]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-463df649]{display:inline-block;margin-left:6px}.ed-tip[data-v-463df649]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-463df649]{color:#dc2626;font-style:normal}.type-row[data-v-463df649]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-463df649]{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-463df649]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-463df649]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-463df649]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-463df649]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-463df649]{font-size:10px;color:#94a3b8}.slot-row[data-v-463df649]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-463df649]{flex:1;min-width:0}.slot-arrow[data-v-463df649]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-463df649]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-463df649]{gap:8px;margin-bottom:6px}.ed-footer[data-v-463df649],.voice-row[data-v-463df649]{display:flex;align-items:center}.ed-footer[data-v-463df649]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-463df649]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-463df649]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-463df649]{display:none}}";
const agentsStyles_DrcBfQcb = [
agents_vue_vue_type_style_index_0_scoped_463df649_lang
];
export { agentsStyles_DrcBfQcb as default };
//# sourceMappingURL=agents-styles.DrcBfQcb.mjs.map

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

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

100
apps/admin/.output/server/chunks/build/appconfig-BTmHA76P.mjs

@ -0,0 +1,100 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import './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';
import './useLoading-D4zrSa2m.mjs';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "appconfig",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const view = ref("list");
const apps = ref([]);
const curApp = ref(0);
const items = ref([]);
const loading = ref(false);
const submitting = ref(false);
const isEditing = ref(false);
const keyword = ref("");
const form = reactive({ id: 0, group: "", key: "", value: "", description: "" });
const curAppLabel = computed(() => {
const a = apps.value.find((x) => x.id === curApp.value);
return a ? a.name || a.app_name : "";
});
const filteredRows = computed(() => {
const kw = keyword.value.trim().toLowerCase();
if (!kw) return items.value;
return items.value.filter((c) => ((c.group || "") + (c.key || "")).toLowerCase().includes(kw));
});
const groupedRows = computed(() => {
const groups = {};
filteredRows.value.forEach((c) => {
const g = c.group || "";
(groups[g] = groups[g] || []).push(c);
});
const names = Object.keys(groups).sort((a, b) => {
if (a === "") return -1;
if (b === "") return 1;
return a < b ? -1 : 1;
});
return names.map((g) => ({ key: g, label: g || "未分组", items: groups[g] }));
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><div><h2 class="text-lg font-semibold text-slate-800">应用环境配置</h2><p class="text-xs text-slate-400 mt-1">应用自有的 key/value 配置(音乐、OSS 等),直接读写所选应用的业务库。结构同「全局环境配置」但不分区域。</p></div><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(!curApp.value) ? " disabled" : ""}>+ 新增配置</button></div><div class="flex items-center gap-3 mb-4"><span class="text-sm text-slate-500">应用</span><select class="select select-bordered select-sm min-w-48"><option${ssrRenderAttr("value", 0)} disabled${ssrIncludeBooleanAttr(Array.isArray(curApp.value) ? ssrLooseContain(curApp.value, 0) : ssrLooseEqual(curApp.value, 0)) ? " selected" : ""}>请选择应用</option><!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a.id)}${ssrIncludeBooleanAttr(Array.isArray(curApp.value) ? ssrLooseContain(curApp.value, a.id) : ssrLooseEqual(curApp.value, a.id)) ? " selected" : ""}>${ssrInterpolate(a.name || a.app_name)}</option>`);
});
_push(`<!--]--></select><input${ssrRenderAttr("value", keyword.value)} class="input input-bordered input-sm w-48" placeholder="按分组/键搜索"></div>`);
if (!curApp.value) {
_push(`<div class="bg-white rounded-xl shadow-sm border border-slate-100 text-center text-slate-400 py-16"><div class="text-4xl mb-2">🗂️</div><p class="text-sm">请先在上方选择一个应用</p></div>`);
} else {
_push(`<div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table"><thead><tr><th>键</th><th>值</th><th>描述</th><th class="text-right">操作</th></tr></thead><tbody>`);
if (loading.value) {
_push(`<tr><td colspan="4" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`);
} else if (!filteredRows.value.length) {
_push(`<tr><td colspan="4" class="text-center text-slate-400 py-8">暂无配置</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(groupedRows.value, (grp) => {
_push(`<!--[--><tr class="bg-slate-100/80"><td colspan="4" class="py-2"><span class="font-semibold text-slate-600 text-sm">▸ ${ssrInterpolate(grp.label)}</span><span class="text-xs text-slate-400 ml-2">${ssrInterpolate(grp.items.length)} 项</span></td></tr><!--[-->`);
ssrRenderList(grp.items, (c) => {
_push(`<tr class="hover"><td class="font-mono text-sm font-medium">${ssrInterpolate(c.key || "")}</td><td class="text-sm text-slate-500 max-w-xs truncate"${ssrRenderAttr("title", c.value || "")}>${ssrInterpolate(c.value || "")}</td><td class="text-sm text-slate-400">${ssrInterpolate(c.description || "")}</td><td class="text-right"><div class="inline-flex gap-1"><button class="btn btn-ghost btn-xs">编辑</button><button class="btn btn-ghost btn-xs text-red-500">删除</button></div></td></tr>`);
});
_push(`<!--]--><!--]-->`);
});
_push(`<!--]--></tbody></table></div></div>`);
}
_push(`</div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}"><div class="flex items-center gap-3 mb-5"><button class="btn btn-ghost btn-sm">← 返回列表</button><h2 class="text-lg font-semibold text-slate-800">${ssrInterpolate(isEditing.value ? "编辑配置" : "新增配置")}</h2><span class="text-xs text-slate-400">应用:${ssrInterpolate(curAppLabel.value)}</span></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"><form><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">分组 (group)</span></label><input${ssrRenderAttr("value", form.group)} type="text" class="input input-bordered w-full" placeholder="如 music / oss / other"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">键 (key) *</span></label><input${ssrRenderAttr("value", form.key)} type="text" class="input input-bordered w-full" required placeholder="如 oss_access_key"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">值 (value)</span></label><textarea class="textarea textarea-bordered w-full font-mono text-sm" rows="3">${ssrInterpolate(form.value)}</textarea></div><div class="form-control mb-6"><label class="label"><span class="label-text font-medium">描述</span></label><input${ssrRenderAttr("value", form.description)} type="text" class="input input-bordered w-full"></div><div class="flex gap-3"><button type="button" class="btn btn-ghost">取消</button><button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""}>保存</button></div></form></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/appconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export { _sfc_main as default };
//# sourceMappingURL=appconfig-BTmHA76P.mjs.map

1
apps/admin/.output/server/chunks/build/appconfig-BTmHA76P.mjs.map

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

211
apps/admin/.output/server/chunks/build/calltranslate--sRmJf-u.mjs

@ -1,211 +0,0 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.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_STT = 1;
const SCAT_TTS = 2;
const SCAT_MT = 3;
const SCAT_AST = 4;
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "calltranslate",
__ssrInlineRender: true,
setup(__props) {
const LANGS = [
{ c: "zh", n: "中文" },
{ c: "en", n: "英文" },
{ c: "ja", n: "日语" },
{ c: "ko", n: "韩语" },
{ c: "fr", n: "法语" },
{ c: "de", n: "德语" },
{ c: "es", n: "西班牙语" },
{ c: "pt", n: "葡萄牙语" },
{ c: "ru", n: "俄语" },
{ c: "ar", n: "阿拉伯语" },
{ c: "th", n: "泰语" },
{ c: "vi", n: "越南语" },
{ c: "id", n: "印尼语" },
{ c: "ms", n: "马来语" },
{ c: "hi", n: "印地语" }
];
function langName(c) {
const x = LANGS.find((l) => l.c === c);
return x ? x.n : c || "";
}
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: "印度" }
];
useApi();
useToast();
const backendReady = ref(true);
const allSvcs = ref([]);
const pairs = ref([]);
const curRegion = ref(REGIONS.length ? REGIONS[0].value : 1);
const editorOpen = ref(false);
const editingPair = ref(null);
ref(0);
const ed = reactive({
src: "zh",
dst: "en",
bidir: false,
mode: 0,
asr: "",
mt: "",
tts: "",
ast: "",
enable: true
});
function svcsByCat(cat) {
return allSvcs.value.filter(
(s) => s.enable && (s.categories || "").split(",").map(Number).indexOf(cat) >= 0
);
}
function svcName(id) {
const s = allSvcs.value.find((x) => x.id === id);
return s ? s.name : id || "未配置";
}
const syncOpen = ref(false);
const syncDesc = ref("");
const syncTargets = ref([]);
const syncRegions = computed(() => REGIONS.filter((r) => r.value !== curRegion.value));
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-51f11136>`);
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-51f11136> ⚠ 「通话翻译配置」的后端接口尚未迁移到当前 console 服务,功能暂不可用。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex items-center justify-between mb-5" data-v-51f11136><div data-v-51f11136><h2 class="text-lg font-semibold text-slate-800" data-v-51f11136>通话翻译配置</h2><p class="text-xs text-slate-400 mt-1" data-v-51f11136>按区域和语言对配置翻译服务。支持三段式(ASR→MT→TTS)和端到端 AST 两种模式。</p></div><div class="flex items-center gap-3" data-v-51f11136><span class="text-sm text-slate-500" data-v-51f11136>区域</span><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-51f11136${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-primary btn-sm text-white" data-v-51f11136>+ 新增语言对</button></div></div><div class="editor-panel" style="${ssrRenderStyle(editorOpen.value ? null : { display: "none" })}" data-v-51f11136><div class="flex items-center justify-between mb-4" data-v-51f11136><h3 class="font-semibold text-slate-800 text-sm" data-v-51f11136>${ssrInterpolate(editingPair.value ? "编辑语言对" : "新增语言对")}</h3><button class="btn btn-ghost btn-xs" data-v-51f11136>✕ 关闭</button></div><div class="grid grid-cols-3 gap-4 mb-4" data-v-51f11136><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>源语言 *</span></label><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`);
ssrRenderList(LANGS, (l) => {
_push(`<option${ssrRenderAttr("value", l.c)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.src) ? ssrLooseContain(ed.src, l.c) : ssrLooseEqual(ed.src, l.c)) ? " selected" : ""}>${ssrInterpolate(l.n)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>目标语言 *</span></label><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`);
ssrRenderList(LANGS, (l) => {
_push(`<option${ssrRenderAttr("value", l.c)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.dst) ? ssrLooseContain(ed.dst, l.c) : ssrLooseEqual(ed.dst, l.c)) ? " selected" : ""}>${ssrInterpolate(l.n)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>双向</span></label><input${ssrIncludeBooleanAttr(Array.isArray(ed.bidir) ? ssrLooseContain(ed.bidir, null) : ed.bidir) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-1" data-v-51f11136></div></div><div class="flex gap-3 mb-4" data-v-51f11136><div class="${ssrRenderClass([{ on: ed.mode === 0 }, "mtab"])}" data-v-51f11136><div data-v-51f11136><div class="font-bold text-sm" data-v-51f11136>🧩 三段式拼接</div><div class="text-xs text-slate-400 mt-0.5" data-v-51f11136>ASR → MT → TTS</div></div></div><div class="${ssrRenderClass([{ on: ed.mode === 1 }, "mtab"])}" data-v-51f11136><div data-v-51f11136><div class="font-bold text-sm" data-v-51f11136>⚡ 端到端 AST</div><div class="text-xs text-slate-400 mt-0.5" data-v-51f11136>单服务直接完成语音翻译</div></div></div></div><div data-v-51f11136>`);
if (ed.mode === 0) {
_push(`<div class="grid grid-cols-3 gap-4" data-v-51f11136><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>语音识别(ASR)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`);
if (!svcsByCat(SCAT_STT).length) {
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.asr) ? ssrLooseContain(ed.asr, "") : ssrLooseEqual(ed.asr, "")) ? " selected" : ""}>(无可用服务)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(svcsByCat(SCAT_STT), (s) => {
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.asr) ? ssrLooseContain(ed.asr, s.id) : ssrLooseEqual(ed.asr, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>机器翻译(MT)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`);
if (!svcsByCat(SCAT_MT).length) {
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.mt) ? ssrLooseContain(ed.mt, "") : ssrLooseEqual(ed.mt, "")) ? " selected" : ""}>(无可用服务)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(svcsByCat(SCAT_MT), (s) => {
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.mt) ? ssrLooseContain(ed.mt, s.id) : ssrLooseEqual(ed.mt, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>语音合成(TTS)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`);
if (!svcsByCat(SCAT_TTS).length) {
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.tts) ? ssrLooseContain(ed.tts, "") : ssrLooseEqual(ed.tts, "")) ? " selected" : ""}>(无可用服务)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(svcsByCat(SCAT_TTS), (s) => {
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.tts) ? ssrLooseContain(ed.tts, s.id) : ssrLooseEqual(ed.tts, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`);
});
_push(`<!--]--></select></div></div>`);
} else {
_push(`<div class="form-control max-w-xs" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>端到端语音翻译服务(AST)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`);
if (!svcsByCat(SCAT_AST).length) {
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.ast) ? ssrLooseContain(ed.ast, "") : ssrLooseEqual(ed.ast, "")) ? " selected" : ""}>(无可用服务)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(svcsByCat(SCAT_AST), (s) => {
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.ast) ? ssrLooseContain(ed.ast, s.id) : ssrLooseEqual(ed.ast, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`);
});
_push(`<!--]--></select></div>`);
}
_push(`</div><div class="flex items-center justify-between pt-4 border-t border-slate-100 mt-4" data-v-51f11136><label class="flex items-center gap-2 text-sm" data-v-51f11136><input${ssrIncludeBooleanAttr(Array.isArray(ed.enable) ? ssrLooseContain(ed.enable, null) : ed.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-51f11136> 启用 </label><div class="flex gap-2" data-v-51f11136><button class="btn btn-ghost btn-sm" data-v-51f11136>取消</button><button class="btn btn-primary btn-sm text-white" data-v-51f11136>保存</button></div></div></div><div class="grid grid-cols-1 gap-4" style="${ssrRenderStyle({ "grid-template-columns": "repeat(auto-fill,minmax(360px,1fr))" })}" data-v-51f11136>`);
if (!pairs.value.length) {
_push(`<div class="col-span-full text-center py-20 text-slate-300" data-v-51f11136><div class="text-5xl mb-3" data-v-51f11136>🌐</div><p class="text-sm" data-v-51f11136>当前区域暂无语言对配置</p></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(pairs.value, (p) => {
_push(`<div class="pair-card" data-v-51f11136><div class="flex items-center justify-between" data-v-51f11136><div class="flex items-center gap-2" data-v-51f11136><span class="lang-badge" data-v-51f11136>${ssrInterpolate(langName(p.src_lang))}</span><span class="text-slate-400 font-bold text-lg" data-v-51f11136>${ssrInterpolate(p.bidir ? "⇄" : "→")}</span><span class="lang-badge" data-v-51f11136>${ssrInterpolate(langName(p.dst_lang))}</span></div><div class="flex items-center gap-2" data-v-51f11136>`);
if (p.mode === 0) {
_push(`<span class="mode-badge mode-pipeline" data-v-51f11136>三段式拼接</span>`);
} else {
_push(`<span class="mode-badge mode-e2e" data-v-51f11136>端到端 AST</span>`);
}
if (p.enable) {
_push(`<span class="badge badge-success badge-xs" data-v-51f11136>启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-xs" data-v-51f11136>停用</span>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-51f11136>删除</button></div></div>`);
if (p.mode === 0) {
_push(`<div class="flex flex-wrap items-center gap-2 mt-3" data-v-51f11136><span class="svc-pill" style="${ssrRenderStyle({ "background": "#1664ff" })}" data-v-51f11136>ASR: ${ssrInterpolate(svcName(p.asr_svc_id))}</span><span class="text-slate-300 text-sm" data-v-51f11136>→</span><span class="svc-pill" style="${ssrRenderStyle({ "background": "#059669" })}" data-v-51f11136>MT: ${ssrInterpolate(svcName(p.mt_svc_id))}</span><span class="text-slate-300 text-sm" data-v-51f11136>→</span><span class="svc-pill" style="${ssrRenderStyle({ "background": "#7c3aed" })}" data-v-51f11136>TTS: ${ssrInterpolate(svcName(p.tts_svc_id))}</span></div>`);
} else {
_push(`<div class="flex items-center gap-2 mt-3" data-v-51f11136><span class="svc-pill" style="${ssrRenderStyle({ "background": "#f97316" })}" data-v-51f11136>AST: ${ssrInterpolate(svcName(p.ast_svc_id))}</span></div>`);
}
_push(`</div>`);
});
_push(`<!--]--></div><div class="sync-overlay" style="${ssrRenderStyle(syncOpen.value ? null : { display: "none" })}" data-v-51f11136><div class="sync-box" data-v-51f11136><div class="flex items-start gap-3 mb-4" data-v-51f11136><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-51f11136><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-51f11136><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-51f11136></path></svg></div><div data-v-51f11136><h3 class="text-base font-semibold text-slate-800" data-v-51f11136>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-51f11136>${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-51f11136> ✦ 同步内容:服务组合(模式 + 各段服务)将被复制到目标区域。 </div><div class="flex items-center justify-between mb-1" data-v-51f11136><span class="text-xs font-semibold text-slate-500" data-v-51f11136>选择目标区域</span><div class="flex gap-2" data-v-51f11136><button class="btn btn-ghost btn-xs" data-v-51f11136>全选</button><button class="btn btn-ghost btn-xs" data-v-51f11136>清空</button></div></div><div class="sync-region-grid" data-v-51f11136><!--[-->`);
ssrRenderList(syncRegions.value, (r) => {
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-51f11136><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-51f11136><span data-v-51f11136>${ssrInterpolate(r.label)}</span></label>`);
});
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-51f11136>⚠ 目标区域相同语言对已存在则覆盖,否则新建。</p><div class="flex gap-3 justify-end" data-v-51f11136><button class="btn btn-ghost" data-v-51f11136>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-51f11136>保存并同步</button></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/calltranslate.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-51f11136"]]);
export { calltranslate as default };
//# sourceMappingURL=calltranslate--sRmJf-u.mjs.map

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

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

267
apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs

@ -0,0 +1,267 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderComponent, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { l as langName } from './useLangOptions-DMhiAuTa.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.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 LANG_ANY = "*";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "calltranslate",
__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: "印度" }
];
function regionLabel(v) {
return REGIONS.find((x) => x.value === v)?.label ?? "区域" + v;
}
const TRANS_TYPES = {
translate: { label: "🧩 三段式翻译", color: "#059669", bg: "#dcfce7" },
"ast-translate": { label: "🚀 端到端翻译", color: "#c2410c", bg: "#fff7ed" }
};
function typeLabel(t) {
return t && TRANS_TYPES[t] ? TRANS_TYPES[t].label : t || "未知";
}
function typeStyle(t) {
const s = t ? TRANS_TYPES[t] : void 0;
return s ? { background: s.bg, color: s.color } : { background: "#f1f5f9", color: "#64748b" };
}
useApi();
useToast();
const scopeApp = ref("");
const scopeApps = ref([]);
const curRegion = ref(REGIONS[0].value);
const rules = ref([]);
const agents = ref([]);
const editorOpen = ref(false);
const editing = ref(null);
ref(null);
ref(0);
const ed = reactive({
name: "",
srcLangs: "",
dstLangs: "",
srcAny: false,
dstAny: false,
bidir: true,
region: 0,
priority: 100,
agentId: "",
remark: "",
enable: true
});
const transAgents = computed(() => agents.value.filter((a) => a.type in TRANS_TYPES));
const agentGroups = computed(
() => Object.keys(TRANS_TYPES).map((t) => ({
type: t,
label: TRANS_TYPES[t].label,
items: transAgents.value.filter((a) => a.type === t)
})).filter((g) => g.items.length)
);
const curAgent = computed(() => agents.value.find((a) => a.id === ed.agentId) || null);
const langWarn = computed(() => {
const a = curAgent.value;
if (!a || !a.support_langs) return "";
const sup = a.support_langs.split(",").map((x) => x.trim()).filter(Boolean);
if (!sup.length) return "";
const picked = [
...ed.srcAny ? [] : ed.srcLangs.split(","),
...ed.dstAny ? [] : ed.dstLangs.split(",")
].map((x) => x.trim()).filter(Boolean);
const miss = picked.filter((c) => !sup.includes(c));
if (!miss.length) return "";
return `Agent「${a.name || a.id}」未声明支持:${miss.join("、")}`;
});
function isAny(s) {
return (s || "").trim() === LANG_ANY;
}
function langsLabel(s) {
if (isAny(s)) return "任意语言";
const arr = (s || "").split(",").map((x) => x.trim()).filter(Boolean);
if (!arr.length) return "—";
if (arr.length <= 3) return arr.map((c) => langName(c)).join("、");
return arr.slice(0, 3).map((c) => langName(c)).join("、") + ` 等 ${arr.length} 种`;
}
function agentName(id) {
return agents.value.find((a) => a.id === id)?.name || id || "未配置";
}
function agentType(id) {
return agents.value.find((a) => a.id === id)?.type || "";
}
const syncOpen = ref(false);
const syncDesc = ref("");
const syncTargets = ref([]);
const syncRegions = computed(() => REGIONS.filter((r) => r.value !== ed.region));
const testOpen = ref(false);
const testSrc = ref("zh-CN");
const testDst = ref("en-US");
const testResult = ref(null);
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><!--[-->`);
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(`<!--]--></select><span class="text-sm text-slate-500" data-v-c0bab860>区域</span><select class="select select-bordered select-sm" data-v-c0bab860><!--[-->`);
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(`<!--]--></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>`);
if (ed.srcAny) {
_push(`<div class="any-box" data-v-c0bab860>任意源语言</div>`);
} else {
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: ed.srcLangs,
"onUpdate:modelValue": ($event) => ed.srcLangs = $event,
multiple: ""
}, 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>`);
if (ed.dstAny) {
_push(`<div class="any-box" data-v-c0bab860>任意目标语言</div>`);
} else {
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: ed.dstLangs,
"onUpdate:modelValue": ($event) => ed.dstLangs = $event,
multiple: ""
}, 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><!--[-->`);
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(`<!--]--></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><!--[-->`);
ssrRenderList(agentGroups.value, (g) => {
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-c0bab860><!--[-->`);
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(`<!--]--></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>`);
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>`);
if (curAgent.value.support_langs) {
_push(`<span class="text-[11px] text-slate-400" data-v-c0bab860>支持:${ssrInterpolate(curAgent.value.support_langs)}</span>`);
} else {
_push(`<!---->`);
}
if (!curAgent.value.enable) {
_push(`<span class="text-[11px] text-amber-600" data-v-c0bab860>⚠ 该 Agent 当前为停用状态</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
if (langWarn.value) {
_push(`<p class="ed-warn" data-v-c0bab860>⚠ ${ssrInterpolate(langWarn.value)}</p>`);
} else {
_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>`);
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>`);
} 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><!--[-->`);
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>`);
if (r.name || r.remark) {
_push(`<div class="text-[11px] text-slate-400 mt-1" data-v-c0bab860>${ssrInterpolate(r.name)}`);
if (r.remark) {
_push(`<span data-v-c0bab860> · ${ssrInterpolate(r.remark)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_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>`);
if (r.enable) {
_push(`<span class="badge badge-success badge-xs mr-2" data-v-c0bab860>启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-xs mr-2" data-v-c0bab860>停用</span>`);
}
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-c0bab860>删除</button></div></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(ssrRenderComponent(__nuxt_component_0, {
modelValue: testSrc.value,
"onUpdate:modelValue": ($event) => testSrc.value = $event
}, null, _parent));
_push(`</div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>目标语言</span>`);
_push(ssrRenderComponent(__nuxt_component_0, {
modelValue: testDst.value,
"onUpdate:modelValue": ($event) => testDst.value = $event
}, null, _parent));
_push(`</div></div>`);
if (testResult.value) {
_push(`<div class="${ssrRenderClass([{ miss: !testResult.value.matched }, "test-result"])}" data-v-c0bab860>`);
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)} `);
if (testResult.value.agent) {
_push(`<span data-v-c0bab860>(${ssrInterpolate(typeLabel(testResult.value.agent.type))})</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><!--]-->`);
} else {
_push(`<div class="text-sm text-amber-700" data-v-c0bab860>没有任何规则命中 —— 这个方向的通话翻译会不可用,建议补一条兜底规则。</div>`);
}
_push(`</div>`);
} else {
_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><!--[-->`);
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(`<!--]--></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>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/calltranslate.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c0bab860"]]);
export { calltranslate as default };
//# sourceMappingURL=calltranslate-D-FgQw8P.mjs.map

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

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

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

@ -0,0 +1,8 @@
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

@ -0,0 +1 @@
{"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]}

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

@ -1,8 +0,0 @@
const calltranslate_vue_vue_type_style_index_0_scoped_51f11136_lang = ".pair-card[data-v-51f11136]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:16px;cursor:pointer;transition:all .15s}.pair-card[data-v-51f11136]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.lang-badge[data-v-51f11136]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.svc-pill[data-v-51f11136]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:8px;color:#fff}.mode-badge[data-v-51f11136]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px}.mode-pipeline[data-v-51f11136]{background:#dbeafe;color:#1e40af}.mode-e2e[data-v-51f11136]{background:#fff7ed;color:#c2410c}.editor-panel[data-v-51f11136]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.mtab[data-v-51f11136]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:10px;border:2px solid transparent;cursor:pointer;transition:all .15s;flex:1}.mtab.on[data-v-51f11136]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.sync-overlay[data-v-51f11136]{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)}.sync-box[data-v-51f11136]{background:#fff;border-radius:20px;padding:28px;width:520px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-51f11136]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-51f11136]{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-51f11136]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-51f11136]{border-color:#6366f1;background:#eef2ff;color:#4338ca}";
const calltranslateStyles_hpAJUqsK = [
calltranslate_vue_vue_type_style_index_0_scoped_51f11136_lang
];
export { calltranslateStyles_hpAJUqsK as default };
//# sourceMappingURL=calltranslate-styles.hpAJUqsK.mjs.map

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

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

274
apps/admin/.output/server/chunks/build/channels-CRuax8yi.mjs

@ -0,0 +1,274 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc, b as useRouter } from './server.mjs';
import './useLoading-D4zrSa2m.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 _sfc_main = /* @__PURE__ */ defineComponent({
__name: "channels",
__ssrInlineRender: true,
setup(__props) {
const CHANNELS = {
1: "华为",
2: "小米",
3: "OPPO",
4: "VIVO",
5: "荣耀",
100: "官方包",
101: "App Store",
102: "Google Play"
};
function channelName(v) {
return CHANNELS[v] ?? "渠道" + v;
}
const CHANNEL_GROUPS = [
{ label: "中国厂商", icon: "📱", color: "#0369a1", bg: "#dbeafe", channels: [1, 2, 3, 4, 5] },
{ label: "全球商店", icon: "🌍", color: "#c2410c", bg: "#fff7ed", channels: [101, 102] },
{ label: "官方渠道", icon: "🏠", color: "#059669", bg: "#dcfce7", channels: [100] }
];
const STATUS = [
{ v: 0, label: "草稿(不下发)", color: "#64748b", bg: "#f1f5f9" },
{ v: 1, label: "已上架", color: "#059669", bg: "#dcfce7" },
{ v: 2, label: "审核中", color: "#b45309", bg: "#fef9c3" },
{ v: 3, label: "已下架", color: "#be123c", bg: "#ffe4e6" }
];
function statusLabel(v) {
return STATUS.find((s) => s.v === v)?.label ?? "未知";
}
function statusStyle(v) {
const s = STATUS.find((x) => x.v === v);
return s ? { background: s.bg, color: s.color } : {};
}
const PAY_CHANNELS = [
{ key: "wxpay", label: "微信支付", module: "wechatpay" },
{ key: "alipay", label: "支付宝", module: "alipay" },
{ key: "paypal", label: "PayPal", module: "paypal" },
{ key: "apple", label: "Apple 内购", module: "appleiap" },
{ key: "google", label: "Google 内购", module: "googleiap" }
];
function payLabel(k) {
return PAY_CHANNELS.find((p) => p.key === k)?.label ?? k;
}
useApi();
useToast();
useRouter();
const scopeApp = ref("");
const scopeApps = ref([]);
const items = ref([]);
const payConfigured = ref([]);
const payChecked_ = ref(false);
const modalOpen = ref(false);
const isEditing = ref(false);
const submitting = ref(false);
function emptyForm() {
return {
row_id: 0,
app_name: "",
channel: 0,
version: "",
min_version: "",
force_update: false,
changelog: "",
address: "",
review_version: "",
status: 1,
description: "",
tourists: false,
allowskipdevicebinding: false,
paychannels: "",
enable: true
};
}
const form = reactive(emptyForm());
const groups = computed(
() => CHANNEL_GROUPS.map((g) => ({
...g,
items: items.value.filter((c) => g.channels.includes(c.channel)).sort((a, b) => a.channel - b.channel),
missing: g.channels.filter((ch) => !items.value.some((c) => c.channel === ch))
}))
);
function payList(c) {
return (c.paychannels || "").split(",").map((x) => x.trim()).filter(Boolean);
}
function payMissing(key) {
if (!payChecked_.value) return false;
const mod = PAY_CHANNELS.find((p) => p.key === key)?.module;
return !!mod && !payConfigured.value.includes(mod);
}
const payWarnings = computed(() => {
if (!payChecked_.value) return [];
const map = {};
for (const c of items.value) {
if (!c.enable) continue;
for (const p of payList(c)) {
if (!payMissing(p)) continue;
(map[p] = map[p] || []).push(channelName(c.channel));
}
}
return Object.keys(map).map((k) => ({ key: k, label: payLabel(k), channels: map[k] }));
});
const versionWarn = computed(() => {
if (form.force_update && !form.min_version.trim()) return "开启强制更新时必须填「最低支持版本」,否则挡不住任何人";
if (form.min_version.trim() && form.version.trim() && cmpVer(form.min_version, form.version) > 0) {
return "「最低支持版本」高于「当前线上版本」,会把所有线上用户判定为需强更却无更高版本可更";
}
return "";
});
function cmpVer(a, b) {
const as = a.trim().split("."), bs = b.trim().split(".");
const n = Math.max(as.length, bs.length);
for (let i = 0; i < n; i++) {
const x = parseInt(as[i] ?? "0") || 0;
const y = parseInt(bs[i] ?? "0") || 0;
if (x !== y) return x < y ? -1 : 1;
}
return 0;
}
function payChecked(key) {
return payList(form).includes(key);
}
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><!--[-->`);
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(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-6057a5c9>+ 添加渠道</button></div></div>`);
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><!--[-->`);
ssrRenderList(payWarnings.value, (w) => {
_push(`<span class="warn-pill" data-v-6057a5c9>${ssrInterpolate(w.label)}(${ssrInterpolate(w.channels.join("、"))})</span>`);
});
_push(`<!--]--></div></div><button class="btn btn-xs btn-ghost" data-v-6057a5c9>去配置 →</button></div></div>`);
} else {
_push(`<!---->`);
}
if (!scopeApp.value) {
_push(`<div class="scope-tip" data-v-6057a5c9> 当前是<b data-v-6057a5c9>全局默认</b>作用域:这里配的渠道对所有应用生效,应用自己配了同渠道则以应用的为准。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
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><!--[-->`);
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>`);
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>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9>`);
if (c.force_update) {
_push(`<span class="flag flag-warn" data-v-6057a5c9>强制更新</span>`);
} else {
_push(`<!---->`);
}
if (c.tourists) {
_push(`<span class="flag" data-v-6057a5c9>游客登录</span>`);
} else {
_push(`<!---->`);
}
if (c.allowskipdevicebinding) {
_push(`<span class="flag" data-v-6057a5c9>可跳过绑定</span>`);
} else {
_push(`<!---->`);
}
if (!c.enable) {
_push(`<span class="flag flag-off" data-v-6057a5c9>已停用</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
if (payList(c).length) {
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9><!--[-->`);
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(`<!--]--></div>`);
} else {
_push(`<!---->`);
}
if (c.address) {
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-6057a5c9>${ssrInterpolate(c.address)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--><!--[-->`);
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></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><!--[-->`);
ssrRenderList(CHANNEL_GROUPS, (g) => {
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-6057a5c9><!--[-->`);
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(`<!--]--></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><!--[-->`);
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(`<!--]--></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>`);
if (versionWarn.value) {
_push(`<p class="ed-warn" data-v-6057a5c9>⚠ ${ssrInterpolate(versionWarn.value)}</p>`);
} else {
_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><!--[-->`);
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>`);
if (payChecked(p.key) && payMissing(p.key)) {
_push(`<span class="pay-miss" data-v-6057a5c9>未配凭据</span>`);
} else {
_push(`<!---->`);
}
_push(`</label>`);
});
_push(`<!--]--></div><p class="ed-tip" data-v-6057a5c9> 这里只决定「这个渠道开放哪几种支付入口」;商户号、密钥等凭据在 `);
if (scopeApp.value) {
_push(`<a class="link" data-v-6057a5c9>应用「${ssrInterpolate(scopeApp.value)}」→ 业务功能配置 → 支付</a>`);
} else {
_push(`<span data-v-6057a5c9>各应用的「业务功能配置 → 支付」</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>`);
if (isEditing.value) {
_push(`<button class="btn btn-ghost btn-sm text-error mr-auto" data-v-6057a5c9>删除</button>`);
} else {
_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>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/channels.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const channels = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6057a5c9"]]);
export { channels as default };
//# sourceMappingURL=channels-CRuax8yi.mjs.map

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

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

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

@ -0,0 +1,8 @@
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

@ -0,0 +1 @@
{"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]}

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

File diff suppressed because one or more lines are too long

124
apps/admin/.output/server/chunks/build/mcpconfig-CcWVtnKl.mjs

@ -1,124 +0,0 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import './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';
import './useLoading-D4zrSa2m.mjs';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "mcpconfig",
__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: "印度" }
];
function regionLabel(v) {
const n = Number(v) || 0;
const r = REGIONS.find((x) => x.value === n);
if (r) return r.label;
return n === 0 ? "通用" : "区域" + n;
}
const TYPE_LABELS = { 0: "HTTP", 1: "SSE" };
function typeLabel(t) {
const n = Number(t) || 0;
return TYPE_LABELS[n] || String(t ?? "HTTP");
}
useApi();
useToast();
const view = ref("list");
const servers = ref([]);
const loading = ref(false);
const submitting = ref(false);
const isEditing = ref(false);
const regionFilter = ref(1);
const kwFilter = ref("");
const form = reactive({
id: "",
name: "",
region: 1,
type: 0,
url: "",
tools: "",
description: "",
enable: true
});
const filteredRows = computed(() => {
const kw = kwFilter.value.trim().toLowerCase();
if (!kw) return servers.value;
return servers.value.filter((s) => ((s.id || "") + (s.name || "")).toLowerCase().includes(kw));
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><div><h2 class="text-lg font-semibold text-slate-800">MCP 配置</h2><p class="text-xs text-slate-400 mt-1">MCP(模型上下文协议)服务器,按区域分组,所有应用共享。修改后各服务约 10 分钟内自动同步。</p></div><button class="btn btn-primary btn-sm text-white">+ 新增 MCP 服务</button></div><div class="flex items-center gap-3 mb-4"><span class="text-sm text-slate-500">区域筛选</span><select class="select select-bordered select-sm"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(regionFilter.value) ? ssrLooseContain(regionFilter.value, 0) : ssrLooseEqual(regionFilter.value, 0)) ? " selected" : ""}>全部区域</option><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)}${ssrIncludeBooleanAttr(Array.isArray(regionFilter.value) ? ssrLooseContain(regionFilter.value, r.value) : ssrLooseEqual(regionFilter.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select><input${ssrRenderAttr("value", kwFilter.value)} class="input input-bordered input-sm w-48" placeholder="按ID/名称搜索"></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>服务ID</th><th>名称</th><th>区域</th><th>类型</th><th>地址</th><th>工具</th><th>状态</th><th class="text-right">操作</th></tr></thead><tbody>`);
if (loading.value) {
_push(`<tr><td colspan="8" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`);
} else if (!filteredRows.value.length) {
_push(`<tr><td colspan="8" class="text-center text-slate-400 py-8">暂无 MCP 服务</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(filteredRows.value, (s) => {
_push(`<tr><td class="font-mono text-sm font-medium">${ssrInterpolate(s.id || "")}</td><td class="text-sm">${ssrInterpolate(s.name || "")}</td><td><span class="badge badge-ghost badge-sm">${ssrInterpolate(regionLabel(s.region))}</span></td><td><span class="badge badge-sm badge-outline">${ssrInterpolate(typeLabel(s.type))}</span></td><td class="text-sm text-slate-500 max-w-xs truncate"${ssrRenderAttr("title", s.url || "")}>${ssrInterpolate(s.url || "")}</td><td class="text-sm text-slate-400">`);
if (s.tools && s.tools.trim()) {
_push(`<span>${ssrInterpolate(s.tools)}</span>`);
} else {
_push(`<span class="text-slate-300">全部</span>`);
}
_push(`</td><td>`);
if (s.enable) {
_push(`<span class="badge badge-success badge-sm text-white">启用</span>`);
} else {
_push(`<span class="badge badge-ghost badge-sm">停用</span>`);
}
_push(`</td><td class="text-right"><div class="inline-flex gap-1"><button class="btn btn-ghost btn-xs">编辑</button><button class="btn btn-ghost btn-xs text-red-500">删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}"><div class="flex items-center gap-3 mb-5"><button class="btn btn-ghost btn-sm">← 返回列表</button><h2 class="text-lg font-semibold text-slate-800">${ssrInterpolate(isEditing.value ? "编辑 MCP 服务" : "新增 MCP 服务")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"><form><div class="grid grid-cols-2 gap-4"><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">服务ID *</span></label><input${ssrRenderAttr("value", form.id)} type="text" class="${ssrRenderClass([{ "bg-slate-100": isEditing.value }, "input input-bordered w-full"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " readonly" : ""} required placeholder="如 gaode_map"><span class="text-xs text-slate-400 mt-1">${ssrInterpolate(isEditing.value ? "编辑模式下不可修改" : "唯一标识,创建后不可修改")}</span></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">名称</span></label><input${ssrRenderAttr("value", form.name)} type="text" class="input input-bordered w-full"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">区域 *</span></label><select class="select select-bordered w-full"><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)}${ssrIncludeBooleanAttr(Array.isArray(form.region) ? ssrLooseContain(form.region, r.value) : ssrLooseEqual(form.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">类型</span></label><select class="select select-bordered w-full"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(form.type) ? ssrLooseContain(form.type, 0) : ssrLooseEqual(form.type, 0)) ? " selected" : ""}>HTTP</option><option${ssrRenderAttr("value", 1)}${ssrIncludeBooleanAttr(Array.isArray(form.type) ? ssrLooseContain(form.type, 1) : ssrLooseEqual(form.type, 1)) ? " selected" : ""}>SSE</option></select></div></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">服务地址 (url)</span></label><input${ssrRenderAttr("value", form.url)} type="text" class="input input-bordered w-full font-mono text-sm" placeholder="https://..."></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">启用工具 (tools)</span></label><input${ssrRenderAttr("value", form.tools)} type="text" class="input input-bordered w-full" placeholder="逗号分隔,留空表示全部启用"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">描述</span></label><input${ssrRenderAttr("value", form.description)} type="text" class="input input-bordered w-full"></div><div class="form-control mb-6"><label class="label cursor-pointer justify-start gap-3"><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary"><span class="label-text font-medium">启用该服务</span></label></div><div class="flex gap-3"><button type="button" class="btn btn-ghost">取消</button><button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""}>保存</button></div></form></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/mcpconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export { _sfc_main as default };
//# sourceMappingURL=mcpconfig-CcWVtnKl.mjs.map

1
apps/admin/.output/server/chunks/build/mcpconfig-CcWVtnKl.mjs.map

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

21
apps/admin/.output/server/chunks/build/mcpconfig-O3oMJUPy.mjs

@ -0,0 +1,21 @@
import { defineComponent, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs } from 'vue/server-renderer';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "mcpconfig",
__ssrInlineRender: true,
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "py-16 text-center text-slate-400" }, _attrs))}><span class="loading loading-spinner loading-sm"></span><p class="text-sm mt-3">MCP 配置已并入「第三方服务配置」,正在跳转…</p></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/mcpconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export { _sfc_main as default };
//# sourceMappingURL=mcpconfig-O3oMJUPy.mjs.map

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

Loading…
Cancel
Save