performance improvements

This commit is contained in:
Dax Raad
2025-11-05 15:33:23 -05:00
parent 1f44c7f750
commit b7262b8527
5 changed files with 27 additions and 26 deletions

View File

@@ -7,7 +7,7 @@ import { Installation } from "@/installation"
import { Global } from "@/global" import { Global } from "@/global"
import { DialogProvider, useDialog } from "@tui/ui/dialog" import { DialogProvider, useDialog } from "@tui/ui/dialog"
import { SDKProvider, useSDK } from "@tui/context/sdk" import { SDKProvider, useSDK } from "@tui/context/sdk"
import { SyncProvider, useSync } from "@tui/context/sync" import { SyncProvider } from "@tui/context/sync"
import { LocalProvider, useLocal } from "@tui/context/local" import { LocalProvider, useLocal } from "@tui/context/local"
import { DialogModel } from "@tui/component/dialog-model" import { DialogModel } from "@tui/component/dialog-model"
import { DialogStatus } from "@tui/component/dialog-status" import { DialogStatus } from "@tui/component/dialog-status"
@@ -24,7 +24,6 @@ import { PromptHistoryProvider } from "./component/prompt/history"
import { DialogAlert } from "./ui/dialog-alert" import { DialogAlert } from "./ui/dialog-alert"
import { ToastProvider, useToast } from "./ui/toast" import { ToastProvider, useToast } from "./ui/toast"
import { ExitProvider, useExit } from "./context/exit" import { ExitProvider, useExit } from "./context/exit"
import type { SessionRoute } from "./context/route"
import { Session as SessionApi } from "@/session" import { Session as SessionApi } from "@/session"
import { TuiEvent } from "./event" import { TuiEvent } from "./event"
import { KVProvider, useKV } from "./context/kv" import { KVProvider, useKV } from "./context/kv"
@@ -173,9 +172,7 @@ function App() {
const kv = useKV() const kv = useKV()
const command = useCommandDialog() const command = useCommandDialog()
const { event } = useSDK() const { event } = useSDK()
const sync = useSync()
const toast = useToast() const toast = useToast()
const [sessionExists, setSessionExists] = createSignal(false)
const { theme, mode, setMode } = useTheme() const { theme, mode, setMode } = useTheme()
const exit = useExit() const exit = useExit()
@@ -192,21 +189,6 @@ function App() {
} }
}) })
// Make sure session is valid, otherwise redirect to home
createEffect(async () => {
if (route.data.type === "session") {
const data = route.data as SessionRoute
await sync.session.sync(data.sessionID).catch(() => {
toast.show({
message: `Session not found: ${data.sessionID}`,
variant: "error",
})
return route.navigate({ type: "home" })
})
setSessionExists(true)
}
})
createEffect(() => { createEffect(() => {
console.log(JSON.stringify(route.data)) console.log(JSON.stringify(route.data))
}) })
@@ -413,7 +395,7 @@ function App() {
<Match when={route.data.type === "home"}> <Match when={route.data.type === "home"}>
<Home /> <Home />
</Match> </Match>
<Match when={route.data.type === "session" && sessionExists()}> <Match when={route.data.type === "session"}>
<Session /> <Session />
</Match> </Match>
</Switch> </Switch>

View File

@@ -137,7 +137,12 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
} }
const result = Binary.search(messages, event.properties.info.id, (m) => m.id) const result = Binary.search(messages, event.properties.info.id, (m) => m.id)
if (result.found) { if (result.found) {
setStore("message", event.properties.info.sessionID, result.index, reconcile(event.properties.info)) setStore(
"message",
event.properties.info.sessionID,
result.index,
reconcile(event.properties.info),
)
break break
} }
setStore( setStore(
@@ -171,7 +176,12 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
} }
const result = Binary.search(parts, event.properties.part.id, (p) => p.id) const result = Binary.search(parts, event.properties.part.id, (p) => p.id)
if (result.found) { if (result.found) {
setStore("part", event.properties.part.messageID, result.index, reconcile(event.properties.part)) setStore(
"part",
event.properties.part.messageID,
result.index,
reconcile(event.properties.part),
)
break break
} }
setStore( setStore(
@@ -249,11 +259,13 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
return last.time.completed ? "idle" : "working" return last.time.completed ? "idle" : "working"
}, },
async sync(sessionID: string) { async sync(sessionID: string) {
const now = Date.now()
const [session, messages, todo] = await Promise.all([ const [session, messages, todo] = await Promise.all([
sdk.client.session.get({ path: { id: sessionID }, throwOnError: true }), sdk.client.session.get({ path: { id: sessionID }, throwOnError: true }),
sdk.client.session.messages({ path: { id: sessionID } }), sdk.client.session.messages({ path: { id: sessionID } }),
sdk.client.session.todo({ path: { id: sessionID } }), sdk.client.session.todo({ path: { id: sessionID } }),
]) ])
console.log("fetched in " + (Date.now() - now), sessionID)
setStore( setStore(
produce((draft) => { produce((draft) => {
const match = Binary.search(draft.session, sessionID, (s) => s.id) const match = Binary.search(draft.session, sessionID, (s) => s.id)
@@ -266,6 +278,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
} }
}), }),
) )
console.log("synced in " + (Date.now() - now), sessionID)
}, },
}, },
} }

View File

@@ -104,7 +104,15 @@ export function Session() {
const sidebarVisible = createMemo(() => sidebar() === "show" || (sidebar() === "auto" && wide())) const sidebarVisible = createMemo(() => sidebar() === "show" || (sidebar() === "auto" && wide()))
const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4) const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4)
createEffect(() => sync.session.sync(route.sessionID)) createEffect(() => {
sync.session.sync(route.sessionID).catch(() => {
toast.show({
message: `Session not found: ${route.sessionID}`,
variant: "error",
})
return navigate({ type: "home" })
})
})
const toast = useToast() const toast = useToast()

View File

@@ -91,6 +91,7 @@ export namespace Format {
export function init() { export function init() {
log.info("init") log.info("init")
return
Bus.subscribe(File.Event.Edited, async (payload) => { Bus.subscribe(File.Event.Edited, async (payload) => {
const file = payload.properties.file const file = payload.properties.file
log.info("formatting", { file }) log.info("formatting", { file })

View File

@@ -1022,9 +1022,6 @@ export namespace SessionPrompt {
for await (const value of stream.fullStream) { for await (const value of stream.fullStream) {
input.abort.throwIfAborted() input.abort.throwIfAborted()
log.info("part", {
type: value.type,
})
switch (value.type) { switch (value.type) {
case "start": case "start":
break break