Adam пре 2 месеци
родитељ
комит
ef14f64f9e

+ 0 - 10
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)
   })
 })
 

+ 0 - 31
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 ?? [])

+ 0 - 2
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() {},

+ 0 - 5
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]

+ 0 - 1
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,

+ 0 - 1
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 = {

+ 0 - 18
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

+ 0 - 46
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>

+ 25 - 32
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>

+ 0 - 135
packages/app/src/utils/perf.ts

@@ -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)
-}