diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlButton.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlButton.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlButton.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlButton.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlButtonTooltip.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlButtonTooltip.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlButtonTooltip.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlButtonTooltip.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlsIslandHearingConfig.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlsIslandHearingConfig.vue
similarity index 94%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlsIslandHearingConfig.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlsIslandHearingConfig.vue
index b48cda4c3..20537092b 100644
--- a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlsIslandHearingConfig.vue
+++ b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/ControlsIslandHearingConfig.vue
@@ -51,12 +51,9 @@ onUnmounted(async () => {
v-model:enabled="enabled"
v-model:selected-audio-input="selectedAudioInput"
:granted="mediaAccessStatus !== 'denied' && mediaAccessStatus !== 'restricted'"
- :audio-input-options="audioInputs"
+ :audio-inputs="audioInputs"
:volume-level="volumeLevel"
>
-
-
-
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/IndicatorMicVolume.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/IndicatorMicVolume.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/IndicatorMicVolume.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/IndicatorMicVolume.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/index.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/index.vue
similarity index 96%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/index.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/index.vue
index 20585ce7d..a771e5023 100644
--- a/apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/index.vue
+++ b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ControlsIsland/index.vue
@@ -19,7 +19,7 @@ const toggleDark = useToggle(isDark)
const settingsAudioDeviceStore = useSettingsAudioDevice()
const context = useElectronEventaContext()
-const { enabled: isAudioEnabled } = storeToRefs(settingsAudioDeviceStore)
+const { enabled } = storeToRefs(settingsAudioDeviceStore)
const openSettings = useElectronEventaInvoke(electronOpenSettings)
const openChat = useElectronEventaInvoke(electronOpenChat)
@@ -64,7 +64,7 @@ defineExpose({ hearingDialogOpen })
-
+
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingComponent.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingComponent.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingComponent.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingComponent.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingComponentDetail.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingComponentDetail.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingComponentDetail.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingComponentDetail.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingModules.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingModules.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/LoadingModules.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/LoadingModules.vue
diff --git a/apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/index.vue b/apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/index.vue
similarity index 100%
rename from apps/stage-tamagotchi/src/renderer/components/Widgets/ResourceStatusIsland/index.vue
rename to apps/stage-tamagotchi/src/renderer/components/StageIslands/ResourceStatusIsland/index.vue
diff --git a/apps/stage-tamagotchi/src/renderer/pages/index.vue b/apps/stage-tamagotchi/src/renderer/pages/index.vue
index 88fb7be54..0ca8240f6 100644
--- a/apps/stage-tamagotchi/src/renderer/pages/index.vue
+++ b/apps/stage-tamagotchi/src/renderer/pages/index.vue
@@ -17,8 +17,8 @@ import { debouncedRef, useBroadcastChannel, watchPausable } from '@vueuse/core'
import { storeToRefs } from 'pinia'
import { computed, onUnmounted, ref, toRef, watch } from 'vue'
-import ControlsIsland from '../components/Widgets/ControlsIsland/index.vue'
-import ResourceStatusIsland from '../components/Widgets/ResourceStatusIsland/index.vue'
+import ControlsIsland from '../components/StageIslands/ControlsIsland/index.vue'
+import ResourceStatusIsland from '../components/StageIslands/ResourceStatusIsland/index.vue'
import { electron } from '../../shared/electron'
import {
diff --git a/apps/stage-web/package.json b/apps/stage-web/package.json
index 57e5725b4..1543f231f 100644
--- a/apps/stage-web/package.json
+++ b/apps/stage-web/package.json
@@ -97,6 +97,7 @@
"@iconify-json/eos-icons": "^1.2.4",
"@iconify-json/lucide": "^1.2.71",
"@iconify-json/mingcute": "^1.2.5",
+ "@iconify-json/ph": "^1.2.2",
"@iconify-json/simple-icons": "^1.2.56",
"@iconify-json/solar": "^1.2.5",
"@iconify-json/svg-spinners": "^1.2.4",
diff --git a/apps/stage-web/src/components/Layouts/InteractiveArea.vue b/apps/stage-web/src/components/Layouts/InteractiveArea.vue
index f9e376c4d..200f3c93a 100644
--- a/apps/stage-web/src/components/Layouts/InteractiveArea.vue
+++ b/apps/stage-web/src/components/Layouts/InteractiveArea.vue
@@ -1,24 +1,24 @@
@@ -113,54 +116,107 @@ watch([hearingDialogOpen, enabled, stream], () => {
-
-
-
selectedAudioInput = val as string"
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ enabled ? 'Microphone enabled' : 'Microphone disabled' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue b/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue
index 4e00009e8..efc3eeef7 100644
--- a/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue
+++ b/apps/stage-web/src/components/Layouts/MobileInteractiveArea.vue
@@ -2,7 +2,8 @@
import type { ChatProvider } from '@xsai-ext/shared-providers'
import { HearingConfigDialog } from '@proj-airi/stage-ui/components'
-import { useMicVAD } from '@proj-airi/stage-ui/composables'
+import { useAudioAnalyzer } from '@proj-airi/stage-ui/composables'
+import { useAudioContext } from '@proj-airi/stage-ui/stores/audio'
import { useChatStore } from '@proj-airi/stage-ui/stores/chat'
import { useConsciousnessStore } from '@proj-airi/stage-ui/stores/modules/consciousness'
import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers'
@@ -10,10 +11,11 @@ import { useSettings, useSettingsAudioDevice } from '@proj-airi/stage-ui/stores/
import { BasicTextarea } from '@proj-airi/ui'
import { useDark, useResizeObserver, useScreenSafeArea } from '@vueuse/core'
import { storeToRefs } from 'pinia'
-import { onMounted, ref, useTemplateRef, watch } from 'vue'
+import { onMounted, onUnmounted, ref, useTemplateRef, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { RouterLink } from 'vue-router'
+import IndicatorMicVolume from '../Widgets/IndicatorMicVolume.vue'
import MobileChatHistory from '../Widgets/MobileChatHistory.vue'
import ActionAbout from './InteractiveArea/Actions/About.vue'
import ActionViewControls from './InteractiveArea/Actions/ViewControls.vue'
@@ -26,7 +28,6 @@ const viewControlsActiveMode = ref<'x' | 'y' | 'z' | 'scale'>('scale')
const viewControlsInputsRef = useTemplateRef