From 20662e21014216dfb42690d52b900d43666892fc Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Tue, 9 Dec 2025 06:12:04 -0600
Subject: wip(desktop): progress
---
packages/desktop/src/DesktopInterface.tsx | 59 -------------------------------
packages/desktop/src/PlatformContext.tsx | 14 --------
packages/desktop/src/app.tsx | 59 +++++++++++++++++++++++++++++++
packages/desktop/src/context/platform.tsx | 25 +++++++++++++
packages/desktop/src/entry.tsx | 13 ++++---
packages/desktop/src/index.ts | 4 +--
packages/desktop/src/pages/layout.tsx | 2 +-
7 files changed, 96 insertions(+), 80 deletions(-)
delete mode 100644 packages/desktop/src/DesktopInterface.tsx
delete mode 100644 packages/desktop/src/PlatformContext.tsx
create mode 100644 packages/desktop/src/app.tsx
create mode 100644 packages/desktop/src/context/platform.tsx
(limited to 'packages/desktop/src')
diff --git a/packages/desktop/src/DesktopInterface.tsx b/packages/desktop/src/DesktopInterface.tsx
deleted file mode 100644
index 31d52863d..000000000
--- a/packages/desktop/src/DesktopInterface.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import "@/index.css"
-import { Router, Route, Navigate } from "@solidjs/router"
-import { MetaProvider } from "@solidjs/meta"
-import { Font } from "@opencode-ai/ui/font"
-import { MarkedProvider } from "@opencode-ai/ui/context/marked"
-import { DiffComponentProvider } from "@opencode-ai/ui/context/diff"
-import { Diff } from "@opencode-ai/ui/diff"
-import { GlobalSyncProvider } from "./context/global-sync"
-import Layout from "@/pages/layout"
-import Home from "@/pages/home"
-import DirectoryLayout from "@/pages/directory-layout"
-import Session from "@/pages/session"
-import { LayoutProvider } from "./context/layout"
-import { GlobalSDKProvider } from "./context/global-sdk"
-import { SessionProvider } from "./context/session"
-import { Show } from "solid-js"
-
-const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1"
-const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"
-
-const url =
- new URLSearchParams(document.location.search).get("url") ||
- (location.hostname.includes("opencode.ai") || location.hostname.includes("localhost")
- ? `http://${host}:${port}`
- : "/")
-
-export function DesktopInterface() {
- return (
-
-
-
-
-
-
-
-
-
-
- } />
- (
-
-
-
-
-
- )}
- />
-
-
-
-
-
-
-
-
- )
-}
diff --git a/packages/desktop/src/PlatformContext.tsx b/packages/desktop/src/PlatformContext.tsx
deleted file mode 100644
index 5b510a8d4..000000000
--- a/packages/desktop/src/PlatformContext.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { createContext } from "solid-js"
-import { useContext } from "solid-js"
-
-export interface Platform {}
-
-const PlatformContext = createContext()
-
-export const PlatformProvider = PlatformContext.Provider
-
-export function usePlatform() {
- const ctx = useContext(PlatformContext)
- if (!ctx) throw new Error("usePlatform must be used within a PlatformProvider")
- return ctx
-}
diff --git a/packages/desktop/src/app.tsx b/packages/desktop/src/app.tsx
new file mode 100644
index 000000000..0ca4d5e6b
--- /dev/null
+++ b/packages/desktop/src/app.tsx
@@ -0,0 +1,59 @@
+import "@/index.css"
+import { Router, Route, Navigate } from "@solidjs/router"
+import { MetaProvider } from "@solidjs/meta"
+import { Font } from "@opencode-ai/ui/font"
+import { MarkedProvider } from "@opencode-ai/ui/context/marked"
+import { DiffComponentProvider } from "@opencode-ai/ui/context/diff"
+import { Diff } from "@opencode-ai/ui/diff"
+import { GlobalSyncProvider } from "./context/global-sync"
+import Layout from "@/pages/layout"
+import Home from "@/pages/home"
+import DirectoryLayout from "@/pages/directory-layout"
+import Session from "@/pages/session"
+import { LayoutProvider } from "./context/layout"
+import { GlobalSDKProvider } from "./context/global-sdk"
+import { SessionProvider } from "./context/session"
+import { Show } from "solid-js"
+
+const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1"
+const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"
+
+const url =
+ new URLSearchParams(document.location.search).get("url") ||
+ (location.hostname.includes("opencode.ai") || location.hostname.includes("localhost")
+ ? `http://${host}:${port}`
+ : "/")
+
+export function App() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ } />
+ (
+
+
+
+
+
+ )}
+ />
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/desktop/src/context/platform.tsx b/packages/desktop/src/context/platform.tsx
new file mode 100644
index 000000000..21be49cbd
--- /dev/null
+++ b/packages/desktop/src/context/platform.tsx
@@ -0,0 +1,25 @@
+import { createSimpleContext } from "@opencode-ai/ui/context"
+
+export type Platform = {
+ /** Platform discriminator */
+ platform: "web" | "tauri"
+
+ /** Open native directory picker dialog (Tauri only) */
+ openDirectoryPickerDialog?(opts?: { title?: string; multiple?: boolean }): Promise
+
+ /** Open native file picker dialog (Tauri only) */
+ openFilePickerDialog?(opts?: { title?: string; multiple?: boolean }): Promise
+
+ /** Save file picker dialog (Tauri only) */
+ saveFilePickerDialog?(opts?: { title?: string; defaultPath?: string }): Promise
+
+ /** Open a URL in the default browser */
+ openLink(url: string): void
+}
+
+export const { use: usePlatform, provider: PlatformProvider } = createSimpleContext({
+ name: "Platform",
+ init: (props: { value: Platform }) => {
+ return props.value
+ },
+})
diff --git a/packages/desktop/src/entry.tsx b/packages/desktop/src/entry.tsx
index 82c5dd331..eec6396e9 100644
--- a/packages/desktop/src/entry.tsx
+++ b/packages/desktop/src/entry.tsx
@@ -1,7 +1,7 @@
// @refresh reload
import { render } from "solid-js/web"
-import { DesktopInterface } from "@/DesktopInterface"
-import { Platform, PlatformProvider } from "@/PlatformContext"
+import { App } from "@/app"
+import { Platform, PlatformProvider } from "@/context/platform"
const root = document.getElementById("root")
if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
@@ -10,12 +10,17 @@ if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
)
}
-const platform: Platform = {}
+const platform: Platform = {
+ platform: "web",
+ openLink(url: string) {
+ window.open(url, "_blank")
+ },
+}
render(
() => (
-
+
),
root!,
diff --git a/packages/desktop/src/index.ts b/packages/desktop/src/index.ts
index 2142e4886..cf5be9f51 100644
--- a/packages/desktop/src/index.ts
+++ b/packages/desktop/src/index.ts
@@ -1,2 +1,2 @@
-export { PlatformProvider, type Platform } from "./PlatformContext"
-export { DesktopInterface } from "./DesktopInterface"
+export { PlatformProvider, type Platform } from "./context/platform"
+export { App } from "./app"
diff --git a/packages/desktop/src/pages/layout.tsx b/packages/desktop/src/pages/layout.tsx
index 03eeedfb1..25e3aafb6 100644
--- a/packages/desktop/src/pages/layout.tsx
+++ b/packages/desktop/src/pages/layout.tsx
@@ -196,7 +196,7 @@ export default function Layout(props: ParentProps) {
return (
-
+