From ef14f64f9ee10ee7945a547bde4b13d6dcf2f0bd Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Wed, 18 Feb 2026 11:02:41 -0600 Subject: [PATCH] chore: cleanup --- packages/app/src/context/global-sync.test.ts | 10 -- packages/app/src/context/global-sync.tsx | 31 ---- .../context/global-sync/child-store.test.ts | 2 - .../src/context/global-sync/child-store.ts | 5 - .../src/context/global-sync/session-load.ts | 1 - packages/app/src/context/global-sync/types.ts | 1 - packages/app/src/pages/layout.tsx | 18 --- packages/app/src/pages/session.tsx | 46 ------ .../src/pages/session/message-timeline.tsx | 57 ++++---- packages/app/src/utils/perf.ts | 135 ------------------ 10 files changed, 25 insertions(+), 281 deletions(-) delete mode 100644 packages/app/src/utils/perf.ts 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() const booting = new Map>() const sessionLoads = new Map>() @@ -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} /> 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: { - {(message) => { - if (import.meta.env.DEV && props.onFirstTurnMount) { - onMount(() => props.onFirstTurnMount?.()) - } - - return ( -
{ - props.onRegisterMessage(el, message.id) - onCleanup(() => props.onUnregisterMessage(message.id)) + {(message) => ( +
{ + 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, + }} + > + - -
- ) - }} + /> +
+ )}
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 - logged: boolean - timer?: ReturnType -} - -const dev = import.meta.env.DEV - -const key = (dir: string | undefined, to: string) => `${dir ?? ""}:${to}` - -const now = () => performance.now() - -const navs = new Map() -const pending = new Map() -const active = new Map() - -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) { - 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) -}