import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Issue, IssueScheduledRetry } from "@paperclipai/shared"; import { IssueScheduledRetryCard } from "@/components/IssueScheduledRetryCard"; import { IssueProperties } from "@/components/IssueProperties"; import { storybookExecutionWorkspaces, storybookIssueDocuments, storybookIssues, } from "../fixtures/paperclipData"; const issueDocumentSummaries = storybookIssueDocuments.map(({ body: _body, ...summary }) => summary); const baseIssue: Issue = { ...storybookIssues[0]!, planDocument: storybookIssueDocuments.find((document) => document.key === "plan") ?? null, documentSummaries: issueDocumentSummaries, currentExecutionWorkspace: storybookExecutionWorkspaces[0]!, }; const inFifteenMinutes = () => new Date(Date.now() + 15 * 60_000).toISOString(); const justNow = () => new Date(Date.now() + 5_000).toISOString(); const inTwoDays = () => new Date(Date.now() + 2 * 24 * 60 * 60_000).toISOString(); const transientRetry: IssueScheduledRetry = { runId: "run-aaaaaaaa-1111-1111-1111-111111111111", status: "scheduled_retry", agentId: baseIssue.assigneeAgentId ?? "agent-1", agentName: "ClaudeCoder", retryOfRunId: "run-prev-2222-2222-2222-222222222222", scheduledRetryAt: inFifteenMinutes(), scheduledRetryAttempt: 4, scheduledRetryReason: "transient_failure", retryExhaustedReason: null, error: "Upstream provider returned 502", errorCode: "upstream_502", }; const continuationRetry: IssueScheduledRetry = { ...transientRetry, runId: "run-bbbbbbbb-3333-3333-3333-333333333333", retryOfRunId: "run-prev-4444-4444-4444-444444444444", scheduledRetryAt: inTwoDays(), scheduledRetryAttempt: 1, scheduledRetryReason: "max_turns_continuation", error: null, }; const dueNowRetry: IssueScheduledRetry = { ...transientRetry, runId: "run-cccccccc-5555-5555-5555-555555555555", scheduledRetryAt: justNow(), }; const issueWithRetry = (retry: IssueScheduledRetry): Issue => ({ ...baseIssue, scheduledRetry: retry, }); function ScheduledRetrySurfaceStories() { return (
IssueScheduledRetryCard - transient failure, in 15m
IssueScheduledRetryCard - max-turn continuation, in 2d
IssueScheduledRetryCard - due now (overdue)
IssueScheduledRetryCard - returns null with no live scheduled retry
(intentionally renders nothing for issues without a live scheduled retry)
IssueProperties Scheduled retry row - hidden when no live retry
undefined} inline />
IssueProperties Scheduled retry row - transient failure, in 15m
undefined} inline />
IssueProperties Scheduled retry row - continuation, in 2d
undefined} inline />
IssueProperties Scheduled retry row - due now
undefined} inline />
); } const meta = { title: "Product/Issue Scheduled retry surfaces", component: ScheduledRetrySurfaceStories, parameters: { docs: { description: { component: "Surfaces the IssueScheduledRetryCard and IssueProperties Scheduled retry row in transient/continuation/due-now variants for UX review. The card mounts above IssueMonitorActivityCard and the property row sits sibling-to (and above) Monitor.", }, }, }, } satisfies Meta; export default meta; type Story = StoryObj; export const ScheduledRetrySurfaces: Story = {};