James Long 3 месяцев назад
Родитель
Сommit
8d63dc34c0

+ 3 - 7
packages/opencode/src/cli/cmd/tui/component/dialog-workspace-create.tsx

@@ -43,9 +43,7 @@ export function recentConnectedWorkspaces<WorkspaceInfo extends { id: string; ti
   omitWorkspaceID?: string
 }) {
   const allWorkspaces = input.workspaces.filter((workspace) => input.status(workspace.id) === "connected")
-  const workspaces = allWorkspaces
-    .filter((workspace) => workspace.id !== input.omitWorkspaceID)
-    .toSorted((a, b) => Number(b.timeUsed) - Number(a.timeUsed))
+  const workspaces = allWorkspaces.toSorted((a, b) => Number(b.timeUsed) - Number(a.timeUsed))
   const recent = workspaces.slice(0, input.limit ?? 3)
 
   return { recent, hasMore: recent.length < workspaces.length }
@@ -83,10 +81,8 @@ export async function openWorkspaceSelect(input: {
   onSelect: (selection: WorkspaceSelection) => Promise<void> | void
 }) {
   input.dialog.clear()
-  void input.sdk.client.experimental.workspace
-    .syncList()
-    .then(() => input.project.workspace.sync())
-    .catch(() => undefined)
+  await input.sdk.client.experimental.workspace.syncList().catch(() => undefined)
+  await input.project.workspace.sync().catch(() => undefined)
   const adapters = await loadWorkspaceAdapters(input)
   if (!adapters) return
   input.dialog.replace(() => <DialogWorkspaceSelect adapters={adapters} onSelect={input.onSelect} />)

+ 1 - 1
packages/opencode/src/control-plane/adapters/worktree.ts

@@ -48,7 +48,7 @@ export const WorktreeAdapter: WorkspaceAdapter = {
     return (await AppRuntime.runPromise(Worktree.Service.use((svc) => svc.list()))).map((info) => ({
       type: "worktree",
       name: info.name,
-      branch: info.branch,
+      branch: info.branch ?? null,
       directory: info.directory,
       extra: null,
       projectID: Instance.project.id,

+ 2 - 2
packages/opencode/src/worktree/index.ts

@@ -156,7 +156,7 @@ export interface Interface {
   readonly makeWorktreeInfo: (name?: string) => Effect.Effect<Info>
   readonly createFromInfo: (info: Info, startCommand?: string) => Effect.Effect<void>
   readonly create: (input?: CreateInput) => Effect.Effect<Info>
-  readonly list: () => Effect.Effect<Info[]>
+  readonly list: () => Effect.Effect<(Omit<Info, "branch"> & { branch?: string })[]>
   readonly remove: (input: RemoveInput) => Effect.Effect<boolean>
   readonly reset: (input: ResetInput) => Effect.Effect<boolean>
 }
@@ -368,8 +368,8 @@ export const layer: Layer.Layer<
           if (directory === primary) return undefined
           return {
             name: pathSvc.basename(directory),
-            branch: entry.branch ? entry.branch.replace(/^refs\/heads\//, "") : null,
             directory,
+            ...(entry.branch ? { branch: entry.branch.replace(/^refs\/heads\//, "") } : {}),
           }
         }),
       ).pipe(Effect.map((items) => items.filter((item) => item !== undefined)))