diff --git a/packages/desktop/src/context/global-sync.tsx b/packages/desktop/src/context/global-sync.tsx
index 188db1e69..2c5c05125 100644
--- a/packages/desktop/src/context/global-sync.tsx
+++ b/packages/desktop/src/context/global-sync.tsx
@@ -74,7 +74,7 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
session_status: {},
session_diff: {},
todo: {},
- limit: 10,
+ limit: 5,
message: {},
part: {},
node: [],
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index 1b43cf511..5ef41c1f4 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -1,14 +1,18 @@
import { createStore } from "solid-js/store"
-import { createMemo } from "solid-js"
+import { createMemo, onMount } from "solid-js"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { makePersisted } from "@solid-primitives/storage"
+import { useGlobalSync } from "./global-sync"
+import { useGlobalSDK } from "./global-sdk"
export const { use: useLayout, provider: LayoutProvider } = createSimpleContext({
name: "Layout",
init: () => {
+ const globalSdk = useGlobalSDK()
+ const globalSync = useGlobalSync()
const [store, setStore] = makePersisted(
createStore({
- projects: [] as { directory: string; expanded: boolean; lastSession?: string }[],
+ projects: [] as { directory: string; expanded: boolean }[],
sidebar: {
opened: false,
width: 280,
@@ -26,11 +30,31 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
)
+ async function loadProjectSessions(directory: string) {
+ const [, setStore] = globalSync.child(directory)
+ globalSdk.client.session.list({ directory }).then((x) => {
+ const sessions = (x.data ?? [])
+ .slice()
+ .sort((a, b) => a.id.localeCompare(b.id))
+ .slice(0, 5)
+ setStore("session", sessions)
+ })
+ }
+
+ onMount(() => {
+ Promise.all(
+ store.projects.map(({ directory }) => {
+ return loadProjectSessions(directory)
+ }),
+ )
+ })
+
return {
projects: {
list: createMemo(() => store.projects),
open(directory: string) {
if (store.projects.find((x) => x.directory === directory)) return
+ loadProjectSessions(directory)
setStore("projects", (x) => [...x, { directory, expanded: true }])
},
close(directory: string) {
@@ -42,12 +66,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
collapse(directory: string) {
setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, expanded: false } : x)))
},
- lastSession(directory: string) {
- return store.projects.find((x) => x.directory === directory)?.lastSession
- },
- setLastSession(directory: string, session: string | undefined) {
- setStore("projects", (x) => x.map((x) => (x.directory === directory ? { ...x, lastSession: session } : x)))
- },
},
sidebar: {
opened: createMemo(() => store.sidebar.opened),
diff --git a/packages/desktop/src/context/local.tsx b/packages/desktop/src/context/local.tsx
index a9f48ec67..0d8303b45 100644
--- a/packages/desktop/src/context/local.tsx
+++ b/packages/desktop/src/context/local.tsx
@@ -335,7 +335,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
return {
node: async (path: string) => {
- if (!store.node[path]) {
+ if (!store.node[path] || store.node[path].loaded === false) {
await init(path)
}
return store.node[path]
diff --git a/packages/desktop/src/context/session.tsx b/packages/desktop/src/context/session.tsx
index 2a0391d6b..5335422f7 100644
--- a/packages/desktop/src/context/session.tsx
+++ b/packages/desktop/src/context/session.tsx
@@ -1,9 +1,9 @@
import { createStore, produce } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
-import { batch, createEffect, createMemo } from "solid-js"
+import { batch, createEffect, createMemo, onMount } from "solid-js"
import { useSync } from "./sync"
import { makePersisted } from "@solid-primitives/storage"
-import { TextSelection } from "./local"
+import { TextSelection, useLocal } from "./local"
import { pipe, sumBy } from "remeda"
import { AssistantMessage, UserMessage } from "@opencode-ai/sdk/v2"
import { useParams } from "@solidjs/router"
@@ -25,6 +25,7 @@ export const { use: useSession, provider: SessionProvider } = createSimpleContex
const sdk = useSDK()
const params = useParams()
const sync = useSync()
+ const local = useLocal()
const name = createMemo(
() => `${base64Encode(sync.data.project.worktree)}/session${params.id ? "/" + params.id : ""}.v2`,
)
@@ -55,6 +56,14 @@ export const { use: useSession, provider: SessionProvider } = createSimpleContex
},
)
+ onMount(() => {
+ store.tabs.all.forEach((tab) => {
+ if (tab.startsWith("file://")) {
+ local.file.open(tab.replace("file://", ""))
+ }
+ })
+ })
+
createEffect(() => {
if (!params.id) return
sync.session.sync(params.id)
diff --git a/packages/desktop/src/pages/directory-layout.tsx b/packages/desktop/src/pages/directory-layout.tsx
index 20467c066..c909a373d 100644
--- a/packages/desktop/src/pages/directory-layout.tsx
+++ b/packages/desktop/src/pages/directory-layout.tsx
@@ -1,32 +1,31 @@
-import { createMemo, type ParentProps } from "solid-js"
+import { createMemo, Show, type ParentProps } from "solid-js"
import { useParams } from "@solidjs/router"
import { SDKProvider } from "@/context/sdk"
import { SyncProvider, useSync } from "@/context/sync"
import { LocalProvider } from "@/context/local"
-import { useGlobalSync } from "@/context/global-sync"
import { base64Decode } from "@opencode-ai/util/encode"
import { DataProvider } from "@opencode-ai/ui/context"
import { iife } from "@opencode-ai/util/iife"
export default function Layout(props: ParentProps) {
const params = useParams()
- const sync = useGlobalSync()
const directory = createMemo(() => {
- const decoded = base64Decode(params.dir!)
- return sync.data.projects.find((x) => x.worktree === decoded)?.worktree ?? "/"
+ return base64Decode(params.dir!)
})
return (
-