fix: defer worktree git watch subscription until after worktree exists
registerPendingWorktreeWorkspace was subscribing the WorkspaceGitService before the worktree directory existed on disk, caching a stale isGit:false snapshot. When background reconciliation ran, it consumed the stale cache, overwrote the correct workspace record with a wrong projectId, and briefly showed the worktree as a standalone project in the sidebar. Move syncWorkspaceGitWatchTarget from registerPendingWorktreeWorkspace into handleCreatePaseoWorktreeRequest, called after createAgentWorktree, so the first snapshot sees the real worktree — one subscribe, one load, no stale cache to race against.
This commit is contained in:
@@ -5880,8 +5880,6 @@ export class Session {
|
||||
buildPersistedWorkspaceRecord: (input) => this.buildPersistedWorkspaceRecord(input),
|
||||
buildProjectPlacement: (cwd) => this.buildProjectPlacement(cwd),
|
||||
projectRegistry: this.projectRegistry,
|
||||
syncWorkspaceGitWatchTarget: (cwd, syncOptions) =>
|
||||
this.syncWorkspaceGitWatchTarget(cwd, syncOptions),
|
||||
workspaceRegistry: this.workspaceRegistry,
|
||||
archiveProjectRecordIfEmpty: (projectId, archivedAt) =>
|
||||
this.archiveProjectRecordIfEmpty(projectId, archivedAt),
|
||||
@@ -6269,6 +6267,8 @@ export class Session {
|
||||
emit: (message) => this.emit(message),
|
||||
registerPendingWorktreeWorkspace: (options) =>
|
||||
this.registerPendingWorktreeWorkspace(options),
|
||||
syncWorkspaceGitWatchTarget: (cwd, syncOptions) =>
|
||||
this.syncWorkspaceGitWatchTarget(cwd, syncOptions),
|
||||
sessionLogger: this.sessionLogger,
|
||||
runWorktreeSetupInBackground: (options) => this.runWorktreeSetupInBackground(options),
|
||||
},
|
||||
|
||||
@@ -87,7 +87,6 @@ type RegisterPendingWorktreeWorkspaceDependencies = {
|
||||
}) => PersistedWorkspaceRecord;
|
||||
buildProjectPlacement: (cwd: string) => Promise<ProjectPlacementPayload>;
|
||||
projectRegistry: Pick<ProjectRegistry, "get" | "upsert">;
|
||||
syncWorkspaceGitWatchTarget: (cwd: string, options: { isGit: boolean }) => Promise<void>;
|
||||
workspaceRegistry: Pick<WorkspaceRegistry, "get" | "upsert">;
|
||||
archiveProjectRecordIfEmpty: (projectId: string, archivedAt: string) => Promise<void>;
|
||||
};
|
||||
@@ -111,6 +110,7 @@ type HandleCreatePaseoWorktreeRequestDependencies = {
|
||||
worktreePath: string;
|
||||
branchName: string;
|
||||
}) => Promise<PersistedWorkspaceRecord>;
|
||||
syncWorkspaceGitWatchTarget: (cwd: string, options: { isGit: boolean }) => Promise<void>;
|
||||
sessionLogger: Logger;
|
||||
runWorktreeSetupInBackground: (options: {
|
||||
requestCwd: string;
|
||||
@@ -535,9 +535,6 @@ export async function registerPendingWorktreeWorkspace(
|
||||
|
||||
await dependencies.projectRegistry.upsert(nextProjectRecord);
|
||||
await dependencies.workspaceRegistry.upsert(nextWorkspaceRecord);
|
||||
await dependencies.syncWorkspaceGitWatchTarget(workspaceId, {
|
||||
isGit: placement.checkout.isGit,
|
||||
});
|
||||
|
||||
if (
|
||||
existingWorkspace &&
|
||||
@@ -593,6 +590,8 @@ export async function handleCreatePaseoWorktreeRequest(
|
||||
paseoHome: dependencies.paseoHome,
|
||||
});
|
||||
|
||||
await dependencies.syncWorkspaceGitWatchTarget(worktreePath, { isGit: true });
|
||||
|
||||
const descriptor = await dependencies.describeWorkspaceRecord(workspace);
|
||||
dependencies.emit({
|
||||
type: "create_paseo_worktree_response",
|
||||
|
||||
Reference in New Issue
Block a user