Skip to content

Commit 13c2759

Browse files
committed
Merge branch 'dev' of github.com:anomalyco/opencode into dev
2 parents 2564a4f + fd9bd44 commit 13c2759

88 files changed

Lines changed: 1136 additions & 748 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎bun.lock‎

Lines changed: 28 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎packages/app/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@opencode-ai/app",
3-
"version": "1.18.22",
3+
"version": "1.18.23",
44
"description": "",
55
"type": "module",
66
"exports": {

‎packages/app/src/context/global-sync/home-session-index.test.ts‎

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { describe, expect, test } from "bun:test"
2-
import type { SessionV2Info } from "@opencode-ai/sdk/v2/client"
2+
import { QueryClient } from "@tanstack/solid-query"
3+
import type { Session, SessionV2Info } from "@opencode-ai/sdk/v2/client"
34
import {
45
applyHomeSessionEvent,
56
appendHomeSessionEvent,
7+
createHomeSessionIndexCache,
68
HOME_V2_SESSION_PAGE_LIMIT,
79
loadHomeSessionIndex,
810
homeSessionIndexSessions,
@@ -151,4 +153,33 @@ describe("Home V2 session index", () => {
151153
expect(homeSessionIndexRefresh("global.disposed", true).refetch).toBe(true)
152154
expect(homeSessionIndexRefresh("session.next.moved", true).refetch).toBe(true)
153155
})
156+
157+
test("removes a session from the loaded Home index", () => {
158+
const queryClient = new QueryClient()
159+
const cache = createHomeSessionIndexCache(queryClient, "server")
160+
const sessions = [
161+
{ id: "a", time: { created: 1, updated: 1 } },
162+
{ id: "b", time: { created: 1, updated: 1 } },
163+
] as Session[]
164+
queryClient.setQueryData(cache.indexKey, { sessions, eventSequence: 0 })
165+
166+
cache.remove("a")
167+
168+
const index = queryClient.getQueryData<{ sessions: Session[] }>(cache.indexKey)
169+
expect(index?.sessions.map((item) => item.id)).toEqual(["b"])
170+
})
171+
172+
test("keeps the session out of the Home list when the index is not mounted", () => {
173+
const queryClient = new QueryClient()
174+
const cache = createHomeSessionIndexCache(queryClient, "server")
175+
const sessions = [
176+
{ id: "a", time: { created: 1, updated: 1 } },
177+
{ id: "b", time: { created: 1, updated: 1 } },
178+
] as Session[]
179+
180+
cache.remove("a")
181+
182+
expect(queryClient.getQueryData(cache.indexKey)).toBeUndefined()
183+
expect(cache.sessions({ sessions, eventSequence: 0 }, undefined).map((item) => item.id)).toEqual(["b"])
184+
})
154185
})

‎packages/app/src/context/global-sync/home-session-index.ts‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
8585
const indexKey = homeSessionIndexKey(server)
8686
const eventsKey = homeSessionEventsKey(server)
8787
let connected = false
88+
const removed = new Set<string>()
8889

8990
return {
9091
indexKey,
@@ -97,7 +98,8 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
9798
queryClient.setQueryData<HomeSessionEvents>(eventsKey, (current) => trimHomeSessionEvents(current, sequence))
9899
},
99100
sessions(index: HomeSessionIndex | undefined, events: HomeSessionEvents | undefined) {
100-
return homeSessionIndexSessions(index, events)
101+
const sessions = homeSessionIndexSessions(index, events)
102+
return removed.size === 0 ? sessions : sessions.filter((session) => !removed.has(session.id))
101103
},
102104
apply(event: HomeSessionEvent) {
103105
if (!queryClient.getQueryState(indexKey)) return
@@ -116,6 +118,16 @@ export function createHomeSessionIndexCache(queryClient: QueryClient, server: st
116118
}
117119
queryClient.setQueryData<HomeSessionEvents>(eventsKey, { sequence: next.sequence, entries: [] })
118120
},
121+
remove(sessionID: string) {
122+
removed.add(sessionID)
123+
if (!queryClient.getQueryState(indexKey)) return
124+
queryClient.setQueryData<HomeSessionIndex>(indexKey, (index) => {
125+
if (!index) return index
126+
const at = index.sessions.findIndex((session) => session.id === sessionID)
127+
if (at === -1) return index
128+
return { ...index, sessions: index.sessions.toSpliced(at, 1) }
129+
})
130+
},
119131
refresh(event: Event["type"]) {
120132
const result = homeSessionIndexRefresh(event, connected)
121133
connected = result.connected

‎packages/app/src/pages/home/home-sessions-controller.tsx‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,13 +219,15 @@ export function createHomeSessionsController(home: HomeController) {
219219
directory: session.directory,
220220
time: { archived: Date.now() },
221221
}),
222-
remove: () =>
222+
remove: () => {
223223
setStore(
224224
produce((draft) => {
225225
const match = Binary.search(draft.session, session.id, (item) => item.id)
226226
if (match.found) draft.session.splice(match.index, 1)
227227
}),
228-
),
228+
)
229+
homeSessions().remove(session.id)
230+
},
229231
onError: (cause) =>
230232
showToast({
231233
title: language.t("common.requestFailed"),

‎packages/app/src/pages/session/session-archive.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { produce } from "solid-js/store"
33
import { notifySessionTabsRemoved } from "@/components/titlebar-session-events"
44
import { useLanguage } from "@/context/language"
55
import { useSDK } from "@/context/sdk"
6+
import { useServerSync } from "@/context/server-sync"
67
import { useSync } from "@/context/sync"
78
import { useTabs } from "@/context/tabs"
89
import { errorMessage } from "@/pages/layout/helpers"
@@ -15,6 +16,7 @@ export function useSessionArchive() {
1516
const navigate = useNavigate()
1617
const sdk = useSDK()
1718
const sync = useSync()
19+
const serverSync = useServerSync()
1820
const tabs = useTabs()
1921
const { params } = useSessionKey()
2022

@@ -56,6 +58,7 @@ export function useSessionArchive() {
5658
}),
5759
)
5860
sync().session.evict(sessionID)
61+
serverSync().homeSessions.remove(sessionID)
5962
navigateAfterRemoval(sessionID, session.parentID, nextSession?.id)
6063
notifySessionTabsRemoved({ directory: sdk().directory, sessionIDs: [sessionID] })
6164
})

‎packages/cli/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://json.schemastore.org/package.json",
33
"name": "@opencode-ai/cli",
4-
"version": "1.18.22",
4+
"version": "1.18.23",
55
"type": "module",
66
"license": "MIT",
77
"bin": {

0 commit comments

Comments
 (0)