diff --git a/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts b/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts index 68e6240cb..b56e4f422 100644 --- a/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts +++ b/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts @@ -9,9 +9,9 @@ import type { WidgetsWindowManager } from '../../widgets' import { defineInvokeHandler } from '@moeru/eventa' import { createContext } from '@moeru/eventa/adapters/electron/main' -import { desktopCapturer, ipcMain, session } from 'electron' +import { ipcMain } from 'electron' -import { electronOpenDevtoolsWindow, electronOpenSettingsDevtools, modulesVisionPrepareScreenSourceSelection } from '../../../../shared/eventa' +import { electronOpenDevtoolsWindow, electronOpenSettingsDevtools } from '../../../../shared/eventa' import { createMcpServersService } from '../../../services/airi/mcp-servers' import { createWidgetsService } from '../../../services/airi/widgets' import { createAutoUpdaterService } from '../../../services/electron' @@ -44,16 +44,5 @@ export async function setupSettingsWindowInvokes(params: { await params.devtoolsMarkdownStressWindow.openWindow(payload?.route) }) - defineInvokeHandler(context, modulesVisionPrepareScreenSourceSelection, async () => { - // TODO(@sumimakito): Refactor electron-audio-loopback first then move this to register for beat-sync handler. - // TODO(@nekomeowww): Currently, beat-sync and vision cannot be used together, as they both overriding the display media request handler. - session.defaultSession.setDisplayMediaRequestHandler((_request, callback) => { - desktopCapturer.getSources({ types: ['screen'] }).then((sources) => { - // Grant access to the first screen found. - callback({ video: sources[0], audio: 'loopback' }) - }) - }, { useSystemPicker: false }) - }) - return context } diff --git a/apps/stage-tamagotchi/src/shared/eventa.ts b/apps/stage-tamagotchi/src/shared/eventa.ts index 8d2d7458b..3a3ea5ef5 100644 --- a/apps/stage-tamagotchi/src/shared/eventa.ts +++ b/apps/stage-tamagotchi/src/shared/eventa.ts @@ -266,5 +266,3 @@ export const i18nGetLocale = defineInvokeEventa('eventa:invoke:electron: export { electron } from '@proj-airi/electron-eventa' export * from '@proj-airi/electron-eventa/electron-updater' - -export const modulesVisionPrepareScreenSourceSelection = defineInvokeEventa('eventa:invoke:modules:vision:prepare-screen-source-selection') diff --git a/packages/stage-ui/src/stores/modules/vision/processing-store.ts b/packages/stage-ui/src/stores/modules/vision/processing-store.ts index 3b0ff8006..f42f3fee2 100644 --- a/packages/stage-ui/src/stores/modules/vision/processing-store.ts +++ b/packages/stage-ui/src/stores/modules/vision/processing-store.ts @@ -1,8 +1,7 @@ +import { refManualReset, useLocalStorage } from '@vueuse/core' import { defineStore } from 'pinia' import { computed, ref, watch } from 'vue' -import { createResettableLocalStorage } from '../../../utils/resettable' - export interface VisionTickOutcome { capturedAt?: number contextUpdates?: number @@ -32,10 +31,10 @@ function countInWindow(history: number[], windowMs: number) { } export const useVisionProcessingStore = defineStore('vision-processing', () => { - const [captureIntervalMs, resetCaptureIntervalMs] = createResettableLocalStorage( + const captureIntervalMs = refManualReset(useLocalStorage( 'settings/vision/capture-interval-ms', DEFAULT_CAPTURE_INTERVAL_MS, - ) + )) const isRunning = ref(false) const isProcessing = ref(false) @@ -161,7 +160,7 @@ export const useVisionProcessingStore = defineStore('vision-processing', () => { function resetState() { stopTicker() resetMetrics() - resetCaptureIntervalMs() + captureIntervalMs.reset() } watch(captureIntervalMs, (next, previous) => { diff --git a/packages/stage-ui/src/stores/modules/vision/store.ts b/packages/stage-ui/src/stores/modules/vision/store.ts index f45e22788..049e37b6f 100644 --- a/packages/stage-ui/src/stores/modules/vision/store.ts +++ b/packages/stage-ui/src/stores/modules/vision/store.ts @@ -1,16 +1,16 @@ +import { refManualReset, useLocalStorage } from '@vueuse/core' import { defineStore } from 'pinia' import { computed } from 'vue' -import { createResettableLocalStorage, createResettableRef } from '../../../utils/resettable' import { useProvidersStore } from '../../providers' export const useVisionStore = defineStore('vision', () => { const providersStore = useProvidersStore() - const [activeProvider, resetActiveProvider] = createResettableLocalStorage('settings/vision/active-provider', '') - const [activeModel, resetActiveModel] = createResettableLocalStorage('settings/vision/active-model', '') - const [activeCustomModelName, resetActiveCustomModelName] = createResettableLocalStorage('settings/vision/active-custom-model', '') - const [modelSearchQuery, resetModelSearchQuery] = createResettableRef('') + const activeProvider = refManualReset(useLocalStorage('settings/vision/active-provider', '')) + const activeModel = refManualReset(useLocalStorage('settings/vision/active-model', '')) + const activeCustomModelName = refManualReset(useLocalStorage('settings/vision/active-custom-model', '')) + const modelSearchQuery = refManualReset('') const providerMetadata = computed(() => { if (!activeProvider.value) @@ -49,9 +49,9 @@ export const useVisionStore = defineStore('vision', () => { }) function resetModelSelection() { - resetActiveModel() - resetActiveCustomModelName() - resetModelSearchQuery() + activeModel.reset() + activeCustomModelName.reset() + modelSearchQuery.reset() } async function loadModelsForProvider(provider: string) { @@ -69,7 +69,7 @@ export const useVisionStore = defineStore('vision', () => { } function resetState() { - resetActiveProvider() + activeProvider.reset() resetModelSelection() } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31b1ea973..2fcfee20e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1848,7 +1848,7 @@ importers: version: 5.0.0(vue@3.5.29(typescript@5.9.3)) '@intlify/unplugin-vue-i18n': specifier: ^11.0.7 - version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + version: 11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) '@mdit/plugin-footnote': specifier: ^0.22.4 version: 0.22.4(markdown-it@14.1.1) @@ -1908,7 +1908,7 @@ importers: version: 0.1.3 unplugin-yaml: specifier: ^4.0.0 - version: 4.0.0(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.0(@nuxt/kit@3.20.2(magicast@0.5.2))(esbuild@0.27.2)(rolldown@1.0.0-rc.3)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vitepress: specifier: ^2.0.0-alpha.16 version: 2.0.0-alpha.16(@types/node@24.10.14)(change-case@5.4.4)(fuse.js@7.1.0)(idb-keyval@6.2.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(nprogress@0.2.0)(postcss@8.5.6)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) @@ -3261,7 +3261,7 @@ importers: version: 14.1.0(vue@3.5.29(typescript@5.9.3)) '@wxt-dev/module-vue': specifier: ^1.0.3 - version: 1.0.3(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))(wxt@0.20.18(@types/node@24.10.14)(canvas@3.2.1)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.0.3(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))(wxt@0.20.18(@types/node@24.10.14)(canvas@3.2.1)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) nanoid: specifier: ^5.1.6 version: 5.1.6 @@ -19423,6 +19423,31 @@ snapshots: - supports-color - typescript + '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) + '@intlify/bundle-utils': 11.0.7(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3))) + '@intlify/shared': 11.2.8 + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.2.8)(@vue/compiler-dom@3.5.29)(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3)) + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) + debug: 4.4.3 + fast-glob: 3.3.3 + pathe: 2.0.3 + picocolors: 1.1.1 + unplugin: 2.3.11 + vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.29(typescript@5.9.3) + optionalDependencies: + vue-i18n: 11.2.8(vue@3.5.29(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/compiler-dom' + - eslint + - rollup + - supports-color + - typescript + '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.29)(eslint@9.39.3(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue-i18n@11.2.8(vue@3.5.29(typescript@5.9.3)))(vue@3.5.29(typescript@5.9.3))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) @@ -23657,9 +23682,9 @@ snapshots: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 - '@wxt-dev/module-vue@1.0.3(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))(wxt@0.20.18(@types/node@24.10.14)(canvas@3.2.1)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@wxt-dev/module-vue@1.0.3(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3))(wxt@0.20.18(@types/node@24.10.14)(canvas@3.2.1)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitejs/plugin-vue': 6.0.4(vite@8.0.0-beta.15(@types/node@24.10.14)(esbuild@0.27.2)(jiti@2.6.1)(less@4.5.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.4(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.9.3)) wxt: 0.20.18(@types/node@24.10.14)(canvas@3.2.1)(eslint@9.39.3(jiti@2.6.1))(jiti@2.6.1)(less@4.5.1)(lightningcss@1.31.1)(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - vite