summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-18 11:02:41 -0600
committerAdam <[email protected]>2026-02-18 11:48:25 -0600
commitef14f64f9ee10ee7945a547bde4b13d6dcf2f0bd (patch)
tree56e755687a04ded0c7c6469ad96836331e88dd94
parent3f60a6c2a46dab1622ee4f4c99e4dfad876f3a3c (diff)
downloadopencode-ef14f64f9ee10ee7945a547bde4b13d6dcf2f0bd.tar.gz
opencode-ef14f64f9ee10ee7945a547bde4b13d6dcf2f0bd.zip
chore: cleanup
-rw-r--r--packages/app/src/context/global-sync.test.ts10
-rw-r--r--packages/app/src/context/global-sync.tsx31
-rw-r--r--packages/app/src/context/global-sync/child-store.test.ts2
-rw-r--r--packages/app/src/context/global-sync/child-store.ts5
-rw-r--r--packages/app/src/context/global-sync/session-load.ts1
-rw-r--r--packages/app/src/context/global-sync/types.ts1
-rw-r--r--packages/app/src/pages/layout.tsx18
-rw-r--r--packages/app/src/pages/session.tsx46
-rw-r--r--packages/app/src/pages/session/message-timeline.tsx57
-rw-r--r--packages/app/src/utils/perf.ts135
10 files changed, 25 insertions, 281 deletions
diff --git a/packages/app/src/context/global-sync.test.ts b/packages/app/src/context/global-sync.test.ts
index 396b41231..7956057fd 100644
--- a/packages/app/src/context/global-sync.test.ts
+++ b/packages/app/src/context/global-sync.test.ts
@@ -30,7 +30,6 @@ describe("pickDirectoriesToEvict", () => {
describe("loadRootSessionsWithFallback", () => {
test("uses limited roots query when supported", async () => {
const calls: Array<{ directory: string; roots: true; limit?: number }> = []
- let fallback = 0
const result = await loadRootSessionsWithFallback({
directory: "dir",
@@ -39,20 +38,15 @@ describe("loadRootSessionsWithFallback", () => {
calls.push(query)
return { data: [] }
},
- onFallback: () => {
- fallback += 1
- },
})
expect(result.data).toEqual([])
expect(result.limited).toBe(true)
expect(calls).toEqual([{ directory: "dir", roots: true, limit: 10 }])
- expect(fallback).toBe(0)
})
test("falls back to full roots query on limited-query failure", async () => {
const calls: Array<{ directory: string; roots: true; limit?: number }> = []
- let fallback = 0
const result = await loadRootSessionsWithFallback({
directory: "dir",
@@ -62,9 +56,6 @@ describe("loadRootSessionsWithFallback", () => {
if (query.limit) throw new Error("unsupported")
return { data: [] }
},
- onFallback: () => {
- fallback += 1
- },
})
expect(result.data).toEqual([])
@@ -73,7 +64,6 @@ describe("loadRootSessionsWithFallback", () => {
{ directory: "dir", roots: true, limit: 25 },
{ directory: "dir", roots: true },
])
- expect(fallback).toBe(1)
})
})
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx
index 4f3664d8e..7e242130f 100644
--- a/packages/app/src/context/global-sync.tsx
+++ b/packages/app/src/context/global-sync.tsx
@@ -57,14 +57,6 @@ function errorMessage(error: unknown) {
return "Unknown error"
}
-function setDevStats(value: {
- activeDirectoryStores: number
- evictions: number
- loadSessionsFullFetchFallback: number
-}) {
- ;(globalThis as { __OPENCODE_GLOBAL_SYNC_STATS?: typeof value }).__OPENCODE_GLOBAL_SYNC_STATS = value
-}
-
function createGlobalSync() {
const globalSDK = useGlobalSDK()
const platform = usePlatform()
@@ -72,11 +64,6 @@ function createGlobalSync() {
const owner = getOwner()
if (!owner) throw new Error("GlobalSync must be created within owner")
- const stats = {
- evictions: 0,
- loadSessionsFallback: 0,
- }
-
const sdkCache = new Map<string, OpencodeClient>()
const booting = new Map<string, Promise<void>>()
const sessionLoads = new Map<string, Promise<void>>()
@@ -112,15 +99,6 @@ function createGlobalSync() {
setGlobalStore("session_todo", sessionID, reconcile(todos, { key: "id" }))
}
- const updateStats = (activeDirectoryStores: number) => {
- if (!import.meta.env.DEV) return
- setDevStats({
- activeDirectoryStores,
- evictions: stats.evictions,
- loadSessionsFullFetchFallback: stats.loadSessionsFallback,
- })
- }
-
const paused = () => untrack(() => globalStore.reload) !== undefined
const queue = createRefreshQueue({
@@ -131,11 +109,6 @@ function createGlobalSync() {
const children = createChildStoreManager({
owner,
- markStats: updateStats,
- incrementEvictions: () => {
- stats.evictions += 1
- updateStats(Object.keys(children.children).length)
- },
isBooting: (directory) => booting.has(directory),
isLoadingSessions: (directory) => sessionLoads.has(directory),
onBootstrap: (directory) => {
@@ -207,10 +180,6 @@ function createGlobalSync() {
directory,
limit,
list: (query) => globalSDK.client.session.list(query),
- onFallback: () => {
- stats.loadSessionsFallback += 1
- updateStats(Object.keys(children.children).length)
- },
})
.then((x) => {
const nonArchived = (x.data ?? [])
diff --git a/packages/app/src/context/global-sync/child-store.test.ts b/packages/app/src/context/global-sync/child-store.test.ts
index 500f0fc70..cec76ff87 100644
--- a/packages/app/src/context/global-sync/child-store.test.ts
+++ b/packages/app/src/context/global-sync/child-store.test.ts
@@ -17,8 +17,6 @@ describe("createChildStoreManager", () => {
const manager = createChildStoreManager({
owner,
- markStats() {},
- incrementEvictions() {},
isBooting: () => false,
isLoadingSessions: () => false,
onBootstrap() {},
diff --git a/packages/app/src/context/global-sync/child-store.ts b/packages/app/src/context/global-sync/child-store.ts
index af08c3bd4..2fe5b7830 100644
--- a/packages/app/src/context/global-sync/child-store.ts
+++ b/packages/app/src/context/global-sync/child-store.ts
@@ -17,8 +17,6 @@ import { canDisposeDirectory, pickDirectoriesToEvict } from "./eviction"
export function createChildStoreManager(input: {
owner: Owner
- markStats: (activeDirectoryStores: number) => void
- incrementEvictions: () => void
isBooting: (directory: string) => boolean
isLoadingSessions: (directory: string) => boolean
onBootstrap: (directory: string) => void
@@ -102,7 +100,6 @@ export function createChildStoreManager(input: {
}
delete children[directory]
input.onDispose(directory)
- input.markStats(Object.keys(children).length)
return true
}
@@ -120,7 +117,6 @@ export function createChildStoreManager(input: {
if (list.length === 0) return
for (const directory of list) {
if (!disposeDirectory(directory)) continue
- input.incrementEvictions()
}
}
@@ -200,7 +196,6 @@ export function createChildStoreManager(input: {
})
runWithOwner(input.owner, init)
- input.markStats(Object.keys(children).length)
}
mark(directory)
const childStore = children[directory]
diff --git a/packages/app/src/context/global-sync/session-load.ts b/packages/app/src/context/global-sync/session-load.ts
index 443aa8450..3693dcb46 100644
--- a/packages/app/src/context/global-sync/session-load.ts
+++ b/packages/app/src/context/global-sync/session-load.ts
@@ -9,7 +9,6 @@ export async function loadRootSessionsWithFallback(input: RootLoadArgs) {
limited: true,
} as const
} catch {
- input.onFallback()
const result = await input.list({ directory: input.directory, roots: true })
return {
data: result.data,
diff --git a/packages/app/src/context/global-sync/types.ts b/packages/app/src/context/global-sync/types.ts
index ade0b973a..c61dc337d 100644
--- a/packages/app/src/context/global-sync/types.ts
+++ b/packages/app/src/context/global-sync/types.ts
@@ -119,7 +119,6 @@ export type RootLoadArgs = {
directory: string
limit: number
list: (query: { directory: string; roots: true; limit?: number }) => Promise<{ data?: Session[] }>
- onFallback: () => void
}
export type RootLoadResult = {
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index cecb52617..e280b2f92 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -51,7 +51,6 @@ import { DialogSelectServer } from "@/components/dialog-select-server"
import { DialogSettings } from "@/components/dialog-settings"
import { useCommand, type CommandOption } from "@/context/command"
import { ConstrainDragXAxis } from "@/utils/solid-dnd"
-import { navStart } from "@/utils/perf"
import { DialogSelectDirectory } from "@/components/dialog-select-directory"
import { DialogEditProject } from "@/components/dialog-edit-project"
import { Titlebar } from "@/components/titlebar"
@@ -826,14 +825,6 @@ export default function Layout(props: ParentProps) {
if (next) prefetchSession(next)
}
- if (import.meta.env.DEV) {
- navStart({
- dir: base64Encode(session.directory),
- from: params.id,
- to: session.id,
- trigger: offset > 0 ? "alt+arrowdown" : "alt+arrowup",
- })
- }
navigateToSession(session)
queueMicrotask(() => scrollToSession(session.id, `${session.directory}:${session.id}`))
}
@@ -869,15 +860,6 @@ export default function Layout(props: ParentProps) {
if (next) prefetchSession(next)
}
- if (import.meta.env.DEV) {
- navStart({
- dir: base64Encode(session.directory),
- from: params.id,
- to: session.id,
- trigger: offset > 0 ? "shift+alt+arrowdown" : "shift+alt+arrowup",
- })
- }
-
navigateToSession(session)
queueMicrotask(() => scrollToSession(session.id, `${session.directory}:${session.id}`))
return
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index cbe5a3aca..8a91b6e85 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -23,7 +23,6 @@ import { usePrompt } from "@/context/prompt"
import { useComments } from "@/context/comments"
import { usePermission } from "@/context/permission"
import { SessionHeader, NewSessionView } from "@/components/session"
-import { navMark, navParams } from "@/utils/perf"
import { same } from "@/utils/same"
import { createOpenReviewFile } from "@/pages/session/helpers"
import { createScrollSpy } from "@/pages/session/scroll-spy"
@@ -109,46 +108,6 @@ export default function Page() {
),
)
- if (import.meta.env.DEV) {
- createEffect(
- on(
- () => [params.dir, params.id] as const,
- ([dir, id], prev) => {
- if (!id) return
- navParams({ dir, from: prev?.[1], to: id })
- },
- ),
- )
-
- createEffect(() => {
- const id = params.id
- if (!id) return
- if (!prompt.ready()) return
- navMark({ dir: params.dir, to: id, name: "storage:prompt-ready" })
- })
-
- createEffect(() => {
- const id = params.id
- if (!id) return
- if (!terminal.ready()) return
- navMark({ dir: params.dir, to: id, name: "storage:terminal-ready" })
- })
-
- createEffect(() => {
- const id = params.id
- if (!id) return
- if (!file.ready()) return
- navMark({ dir: params.dir, to: id, name: "storage:file-view-ready" })
- })
-
- createEffect(() => {
- const id = params.id
- if (!id) return
- if (sync.data.message[id] === undefined) return
- navMark({ dir: params.dir, to: id, name: "session:data-ready" })
- })
- }
-
const isDesktop = createMediaQuery("(min-width: 768px)")
const desktopReviewOpen = createMemo(() => isDesktop() && view().reviewPanel.opened())
const desktopFileTreeOpen = createMemo(() => isDesktop() && layout.fileTree.opened())
@@ -1140,11 +1099,6 @@ export default function Page() {
anchor={anchor}
onRegisterMessage={scrollSpy.register}
onUnregisterMessage={scrollSpy.unregister}
- onFirstTurnMount={() => {
- const id = params.id
- if (!id) return
- navMark({ dir: params.dir, to: id, name: "session:first-turn-mounted" })
- }}
lastUserMessageID={lastUserMessage()?.id}
/>
</Show>
diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx
index b94942408..c65e2600e 100644
--- a/packages/app/src/pages/session/message-timeline.tsx
+++ b/packages/app/src/pages/session/message-timeline.tsx
@@ -1,4 +1,4 @@
-import { For, createEffect, createMemo, on, onCleanup, onMount, Show, type JSX } from "solid-js"
+import { For, createEffect, createMemo, on, onCleanup, Show, type JSX } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { useNavigate, useParams } from "@solidjs/router"
import { Button } from "@opencode-ai/ui/button"
@@ -72,7 +72,6 @@ export function MessageTimeline(props: {
anchor: (id: string) => string
onRegisterMessage: (el: HTMLDivElement, id: string) => void
onUnregisterMessage: (id: string) => void
- onFirstTurnMount?: () => void
lastUserMessageID?: string
}) {
let touchGesture: number | undefined
@@ -516,37 +515,31 @@ export function MessageTimeline(props: {
</div>
</Show>
<For each={props.renderedUserMessages}>
- {(message) => {
- if (import.meta.env.DEV && props.onFirstTurnMount) {
- onMount(() => props.onFirstTurnMount?.())
- }
-
- return (
- <div
- id={props.anchor(message.id)}
- data-message-id={message.id}
- ref={(el) => {
- props.onRegisterMessage(el, message.id)
- onCleanup(() => props.onUnregisterMessage(message.id))
- }}
- classList={{
- "min-w-0 w-full max-w-full": true,
- "md:max-w-200 2xl:max-w-[1000px]": props.centered,
+ {(message) => (
+ <div
+ id={props.anchor(message.id)}
+ data-message-id={message.id}
+ ref={(el) => {
+ props.onRegisterMessage(el, message.id)
+ onCleanup(() => props.onUnregisterMessage(message.id))
+ }}
+ classList={{
+ "min-w-0 w-full max-w-full": true,
+ "md:max-w-200 2xl:max-w-[1000px]": props.centered,
+ }}
+ >
+ <SessionTurn
+ sessionID={sessionID() ?? ""}
+ messageID={message.id}
+ lastUserMessageID={props.lastUserMessageID}
+ classes={{
+ root: "min-w-0 w-full relative",
+ content: "flex flex-col justify-between !overflow-visible",
+ container: "w-full px-4 md:px-6",
}}
- >
- <SessionTurn
- sessionID={sessionID() ?? ""}
- messageID={message.id}
- lastUserMessageID={props.lastUserMessageID}
- classes={{
- root: "min-w-0 w-full relative",
- content: "flex flex-col justify-between !overflow-visible",
- container: "w-full px-4 md:px-6",
- }}
- />
- </div>
- )
- }}
+ />
+ </div>
+ )}
</For>
</div>
</div>
diff --git a/packages/app/src/utils/perf.ts b/packages/app/src/utils/perf.ts
deleted file mode 100644
index 105d02a82..000000000
--- a/packages/app/src/utils/perf.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { uuid } from "@/utils/uuid"
-
-type Nav = {
- id: string
- dir?: string
- from?: string
- to: string
- trigger?: string
- start: number
- marks: Record<string, number>
- logged: boolean
- timer?: ReturnType<typeof setTimeout>
-}
-
-const dev = import.meta.env.DEV
-
-const key = (dir: string | undefined, to: string) => `${dir ?? ""}:${to}`
-
-const now = () => performance.now()
-
-const navs = new Map<string, Nav>()
-const pending = new Map<string, string>()
-const active = new Map<string, string>()
-
-const required = [
- "session:params",
- "session:data-ready",
- "session:first-turn-mounted",
- "storage:prompt-ready",
- "storage:terminal-ready",
- "storage:file-view-ready",
-]
-
-function flush(id: string, reason: "complete" | "timeout") {
- if (!dev) return
- const nav = navs.get(id)
- if (!nav) return
- if (nav.logged) return
-
- nav.logged = true
- if (nav.timer) clearTimeout(nav.timer)
-
- const baseName = nav.marks["navigate:start"] !== undefined ? "navigate:start" : "session:params"
- const base = nav.marks[baseName] ?? nav.start
-
- const ms = Object.fromEntries(
- Object.entries(nav.marks)
- .slice()
- .sort(([a], [b]) => a.localeCompare(b))
- .map(([name, t]) => [name, Math.round((t - base) * 100) / 100]),
- )
-
- console.log(
- "perf.session-nav " +
- JSON.stringify({
- type: "perf.session-nav.v0",
- id: nav.id,
- dir: nav.dir,
- from: nav.from,
- to: nav.to,
- trigger: nav.trigger,
- base: baseName,
- reason,
- ms,
- }),
- )
-
- navs.delete(id)
-}
-
-function maybeFlush(id: string) {
- if (!dev) return
- const nav = navs.get(id)
- if (!nav) return
- if (nav.logged) return
- if (!required.every((name) => nav.marks[name] !== undefined)) return
- flush(id, "complete")
-}
-
-function ensure(id: string, data: Omit<Nav, "marks" | "logged" | "timer">) {
- const existing = navs.get(id)
- if (existing) return existing
-
- const nav: Nav = {
- ...data,
- marks: {},
- logged: false,
- }
- nav.timer = setTimeout(() => flush(id, "timeout"), 5000)
- navs.set(id, nav)
- return nav
-}
-
-export function navStart(input: { dir?: string; from?: string; to: string; trigger?: string }) {
- if (!dev) return
-
- const id = uuid()
- const start = now()
- const nav = ensure(id, { ...input, id, start })
- nav.marks["navigate:start"] = start
-
- pending.set(key(input.dir, input.to), id)
- return id
-}
-
-export function navParams(input: { dir?: string; from?: string; to: string }) {
- if (!dev) return
-
- const k = key(input.dir, input.to)
- const pendingId = pending.get(k)
- if (pendingId) pending.delete(k)
- const id = pendingId ?? uuid()
-
- const start = now()
- const nav = ensure(id, { ...input, id, start, trigger: pendingId ? "key" : "route" })
- nav.marks["session:params"] = start
-
- active.set(k, id)
- maybeFlush(id)
- return id
-}
-
-export function navMark(input: { dir?: string; to: string; name: string }) {
- if (!dev) return
-
- const id = active.get(key(input.dir, input.to))
- if (!id) return
-
- const nav = navs.get(id)
- if (!nav) return
- if (nav.marks[input.name] !== undefined) return
-
- nav.marks[input.name] = now()
- maybeFlush(id)
-}