@@ -4,13 +4,13 @@ import {
44 EnvelopeIcon ,
55 QueueListIcon ,
66} from "@heroicons/react/20/solid" ;
7- import { Link } from "@remix-run/react" ;
87import { type LoaderFunctionArgs } from "@remix-run/server-runtime" ;
98import {
109 formatDurationMilliseconds ,
1110 type TaskRunError ,
1211 taskRunErrorEnhancer ,
1312} from "@trigger.dev/core/v3" ;
13+ import { assertNever } from "assert-never" ;
1414import { useEffect } from "react" ;
1515import { typedjson , useTypedFetcher } from "remix-typedjson" ;
1616import { ExitIcon } from "~/assets/icons/ExitIcon" ;
@@ -37,20 +37,23 @@ import { TabButton, TabContainer } from "~/components/primitives/Tabs";
3737import { TextLink } from "~/components/primitives/TextLink" ;
3838import { InfoIconTooltip , SimpleTooltip } from "~/components/primitives/Tooltip" ;
3939import { RunTimeline , RunTimelineEvent , SpanTimeline } from "~/components/run/RunTimeline" ;
40+ import { PacketDisplay } from "~/components/runs/v3/PacketDisplay" ;
4041import { RunIcon } from "~/components/runs/v3/RunIcon" ;
4142import { RunTag } from "~/components/runs/v3/RunTag" ;
4243import { SpanEvents } from "~/components/runs/v3/SpanEvents" ;
4344import { SpanTitle } from "~/components/runs/v3/SpanTitle" ;
4445import { TaskRunAttemptStatusCombo } from "~/components/runs/v3/TaskRunAttemptStatus" ;
4546import { TaskRunStatusCombo , TaskRunStatusReason } from "~/components/runs/v3/TaskRunStatus" ;
47+ import { WaitpointDetailTable } from "~/components/runs/v3/WaitpointDetails" ;
48+ import { WarmStartCombo } from "~/components/WarmStarts" ;
49+ import { useEnvironment } from "~/hooks/useEnvironment" ;
4650import { useOrganization } from "~/hooks/useOrganizations" ;
4751import { useProject } from "~/hooks/useProject" ;
4852import { useSearchParams } from "~/hooks/useSearchParam" ;
4953import { useHasAdminAccess } from "~/hooks/useUser" ;
5054import { redirectWithErrorMessage } from "~/models/message.server" ;
5155import { type Span , SpanPresenter , type SpanRun } from "~/presenters/v3/SpanPresenter.server" ;
5256import { logger } from "~/services/logger.server" ;
53- import { requireUserId } from "~/services/session.server" ;
5457import { cn } from "~/utils/cn" ;
5558import { formatCurrencyAccurate } from "~/utils/numberFormatter" ;
5659import {
@@ -63,15 +66,8 @@ import {
6366 v3SchedulePath ,
6467 v3SpanParamsSchema ,
6568} from "~/utils/pathBuilder" ;
66- import {
67- CompleteWaitpointForm ,
68- ForceTimeout ,
69- } from "../resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route" ;
70- import { useEnvironment } from "~/hooks/useEnvironment" ;
71- import { WaitpointStatusCombo } from "~/components/runs/v3/WaitpointStatus" ;
72- import { PacketDisplay } from "~/components/runs/v3/PacketDisplay" ;
73- import { WaitpointDetailTable } from "~/components/runs/v3/WaitpointDetails" ;
7469import { createTimelineSpanEventsFromSpanEvents } from "~/utils/timelineSpanEvents" ;
70+ import { CompleteWaitpointForm } from "../resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route" ;
7571
7672export const loader = async ( { request, params } : LoaderFunctionArgs ) => {
7773 const { projectParam, organizationSlug, envParam, runParam, spanParam } =
@@ -935,6 +931,40 @@ function SpanEntity({ span }: { span: Span }) {
935931 }
936932
937933 switch ( span . entity . type ) {
934+ case "attempt" : {
935+ return (
936+ < div className = "flex flex-col gap-4 p-3" >
937+ < div className = "border-b border-grid-bright pb-3" >
938+ < TaskRunAttemptStatusCombo
939+ status = {
940+ span . isCancelled
941+ ? "CANCELED"
942+ : span . isError
943+ ? "FAILED"
944+ : span . isPartial
945+ ? "EXECUTING"
946+ : "COMPLETED"
947+ }
948+ className = "text-sm"
949+ />
950+ </ div >
951+ < SpanTimeline
952+ startTime = { new Date ( span . startTime ) }
953+ duration = { span . duration }
954+ inProgress = { span . isPartial }
955+ isError = { span . isError }
956+ events = { createTimelineSpanEventsFromSpanEvents ( span . events , isAdmin ) }
957+ />
958+ { span . entity . object . isWarmStart !== undefined ? (
959+ < WarmStartCombo
960+ isWarmStart = { span . entity . object . isWarmStart }
961+ showTooltip
962+ className = "mt-3"
963+ />
964+ ) : null }
965+ </ div >
966+ ) ;
967+ }
938968 case "waitpoint" : {
939969 return (
940970 < div className = "grid h-full grid-rows-[1fr_auto]" >
@@ -957,7 +987,7 @@ function SpanEntity({ span }: { span: Span }) {
957987 ) ;
958988 }
959989 default : {
960- return < Paragraph variant = "small" > No span for { span . entity . type } </ Paragraph > ;
990+ assertNever ( span . entity ) ;
961991 }
962992 }
963993}
0 commit comments