diff --git a/packages/ui/src/components/views/agent-manager/AgentManagerEmptyState.tsx b/packages/ui/src/components/views/agent-manager/AgentManagerEmptyState.tsx index 4c6bc459..eede4785 100644 --- a/packages/ui/src/components/views/agent-manager/AgentManagerEmptyState.tsx +++ b/packages/ui/src/components/views/agent-manager/AgentManagerEmptyState.tsx @@ -34,7 +34,7 @@ interface AttachedFile { interface AgentManagerEmptyStateProps { className?: string; /** Called when the user submits to create a new agent group */ - onCreateGroup?: (params: CreateMultiRunParams) => void; + onCreateGroup?: (params: CreateMultiRunParams) => Promise | void; /** Indicates if a group creation is in progress */ isCreating?: boolean; } @@ -150,7 +150,7 @@ export const AgentManagerEmptyState: React.FC = ({ })) : undefined; - onCreateGroup?.({ + await onCreateGroup?.({ name: groupName.trim(), prompt: prompt.trim(), models, @@ -158,7 +158,7 @@ export const AgentManagerEmptyState: React.FC = ({ files, }); - // Reset form on success + // Reset form on success - only after onCreateGroup completes setGroupName(''); setPrompt(''); setSelectedModels([]); diff --git a/packages/ui/src/stores/useAgentGroupsStore.ts b/packages/ui/src/stores/useAgentGroupsStore.ts index 28fb9091..af3770d2 100644 --- a/packages/ui/src/stores/useAgentGroupsStore.ts +++ b/packages/ui/src/stores/useAgentGroupsStore.ts @@ -175,17 +175,11 @@ export const useAgentGroupsStore = create()( try { const apiClient = opencodeClient.getApiClient(); - // Fetch all sessions from the main project directory - // All worktree sessions are visible from here - const response = await apiClient.session.list({ - directory: normalizedCurrent, - }); - const allSessions: Session[] = Array.isArray(response.data) ? response.data : []; - - // Get git worktree info for metadata + // Get git worktree info first - we need to query each worktree separately let worktreeInfoMap = new Map>[number]>(); + let worktreeInfoList: Awaited> = []; try { - const worktreeInfoList = await listWorktrees(normalizedCurrent); + worktreeInfoList = await listWorktrees(normalizedCurrent); worktreeInfoMap = new Map( worktreeInfoList.map((info) => [normalize(info.worktree), info]) ); @@ -193,6 +187,33 @@ export const useAgentGroupsStore = create()( console.debug('Failed to list git worktrees'); } + // Fetch sessions from each worktree directory (sessions are stored per-directory in OpenCode) + // Filter to only .openchamber worktrees (agent group worktrees) + const openchamberWorktrees = worktreeInfoList.filter( + (info) => normalize(info.worktree).includes(`/${OPENCHAMBER_DIR}/`) + ); + + const sessionsMap = new Map(); + + // Fetch sessions from each openchamber worktree + await Promise.all( + openchamberWorktrees.map(async (worktree) => { + try { + const response = await apiClient.session.list({ + directory: normalize(worktree.worktree), + }); + const sessions: Session[] = Array.isArray(response.data) ? response.data : []; + for (const session of sessions) { + sessionsMap.set(session.id, session); + } + } catch (err) { + console.debug('Failed to fetch sessions from worktree:', worktree.worktree, err); + } + }) + ); + + const allSessions = Array.from(sessionsMap.values()); + // Parse sessions and group by groupSlug const groupsMap = new Map(); diff --git a/packages/vscode/webview/api/git.ts b/packages/vscode/webview/api/git.ts index 276ccf96..f111a613 100644 --- a/packages/vscode/webview/api/git.ts +++ b/packages/vscode/webview/api/git.ts @@ -107,6 +107,7 @@ export const createVSCodeGitAPI = (): GitAPI => ({ path: payload.path, branch: payload.branch, createBranch: payload.createBranch, + startPoint: payload.startPoint, }); },