From b0e9dc5f168999479ce86a5646aad93c865936c2 Mon Sep 17 00:00:00 2001 From: Fusion Date: Wed, 13 May 2026 11:21:09 -0700 Subject: [PATCH] =?UTF-8?q?feat(FN-4329):=20complete=20Step=201=20?= =?UTF-8?q?=E2=80=94=20structure=20github=20provenance=20context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fusion-Task-Id: FN-4329 Fusion-Task-Lineage: 6a0517ee-39e6-497f-ad31-535dc3492489 --- .../app/components/TaskDetailModal.tsx | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/dashboard/app/components/TaskDetailModal.tsx b/packages/dashboard/app/components/TaskDetailModal.tsx index 0c9e854e1..439e18032 100644 --- a/packages/dashboard/app/components/TaskDetailModal.tsx +++ b/packages/dashboard/app/components/TaskDetailModal.tsx @@ -326,6 +326,8 @@ interface ProvenanceDisplay { label: string; parentTaskId?: string; contextInfo?: string; + contextHref?: string; + contextInfoFull?: string; sourceAgentId?: string; } @@ -338,6 +340,19 @@ function getIssueUrlFromMetadata(metadata: Task["sourceMetadata"]): string | und return typeof issueUrl === "string" && issueUrl.length > 0 ? issueUrl : undefined; } +function parseGithubIssueLabel(url: string): { label: string; href: string } | null { + const match = url.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/(issues|pull)\/(\d+)(?:$|[/?#])/); + if (!match) { + return null; + } + + const [, owner, repo, , number] = match; + return { + label: `${owner}/${repo}#${number}`, + href: url, + }; +} + function getResearchContextInfo(metadata: Task["sourceMetadata"]): string | undefined { const findingLabel = metadata?.findingLabel; if (typeof findingLabel === "string" && findingLabel.length > 0) { @@ -373,9 +388,12 @@ function getProvenanceLabel(task: Task | TaskDetail, options: ProvenanceLabelOpt return { label: "Workflow Step" }; case "github_import": { const issueUrl = getIssueUrlFromMetadata(task.sourceMetadata); + const parsedIssue = issueUrl ? parseGithubIssueLabel(issueUrl) : null; return { label: "GitHub Import", - contextInfo: issueUrl, + contextInfo: issueUrl ? (parsedIssue?.label ?? "Open issue") : undefined, + contextHref: issueUrl, + contextInfoFull: issueUrl, }; } case "research": { @@ -383,6 +401,7 @@ function getProvenanceLabel(task: Task | TaskDetail, options: ProvenanceLabelOpt return { label: "Research", contextInfo, + contextInfoFull: contextInfo, }; } case "task_refine":