diff --git a/src/main/ipc/worktrees/metadata/register-worktree-metadata-handlers.ts b/src/main/ipc/worktrees/metadata/register-worktree-metadata-handlers.ts index af71462b477..c0600107a18 100644 --- a/src/main/ipc/worktrees/metadata/register-worktree-metadata-handlers.ts +++ b/src/main/ipc/worktrees/metadata/register-worktree-metadata-handlers.ts @@ -1,5 +1,6 @@ import { ipcMain } from 'electron' import type { WorktreeMeta } from '../../../../shared/worktree/meta-types' +import { displayNameUpdatePinsLabel } from '../../../../shared/worktree/display-name-provenance' import { parseExecutionHostId } from '../../../../shared/execution-host' import { stripOrcaProvenanceMetaUpdates } from '../../../worktree-removal-safety' import { getRepoIdFromWorktreeId } from '../../../../shared/worktree/id' @@ -40,7 +41,7 @@ export function registerWorktreeMetadataHandlers(context: WorktreeIpcContext): v ? { ...validatedUpdates, // The host persists provenance; do not rely on renderer-authored metadata. - displayNameIsPinned: Boolean(validatedUpdates.displayName.trim()), + displayNameIsPinned: displayNameUpdatePinsLabel(validatedUpdates.displayName), pendingFirstAgentMessageRename: false, firstAgentMessageRenameError: null } diff --git a/src/main/runtime/rpc/methods/worktree.ts b/src/main/runtime/rpc/methods/worktree.ts index 494e6023795..b3d816496c3 100644 --- a/src/main/runtime/rpc/methods/worktree.ts +++ b/src/main/runtime/rpc/methods/worktree.ts @@ -4,6 +4,7 @@ import { resolveAutomationWorkspaceProvenance } from '../../../automations/workspace-provenance' import { buildCliWorkspaceProvenance } from '../../../../shared/cli-workspace-provenance' +import { displayNameUpdatePinsLabel } from '../../../../shared/worktree/display-name-provenance' import { defineMethod, type RpcMethod } from '../core' import { buildManagedWorktreeCreateArgs } from './worktree-create-args' import { resolvePairedCallerHostId } from './paired-caller-host-id' @@ -134,7 +135,7 @@ export const WORKTREE_METHODS: RpcMethod[] = [ worktree: await runtime.updateManagedWorktreeMeta(params.worktree, { displayName: params.displayName, ...(params.displayName !== undefined - ? { displayNameIsPinned: Boolean(params.displayName.trim()) } + ? { displayNameIsPinned: displayNameUpdatePinsLabel(params.displayName) } : {}), linkedIssue: params.linkedIssue, linkedPR: params.linkedPR, diff --git a/src/renderer/src/store/slices/worktrees/metadata/update-worktree-meta.ts b/src/renderer/src/store/slices/worktrees/metadata/update-worktree-meta.ts index 12eefaa6542..5e5c38a71e2 100644 --- a/src/renderer/src/store/slices/worktrees/metadata/update-worktree-meta.ts +++ b/src/renderer/src/store/slices/worktrees/metadata/update-worktree-meta.ts @@ -2,6 +2,7 @@ import type { WorktreeSlice } from '../../worktree-helpers' import type { WorktreeSliceGet, WorktreeSliceSet } from '../listing/worktree-slice-types' import { translate } from '@/i18n/i18n' import { isPositiveHostedReviewNumber } from '../../../../../../shared/hosted-review' +import { displayNameUpdatePinsLabel } from '../../../../../../shared/worktree/display-name-provenance' import { parseWorkspaceKey } from '../../../../../../shared/workspace-scope' import { applyWorktreeUpdates, getRepoIdFromWorktreeId } from '../../worktree-helpers' import { getHostedReviewCacheKey } from '../../hosted-review-cache-identity' @@ -124,7 +125,7 @@ export function createUpdateWorktreeMeta( // Why: bump lastActivityAt on comment edits so the time-decay sort doesn't drop a just-touched worktree. const displayNameProvenance = 'displayName' in normalizedUpdates - ? { displayNameIsPinned: Boolean(normalizedUpdates.displayName?.trim()) } + ? { displayNameIsPinned: displayNameUpdatePinsLabel(normalizedUpdates.displayName) } : {} const targetEnriched = resolvedPushTarget ? { ...normalizedUpdates, ...displayNameProvenance, pushTarget: resolvedPushTarget } diff --git a/src/shared/worktree/display-name-provenance.ts b/src/shared/worktree/display-name-provenance.ts new file mode 100644 index 00000000000..a352ab466ba --- /dev/null +++ b/src/shared/worktree/display-name-provenance.ts @@ -0,0 +1,4 @@ +/** A rename with text pins the label; empty text returns it to automatic (branch-derived). */ +export function displayNameUpdatePinsLabel(displayName: string | undefined): boolean { + return Boolean(displayName?.trim()) +}