refactor(workspaces): unify display-name pin derivation

Three call sites (renderer optimistic update, local IPC updateMeta
handler, remote worktree.set handler) each restated the same formula;
a future edit to one would silently skew provenance between paths.
This commit is contained in:
Jinwoo-H
2026-08-31 18:59:38 -04:00
parent 860e79c212
commit 46a57cdd34
4 changed files with 10 additions and 3 deletions
@@ -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
}
+2 -1
View File
@@ -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,
@@ -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 }
@@ -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())
}