+
+
+
+ {voice.state.title}
+
+
+
+
+
+
+ {language.t("voice.connecting")}
+
+
+ {language.t(`voice.failure.${voice.state.failure ?? "dropped"}`)}
+
+
+
+ {language.t(voice.state.speaker === "user" ? "voice.you" : "voice.assistant")}{" "}
+ {voice.state.caption}
+
+
+
+ )
+}
diff --git a/packages/app/src/voice/context.tsx b/packages/app/src/voice/context.tsx
new file mode 100644
index 000000000000..7237fc29f324
--- /dev/null
+++ b/packages/app/src/voice/context.tsx
@@ -0,0 +1,89 @@
+import { createSimpleContext } from "@opencode/ui/context"
+import { useNavigate } from "@solidjs/router"
+import { onCleanup } from "solid-js"
+import { createStore } from "solid-js/store"
+import type { SessionInfo } from "@opencode/client/promise"
+import { usePlatform } from "@/runtime/platform/platform"
+import type { ServerCtx } from "@/runtime/server/runtime"
+import type { ServerConnection } from "@/runtime/server/registry"
+import { sessionHref } from "@/shell/routes/session"
+import type { CallState, createVoiceCall } from "./call"
+
+export const { provider: VoiceProvider, use: useVoice } = createSimpleContext({
+ name: "Voice",
+ init: () => {
+ const platform = usePlatform()
+ const navigate = useNavigate()
+
+ const [state, setState] = createStore