diff --git a/src/services/worker-types.ts b/src/services/worker-types.ts index 1a8557a0..79dc9199 100644 --- a/src/services/worker-types.ts +++ b/src/services/worker-types.ts @@ -124,6 +124,7 @@ export interface Observation { id: number; memory_session_id: string; // Renamed from sdk_session_id project: string; + merged_into_project: string | null; platform_source: string; type: string; title: string; diff --git a/src/services/worker/PaginationHelper.ts b/src/services/worker/PaginationHelper.ts index 42ce1cce..07888ec7 100644 --- a/src/services/worker/PaginationHelper.ts +++ b/src/services/worker/PaginationHelper.ts @@ -80,6 +80,7 @@ export class PaginationHelper { o.id, o.memory_session_id, o.project, + o.merged_into_project, COALESCE(s.platform_source, 'claude') as platform_source, o.type, o.title, @@ -100,8 +101,10 @@ export class PaginationHelper { const conditions: string[] = []; if (project) { - conditions.push('o.project = ?'); - params.push(project); + // Include adopted merged-worktree rows so the parent project's view + // surfaces observations that originated under its merged children. + conditions.push('(o.project = ? OR o.merged_into_project = ?)'); + params.push(project, project); } if (platformSource) { conditions.push(`COALESCE(s.platform_source, 'claude') = ?`); @@ -156,8 +159,10 @@ export class PaginationHelper { const conditions: string[] = []; if (project) { - conditions.push('ss.project = ?'); - params.push(project); + // Include adopted merged-worktree summaries so the parent project's view + // surfaces rows that originated under its merged children. + conditions.push('(ss.project = ? OR ss.merged_into_project = ?)'); + params.push(project, project); } if (platformSource) { diff --git a/src/ui/viewer-template.html b/src/ui/viewer-template.html index c540310c..04f79156 100644 --- a/src/ui/viewer-template.html +++ b/src/ui/viewer-template.html @@ -1130,6 +1130,19 @@ color: var(--color-text-muted); } + /* Merged-into-parent provenance badge */ + .card-merged-badge { + padding: 1px 6px; + border-radius: 3px; + font-size: 9px; + font-weight: 500; + letter-spacing: 0.02em; + color: var(--color-text-muted); + background: var(--color-type-badge-bg); + border: 1px solid var(--color-border); + opacity: 0.85; + } + .summary-card { border-color: var(--color-border-summary); background: var(--color-bg-summary); diff --git a/src/ui/viewer/components/ObservationCard.tsx b/src/ui/viewer/components/ObservationCard.tsx index 71352756..14fbe6cb 100644 --- a/src/ui/viewer/components/ObservationCard.tsx +++ b/src/ui/viewer/components/ObservationCard.tsx @@ -56,6 +56,11 @@ export function ObservationCard({ observation }: ObservationCardProps) { {observation.platform_source || 'claude'} {observation.project} + {observation.merged_into_project && ( + + merged → {observation.merged_into_project} + + )}