|
|
@@ -95,7 +95,7 @@ import { SidebarContent } from "./layout/sidebar-shell"
|
|
|
export default function Layout(props: ParentProps) {
|
|
|
const serverSDK = useServerSDK()
|
|
|
const [store, setStore, , ready] = persisted(
|
|
|
- Persist.serverGlobal(serverSDK.scope, "layout.page", ["layout.page.v1"]),
|
|
|
+ Persist.serverGlobal(serverSDK().scope, "layout.page", ["layout.page.v1"]),
|
|
|
createStore({
|
|
|
lastProjectSession: {} as { [directory: string]: { directory: string; id: string; at: number } },
|
|
|
activeProject: undefined as string | undefined,
|
|
|
@@ -140,7 +140,7 @@ export default function Layout(props: ParentProps) {
|
|
|
if (!slug) return { slug, dir: "" }
|
|
|
const dir = decode64(slug)
|
|
|
if (!dir) return { slug, dir: "" }
|
|
|
- const store = serverSync.peek(dir, { bootstrap: false })
|
|
|
+ const store = serverSync().peek(dir, { bootstrap: false })
|
|
|
return {
|
|
|
slug,
|
|
|
store,
|
|
|
@@ -213,7 +213,7 @@ export default function Layout(props: ParentProps) {
|
|
|
active: () => state.hoverProject,
|
|
|
el: () => state.nav?.querySelector<HTMLElement>("[data-component='sidebar-rail']") ?? state.nav,
|
|
|
onActivate: (directory) => {
|
|
|
- serverSync.child(directory)
|
|
|
+ serverSync().child(directory)
|
|
|
setState("hoverProject", directory)
|
|
|
},
|
|
|
})
|
|
|
@@ -397,17 +397,17 @@ export default function Layout(props: ParentProps) {
|
|
|
alertedAtBySession.delete(sessionKey)
|
|
|
}
|
|
|
|
|
|
- const unsub = serverSDK.event.listen((e) => {
|
|
|
+ const unsub = serverSDK().event.listen((e) => {
|
|
|
if (e.details?.type === "worktree.ready") {
|
|
|
setBusy(e.name, false)
|
|
|
- WorktreeState.ready(serverSDK.scope, e.name)
|
|
|
+ WorktreeState.ready(serverSDK().scope, e.name)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
if (e.details?.type === "worktree.failed") {
|
|
|
setBusy(e.name, false)
|
|
|
WorktreeState.failed(
|
|
|
- serverSDK.scope,
|
|
|
+ serverSDK().scope,
|
|
|
e.name,
|
|
|
e.details.properties?.message ?? language.t("common.requestFailed"),
|
|
|
)
|
|
|
@@ -435,7 +435,7 @@ export default function Layout(props: ParentProps) {
|
|
|
const props = e.details.properties
|
|
|
if (e.details.type === "permission.asked" && permission.autoResponds(e.details.properties, directory)) return
|
|
|
|
|
|
- const [store] = serverSync.child(directory, { bootstrap: false })
|
|
|
+ const [store] = serverSync().child(directory, { bootstrap: false })
|
|
|
const session = store.session.find((s) => s.id === props.sessionID)
|
|
|
const sessionKey = `${directory}:${props.sessionID}`
|
|
|
|
|
|
@@ -498,7 +498,7 @@ export default function Layout(props: ParentProps) {
|
|
|
if (!currentDir() || !currentSession) return
|
|
|
const sessionKey = `${currentDir()}:${currentSession}`
|
|
|
dismissSessionAlert(sessionKey)
|
|
|
- const [store] = serverSync.child(currentDir(), { bootstrap: false })
|
|
|
+ const [store] = serverSync().child(currentDir(), { bootstrap: false })
|
|
|
const childSessions = store.session.filter((s) => s.parentID === currentSession)
|
|
|
for (const child of childSessions) {
|
|
|
dismissSessionAlert(`${currentDir()}:${child.id}`)
|
|
|
@@ -536,11 +536,11 @@ export default function Layout(props: ParentProps) {
|
|
|
const direct = projects.find((p) => pathKey(p.worktree) === key)
|
|
|
if (direct) return direct
|
|
|
|
|
|
- const [child] = serverSync.child(directory, { bootstrap: false })
|
|
|
+ const [child] = serverSync().child(directory, { bootstrap: false })
|
|
|
const id = child.project
|
|
|
if (!id) return
|
|
|
|
|
|
- const meta = serverSync.data.project.find((p) => p.id === id)
|
|
|
+ const meta = serverSync().data.project.find((p) => p.id === id)
|
|
|
const root = meta?.worktree
|
|
|
if (!root) return
|
|
|
|
|
|
@@ -631,7 +631,7 @@ export default function Layout(props: ParentProps) {
|
|
|
|
|
|
const result: Session[] = []
|
|
|
for (const dir of dirs) {
|
|
|
- const [dirStore] = serverSync.child(dir, { bootstrap: true })
|
|
|
+ const [dirStore] = serverSync().child(dir, { bootstrap: true })
|
|
|
const dirSessions = sortedRootSessions(dirStore, now)
|
|
|
result.push(...dirSessions)
|
|
|
}
|
|
|
@@ -683,10 +683,10 @@ export default function Layout(props: ParentProps) {
|
|
|
|
|
|
createEffect(() => {
|
|
|
route()
|
|
|
- serverSDK.url
|
|
|
+ serverSDK().url
|
|
|
|
|
|
prefetchToken.value += 1
|
|
|
- clearSessionPrefetchInflight(serverSDK.scope)
|
|
|
+ clearSessionPrefetchInflight(serverSDK().scope)
|
|
|
prefetchQueues.clear()
|
|
|
})
|
|
|
|
|
|
@@ -730,17 +730,17 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
async function prefetchMessages(directory: string, sessionID: string, token: number) {
|
|
|
- const [store, setStore] = serverSync.child(directory, { bootstrap: false })
|
|
|
+ const [store, setStore] = serverSync().child(directory, { bootstrap: false })
|
|
|
|
|
|
return runSessionPrefetch({
|
|
|
- scope: serverSDK.scope,
|
|
|
+ scope: serverSDK().scope,
|
|
|
directory,
|
|
|
sessionID,
|
|
|
task: (rev) =>
|
|
|
- retry(() => serverSDK.client.session.messages({ directory, sessionID, limit: prefetchChunk }))
|
|
|
+ retry(() => serverSDK().client.session.messages({ directory, sessionID, limit: prefetchChunk }))
|
|
|
.then((messages) => {
|
|
|
if (prefetchToken.value !== token) return
|
|
|
- if (!isSessionPrefetchCurrent(serverSDK.scope, directory, sessionID, rev)) return
|
|
|
+ if (!isSessionPrefetchCurrent(serverSDK().scope, directory, sessionID, rev)) return
|
|
|
|
|
|
const items = (messages.data ?? []).filter((x) => !!x?.info?.id)
|
|
|
const next = items.map((x) => x.info).filter((m): m is Message => !!m?.id)
|
|
|
@@ -755,9 +755,9 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
if (stale.length > 0) {
|
|
|
- clearSessionPrefetch(serverSDK.scope, directory, stale)
|
|
|
+ clearSessionPrefetch(serverSDK().scope, directory, stale)
|
|
|
for (const id of stale) {
|
|
|
- serverSync.todo.set(id, undefined)
|
|
|
+ serverSync().todo.set(id, undefined)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -767,7 +767,7 @@ export default function Layout(props: ParentProps) {
|
|
|
sorted,
|
|
|
)
|
|
|
|
|
|
- if (!isSessionPrefetchCurrent(serverSDK.scope, directory, sessionID, rev)) return
|
|
|
+ if (!isSessionPrefetchCurrent(serverSDK().scope, directory, sessionID, rev)) return
|
|
|
|
|
|
batch(() => {
|
|
|
if (stale.length > 0) {
|
|
|
@@ -779,7 +779,7 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
setStore("message", sessionID, reconcile(merged, { key: "id" }))
|
|
|
- setSessionPrefetch({ scope: serverSDK.scope, directory, sessionID, ...meta })
|
|
|
+ setSessionPrefetch({ scope: serverSDK().scope, directory, sessionID, ...meta })
|
|
|
|
|
|
for (const message of items) {
|
|
|
const currentParts = store.part[message.info.id] ?? []
|
|
|
@@ -822,9 +822,9 @@ export default function Layout(props: ParentProps) {
|
|
|
const directory = session.directory
|
|
|
if (!directory) return
|
|
|
|
|
|
- const [store] = serverSync.child(directory, { bootstrap: false })
|
|
|
+ const [store] = serverSync().child(directory, { bootstrap: false })
|
|
|
const cached = untrack(() => {
|
|
|
- const info = getSessionPrefetch(serverSDK.scope, directory, session.id)
|
|
|
+ const info = getSessionPrefetch(serverSDK().scope, directory, session.id)
|
|
|
return shouldSkipSessionPrefetch({
|
|
|
message: store.message[session.id] !== undefined,
|
|
|
info,
|
|
|
@@ -927,7 +927,7 @@ export default function Layout(props: ParentProps) {
|
|
|
if (!target) return
|
|
|
|
|
|
// warm up child store to prevent flicker
|
|
|
- serverSync.child(target.worktree)
|
|
|
+ serverSync().child(target.worktree)
|
|
|
void openProject(target.worktree)
|
|
|
}
|
|
|
|
|
|
@@ -936,7 +936,7 @@ export default function Layout(props: ParentProps) {
|
|
|
const target = projects[index]
|
|
|
if (!target) return
|
|
|
|
|
|
- serverSync.child(target.worktree)
|
|
|
+ serverSync().child(target.worktree)
|
|
|
void openProject(target.worktree)
|
|
|
}
|
|
|
|
|
|
@@ -965,12 +965,12 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
async function archiveSession(session: Session) {
|
|
|
- const [store, setStore] = serverSync.child(session.directory)
|
|
|
+ const [store, setStore] = serverSync().child(session.directory)
|
|
|
const sessions = store.session ?? []
|
|
|
const index = sessions.findIndex((s) => s.id === session.id)
|
|
|
const nextSession = sessions[index + 1] ?? sessions[index - 1]
|
|
|
|
|
|
- await serverSDK.client.session.update({
|
|
|
+ await serverSDK().client.session.update({
|
|
|
directory: session.directory,
|
|
|
sessionID: session.id,
|
|
|
time: { archived: Date.now() },
|
|
|
@@ -1241,11 +1241,11 @@ export default function Layout(props: ParentProps) {
|
|
|
)
|
|
|
if (known) return known[0]
|
|
|
|
|
|
- const [child] = serverSync.child(directory, { bootstrap: false })
|
|
|
+ const [child] = serverSync().child(directory, { bootstrap: false })
|
|
|
const id = child.project
|
|
|
if (!id) return directory
|
|
|
|
|
|
- const meta = serverSync.data.project.find((item) => item.id === id)
|
|
|
+ const meta = serverSync().data.project.find((item) => item.id === id)
|
|
|
return meta?.worktree ?? directory
|
|
|
}
|
|
|
|
|
|
@@ -1293,7 +1293,7 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
const refreshDirs = async (target?: string) => {
|
|
|
if (!target || target === root || canOpen(target)) return canOpen(target)
|
|
|
- const listed = await serverSDK.client.worktree
|
|
|
+ const listed = await serverSDK().client.worktree
|
|
|
.list({ directory: root })
|
|
|
.then((x) => x.data ?? [])
|
|
|
.catch(() => [] as string[])
|
|
|
@@ -1302,13 +1302,13 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
const openSession = async (target: { directory: string; id: string }) => {
|
|
|
if (!canOpen(target.directory)) return false
|
|
|
- const [data] = serverSync.child(target.directory, { bootstrap: false })
|
|
|
+ const [data] = serverSync().child(target.directory, { bootstrap: false })
|
|
|
if (data.session.some((item) => item.id === target.id)) {
|
|
|
setStore("lastProjectSession", root, { directory: target.directory, id: target.id, at: Date.now() })
|
|
|
navigateWithSidebarReset(`/${base64Encode(target.directory)}/session/${target.id}`)
|
|
|
return true
|
|
|
}
|
|
|
- const resolved = await serverSDK.client.session
|
|
|
+ const resolved = await serverSDK().client.session
|
|
|
.get({ sessionID: target.id })
|
|
|
.then((x) => x.data)
|
|
|
.catch(() => undefined)
|
|
|
@@ -1328,7 +1328,7 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
const latest = latestRootSession(
|
|
|
- dirs.map((item) => serverSync.child(item, { bootstrap: false })[0]),
|
|
|
+ dirs.map((item) => serverSync().child(item, { bootstrap: false })[0]),
|
|
|
Date.now(),
|
|
|
)
|
|
|
if (latest && (await openSession(latest))) {
|
|
|
@@ -1339,7 +1339,7 @@ export default function Layout(props: ParentProps) {
|
|
|
await Promise.all(
|
|
|
dirs.map(async (item) => ({
|
|
|
path: { directory: item },
|
|
|
- session: await serverSDK.client.session
|
|
|
+ session: await serverSDK().client.session
|
|
|
.list({ directory: item })
|
|
|
.then((x) => x.data ?? [])
|
|
|
.catch(() => []),
|
|
|
@@ -1402,11 +1402,11 @@ export default function Layout(props: ParentProps) {
|
|
|
const name = next === getFilename(project.worktree) ? "" : next
|
|
|
|
|
|
if (project.id && project.id !== "global") {
|
|
|
- await serverSDK.client.project.update({ projectID: project.id, directory: project.worktree, name })
|
|
|
+ await serverSDK().client.project.update({ projectID: project.id, directory: project.worktree, name })
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- serverSync.project.meta(project.worktree, { name })
|
|
|
+ serverSync().project.meta(project.worktree, { name })
|
|
|
}
|
|
|
|
|
|
const renameWorkspace = (directory: string, next: string, projectId?: string, branch?: string) => {
|
|
|
@@ -1495,7 +1495,7 @@ export default function Layout(props: ParentProps) {
|
|
|
|
|
|
setBusy(directory, true)
|
|
|
|
|
|
- const result = await serverSDK.client.worktree
|
|
|
+ const result = await serverSDK().client.worktree
|
|
|
.remove({ directory: root, worktreeRemoveInput: { directory } })
|
|
|
.then((x) => x.data)
|
|
|
.catch((err) => {
|
|
|
@@ -1514,7 +1514,7 @@ export default function Layout(props: ParentProps) {
|
|
|
clearLastProjectSession(root)
|
|
|
}
|
|
|
|
|
|
- serverSync.set(
|
|
|
+ serverSync().set(
|
|
|
"project",
|
|
|
produce((draft) => {
|
|
|
const project = draft.find((item) => item.worktree === root)
|
|
|
@@ -1553,7 +1553,7 @@ export default function Layout(props: ParentProps) {
|
|
|
})
|
|
|
const dismiss = () => toaster.dismiss(progress)
|
|
|
|
|
|
- const sessions: Session[] = await serverSDK.client.session
|
|
|
+ const sessions: Session[] = await serverSDK().client.session
|
|
|
.list({ directory })
|
|
|
.then((x) => x.data ?? [])
|
|
|
.catch(() => [])
|
|
|
@@ -1562,11 +1562,11 @@ export default function Layout(props: ParentProps) {
|
|
|
directory,
|
|
|
sessions.map((s) => s.id),
|
|
|
platform,
|
|
|
- serverSDK.scope,
|
|
|
+ serverSDK().scope,
|
|
|
)
|
|
|
- await serverSDK.client.instance.dispose({ directory }).catch(() => undefined)
|
|
|
+ await serverSDK().client.instance.dispose({ directory }).catch(() => undefined)
|
|
|
|
|
|
- const result = await serverSDK.client.worktree
|
|
|
+ const result = await serverSDK().client.worktree
|
|
|
.reset({ directory: root, worktreeResetInput: { directory } })
|
|
|
.then((x) => x.data)
|
|
|
.catch((err) => {
|
|
|
@@ -1588,7 +1588,7 @@ export default function Layout(props: ParentProps) {
|
|
|
sessions
|
|
|
.filter((session) => session.time.archived === undefined)
|
|
|
.map((session) =>
|
|
|
- serverSDK.client.session
|
|
|
+ serverSDK().client.session
|
|
|
.update({
|
|
|
sessionID: session.id,
|
|
|
directory: session.directory,
|
|
|
@@ -1629,7 +1629,7 @@ export default function Layout(props: ParentProps) {
|
|
|
})
|
|
|
|
|
|
onMount(() => {
|
|
|
- serverSDK.client.vcs
|
|
|
+ serverSDK().client.vcs
|
|
|
.status({ directory: props.directory })
|
|
|
.then((x) => {
|
|
|
const files = x.data ?? []
|
|
|
@@ -1688,7 +1688,7 @@ export default function Layout(props: ParentProps) {
|
|
|
})
|
|
|
|
|
|
const refresh = async () => {
|
|
|
- const sessions = await serverSDK.client.session
|
|
|
+ const sessions = await serverSDK().client.session
|
|
|
.list({ directory: props.directory })
|
|
|
.then((x) => x.data ?? [])
|
|
|
.catch(() => [])
|
|
|
@@ -1697,7 +1697,7 @@ export default function Layout(props: ParentProps) {
|
|
|
}
|
|
|
|
|
|
onMount(() => {
|
|
|
- serverSDK.client.vcs
|
|
|
+ serverSDK().client.vcs
|
|
|
.status({ directory: props.directory })
|
|
|
.then((x) => {
|
|
|
const files = x.data ?? []
|
|
|
@@ -1831,7 +1831,7 @@ export default function Layout(props: ParentProps) {
|
|
|
const next = new Set(dirs)
|
|
|
for (const directory of next) {
|
|
|
if (loadedSessionDirs.has(directory)) continue
|
|
|
- void serverSync.project.loadSessions(directory)
|
|
|
+ void serverSync().project.loadSessions(directory)
|
|
|
}
|
|
|
|
|
|
loadedSessionDirs.clear()
|
|
|
@@ -1876,7 +1876,7 @@ export default function Layout(props: ParentProps) {
|
|
|
directory && pathKey(directory) !== pathKey(local) && !dirs.some((item) => pathKey(item) === pathKey(directory))
|
|
|
? directory
|
|
|
: undefined
|
|
|
- const pending = extra ? WorktreeState.get(serverSDK.scope, extra)?.status === "pending" : false
|
|
|
+ const pending = extra ? WorktreeState.get(serverSDK().scope, extra)?.status === "pending" : false
|
|
|
|
|
|
const ordered = effectiveWorkspaceOrder(local, dirs, store.workspaceOrder[project.worktree])
|
|
|
if (pending && extra) return [local, extra, ...ordered.filter((item) => item !== local)]
|
|
|
@@ -1928,7 +1928,7 @@ export default function Layout(props: ParentProps) {
|
|
|
|
|
|
const createWorkspace = async (project: LocalProject) => {
|
|
|
clearSidebarHoverState()
|
|
|
- const created = await serverSDK.client.worktree
|
|
|
+ const created = await serverSDK().client.worktree
|
|
|
.create({ directory: project.worktree })
|
|
|
.then((x) => x.data)
|
|
|
.catch((err) => {
|
|
|
@@ -1948,7 +1948,7 @@ export default function Layout(props: ParentProps) {
|
|
|
const root = pathKey(local)
|
|
|
|
|
|
setBusy(created.directory, true)
|
|
|
- WorktreeState.pending(serverSDK.scope, created.directory)
|
|
|
+ WorktreeState.pending(serverSDK().scope, created.directory)
|
|
|
setStore("workspaceExpanded", key, true)
|
|
|
if (key !== created.directory) {
|
|
|
setStore("workspaceExpanded", created.directory, true)
|
|
|
@@ -1962,7 +1962,7 @@ export default function Layout(props: ParentProps) {
|
|
|
return [created.directory, ...next]
|
|
|
})
|
|
|
|
|
|
- serverSync.child(created.directory)
|
|
|
+ serverSync().child(created.directory)
|
|
|
navigateWithSidebarReset(`/${base64Encode(created.directory)}/session`)
|
|
|
}
|
|
|
|
|
|
@@ -2067,7 +2067,7 @@ export default function Layout(props: ParentProps) {
|
|
|
if (!item) return false
|
|
|
return item.vcs === "git" || layout.sidebar.workspaces(item.worktree)()
|
|
|
})
|
|
|
- const homedir = createMemo(() => serverSync.data.path.home)
|
|
|
+ const homedir = createMemo(() => serverSync().data.path.home)
|
|
|
|
|
|
return (
|
|
|
<div
|