From 999da4b0b66edac9331003d6c3a2efbb85a0efbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=93=9D=E8=8E=93=F0=9F=AB=90?= Date: Mon, 26 Oct 2026 04:47:15 +0700 Subject: [PATCH] feat(stage-pages,stage-ui): search settings, their rows, and runtime items (#3112) --- apps/stage-pocket/vite.config.ts | 5 + apps/stage-tamagotchi/electron.vite.config.ts | 5 + .../connection/server-channel-qr-card.vue | 2 + .../pages/settings/data/index.search.ts | 2 + .../src/renderer/pages/settings/index.vue | 25 +- .../pages/settings/models/index.search.ts | 2 + .../modules/home-assistant.browser.test.ts | 9 + .../settings/modules/home-assistant.search.ts | 35 + .../pages/settings/modules/home-assistant.vue | 13 + .../pages/settings/modules/mcp.search.ts | 21 + .../renderer/pages/settings/modules/mcp.vue | 2 + apps/stage-web/vite.config.ts | 5 + docs/ai/context/ui-components.md | 27 + packages/i18n/src/locales/en/settings.yaml | 4 + .../i18n/src/locales/zh-Hans/settings.yaml | 4 + packages/provider-inference/src/types.ts | 6 + .../stage-layouts/src/layouts/settings.vue | 3 + packages/stage-pages/README.md | 28 + .../settings-experimental-features.vue | 3 + .../pages/settings/airi-card/index.search.ts | 16 + .../components/downloaded-models-section.vue | 21 +- .../pages/settings/data/downloaded-models.ts | 33 + .../src/pages/settings/data/index.search.ts | 15 + .../stage-pages/src/pages/settings/index.vue | 23 +- .../src/pages/settings/models/index.search.ts | 17 + .../settings/modules/consciousness.search.ts | 11 + .../pages/settings/modules/consciousness.vue | 4 + .../modules/hearing/transcriber.search.ts | 17 + .../settings/modules/hearing/transcriber.vue | 4 + .../modules/hearing/wake-words.search.ts | 16 + .../settings/modules/hearing/wake-words.vue | 4 +- .../memory-long-term-memories.search.ts | 25 + .../modules/memory-long-term-memories.vue | 3 + .../memory-long-term-recipes.search.ts | 15 + .../modules/memory-long-term-recipes.vue | 3 + .../settings/modules/module-model-search.ts | 147 ++ .../pages/settings/modules/speech.search.ts | 21 + .../src/pages/settings/modules/speech.vue | 16 + .../pages/settings/modules/stickers.search.ts | 12 + .../settings/modules/tool-cards.search.ts | 15 + .../src/pages/settings/modules/tool-cards.vue | 3 + .../pages/settings/modules/vision.search.ts | 11 + .../src/pages/settings/modules/vision.vue | 4 + .../providers/artistry/comfyui.search.ts | 15 + .../settings/providers/artistry/comfyui.vue | 4 +- .../src/pages/settings/scene/index.search.ts | 26 + .../src/pages/settings/scene/index.vue | 8 +- .../settings/system/experimental.search.ts | 15 + .../src/settings-search-providers.ts | 16 + .../src/vite/settings-search-providers.d.ts | 7 + .../stage-pages/src/vite/settings-search.ts | 1652 +++++++++++++++++ packages/stage-shared/package.json | 1 + .../stage-shared/src/settings-search/index.ts | 120 ++ .../components/layouts/link-group.story.vue | 47 + .../src/components/layouts/section.vue | 1 + .../menu/radio-card-many-select.vue | 6 + .../menu/voice-card-many-select.vue | 6 + .../src/components/modules/stickers.vue | 7 +- .../providers/provider-advanced-settings.vue | 1 + .../components/scenarios/settings/index.ts | 2 + .../settings/model-settings/panel.vue | 4 +- .../settings/model-settings/runtime.ts | 6 + .../settings/settings-search-field.story.vue | 18 + .../settings/settings-search-field.vue | 50 + .../settings/settings-search-results.vue | 158 ++ .../src/composables/use-settings-search.ts | 443 +++++ .../providers/providers/official/index.ts | 5 +- .../stage-ui/src/stores/modules/stickers.ts | 12 + packages/ui/src/components/layouts/index.ts | 2 + .../components/layouts/link-group-context.ts | 16 + .../components/layouts/link-group-item.vue | 167 ++ .../ui/src/components/layouts/link-group.vue | 125 ++ 72 files changed, 3561 insertions(+), 36 deletions(-) create mode 100644 apps/stage-tamagotchi/src/renderer/pages/settings/data/index.search.ts create mode 100644 apps/stage-tamagotchi/src/renderer/pages/settings/models/index.search.ts create mode 100644 apps/stage-tamagotchi/src/renderer/pages/settings/modules/home-assistant.search.ts create mode 100644 apps/stage-tamagotchi/src/renderer/pages/settings/modules/mcp.search.ts create mode 100644 packages/stage-pages/src/pages/settings/airi-card/index.search.ts create mode 100644 packages/stage-pages/src/pages/settings/data/downloaded-models.ts create mode 100644 packages/stage-pages/src/pages/settings/data/index.search.ts create mode 100644 packages/stage-pages/src/pages/settings/models/index.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/consciousness.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/hearing/transcriber.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/hearing/wake-words.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/memory-long-term-memories.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/memory-long-term-recipes.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/module-model-search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/speech.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/stickers.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/tool-cards.search.ts create mode 100644 packages/stage-pages/src/pages/settings/modules/vision.search.ts create mode 100644 packages/stage-pages/src/pages/settings/providers/artistry/comfyui.search.ts create mode 100644 packages/stage-pages/src/pages/settings/scene/index.search.ts create mode 100644 packages/stage-pages/src/pages/settings/system/experimental.search.ts create mode 100644 packages/stage-pages/src/settings-search-providers.ts create mode 100644 packages/stage-pages/src/vite/settings-search-providers.d.ts create mode 100644 packages/stage-pages/src/vite/settings-search.ts create mode 100644 packages/stage-shared/src/settings-search/index.ts create mode 100644 packages/stage-ui/src/components/layouts/link-group.story.vue create mode 100644 packages/stage-ui/src/components/scenarios/settings/settings-search-field.story.vue create mode 100644 packages/stage-ui/src/components/scenarios/settings/settings-search-field.vue create mode 100644 packages/stage-ui/src/components/scenarios/settings/settings-search-results.vue create mode 100644 packages/stage-ui/src/composables/use-settings-search.ts create mode 100644 packages/ui/src/components/layouts/link-group-context.ts create mode 100644 packages/ui/src/components/layouts/link-group-item.vue create mode 100644 packages/ui/src/components/layouts/link-group.vue diff --git a/apps/stage-pocket/vite.config.ts b/apps/stage-pocket/vite.config.ts index 8aecc882a8..1f2d5c0889 100644 --- a/apps/stage-pocket/vite.config.ts +++ b/apps/stage-pocket/vite.config.ts @@ -23,6 +23,7 @@ import VueRouter from 'vue-router/vite' import { tryCatch } from '@moeru/std' import { localeRemap, serializeStartupFallbackLocales } from '@proj-airi/i18n' import { paraformerBilingualZhEn, xAsrBilingualZhEnInt8, zipformerMultilingual } from '@proj-airi/provider-inference/sherpaw-transcription/models' +import { createSettingsSearch } from '@proj-airi/stage-pages/vite/settings-search' import { speakerModel } from '@proj-airi/stage-shared/speaker-model' import { kwsModel } from '@proj-airi/stage-ui/libs/voice/kws-model-info' import { Download } from '@proj-airi/unplugin-fetch/vite' @@ -40,6 +41,7 @@ function isEnvTruthy(value: string | undefined | null): boolean { const stageUIAssetsRoot = resolve(join(import.meta.dirname, '..', '..', 'packages', 'stage-ui', 'src', 'assets')) const sharedCacheDir = resolve(join(import.meta.dirname, '..', '..', '.cache')) +const settingsSearch = createSettingsSearch() export default defineConfig({ optimizeDeps: { @@ -135,6 +137,8 @@ export default defineConfig({ Yaml(), + settingsSearch.plugin, + VueMacros({ plugins: { vue: Vue({ @@ -162,6 +166,7 @@ export default defineConfig({ }, ], exclude: ['**/components/**'], + extendRoute: settingsSearch.extendRoute, }), // https://github.com/JohnCampionJr/vite-plugin-vue-layouts diff --git a/apps/stage-tamagotchi/electron.vite.config.ts b/apps/stage-tamagotchi/electron.vite.config.ts index 0be70b5e05..1189256fe1 100644 --- a/apps/stage-tamagotchi/electron.vite.config.ts +++ b/apps/stage-tamagotchi/electron.vite.config.ts @@ -15,6 +15,7 @@ import VueMacros from 'vue-macros/vite' import VueRouter from 'vue-router/vite' import { paraformerBilingualZhEn, xAsrBilingualZhEnInt8, zipformerMultilingual } from '@proj-airi/provider-inference/sherpaw-transcription/models' +import { createSettingsSearch } from '@proj-airi/stage-pages/vite/settings-search' import { speakerModel } from '@proj-airi/stage-shared/speaker-model' import { kwsModel } from '@proj-airi/stage-ui/libs/voice/kws-model-info' import { Download } from '@proj-airi/unplugin-fetch' @@ -24,6 +25,7 @@ import { defineConfig } from 'electron-vite' const stageUIAssetsRoot = resolve(join(import.meta.dirname, '..', '..', 'packages', 'stage-ui', 'src', 'assets')) const sharedCacheDir = resolve(join(import.meta.dirname, '..', '..', '.cache')) +const settingsSearch = createSettingsSearch() const sherpawModels = [paraformerBilingualZhEn, zipformerMultilingual, xAsrBilingualZhEnInt8] /** Main downloads remote Sherpaw models. It must use the endpoint that the renderer plugin uses. */ const sherpawModelEndpoint = resolveModelEndpoint() @@ -240,6 +242,8 @@ export default defineConfig({ Yaml(), + settingsSearch.plugin, + VueMacros({ plugins: { vue: Vue({ @@ -272,6 +276,7 @@ export default defineConfig({ resolve(import.meta.dirname, 'src', 'renderer', 'pages'), ], exclude: ['**/components/**'], + extendRoute: settingsSearch.extendRoute, }), VitePluginVueDevTools(), diff --git a/apps/stage-tamagotchi/src/renderer/pages/settings/connection/server-channel-qr-card.vue b/apps/stage-tamagotchi/src/renderer/pages/settings/connection/server-channel-qr-card.vue index 75f374e2e3..e460291ba2 100644 --- a/apps/stage-tamagotchi/src/renderer/pages/settings/connection/server-channel-qr-card.vue +++ b/apps/stage-tamagotchi/src/renderer/pages/settings/connection/server-channel-qr-card.vue @@ -98,6 +98,7 @@ watch(appliedConfig, () => {