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":