← Files Codex Security CloudARCHIVED FILE

.internal/defense-factory-ui/src/workbench/scans-metadata.tsx

5.14 KB · Oct 2, 2026 · 00:26 UTC

↓ Download file

import { Clock as ClockIcon } from "@oai/ds/icons/clock";
import { Code as CodeIcon } from "@oai/ds/icons/code";
import { Commit as CommitIcon } from "@oai/ds/icons/commit";
import { Stopwatch as StopwatchIcon } from "@oai/ds/icons/stopwatch";
import { User as UserIcon } from "@oai/ds/icons/user";
import type { ComponentProps } from "react";
import { useIntl } from "react-intl";

import { ExternalLink } from "../link";
import { commitUrl, shortHash } from "./findings-utils";
import { WorkbenchStatusBadge } from "./layout";
import { scanMessages as messages } from "./scans-messages";
import {
  formatDateTime,
  formatDuration,
  getScanCommitHash,
  getScanStartedAt,
  getScanStatus,
  getScanStatusPresentation,
  type WorkbenchScan,
} from "./scans-model";
import Table from "./table";

export function WorkbenchScanStatusBadge({ scan }: { scan: WorkbenchScan }) {
  const intl = useIntl();
  const presentation = getScanStatusPresentation(getScanStatus(scan));
  return (
    <WorkbenchStatusBadge variant={presentation.variant}>
      {intl.formatMessage(presentation.message)}
    </WorkbenchStatusBadge>
  );
}

export function WorkbenchScanStartedBadge({ scan }: { scan: WorkbenchScan }) {
  const intl = useIntl();
  const startedAt = getScanStartedAt(scan);
  return (
    <WorkbenchStatusBadge
      variant="neutral"
      label={intl.formatMessage(messages.started)}
      icon={<ClockIcon aria-hidden className="icon-sm shrink-0" />}
    >
      <time dateTime={startedAt}>{formatDateTime(intl, startedAt)}</time>
    </WorkbenchStatusBadge>
  );
}

export function WorkbenchScanDurationBadge({ scan }: { scan: WorkbenchScan }) {
  const intl = useIntl();
  return (
    <WorkbenchStatusBadge
      variant="neutral"
      label={intl.formatMessage(messages.duration)}
      icon={<StopwatchIcon aria-hidden className="icon-sm shrink-0" />}
    >
      {formatDuration(intl, scan)}
    </WorkbenchStatusBadge>
  );
}

export function WorkbenchScanRepositoryBadge({
  scan,
  rowLinkProps,
}: {
  scan: WorkbenchScan;
  rowLinkProps?: ComponentProps<typeof Table.RowTextLink>;
}) {
  const intl = useIntl();
  const content = scan.repositoryUrl ? (
    <ExternalLink
      href={scan.repositoryUrl}
      target="_blank"
      rel="noopener noreferrer"
      className="min-w-0 truncate text-inherit underline-offset-2 hover:underline"
      title={scan.repositoryName}
    >
      {scan.repositoryName}
    </ExternalLink>
  ) : rowLinkProps ? (
    <Table.RowTextLink
      {...rowLinkProps}
      className="min-w-0 truncate"
      title={scan.repositoryName}
    >
      {scan.repositoryName}
    </Table.RowTextLink>
  ) : (
    <span className="min-w-0 truncate" title={scan.repositoryName}>
      {scan.repositoryName}
    </span>
  );
  return (
    <WorkbenchStatusBadge
      variant="purple"
      label={intl.formatMessage(messages.repository)}
      icon={<CodeIcon aria-hidden className="icon-sm shrink-0" />}
    >
      {content}
    </WorkbenchStatusBadge>
  );
}

export function WorkbenchScanCommitBadge({
  scan,
  rowLinkProps,
}: {
  scan: WorkbenchScan;
  rowLinkProps?: ComponentProps<typeof Table.RowTextLink>;
}) {
  const intl = useIntl();
  const commitHash = getScanCommitHash(scan);
  if (!commitHash) return null;
  const href = commitUrl(scan.repositoryUrl, commitHash);
  return (
    <WorkbenchStatusBadge
      variant="purple"
      label={intl.formatMessage(messages.commit)}
      icon={<CommitIcon aria-hidden className="icon-sm shrink-0" />}
    >
      {href ? (
        <ExternalLink
          href={href}
          target="_blank"
          rel="noopener noreferrer"
          className="font-mono font-normal text-inherit underline-offset-2 hover:underline"
          title={commitHash}
        >
          {shortHash(commitHash)}
        </ExternalLink>
      ) : rowLinkProps ? (
        <Table.RowTextLink
          {...rowLinkProps}
          className="font-mono font-normal"
          title={commitHash}
        >
          {shortHash(commitHash)}
        </Table.RowTextLink>
      ) : (
        <span className="font-mono font-normal" title={commitHash}>
          {shortHash(commitHash)}
        </span>
      )}
    </WorkbenchStatusBadge>
  );
}

export function WorkbenchScanInitiatorBadge({ scan }: { scan: WorkbenchScan }) {
  const intl = useIntl();
  const initiator = scan.workflow
    ? scan.workflow.initiator_name ??
      (scan.workflow.is_owner === false
        ? intl.formatMessage({
            id: "codexSecurity.workbench.scans.detail.initiatedBy.workspaceMember",
            defaultMessage: "Workspace member",
            description:
              "Fallback initiator value when the workspace member's name is unavailable.",
          })
        : intl.formatMessage({
            id: "codexSecurity.workbench.scans.detail.initiatedBy.you",
            defaultMessage: "You",
            description:
              "Short initiator value for a scan started by the current viewer.",
          }))
    : scan.commitScan.triggered_by;
  return (
    <WorkbenchStatusBadge
      variant="info"
      label={intl.formatMessage(messages.initiatedBy)}
      icon={<UserIcon aria-hidden className="icon-sm shrink-0" />}
    >
      {initiator}
    </WorkbenchStatusBadge>
  );
}

SHA-256: 9de8572ffc34ef4b8f43e9f69abcdc0e875806762b32bb97a7192f5a97622df5