@workflow/web-shared 4.1.9 → 4.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +9 -9
  4. package/dist/components/hook-actions.js +1 -1
  5. package/dist/components/index.js +1 -1
  6. package/dist/components/run-trace-view.js +1 -1
  7. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  8. package/dist/components/sidebar/attribute-panel.js +5 -5
  9. package/dist/components/sidebar/conversation-view.js +1 -1
  10. package/dist/components/sidebar/copyable-data-block.js +1 -1
  11. package/dist/components/sidebar/detail-card.js +1 -1
  12. package/dist/components/sidebar/entity-detail-panel.js +1 -1
  13. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  14. package/dist/components/sidebar/events-list.js +7 -7
  15. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  16. package/dist/components/stream-viewer.js +1 -1
  17. package/dist/components/trace-viewer/components/map.js +1 -1
  18. package/dist/components/trace-viewer/components/markers.js +1 -1
  19. package/dist/components/trace-viewer/components/node.js +1 -1
  20. package/dist/components/trace-viewer/components/search-input.js +1 -1
  21. package/dist/components/trace-viewer/components/search.js +1 -1
  22. package/dist/components/trace-viewer/components/span-content.js +1 -1
  23. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  24. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  25. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  26. package/dist/components/trace-viewer/components/ui.js +1 -1
  27. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  28. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  29. package/dist/components/trace-viewer/context.js +1 -1
  30. package/dist/components/trace-viewer/index.js +1 -1
  31. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  32. package/dist/components/trace-viewer/types.js +1 -1
  33. package/dist/components/trace-viewer/util/constants.js +1 -1
  34. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  35. package/dist/components/trace-viewer/util/timing.js +1 -1
  36. package/dist/components/trace-viewer/util/tree.js +1 -1
  37. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  38. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  39. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  40. package/dist/components/trace-viewer/worker.js +1 -1
  41. package/dist/components/ui/alert.js +1 -1
  42. package/dist/components/ui/card.js +1 -1
  43. package/dist/components/ui/data-inspector.js +1 -1
  44. package/dist/components/ui/decrypt-button.js +1 -1
  45. package/dist/components/ui/error-card.js +1 -1
  46. package/dist/components/ui/error-stack-block.d.ts +17 -10
  47. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  48. package/dist/components/ui/error-stack-block.js +27 -13
  49. package/dist/components/ui/inspector-theme.js +1 -1
  50. package/dist/components/ui/load-more-button.js +1 -1
  51. package/dist/components/ui/menu-dropdown.js +1 -1
  52. package/dist/components/ui/skeleton.js +1 -1
  53. package/dist/components/ui/spinner.js +1 -1
  54. package/dist/components/ui/timestamp-tooltip.js +1 -1
  55. package/dist/components/workflow-trace-view.js +1 -1
  56. package/dist/components/workflow-traces/event-colors.js +1 -1
  57. package/dist/components/workflow-traces/trace-colors.js +1 -1
  58. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  59. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  60. package/dist/hooks/use-dark-mode.js +1 -1
  61. package/dist/index.js +1 -1
  62. package/dist/lib/event-analysis.js +1 -1
  63. package/dist/lib/event-materialization.js +1 -1
  64. package/dist/lib/exact-event-search-id.js +1 -1
  65. package/dist/lib/hydration.js +1 -1
  66. package/dist/lib/toast.js +1 -1
  67. package/dist/lib/trace-builder.js +1 -1
  68. package/dist/lib/utils.js +1 -1
  69. package/package.json +6 -6
  70. package/src/components/event-list-view.tsx +12 -11
  71. package/src/components/sidebar/attribute-panel.tsx +4 -7
  72. package/src/components/sidebar/events-list.tsx +6 -9
  73. package/src/components/ui/error-stack-block.tsx +48 -25
  74. package/dist/components/error-boundary.js.map +0 -1
  75. package/dist/components/event-list-view.js.map +0 -1
  76. package/dist/components/hook-actions.js.map +0 -1
  77. package/dist/components/index.js.map +0 -1
  78. package/dist/components/run-trace-view.js.map +0 -1
  79. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  80. package/dist/components/sidebar/conversation-view.js.map +0 -1
  81. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  82. package/dist/components/sidebar/detail-card.js.map +0 -1
  83. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  84. package/dist/components/sidebar/events-list.js.map +0 -1
  85. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  86. package/dist/components/stream-viewer.js.map +0 -1
  87. package/dist/components/trace-viewer/components/map.js.map +0 -1
  88. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  89. package/dist/components/trace-viewer/components/node.js.map +0 -1
  90. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  91. package/dist/components/trace-viewer/components/search.js.map +0 -1
  92. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  93. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  94. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  95. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  96. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  97. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  98. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  99. package/dist/components/trace-viewer/context.js.map +0 -1
  100. package/dist/components/trace-viewer/index.js.map +0 -1
  101. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  102. package/dist/components/trace-viewer/types.js.map +0 -1
  103. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  104. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  105. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  106. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  107. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  108. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  109. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  110. package/dist/components/trace-viewer/worker.js.map +0 -1
  111. package/dist/components/ui/alert.js.map +0 -1
  112. package/dist/components/ui/card.js.map +0 -1
  113. package/dist/components/ui/data-inspector.js.map +0 -1
  114. package/dist/components/ui/decrypt-button.js.map +0 -1
  115. package/dist/components/ui/error-card.js.map +0 -1
  116. package/dist/components/ui/error-stack-block.js.map +0 -1
  117. package/dist/components/ui/inspector-theme.js.map +0 -1
  118. package/dist/components/ui/load-more-button.js.map +0 -1
  119. package/dist/components/ui/menu-dropdown.js.map +0 -1
  120. package/dist/components/ui/skeleton.js.map +0 -1
  121. package/dist/components/ui/spinner.js.map +0 -1
  122. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  123. package/dist/components/workflow-trace-view.js.map +0 -1
  124. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  125. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  126. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  127. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  128. package/dist/hooks/use-dark-mode.js.map +0 -1
  129. package/dist/index.js.map +0 -1
  130. package/dist/lib/event-analysis.js.map +0 -1
  131. package/dist/lib/event-materialization.js.map +0 -1
  132. package/dist/lib/exact-event-search-id.js.map +0 -1
  133. package/dist/lib/hydration.js.map +0 -1
  134. package/dist/lib/toast.js.map +0 -1
  135. package/dist/lib/trace-builder.js.map +0 -1
  136. package/dist/lib/utils.js.map +0 -1
@@ -3,35 +3,56 @@
3
3
  import { AlertCircle, Copy } from 'lucide-react';
4
4
  import { useToast } from '../../lib/toast';
5
5
 
6
+ export type StructuredErrorRecord = Record<string, unknown> & {
7
+ message?: string;
8
+ stack?: string;
9
+ };
10
+
6
11
  /**
7
- * Check whether `value` looks like a structured error object with a `stack`
8
- * field that we can render as pre-formatted text.
12
+ * Check whether `value` looks like a structured error object we can render
13
+ * with the error block. Some persisted workflow errors only include a
14
+ * `message`, while runtime errors usually also include `stack`.
9
15
  */
10
- export function isStructuredErrorWithStack(
16
+ export function isStructuredError(
11
17
  value: unknown
12
- ): value is Record<string, unknown> & { stack: string } {
18
+ ): value is StructuredErrorRecord {
13
19
  return (
14
20
  value != null &&
15
21
  typeof value === 'object' &&
16
- 'stack' in value &&
17
- typeof (value as Record<string, unknown>).stack === 'string'
22
+ (typeof (value as Record<string, unknown>).message === 'string' ||
23
+ typeof (value as Record<string, unknown>).stack === 'string')
24
+ );
25
+ }
26
+
27
+ /**
28
+ * Narrower guard kept for callers that specifically need a stack trace.
29
+ */
30
+ export function isStructuredErrorWithStack(
31
+ value: unknown
32
+ ): value is StructuredErrorRecord & { stack: string } {
33
+ return (
34
+ isStructuredError(value) &&
35
+ typeof (value as StructuredErrorRecord).stack === 'string'
18
36
  );
19
37
  }
20
38
 
21
39
  /**
22
- * Renders an error with a `stack` field as a visually distinct error block.
23
- * Shows the error message with an alert icon at the top, separated from
24
- * the stack trace below.
40
+ * Renders a structured error as a visually distinct error block. Shows the
41
+ * error message with an alert icon at the top, separated from the stack trace
42
+ * or full message below.
25
43
  */
26
- export function ErrorStackBlock({
27
- value,
28
- }: {
29
- value: Record<string, unknown> & { stack: string };
30
- }) {
44
+ export function ErrorStackBlock({ value }: { value: StructuredErrorRecord }) {
31
45
  const toast = useToast();
32
- const stack = value.stack;
46
+ const stack = typeof value.stack === 'string' ? value.stack : undefined;
33
47
  const message = typeof value.message === 'string' ? value.message : undefined;
34
- const copyText = message ? `${message}\n\n${stack}` : stack;
48
+ const body = stack ?? message ?? '';
49
+ // V8's `Error.stack` already starts with `Name: message`; message-only
50
+ // errors use the message as the body so long single-line failures remain
51
+ // readable even when the header truncates.
52
+ const copyText =
53
+ message && stack && !stack.includes(message)
54
+ ? `${message}\n\n${stack}`
55
+ : body;
35
56
 
36
57
  return (
37
58
  <div
@@ -77,15 +98,17 @@ export function ErrorStackBlock({
77
98
  <p className="text-xs font-semibold m-0 break-words">{message}</p>
78
99
  </div>
79
100
  )}
80
- <pre
81
- className="px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0"
82
- style={{
83
- color: 'var(--ds-red-900)',
84
- background: 'var(--ds-red-200)',
85
- }}
86
- >
87
- {stack}
88
- </pre>
101
+ {body && (
102
+ <pre
103
+ className="px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0"
104
+ style={{
105
+ color: 'var(--ds-red-900)',
106
+ background: 'var(--ds-red-200)',
107
+ }}
108
+ >
109
+ {body}
110
+ </pre>
111
+ )}
89
112
  </div>
90
113
  );
91
114
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-boundary.js","sourceRoot":"","sources":["../../src/components/error-boundary.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAiB5C,MAAM,OAAO,aAAc,SAAQ,SAGlC;IACC,YAAY,KAAyB;QACnC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,KAAc;QAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,iBAAiB,CAAC,KAAc,EAAE,SAAkB;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC7B,CAAC;YAED,mBAAmB;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACxE,MAAM,YAAY,GAAG,GAAG,EAAE,KAAK;gBAC7B,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,OAAO,GAAG,CAAC,KAAK,EAAE;gBAClC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI,eAAe,CAAC,CAAC;YAEtC,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,mBAAmB,EAC9C,OAAO,EAAE,YAAY,GACrB,CACH,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { Component } from 'react';\nimport { ErrorCard } from './ui/error-card';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n /** Optional fallback UI to render on error. When omitted, a default ErrorCard is shown. */\n fallback?: ReactNode;\n /** Optional title for the default error card (used when no fallback is provided) */\n title?: string;\n /** Optional callback when an error is caught */\n onCatch?: (error: unknown, retry: () => void) => void;\n}\n\nexport interface ErrorBoundaryState {\n hasError: boolean;\n error: unknown;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: unknown): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n retry(): void {\n this.setState({ hasError: false, error: null });\n }\n\n componentDidCatch(error: unknown, errorInfo: unknown): void {\n if (process.env.NODE_ENV === 'development') {\n console.error(error, errorInfo);\n }\n this.props.onCatch?.(error, () => this.retry());\n }\n\n render(): ReactNode {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n // Default error UI\n const err = this.state.error instanceof Error ? this.state.error : null;\n const errorDetails = err?.stack\n ? `${err.message}\\n\\n${err.stack}`\n : (err?.message ?? 'Unknown error');\n\n return (\n <ErrorCard\n title={this.props.title || 'An error occurred'}\n details={errorDetails}\n />\n );\n }\n\n return this.props.children;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-list-view.js","sourceRoot":"","sources":["../../src/components/event-list-view.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type { Event, WorkflowRun } from '@workflow/world';\nimport { Check, ChevronRight, Copy } from 'lucide-react';\nimport type {\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Virtuoso, type VirtuosoHandle } from 'react-virtuoso';\nimport { isEncryptedMarker } from '../lib/hydration';\nimport {\n parseExactWorkflowSearchId,\n looksLikeWorkflowIdSearchInput,\n type ExactIdSearchResult,\n type ExactWorkflowSearchIdKind,\n} from '../lib/exact-event-search-id';\nimport { DecryptButton } from './ui/decrypt-button';\nimport { formatDuration } from '../lib/utils';\nimport { useToast } from '../lib/toast';\nimport { DataInspector, DecryptClickContext } from './ui/data-inspector';\nimport {\n ErrorStackBlock,\n isStructuredErrorWithStack,\n} from './ui/error-stack-block';\nimport { LoadMoreButton } from './ui/load-more-button';\nimport { MenuDropdown } from './ui/menu-dropdown';\nimport { Skeleton } from './ui/skeleton';\nimport { TimestampTooltip } from './ui/timestamp-tooltip';\n\n/**\n * Event types whose eventData contains an error field with a StructuredError.\n */\nconst ERROR_EVENT_TYPES = new Set([\n 'step_failed',\n 'step_retrying',\n 'run_failed',\n 'workflow_failed',\n]);\n\nconst BUTTON_RESET_STYLE: React.CSSProperties = {\n appearance: 'none',\n WebkitAppearance: 'none',\n border: 'none',\n background: 'transparent',\n};\nconst DOT_PULSE_ANIMATION =\n 'workflow-dot-pulse 1.25s cubic-bezier(0, 0, 0.2, 1) infinite';\n\n// ──────────────────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────────────────\n\nfunction formatEventTime(date: Date): string {\n return (\n date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n }) +\n '.' +\n date.getMilliseconds().toString().padStart(3, '0')\n );\n}\n\nfunction formatEventType(eventType: Event['eventType']): string {\n return eventType\n .split('_')\n .map((word: string) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Event type → status color (small dot only)\n// ──────────────────────────────────────────────────────────────────────────\n\n/** Returns a CSS color using Geist design tokens for the status dot. */\nfunction getStatusDotColor(eventType: string): string {\n // Failed → red\n if (\n eventType === 'step_failed' ||\n eventType === 'run_failed' ||\n eventType === 'workflow_failed'\n ) {\n return 'var(--ds-red-700)';\n }\n // Cancelled → amber\n if (eventType === 'run_cancelled') {\n return 'var(--ds-amber-700)';\n }\n // Retrying → amber\n if (eventType === 'step_retrying') {\n return 'var(--ds-amber-700)';\n }\n // Completed/succeeded → green\n if (\n eventType === 'step_completed' ||\n eventType === 'run_completed' ||\n eventType === 'workflow_completed' ||\n eventType === 'hook_disposed' ||\n eventType === 'wait_completed'\n ) {\n return 'var(--ds-green-700)';\n }\n // Started/running → blue\n if (\n eventType === 'step_started' ||\n eventType === 'run_started' ||\n eventType === 'workflow_started' ||\n eventType === 'hook_received'\n ) {\n return 'var(--ds-blue-700)';\n }\n // Created/pending → gray\n return 'var(--ds-gray-600)';\n}\n\n/**\n * Build a map from correlationId (stepId) → display name using step_created\n * events, and parse the workflow name from the run.\n */\nfunction buildNameMaps(\n events: Event[] | null,\n run: WorkflowRun | null\n): {\n correlationNameMap: Map<string, string>;\n workflowName: string | null;\n} {\n const correlationNameMap = new Map<string, string>();\n\n // Map step correlationId (= stepId) → parsed step name from step_created events\n if (events) {\n for (const event of events) {\n if (event.eventType === 'step_created' && event.correlationId) {\n const stepName = event.eventData?.stepName ?? '';\n const parsed = parseStepName(String(stepName));\n correlationNameMap.set(\n event.correlationId,\n parsed?.shortName ?? stepName\n );\n }\n }\n }\n\n // Parse workflow name from run\n const workflowName = run?.workflowName\n ? (parseWorkflowName(run.workflowName)?.shortName ?? run.workflowName)\n : null;\n\n return { correlationNameMap, workflowName };\n}\n\nexport interface DurationInfo {\n /** Time from created → started (ms) */\n queued?: number;\n /** Time from started → completed/failed/cancelled (ms) */\n ran?: number;\n}\n\n/**\n * Build a map from correlationId → duration info by diffing\n * created ↔ started (queued) and started ↔ completed/failed/cancelled (ran).\n * Also computes run-level durations under the key '__run__'.\n */\nexport function buildDurationMap(events: Event[]): Map<string, DurationInfo> {\n // Process events in chronological order so the result doesn't depend on\n // the caller's sort direction. Retried steps emit multiple `step_started`\n // events for the same correlationId; the queued duration must be measured\n // against the first one, not the last.\n const chronological = [...events].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n\n const createdTimes = new Map<string, number>();\n const firstStartedTimes = new Map<string, number>();\n const startedTimes = new Map<string, number>();\n const durations = new Map<string, DurationInfo>();\n\n for (const event of chronological) {\n const ts = new Date(event.createdAt).getTime();\n const key = event.correlationId ?? '__run__';\n const type: string = event.eventType;\n\n // Track created times (first event for each correlation)\n if (type === 'step_created' || type === 'run_created') {\n if (!createdTimes.has(key)) {\n createdTimes.set(key, ts);\n }\n }\n\n // Track started times & compute queued duration\n if (\n type === 'step_started' ||\n type === 'run_started' ||\n type === 'workflow_started'\n ) {\n startedTimes.set(key, ts);\n // The queued duration is anchored on the first start event only —\n // subsequent step_started events come from retries.\n if (!firstStartedTimes.has(key)) {\n firstStartedTimes.set(key, ts);\n // If no explicit created event was seen, use the started time as created\n if (!createdTimes.has(key)) {\n createdTimes.set(key, ts);\n }\n const createdAt = createdTimes.get(key);\n const info = durations.get(key) ?? {};\n if (createdAt !== undefined) {\n info.queued = ts - createdAt;\n }\n durations.set(key, info);\n }\n }\n\n // Compute ran duration on terminal events\n if (\n type === 'step_completed' ||\n type === 'step_failed' ||\n type === 'run_completed' ||\n type === 'run_failed' ||\n type === 'run_cancelled' ||\n type === 'workflow_completed' ||\n type === 'workflow_failed' ||\n type === 'wait_completed' ||\n type === 'hook_disposed'\n ) {\n const startedAt = startedTimes.get(key);\n const info = durations.get(key) ?? {};\n if (startedAt !== undefined) {\n info.ran = ts - startedAt;\n }\n durations.set(key, info);\n }\n }\n\n return durations;\n}\n\n/** Check if a loaded eventData object contains any encrypted marker values. */\nfunction hasEncryptedValues(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n for (const val of Object.values(data as Record<string, unknown>)) {\n if (isEncryptedMarker(val)) return true;\n }\n return false;\n}\n\nfunction isRunLevel(eventType: string): boolean {\n return (\n eventType === 'run_created' ||\n eventType === 'run_started' ||\n eventType === 'run_completed' ||\n eventType === 'run_failed' ||\n eventType === 'run_cancelled' ||\n eventType === 'workflow_started' ||\n eventType === 'workflow_completed' ||\n eventType === 'workflow_failed'\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Tree gutter — fixed-width, shows branch lines only for the selected group\n// ──────────────────────────────────────────────────────────────────────────\n\n/** Fixed gutter width: 20px root area + 16px for one branch lane */\nconst GUTTER_WIDTH = 36;\n/** X position of the single branch lane line */\nconst LANE_X = 20;\nconst ROOT_LINE_COLOR = 'var(--ds-gray-500)';\n\nfunction TreeGutter({\n isFirst,\n isLast,\n isRunLevel: isRun,\n statusDotColor,\n pulse = false,\n hasSelection,\n showBranch,\n showLaneLine,\n isLaneStart,\n isLaneEnd,\n continuationOnly = false,\n}: {\n isFirst: boolean;\n isLast: boolean;\n isRunLevel: boolean;\n statusDotColor?: string;\n pulse?: boolean;\n /** Whether any group is currently active (selected or hovered) */\n hasSelection: boolean;\n /** Whether to show a horizontal branch line for this row (event belongs to active group) */\n showBranch: boolean;\n /** Whether the vertical lane line passes through this row */\n showLaneLine: boolean;\n /** Whether the vertical lane line starts at this row (top clipped to 50%) */\n isLaneStart: boolean;\n /** Whether the vertical lane line ends at this row (bottom clipped to 50%) */\n isLaneEnd: boolean;\n continuationOnly?: boolean;\n}) {\n const dotSize = isRun ? 8 : 6;\n const dotLeft = isRun ? 5 : 6;\n const dotOpacity = hasSelection && !showBranch && !isRun ? 0.3 : 1;\n\n return (\n <div\n className=\"relative flex-shrink-0 self-stretch\"\n style={{\n width: GUTTER_WIDTH,\n minHeight: continuationOnly ? 0 : undefined,\n }}\n >\n {/* Root vertical line (leftmost, always visible) */}\n <div\n style={{\n position: 'absolute',\n left: 8,\n top: continuationOnly ? 0 : isFirst ? '50%' : 0,\n bottom: continuationOnly ? 0 : isLast ? '50%' : 0,\n width: 2,\n backgroundColor: ROOT_LINE_COLOR,\n zIndex: 0,\n }}\n />\n\n {!continuationOnly && (\n <>\n {/* Status dot on the root line for every event */}\n <div\n style={{\n position: 'absolute',\n left: dotLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: dotSize,\n height: dotSize,\n zIndex: 2,\n }}\n >\n {/* Opaque backdrop ensures gutter lines never visually cut through dots */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: 'var(--ds-background-100)',\n zIndex: 0,\n }}\n />\n {pulse && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: statusDotColor,\n opacity: 0.75 * dotOpacity,\n animation: DOT_PULSE_ANIMATION,\n zIndex: 1,\n }}\n />\n )}\n <div\n style={{\n position: 'relative',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: statusDotColor,\n opacity: dotOpacity,\n transition: 'opacity 150ms',\n zIndex: 2,\n }}\n />\n </div>\n\n {/* Horizontal branch from root to gutter edge (selected group events only) */}\n {showBranch && (\n <div\n style={{\n position: 'absolute',\n left: 9,\n top: '50%',\n width: GUTTER_WIDTH - 9,\n height: 2,\n backgroundColor: ROOT_LINE_COLOR,\n zIndex: 0,\n }}\n />\n )}\n </>\n )}\n\n {/* Vertical lane line connecting the selected group's events */}\n {showLaneLine && (\n <div\n style={{\n position: 'absolute',\n left: LANE_X,\n top: continuationOnly ? 0 : isLaneStart ? '50%' : 0,\n bottom: continuationOnly ? 0 : isLaneEnd ? '50%' : 0,\n width: 2,\n backgroundColor: ROOT_LINE_COLOR,\n zIndex: 0,\n }}\n />\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Copyable cell — shows a copy button on hover\n// ──────────────────────────────────────────────────────────────────────────\n\nfunction CopyableCell({\n value,\n className,\n style: styleProp,\n}: {\n value: string;\n className?: string;\n style?: React.CSSProperties;\n}): ReactNode {\n const [copied, setCopied] = useState(false);\n const resetCopiedTimeoutRef = useRef<number | null>(null);\n\n useEffect(() => {\n return () => {\n if (resetCopiedTimeoutRef.current !== null) {\n window.clearTimeout(resetCopiedTimeoutRef.current);\n }\n };\n }, []);\n\n const handleCopy = useCallback(\n (e: ReactMouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value).then(() => {\n setCopied(true);\n if (resetCopiedTimeoutRef.current !== null) {\n window.clearTimeout(resetCopiedTimeoutRef.current);\n }\n resetCopiedTimeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n resetCopiedTimeoutRef.current = null;\n }, 1500);\n });\n },\n [value]\n );\n\n return (\n <div\n className={`group/copy flex items-center gap-1 min-w-0 px-4 ${className ?? ''}`}\n style={styleProp}\n >\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\n {value || '-'}\n </span>\n {value ? (\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"flex-shrink-0 opacity-0 group-hover/copy:opacity-100 transition-opacity p-0.5 rounded hover:bg-[var(--ds-gray-alpha-200)]\"\n style={BUTTON_RESET_STYLE}\n aria-label={`Copy ${value}`}\n >\n {copied ? (\n <Check\n className=\"h-3 w-3\"\n style={{ color: 'var(--ds-green-700)' }}\n />\n ) : (\n <Copy className=\"h-3 w-3\" style={{ color: 'var(--ds-gray-700)' }} />\n )}\n </button>\n ) : null}\n </div>\n );\n}\n\n/** Recursively parse stringified JSON values so escaped slashes / quotes are cleaned up */\nfunction deepParseJson(value: unknown): unknown {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']')) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))\n ) {\n try {\n return deepParseJson(JSON.parse(trimmed));\n } catch {\n return value;\n }\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(deepParseJson);\n }\n if (value !== null && typeof value === 'object') {\n // Preserve objects with custom constructors (e.g., encrypted markers,\n // class instance refs) — don't destructure them into plain objects\n if (value.constructor !== Object) {\n return value;\n }\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = deepParseJson(v);\n }\n return result;\n }\n return value;\n}\n\n/**\n * Extracts a structured error with a stack trace from event data, if present.\n * Returns the error object to render with ErrorStackBlock, or null if not applicable.\n */\nfunction extractStructuredError(\n data: unknown,\n eventType?: string\n): (Record<string, unknown> & { stack: string }) | null {\n if (!eventType || !ERROR_EVENT_TYPES.has(eventType)) return null;\n if (data == null || typeof data !== 'object') return null;\n const record = data as Record<string, unknown>;\n // Check the nested `error` field first (the StructuredError)\n if (isStructuredErrorWithStack(record.error)) return record.error;\n // Some error formats put the stack at the top level of eventData\n if (isStructuredErrorWithStack(record)) return record;\n return null;\n}\n\nfunction PayloadBlock({\n data,\n eventType,\n}: {\n data: unknown;\n eventType?: string;\n}): ReactNode {\n const structuredError = useMemo(\n () => extractStructuredError(data, eventType),\n [data, eventType]\n );\n\n const [copied, setCopied] = useState(false);\n const resetCopiedTimeoutRef = useRef<number | null>(null);\n const cleaned = useMemo(() => deepParseJson(data), [data]);\n\n useEffect(() => {\n return () => {\n if (resetCopiedTimeoutRef.current !== null) {\n window.clearTimeout(resetCopiedTimeoutRef.current);\n }\n };\n }, []);\n\n const formatted = useMemo(() => {\n try {\n return JSON.stringify(cleaned, null, 2);\n } catch {\n return String(cleaned);\n }\n }, [cleaned]);\n\n const handleCopy = useCallback(\n (e: ReactMouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(formatted).then(() => {\n setCopied(true);\n if (resetCopiedTimeoutRef.current !== null) {\n window.clearTimeout(resetCopiedTimeoutRef.current);\n }\n resetCopiedTimeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n resetCopiedTimeoutRef.current = null;\n }, 1500);\n });\n },\n [formatted]\n );\n\n if (structuredError) {\n return (\n <div className=\"p-2\">\n <ErrorStackBlock value={structuredError} />\n </div>\n );\n }\n\n return (\n <div className=\"relative group/payload\">\n <div\n className=\"overflow-x-auto p-2 text-[11px]\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n <DataInspector data={cleaned} expandLevel={2} />\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"absolute bottom-2 right-2 opacity-0 group-hover/payload:opacity-100 transition-opacity flex items-center gap-1 px-2 py-1 rounded-md text-xs hover:bg-[var(--ds-gray-alpha-200)]\"\n style={{ ...BUTTON_RESET_STYLE, color: 'var(--ds-gray-700)' }}\n aria-label=\"Copy payload\"\n >\n {copied ? (\n <>\n <Check\n className=\"h-3 w-3\"\n style={{ color: 'var(--ds-green-700)' }}\n />\n <span style={{ color: 'var(--ds-green-700)' }}>Copied</span>\n </>\n ) : (\n <>\n <Copy className=\"h-3 w-3\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Sort options for the events list\n// ──────────────────────────────────────────────────────────────────────────\n\nconst SORT_OPTIONS = [\n { value: 'desc' as const, label: 'Newest' },\n { value: 'asc' as const, label: 'Oldest' },\n];\n\nfunction RowsSkeleton() {\n return (\n <div className=\"flex-1 overflow-hidden\">\n {Array.from({ length: 16 }, (_, i) => (\n <div key={i} className=\"flex items-center gap-0\" style={{ height: 40 }}>\n {/* Gutter area */}\n <div\n className=\"relative flex-shrink-0 self-stretch flex items-center\"\n style={{ width: GUTTER_WIDTH }}\n >\n {/* Vertical line skeleton */}\n <div\n style={{\n position: 'absolute',\n left: 8,\n top: i === 0 ? '50%' : 0,\n bottom: 0,\n width: 2,\n }}\n >\n <Skeleton className=\"w-full h-full\" style={{ borderRadius: 1 }} />\n </div>\n {/* Dot skeleton */}\n <Skeleton\n className=\"flex-shrink-0\"\n style={{\n width: i % 4 === 0 ? 8 : 6,\n height: i % 4 === 0 ? 8 : 6,\n borderRadius: '50%',\n marginLeft: i % 4 === 0 ? 5 : 6,\n }}\n />\n </div>\n {/* Chevron placeholder */}\n <div className=\"w-5 flex-shrink-0 flex items-center justify-center\">\n <Skeleton className=\"w-5 h-5\" style={{ borderRadius: 4 }} />\n </div>\n {/* Time */}\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: '70%' }} />\n </div>\n {/* Event Type */}\n <div\n className=\"min-w-0 px-4 flex items-center gap-1.5\"\n style={{ flex: '2 1 0%' }}\n >\n <Skeleton\n className=\"flex-shrink-0\"\n style={{ width: 6, height: 6, borderRadius: '50%' }}\n />\n <Skeleton className=\"h-3\" style={{ width: '60%' }} />\n </div>\n {/* Name */}\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: '50%' }} />\n </div>\n {/* Correlation ID */}\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: '75%' }} />\n </div>\n {/* Event ID */}\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: '75%' }} />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Event row\n// ──────────────────────────────────────────────────────────────────────────\n\ninterface EventsListProps {\n events: Event[] | null;\n run?: WorkflowRun | null;\n onLoadEventData?: (event: Event) => Promise<unknown | null>;\n hasMoreEvents?: boolean;\n isLoadingMoreEvents?: boolean;\n onLoadMoreEvents?: () => Promise<void> | void;\n /** When provided, signals that decryption is active (triggers re-load of expanded events) */\n encryptionKey?: Uint8Array;\n /** When true, shows a loading state instead of \"No events found\" for empty lists */\n isLoading?: boolean;\n /** Sort order for events. Defaults to 'asc'. */\n sortOrder?: 'asc' | 'desc';\n /** Called when the user changes sort order. When provided, the sort dropdown is shown\n * and the parent is expected to refetch from the API with the new order. */\n onSortOrderChange?: (order: 'asc' | 'desc') => void;\n /** Called when the user clicks the Decrypt button. */\n onDecrypt?: () => void;\n /** Whether the encryption key is currently being fetched. */\n isDecrypting?: boolean;\n /** Run-level hint: the run contains encrypted data (from probe). */\n hasEncryptedData?: boolean;\n /** Fetch events for an exact correlation or event ID. */\n onExactIdSearch?: (\n id: string,\n kind: ExactWorkflowSearchIdKind,\n signal?: AbortSignal\n ) => Promise<ExactIdSearchResult>;\n}\n\nfunction EventRow({\n event,\n index,\n isFirst,\n isLast,\n isExpanded,\n onToggleExpand,\n activeGroupKey,\n selectedGroupKey,\n selectedGroupRange,\n correlationNameMap,\n workflowName,\n durationMap,\n onSelectGroup,\n onHoverGroup,\n onLoadEventData,\n cachedEventData,\n onCacheEventData,\n encryptionKey,\n onEncryptedDataDetected,\n suppressGroupDimming = false,\n}: {\n event: Event;\n index: number;\n isFirst: boolean;\n isLast: boolean;\n isExpanded: boolean;\n onToggleExpand: (eventId: string) => void;\n activeGroupKey?: string;\n selectedGroupKey?: string;\n selectedGroupRange: { first: number; last: number } | null;\n correlationNameMap: Map<string, string>;\n workflowName: string | null;\n durationMap: Map<string, DurationInfo>;\n onSelectGroup: (groupKey: string | undefined) => void;\n onHoverGroup: (groupKey: string | undefined) => void;\n onLoadEventData?: (event: Event) => Promise<unknown | null>;\n cachedEventData: unknown | null;\n onCacheEventData: (eventId: string, data: unknown) => void;\n encryptionKey?: Uint8Array;\n onEncryptedDataDetected?: () => void;\n /** Exact-ID search results should not dim unrelated rows. */\n suppressGroupDimming?: boolean;\n}) {\n const [isLoading, setIsLoading] = useState(false);\n const [loadedEventData, setLoadedEventData] = useState<unknown | null>(\n cachedEventData\n );\n const [loadError, setLoadError] = useState<string | null>(null);\n const [hasAttemptedLoad, setHasAttemptedLoad] = useState(\n cachedEventData !== null\n );\n\n // Notify parent if cached data has encrypted markers on mount\n useEffect(() => {\n if (\n cachedEventData !== null &&\n !encryptionKey &&\n hasEncryptedValues(cachedEventData)\n ) {\n onEncryptedDataDetected?.();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const rowGroupKey = isRunLevel(event.eventType)\n ? '__run__'\n : (event.correlationId ?? undefined);\n\n const statusDotColor = getStatusDotColor(event.eventType);\n const createdAt = new Date(event.createdAt);\n const hasExistingEventData = 'eventData' in event && event.eventData != null;\n const isRun = isRunLevel(event.eventType);\n const eventName = isRun\n ? (workflowName ?? '-')\n : event.correlationId\n ? (correlationNameMap.get(event.correlationId) ?? '-')\n : '-';\n\n const durationKey = event.correlationId ?? (isRun ? '__run__' : '');\n const durationInfo = durationKey ? durationMap.get(durationKey) : undefined;\n\n const hasActive = activeGroupKey !== undefined;\n const isRelated = rowGroupKey !== undefined && rowGroupKey === activeGroupKey;\n const isDimmed = hasActive && !isRelated && !suppressGroupDimming;\n const isPulsing = hasActive && isRelated;\n\n // Gutter state derived from selectedGroupRange\n const showBranch = hasActive && isRelated && !isRun;\n const showLaneLine =\n selectedGroupRange !== null &&\n index >= selectedGroupRange.first &&\n index <= selectedGroupRange.last;\n const isLaneStart =\n selectedGroupRange !== null && index === selectedGroupRange.first;\n const isLaneEnd =\n selectedGroupRange !== null && index === selectedGroupRange.last;\n\n const loadEventDetails = useCallback(async () => {\n if (loadedEventData !== null) {\n return;\n }\n if (cachedEventData !== null) {\n setLoadedEventData(cachedEventData);\n setHasAttemptedLoad(true);\n return;\n }\n if (isLoading) {\n return;\n }\n setIsLoading(true);\n setLoadError(null);\n try {\n if (!onLoadEventData) {\n setLoadError('Event details unavailable');\n return;\n }\n const data = await onLoadEventData(event);\n if (data !== null && data !== undefined) {\n setLoadedEventData(data);\n onCacheEventData(event.eventId, data);\n if (!encryptionKey && hasEncryptedValues(data)) {\n onEncryptedDataDetected?.();\n }\n }\n } catch (err) {\n setLoadError(\n err instanceof Error ? err.message : 'Failed to load event details'\n );\n } finally {\n setIsLoading(false);\n setHasAttemptedLoad(true);\n }\n }, [\n event,\n loadedEventData,\n isLoading,\n onLoadEventData,\n onCacheEventData,\n encryptionKey,\n onEncryptedDataDetected,\n cachedEventData,\n ]);\n\n // Auto-load event data when remounting in expanded state without cached data\n useEffect(() => {\n if (!isExpanded || isLoading) {\n return;\n }\n void loadEventDetails();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // When encryption key changes and this event was previously loaded,\n // re-load to get decrypted data\n useEffect(() => {\n if (encryptionKey && hasAttemptedLoad && onLoadEventData) {\n setLoadedEventData(null);\n setHasAttemptedLoad(false);\n onLoadEventData(event)\n .then((data) => {\n if (data !== null && data !== undefined) {\n setLoadedEventData(data);\n onCacheEventData(event.eventId, data);\n }\n setHasAttemptedLoad(true);\n })\n .catch(() => {\n setHasAttemptedLoad(true);\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [encryptionKey]);\n\n const handleRowClick = useCallback(() => {\n onSelectGroup(rowGroupKey === selectedGroupKey ? undefined : rowGroupKey);\n onToggleExpand(event.eventId);\n if (!isExpanded) {\n void loadEventDetails();\n }\n }, [\n selectedGroupKey,\n rowGroupKey,\n onSelectGroup,\n onToggleExpand,\n event.eventId,\n isExpanded,\n loadEventDetails,\n ]);\n\n const mergedEventData =\n loadedEventData ??\n (hasExistingEventData\n ? (event as Event & { eventData: unknown }).eventData\n : null);\n\n const displayPayload = isLoading ? loadedEventData : mergedEventData;\n\n const contentOpacity = isDimmed ? 0.3 : 1;\n\n return (\n <div\n data-event-id={event.eventId}\n onMouseEnter={() => onHoverGroup(rowGroupKey)}\n onMouseLeave={() => onHoverGroup(undefined)}\n >\n {/* Row */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleRowClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') handleRowClick();\n }}\n className=\"w-full text-left flex items-center gap-0 text-[13px] hover:bg-[var(--ds-gray-alpha-100)] transition-colors cursor-pointer\"\n style={{ minHeight: 40 }}\n >\n <TreeGutter\n isFirst={isFirst}\n isLast={isLast && !isExpanded}\n isRunLevel={isRun}\n statusDotColor={statusDotColor}\n pulse={isPulsing}\n hasSelection={hasActive}\n showBranch={showBranch}\n showLaneLine={showLaneLine}\n isLaneStart={isLaneStart}\n isLaneEnd={isLaneEnd}\n />\n\n {/* Content area — dims when unrelated */}\n <div\n className=\"flex items-center flex-1 min-w-0\"\n style={{ opacity: contentOpacity, transition: 'opacity 150ms' }}\n >\n {/* Expand chevron indicator */}\n <div\n className=\"flex items-center justify-center w-5 h-5 flex-shrink-0 rounded\"\n style={{\n border: '1px solid var(--ds-gray-400)',\n }}\n >\n <ChevronRight\n className=\"h-3 w-3 transition-transform\"\n style={{\n color: 'var(--ds-gray-900)',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n }}\n />\n </div>\n\n {/* Time */}\n <div\n className=\"tabular-nums min-w-0 px-4\"\n style={{ color: 'var(--ds-gray-900)', flex: '2 1 0%' }}\n >\n <TimestampTooltip date={createdAt}>\n <span>{formatEventTime(createdAt)}</span>\n </TimestampTooltip>\n </div>\n\n {/* Event Type */}\n <div className=\"font-medium min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <span\n className=\"inline-flex items-center gap-1.5\"\n style={{ color: 'var(--ds-gray-900)' }}\n >\n <span\n style={{\n position: 'relative',\n display: 'inline-flex',\n width: 6,\n height: 6,\n flexShrink: 0,\n }}\n >\n {isPulsing && (\n <span\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: statusDotColor,\n opacity: 0.75,\n animation: DOT_PULSE_ANIMATION,\n }}\n />\n )}\n <span\n style={{\n position: 'relative',\n width: 6,\n height: 6,\n borderRadius: '50%',\n backgroundColor: statusDotColor,\n }}\n />\n </span>\n {formatEventType(event.eventType)}\n </span>\n </div>\n\n {/* Name */}\n <div\n className=\"min-w-0 px-4 overflow-hidden text-ellipsis whitespace-nowrap\"\n style={{ flex: '2 1 0%' }}\n title={eventName !== '-' ? eventName : undefined}\n >\n {eventName}\n </div>\n\n {/* Correlation ID */}\n <CopyableCell\n value={event.correlationId || ''}\n className=\"font-mono\"\n style={{ flex: '3 1 0%' }}\n />\n\n {/* Event ID */}\n <CopyableCell\n value={event.eventId}\n className=\"font-mono\"\n style={{ flex: '3 1 0%' }}\n />\n </div>\n </div>\n\n {/* Expanded details — tree lines continue through this area */}\n {isExpanded && (\n <div className=\"flex\">\n {/* Continuation gutter — lane line continues if not at lane end */}\n <TreeGutter\n isFirst={false}\n isLast={isLast}\n isRunLevel={isRun}\n hasSelection={hasActive}\n showBranch={false}\n showLaneLine={showLaneLine && !isLaneEnd}\n isLaneStart={false}\n isLaneEnd={false}\n continuationOnly\n />\n {/* Spacer for chevron column */}\n <div className=\"w-5 flex-shrink-0\" />\n <div\n className=\"flex-1 my-1.5 mr-3 ml-2 py-2 rounded-md border overflow-hidden\"\n style={{\n borderColor: 'var(--ds-gray-alpha-200)',\n opacity: contentOpacity,\n transition: 'opacity 150ms',\n }}\n >\n {/* Duration info */}\n {(durationInfo?.queued !== undefined ||\n durationInfo?.ran !== undefined) && (\n <div\n className=\"px-2 pb-1.5 text-xs flex gap-3\"\n style={{ color: 'var(--ds-gray-900)' }}\n >\n {durationInfo.queued !== undefined &&\n durationInfo.queued > 0 && (\n <span>\n Queued for{' '}\n <span className=\"font-mono tabular-nums\">\n {formatDuration(durationInfo.queued)}\n </span>\n </span>\n )}\n {durationInfo.ran !== undefined && (\n <span>\n Ran for{' '}\n <span className=\"font-mono tabular-nums\">\n {formatDuration(durationInfo.ran)}\n </span>\n </span>\n )}\n </div>\n )}\n\n {/* Payload */}\n {displayPayload != null ? (\n <PayloadBlock data={displayPayload} eventType={event.eventType} />\n ) : loadError ? (\n <div\n className=\"rounded-md border p-3 text-xs\"\n style={{\n borderColor: 'var(--ds-red-400)',\n backgroundColor: 'var(--ds-red-100)',\n color: 'var(--ds-red-900)',\n }}\n >\n {loadError}\n </div>\n ) : isLoading ||\n (loadedEventData === null &&\n !hasAttemptedLoad &&\n event.correlationId) ? (\n <div className=\"flex flex-col gap-2 p-3\">\n <Skeleton className=\"h-3\" style={{ width: '75%' }} />\n <Skeleton className=\"h-3\" style={{ width: '50%' }} />\n <Skeleton className=\"h-3\" style={{ width: '60%' }} />\n </div>\n ) : (\n <div\n className=\"p-2 text-xs\"\n style={{ color: 'var(--ds-gray-900)' }}\n >\n No data\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Main component\n// ──────────────────────────────────────────────────────────────────────────\n\nexport function EventListView({\n events,\n run,\n onLoadEventData,\n hasMoreEvents = false,\n isLoadingMoreEvents = false,\n onLoadMoreEvents,\n encryptionKey,\n isLoading = false,\n sortOrder: sortOrderProp,\n onSortOrderChange,\n onDecrypt,\n isDecrypting = false,\n hasEncryptedData: hasEncryptedDataProp = false,\n onExactIdSearch,\n}: EventsListProps) {\n const toast = useToast();\n const [internalSortOrder, setInternalSortOrder] = useState<'asc' | 'desc'>(\n 'asc'\n );\n const effectiveSortOrder = sortOrderProp ?? internalSortOrder;\n const handleSortOrderChange = useCallback(\n (order: 'asc' | 'desc') => {\n if (onSortOrderChange) {\n onSortOrderChange(order);\n } else {\n setInternalSortOrder(order);\n }\n },\n [onSortOrderChange]\n );\n\n const [searchQuery, setSearchQuery] = useState('');\n const [searchResults, setSearchResults] = useState<Event[] | null>(null);\n const [searchResultsTruncated, setSearchResultsTruncated] = useState(false);\n const [searchError, setSearchError] = useState<string | null>(null);\n const [searchLoading, setSearchLoading] = useState(false);\n const [searchNotFound, setSearchNotFound] = useState(false);\n const searchRequestRef = useRef(0);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n\n const parsedSearchId = useMemo(\n () => parseExactWorkflowSearchId(searchQuery),\n [searchQuery]\n );\n const isExactSearchActive = searchResults !== null;\n\n const sortedEvents = useMemo(() => {\n const sourceEvents = isExactSearchActive ? searchResults : (events ?? []);\n if (sourceEvents.length === 0) return [];\n const dir = effectiveSortOrder === 'desc' ? -1 : 1;\n return [...sourceEvents].sort(\n (a, b) =>\n dir *\n (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n );\n }, [events, effectiveSortOrder, isExactSearchActive, searchResults]);\n\n // Detect encrypted fields across all loaded events (inline eventData).\n const hasEncryptedInlineData = useMemo(() => {\n const sourceEvents = isExactSearchActive ? searchResults : events;\n if (!sourceEvents) return false;\n for (const event of sourceEvents) {\n const ed = (event as Record<string, unknown>).eventData;\n if (hasEncryptedValues(ed)) return true;\n }\n return false;\n }, [events, isExactSearchActive, searchResults]);\n\n // Tracks whether any expanded row's lazy-loaded data contained encrypted markers.\n // Set to true by EventRow via onEncryptedDataDetected; never reset (sticky).\n const [foundEncryptedInLazyData, setFoundEncryptedInLazyData] =\n useState(false);\n const handleEncryptedDataDetected = useCallback(() => {\n setFoundEncryptedInLazyData(true);\n }, []);\n\n const hasEncryptedData =\n hasEncryptedDataProp || hasEncryptedInlineData || foundEncryptedInLazyData;\n\n const { correlationNameMap, workflowName } = useMemo(\n () =>\n buildNameMaps(\n isExactSearchActive ? searchResults : (events ?? null),\n run ?? null\n ),\n [events, isExactSearchActive, run, searchResults]\n );\n\n const durationMap = useMemo(\n () => buildDurationMap(sortedEvents),\n [sortedEvents]\n );\n\n const [selectedGroupKey, setSelectedGroupKey] = useState<string | undefined>(\n undefined\n );\n const [hoveredGroupKey, setHoveredGroupKey] = useState<string | undefined>(\n undefined\n );\n const onSelectGroup = useCallback((groupKey: string | undefined) => {\n setSelectedGroupKey(groupKey);\n }, []);\n const onHoverGroup = useCallback((groupKey: string | undefined) => {\n setHoveredGroupKey(groupKey);\n }, []);\n\n const activeGroupKey = selectedGroupKey ?? hoveredGroupKey;\n\n // Expanded state lifted out of EventRow so it survives virtualization\n const [expandedEventIds, setExpandedEventIds] = useState<Set<string>>(\n () => new Set()\n );\n const toggleEventExpanded = useCallback((eventId: string) => {\n setExpandedEventIds((prev) => {\n const next = new Set(prev);\n if (next.has(eventId)) {\n next.delete(eventId);\n } else {\n next.add(eventId);\n }\n return next;\n });\n }, []);\n\n // Event data cache — ref avoids re-renders when cache updates\n const eventDataCacheRef = useRef<Map<string, unknown>>(new Map());\n const cacheEventData = useCallback((eventId: string, data: unknown) => {\n eventDataCacheRef.current.set(eventId, data);\n }, []);\n\n // Lookup from eventId → groupKey for efficient collapse filtering\n const eventGroupKeyMap = useMemo(() => {\n const map = new Map<string, string>();\n for (const ev of sortedEvents) {\n const gk = isRunLevel(ev.eventType)\n ? '__run__'\n : (ev.correlationId ?? '');\n if (gk) map.set(ev.eventId, gk);\n }\n return map;\n }, [sortedEvents]);\n\n // Collapse expanded events that don't belong to the newly selected group\n useEffect(() => {\n if (selectedGroupKey === undefined) return;\n setExpandedEventIds((prev) => {\n if (prev.size === 0) return prev;\n let changed = false;\n const next = new Set<string>();\n for (const eventId of prev) {\n if (eventGroupKeyMap.get(eventId) === selectedGroupKey) {\n next.add(eventId);\n } else {\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [selectedGroupKey, eventGroupKeyMap]);\n\n // Compute the row-index range for the active group's connecting lane line.\n // Only applies to non-run groups (step/hook/wait correlations).\n const selectedGroupRange = useMemo(() => {\n if (!activeGroupKey || activeGroupKey === '__run__') return null;\n let first = -1;\n let last = -1;\n for (let i = 0; i < sortedEvents.length; i++) {\n if (sortedEvents[i].correlationId === activeGroupKey) {\n if (first === -1) first = i;\n last = i;\n }\n }\n return first >= 0 ? { first, last } : null;\n }, [activeGroupKey, sortedEvents]);\n\n useEffect(() => {\n const trimmed = searchQuery.trim();\n if (!trimmed) {\n searchRequestRef.current += 1;\n setSearchResults(null);\n setSearchResultsTruncated(false);\n setSearchError(null);\n setSearchLoading(false);\n setSearchNotFound(false);\n setSelectedGroupKey(undefined);\n return;\n }\n\n const parsed = parseExactWorkflowSearchId(trimmed);\n if (!parsed || !onExactIdSearch) {\n setSearchResults(null);\n setSearchLoading(false);\n setSearchNotFound(false);\n return;\n }\n\n const requestId = ++searchRequestRef.current;\n setSearchLoading(true);\n setSearchNotFound(false);\n setSearchError(null);\n\n const abortController = new AbortController();\n\n const timer = setTimeout(() => {\n void (async () => {\n try {\n const results = await onExactIdSearch(\n parsed.id,\n parsed.kind,\n abortController.signal\n );\n if (\n abortController.signal.aborted ||\n searchRequestRef.current !== requestId\n ) {\n return;\n }\n\n if (results.status === 'error') {\n setSearchResults([]);\n setSearchResultsTruncated(false);\n setSearchNotFound(false);\n setSearchError(results.message);\n setSelectedGroupKey(undefined);\n return;\n }\n\n if (\n results.status === 'not_found' ||\n (results.status === 'ok' && results.events.length === 0)\n ) {\n setSearchResults([]);\n setSearchResultsTruncated(false);\n setSearchNotFound(true);\n setSearchError(null);\n setSelectedGroupKey(undefined);\n return;\n }\n\n setSearchResults(results.events);\n setSearchResultsTruncated(Boolean(results.truncated));\n setSearchNotFound(false);\n setSearchError(null);\n setSelectedGroupKey(\n parsed.kind === 'event'\n ? (() => {\n const first = results.events[0];\n if (!first) return undefined;\n return isRunLevel(first.eventType)\n ? '__run__'\n : (first.correlationId ?? undefined);\n })()\n : parsed.id\n );\n virtuosoRef.current?.scrollToIndex({\n index: 0,\n align: 'start',\n behavior: 'smooth',\n });\n } catch {\n if (\n abortController.signal.aborted ||\n searchRequestRef.current !== requestId\n ) {\n return;\n }\n setSearchResults([]);\n setSearchResultsTruncated(false);\n setSearchNotFound(false);\n setSearchError('Failed to search events. Try again.');\n setSelectedGroupKey(undefined);\n } finally {\n if (\n searchRequestRef.current === requestId &&\n !abortController.signal.aborted\n ) {\n setSearchLoading(false);\n }\n }\n })();\n }, 300);\n\n return () => {\n clearTimeout(timer);\n abortController.abort();\n };\n }, [searchQuery, onExactIdSearch]);\n\n const handleSearchKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Enter') {\n return;\n }\n\n const trimmed = searchQuery.trim();\n if (\n !trimmed ||\n parseExactWorkflowSearchId(trimmed) ||\n !onExactIdSearch ||\n !looksLikeWorkflowIdSearchInput(trimmed)\n ) {\n return;\n }\n\n toast.info('Enter a full step ID, wait ID, hook ID, or event ID');\n },\n [searchQuery, onExactIdSearch, toast]\n );\n\n // Track whether we've ever had events to distinguish initial load from refetch\n const hasHadEventsRef = useRef(false);\n if (sortedEvents.length > 0) {\n hasHadEventsRef.current = true;\n }\n const isInitialLoad = isLoading && !hasHadEventsRef.current;\n const isRefetching =\n isLoading && hasHadEventsRef.current && sortedEvents.length === 0;\n\n if (isInitialLoad) {\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Skeleton search bar */}\n <div style={{ padding: 6 }}>\n <Skeleton style={{ height: 40, borderRadius: 6 }} />\n </div>\n {/* Skeleton header */}\n <div\n className=\"flex items-center gap-0 h-10 border-b flex-shrink-0\"\n style={{ borderColor: 'var(--ds-gray-alpha-200)' }}\n >\n <div className=\"flex-shrink-0\" style={{ width: GUTTER_WIDTH }} />\n <div className=\"w-5 flex-shrink-0\" />\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: 40 }} />\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: 72 }} />\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: 44 }} />\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: 92 }} />\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n <Skeleton className=\"h-3\" style={{ width: 60 }} />\n </div>\n </div>\n <RowsSkeleton />\n </div>\n );\n }\n\n return (\n <DecryptClickContext.Provider\n value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}\n >\n <div className=\"h-full flex flex-col overflow-hidden\">\n <style>{`@keyframes workflow-dot-pulse{0%{transform:scale(1);opacity:.7}70%,100%{transform:scale(2.2);opacity:0}}`}</style>\n {/* Search bar + sort */}\n <div\n style={{\n padding: 6,\n backgroundColor: 'var(--ds-background-100)',\n display: 'flex',\n gap: 6,\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 6,\n boxShadow: '0 0 0 1px var(--ds-gray-alpha-400)',\n background: 'var(--ds-background-100)',\n height: 40,\n flex: 1,\n minWidth: 0,\n }}\n >\n <div\n style={{\n width: 40,\n height: 40,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--ds-gray-800)',\n flexShrink: 0,\n }}\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M11.5 11.5L14 14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n <input\n type=\"search\"\n placeholder=\"Search by step ID, wait ID, hook ID, or event ID…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleSearchKeyDown}\n disabled={!onExactIdSearch}\n title={\n onExactIdSearch\n ? undefined\n : 'Exact ID search is unavailable in this view.'\n }\n style={{\n marginLeft: -16,\n paddingInline: 12,\n fontFamily: 'inherit',\n fontSize: 14,\n background: 'transparent',\n border: 'none',\n outline: 'none',\n height: 40,\n width: '100%',\n opacity: onExactIdSearch ? 1 : 0.5,\n cursor: onExactIdSearch ? 'text' : 'not-allowed',\n }}\n />\n </label>\n <MenuDropdown\n options={SORT_OPTIONS}\n value={effectiveSortOrder}\n onChange={handleSortOrderChange}\n />\n {(hasEncryptedData || encryptionKey) && onDecrypt && (\n <DecryptButton\n decrypted={!!encryptionKey}\n loading={isDecrypting}\n onClick={onDecrypt}\n />\n )}\n </div>\n\n {/* Header */}\n <div\n className=\"flex items-center gap-0 text-[13px] font-medium h-10 border-b flex-shrink-0\"\n style={{\n borderColor: 'var(--ds-gray-alpha-200)',\n color: 'var(--ds-gray-900)',\n backgroundColor: 'var(--ds-background-100)',\n }}\n >\n <div className=\"flex-shrink-0\" style={{ width: GUTTER_WIDTH }} />\n <div className=\"w-5 flex-shrink-0\" />\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n Time\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n Event Type\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '2 1 0%' }}>\n Name\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n Correlation ID\n </div>\n <div className=\"min-w-0 px-4\" style={{ flex: '3 1 0%' }}>\n Event ID\n </div>\n </div>\n\n {/* Virtualized event rows or refetching skeleton */}\n {isRefetching || searchLoading ? (\n <RowsSkeleton />\n ) : sortedEvents.length === 0 ? (\n <div\n className=\"flex flex-1 items-center justify-center px-6 text-center text-sm\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n {searchNotFound && searchQuery.trim()\n ? `No events found for ${searchQuery.trim()}`\n : searchError\n ? searchError\n : parsedSearchId && searchQuery.trim() && !onExactIdSearch\n ? 'Exact ID search is unavailable in this view.'\n : 'No events found'}\n </div>\n ) : (\n <Virtuoso\n ref={virtuosoRef}\n totalCount={sortedEvents.length}\n overscan={20}\n defaultItemHeight={40}\n endReached={() => {\n if (\n isExactSearchActive ||\n !hasMoreEvents ||\n isLoadingMoreEvents\n ) {\n return;\n }\n void onLoadMoreEvents?.();\n }}\n itemContent={(index: number) => {\n const ev = sortedEvents[index];\n return (\n <EventRow\n event={ev}\n index={index}\n isFirst={index === 0}\n isLast={index === sortedEvents.length - 1}\n isExpanded={expandedEventIds.has(ev.eventId)}\n onToggleExpand={toggleEventExpanded}\n activeGroupKey={activeGroupKey}\n selectedGroupKey={selectedGroupKey}\n selectedGroupRange={selectedGroupRange}\n correlationNameMap={correlationNameMap}\n workflowName={workflowName}\n durationMap={durationMap}\n onSelectGroup={onSelectGroup}\n onHoverGroup={onHoverGroup}\n onLoadEventData={onLoadEventData}\n cachedEventData={\n eventDataCacheRef.current.get(ev.eventId) ?? null\n }\n onCacheEventData={cacheEventData}\n encryptionKey={encryptionKey}\n onEncryptedDataDetected={handleEncryptedDataDetected}\n suppressGroupDimming={isExactSearchActive}\n />\n );\n }}\n style={{ flex: 1, minHeight: 0 }}\n />\n )}\n\n {/* Fixed footer — count + load more */}\n <div\n className=\"relative flex-shrink-0 flex items-center h-10 border-t px-4 text-xs\"\n style={{\n borderColor: 'var(--ds-gray-alpha-200)',\n color: 'var(--ds-gray-900)',\n backgroundColor: 'var(--ds-background-100)',\n }}\n >\n <span>\n {isExactSearchActive\n ? searchError\n ? searchError\n : searchNotFound\n ? `No events found for ${searchQuery.trim()}`\n : `${sortedEvents.length} event${sortedEvents.length !== 1 ? 's' : ''} for ${searchQuery.trim()}${searchResultsTruncated ? ' (results may be truncated)' : ''}`\n : `${sortedEvents.length} event${sortedEvents.length !== 1 ? 's' : ''} loaded`}\n </span>\n {!isExactSearchActive && hasMoreEvents && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"pointer-events-auto\">\n <LoadMoreButton\n loading={isLoadingMoreEvents}\n onClick={() => void onLoadMoreEvents?.()}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n </DecryptClickContext.Provider>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-actions.js","sourceRoot":"","sources":["../../src/components/hook-actions.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA6BhE,+EAA+E;AAC/E,uCAAuC;AACvC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,SAAS,EACT,SAAS,GACa;IACtB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAAU,EAAE,EAAE;QAClD,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAC/B,KAAK,EAAE,OAAgB,EAAE,EAAE;QACzB,IAAI,WAAW,IAAI,CAAC,YAAY;YAAE,OAAO;QAEzC,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE;gBAC7B,WAAW,EAAE,kDAAkD;aAChE,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACpC,WAAW,EACT,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;aACnE,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EACD,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAClD,CAAC;IAEF,OAAO;QACL,WAAW;QACX,YAAY;QACZ,gBAAgB;QAChB,iBAAiB;QACjB,aAAa;KACd,CAAC;AACJ,CAAC;AAuBD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,IAAI,EACJ,eAAe,GAAG,KAAK,EACvB,cAAc,EACd,gBAAgB,GACa;IAC7B,MAAM,WAAW,GAAG,CAAC,CAAmB,EAAE,EAAE;QAC1C,IAAI,eAAe;YAAE,CAAC,CAAC,eAAe,EAAE,CAAC;QACzC,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,gBAAgB,IAAC,OAAO,EAAE,WAAW,aACpC,KAAC,IAAI,IAAC,SAAS,EAAC,cAAc,GAAG,oBAEhB,CACpB,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,WAAW,GACW;IACtB,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,GACnE,WAAW,CAAC;IAEd,OAAO,CACL,KAAC,gBAAgB,IACf,MAAM,EAAE,YAAY,KAAK,IAAI,EAC7B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,WAAW,GACzB,CACH,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC","sourcesContent":["'use client';\n\nimport type { Hook, WorkflowRunStatus } from '@workflow/world';\nimport { Send } from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { useToast } from '../lib/toast';\nimport { ResolveHookModal } from './sidebar/resolve-hook-modal';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface HookActionCallbacks {\n /** Called after a successful action */\n onSuccess?: () => void;\n}\n\nexport interface UseHookActionsOptions {\n onResolve: (hook: Hook, payload: unknown) => Promise<void>;\n callbacks?: HookActionCallbacks;\n}\n\nexport interface UseHookActionsReturn {\n /** Whether the hook is currently being resolved */\n isResolving: boolean;\n /** The hook currently selected for resolution (null if none) */\n selectedHook: Hook | null;\n /** Open the resolve modal for a specific hook */\n openResolveModal: (hook: Hook) => void;\n /** Close the resolve modal */\n closeResolveModal: () => void;\n /** Handle submitting the resolve payload */\n handleResolve: (payload: unknown) => Promise<void>;\n}\n\n// ============================================================================\n// Hook for managing hook actions state\n// ============================================================================\n\n/**\n * React hook for managing hook action state.\n * Use this to coordinate the resolve modal across components.\n */\nexport function useHookActions({\n onResolve,\n callbacks,\n}: UseHookActionsOptions): UseHookActionsReturn {\n const toast = useToast();\n const [isResolving, setIsResolving] = useState(false);\n const [selectedHook, setSelectedHook] = useState<Hook | null>(null);\n\n const openResolveModal = useCallback((hook: Hook) => {\n setSelectedHook(hook);\n }, []);\n\n const closeResolveModal = useCallback(() => {\n setSelectedHook(null);\n }, []);\n\n const handleResolve = useCallback(\n async (payload: unknown) => {\n if (isResolving || !selectedHook) return;\n\n try {\n setIsResolving(true);\n await onResolve(selectedHook, payload);\n toast.success('Hook resolved', {\n description: 'The payload has been sent and the hook resolved.',\n });\n setSelectedHook(null);\n callbacks?.onSuccess?.();\n } catch (err) {\n console.error('Failed to resolve hook:', err);\n toast.error('Failed to resolve hook', {\n description:\n err instanceof Error ? err.message : 'An unknown error occurred',\n });\n } finally {\n setIsResolving(false);\n }\n },\n [onResolve, selectedHook, isResolving, callbacks]\n );\n\n return {\n isResolving,\n selectedHook,\n openResolveModal,\n closeResolveModal,\n handleResolve,\n };\n}\n\n// ============================================================================\n// Dropdown Menu Item Component\n// ============================================================================\n\nexport interface HookActionsDropdownItemProps {\n /** The hook to act on */\n hook: Hook;\n /** The current run status (used to determine if actions are available) */\n runStatus?: WorkflowRunStatus;\n /** Stop click event propagation (useful in table rows) */\n stopPropagation?: boolean;\n /** Called when the resolve action is triggered */\n onResolveClick: (hook: Hook) => void;\n /** Custom DropdownMenuItem component (allows using the consumer's UI library) */\n DropdownMenuItem: React.ComponentType<{\n onClick?: (e: React.MouseEvent) => void;\n disabled?: boolean;\n children: React.ReactNode;\n }>;\n}\n\n/**\n * Dropdown menu item for resolving a hook.\n * This is a single menu item component that can be composed into dropdown menus.\n */\nexport function ResolveHookDropdownItem({\n hook,\n stopPropagation = false,\n onResolveClick,\n DropdownMenuItem,\n}: HookActionsDropdownItemProps): React.JSX.Element {\n const handleClick = (e: React.MouseEvent) => {\n if (stopPropagation) e.stopPropagation();\n onResolveClick(hook);\n };\n\n return (\n <DropdownMenuItem onClick={handleClick}>\n <Send className=\"h-4 w-4 mr-2\" />\n Resolve Hook\n </DropdownMenuItem>\n );\n}\n\n// ============================================================================\n// Modal wrapper for convenience\n// ============================================================================\n\nexport interface HookResolveModalProps {\n /** The hook actions state from useHookActions */\n hookActions: UseHookActionsReturn;\n}\n\n/**\n * Convenience wrapper that renders the ResolveHookModal using useHookActions state.\n * Place this at the top level of your component (outside any iteration).\n */\nexport function HookResolveModalWrapper({\n hookActions,\n}: HookResolveModalProps): React.JSX.Element | null {\n const { selectedHook, closeResolveModal, handleResolve, isResolving } =\n hookActions;\n\n return (\n <ResolveHookModal\n isOpen={selectedHook !== null}\n onClose={closeResolveModal}\n onSubmit={handleResolve}\n isSubmitting={isResolving}\n />\n );\n}\n\n// Re-export the modal for direct use\nexport { ResolveHookModal } from './sidebar/resolve-hook-modal';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQlD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK/D,OAAO,EAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EACL,aAAa,EAEb,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC","sourcesContent":["export { ErrorBoundary } from './error-boundary';\nexport { EventListView } from './event-list-view';\nexport type {\n HookActionCallbacks,\n HookActionsDropdownItemProps,\n HookResolveModalProps,\n UseHookActionsOptions,\n UseHookActionsReturn,\n} from './hook-actions';\nexport {\n HookResolveModalWrapper,\n ResolveHookDropdownItem,\n ResolveHookModal,\n useHookActions,\n} from './hook-actions';\nexport { RunTraceView } from './run-trace-view';\nexport { ConversationView } from './sidebar/conversation-view';\nexport type {\n SelectedSpanInfo,\n SpanSelectionInfo,\n} from './sidebar/entity-detail-panel';\nexport { type StreamChunk, StreamViewer } from './stream-viewer';\nexport type { Span, SpanEvent } from './trace-viewer/types';\nexport {\n DataInspector,\n type DataInspectorProps,\n DecryptClickContext,\n type DecryptClickContextValue,\n} from './ui/data-inspector';\nexport { DecryptButton } from './ui/decrypt-button';\nexport { LoadMoreButton } from './ui/load-more-button';\nexport { MenuDropdown, type MenuDropdownOption } from './ui/menu-dropdown';\nexport { Spinner } from './ui/spinner';\nexport { WorkflowTraceViewer } from './workflow-trace-view';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-trace-view.js","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,MAAM,UAAU,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACA;IAClB,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,EACnC,qDAAiC,EACjC,sBAAI,KAAK,CAAC,OAAO,GAAK,IAClB,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACtC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { AlertCircle } from 'lucide-react';\nimport type { SpanSelectionInfo } from './sidebar/entity-detail-panel';\nimport { WorkflowTraceViewer } from './workflow-trace-view';\n\ninterface RunTraceViewProps {\n run: WorkflowRun;\n events: Event[];\n isLoading?: boolean;\n error?: Error | null;\n spanDetailData?: WorkflowRun | Step | Hook | Event | null;\n spanDetailLoading?: boolean;\n spanDetailError?: Error | null;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n onCancelRun?: (runId: string) => Promise<void>;\n onStreamClick?: (streamId: string) => void;\n onSpanSelect?: (info: SpanSelectionInfo) => void;\n onLoadMoreSpans?: () => void | Promise<void>;\n hasMoreSpans?: boolean;\n isLoadingMoreSpans?: boolean;\n}\n\nexport function RunTraceView({\n run,\n events,\n isLoading,\n error,\n spanDetailData,\n spanDetailLoading,\n spanDetailError,\n onWakeUpSleep,\n onResolveHook,\n onCancelRun,\n onStreamClick,\n onSpanSelect,\n onLoadMoreSpans,\n hasMoreSpans,\n isLoadingMoreSpans,\n}: RunTraceViewProps) {\n if (error && !run) {\n return (\n <div className=\"m-4\">\n <AlertCircle className=\"h-4 w-4\" />\n <p>Error loading workflow run</p>\n <p>{error.message}</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full relative\">\n <WorkflowTraceViewer\n error={error}\n events={events}\n run={run}\n isLoading={isLoading}\n spanDetailData={spanDetailData}\n spanDetailLoading={spanDetailLoading}\n spanDetailError={spanDetailError}\n onWakeUpSleep={onWakeUpSleep}\n onResolveHook={onResolveHook}\n onCancelRun={onCancelRun}\n onStreamClick={onStreamClick}\n onSpanSelect={onSpanSelect}\n onLoadMoreSpans={onLoadMoreSpans}\n hasMoreSpans={hasMoreSpans}\n isLoadingMoreSpans={isLoadingMoreSpans}\n />\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"attribute-panel.js","sourceRoot":"","sources":["../../../src/components/sidebar/attribute-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport type { ModelMessage } from 'ai';\nimport { Lock } from 'lucide-react';\nimport { Spinner } from '../ui/spinner';\nimport type { KeyboardEvent, ReactNode } from 'react';\nimport { useCallback, useContext, useMemo, useState } from 'react';\nimport { isEncryptedMarker, isExpiredMarker } from '../../lib/hydration';\nimport { useToast } from '../../lib/toast';\nimport { extractConversation, isDoStreamStep } from '../../lib/utils';\nimport { DecryptClickContext, StreamClickContext } from '../ui/data-inspector';\nimport { ErrorCard } from '../ui/error-card';\nimport {\n ErrorStackBlock,\n isStructuredErrorWithStack,\n} from '../ui/error-stack-block';\nimport { Skeleton } from '../ui/skeleton';\nimport { TimestampTooltip } from '../ui/timestamp-tooltip';\nimport { ConversationView } from './conversation-view';\nimport { CopyableDataBlock } from './copyable-data-block';\nimport { DetailCard } from './detail-card';\n\n/**\n * Tab button for conversation/JSON toggle\n */\nfunction TabButton({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n tabIndex={active ? 0 : -1}\n onClick={onClick}\n className=\"px-3 py-1.5 text-[11px] font-medium transition-colors -mb-px\"\n style={{\n // Explicit styles to prevent app-level button overrides when web-shared\n // is embedded in a self-hosted app.\n backgroundColor: 'transparent',\n borderTop: 'none',\n borderLeft: 'none',\n borderRight: 'none',\n borderBottom: `2px solid ${active ? 'var(--ds-blue-600)' : 'transparent'}`,\n borderRadius: 0,\n outline: 'none',\n boxShadow: 'none',\n cursor: 'pointer',\n color: active ? 'var(--ds-gray-1000)' : 'var(--ds-gray-600)',\n }}\n >\n {children}\n </button>\n );\n}\n\n/**\n * Shared tabbed container with accessible ARIA roles and keyboard navigation.\n * Used by ConversationWithTabs for the conversation/JSON toggle.\n */\nfunction TabbedContainer<T extends string>({\n tabs,\n activeTab,\n onTabChange,\n ariaLabel,\n children,\n}: {\n tabs: { id: T; label: string }[];\n activeTab: T;\n onTabChange: (tab: T) => void;\n ariaLabel: string;\n children: ReactNode;\n}) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return;\n event.preventDefault();\n const currentIndex = tabs.findIndex((t) => t.id === activeTab);\n const nextIndex =\n event.key === 'ArrowRight'\n ? (currentIndex + 1) % tabs.length\n : (currentIndex - 1 + tabs.length) % tabs.length;\n onTabChange(tabs[nextIndex].id);\n },\n [tabs, activeTab, onTabChange]\n );\n\n return (\n <div\n className=\"rounded-md border\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'transparent',\n }}\n >\n <div\n className=\"flex gap-1 border-b\"\n role=\"tablist\"\n aria-label={ariaLabel}\n onKeyDown={handleKeyDown}\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'transparent',\n }}\n >\n {tabs.map((tab) => (\n <TabButton\n key={tab.id}\n active={activeTab === tab.id}\n onClick={() => onTabChange(tab.id)}\n >\n {tab.label}\n </TabButton>\n ))}\n </div>\n\n <div role=\"tabpanel\">{children}</div>\n </div>\n );\n}\n\nconst conversationTabs = [\n { id: 'conversation' as const, label: 'Conversation' },\n { id: 'json' as const, label: 'Raw JSON' },\n];\n\n/**\n * Tabbed view for conversation and raw JSON\n */\nfunction ConversationWithTabs({\n conversation,\n args,\n}: {\n conversation: ModelMessage[];\n args: unknown[];\n}) {\n const [activeTab, setActiveTab] = useState<'conversation' | 'json'>(\n 'conversation'\n );\n\n return (\n <DetailCard summary={`Input (${conversation.length} messages)`}>\n <TabbedContainer\n tabs={conversationTabs}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n ariaLabel=\"Conversation view\"\n >\n {activeTab === 'conversation' ? (\n <ConversationView messages={conversation} />\n ) : (\n <div className=\"p-3\">\n {Array.isArray(args)\n ? args.map((v, i) => (\n <div className=\"mt-2 first:mt-0\" key={i}>\n {JsonBlock(v)}\n </div>\n ))\n : JsonBlock(args)}\n </div>\n )}\n </TabbedContainer>\n </DetailCard>\n );\n}\n\n/**\n * Render a value with the shared DataInspector (ObjectInspector with\n * custom theming, nodeRenderer for StreamRef/ClassInstanceRef, etc.)\n */\n/**\n * Inline display for an encrypted field — no expand, just a flat label\n * with the lucide Lock icon matching the title bar Decrypt button.\n */\nfunction EncryptedFieldBlock() {\n const ctx = useContext(DecryptClickContext);\n if (ctx) {\n return (\n <button\n type=\"button\"\n onClick={ctx.onDecrypt}\n disabled={ctx.isDecrypting}\n className=\"flex w-full items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-xs cursor-pointer transition-colors\"\n style={{\n borderColor: 'var(--ds-gray-400)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n opacity: ctx.isDecrypting ? 0.6 : 1,\n }}\n title=\"Click to decrypt\"\n >\n {ctx.isDecrypting ? (\n <Spinner size={12} />\n ) : (\n <Lock className=\"h-3 w-3\" />\n )}\n <span className=\"font-medium\">\n {ctx.isDecrypting ? 'Decrypting…' : 'Decrypt'}\n </span>\n </button>\n );\n }\n return (\n <div\n className=\"flex w-full items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-xs\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n }}\n >\n <Lock className=\"h-3 w-3\" />\n <span className=\"font-medium\">Encrypted</span>\n </div>\n );\n}\n\n/**\n * Inline display for an expired field — flat label indicating data is no longer available.\n */\nfunction ExpiredFieldBlock() {\n return (\n <div\n className=\"flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n }}\n >\n <span className=\"font-medium\">Data expired</span>\n </div>\n );\n}\n\nfunction JsonBlock(value: unknown) {\n return <CopyableDataBlock data={value} />;\n}\n\nconst hasDisplayContent = (value: unknown): boolean => {\n if (value == null) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') return Object.keys(value).length > 0;\n return true;\n};\n\ntype AttributeKey =\n | keyof Step\n | keyof WorkflowRun\n | keyof Hook\n | keyof Event\n | 'moduleSpecifier'\n | 'eventData'\n | 'resumeAt'\n | 'expiredAt'\n | 'workflowCoreVersion'\n | 'receivedCount'\n | 'lastReceivedAt'\n | 'disposedAt';\n\nconst attributeOrder: AttributeKey[] = [\n 'workflowName',\n 'moduleSpecifier',\n 'stepName',\n 'status',\n 'stepId',\n 'hookId',\n 'eventId',\n 'runId',\n 'attempt',\n 'token',\n 'receivedCount',\n 'lastReceivedAt',\n 'disposedAt',\n 'correlationId',\n 'eventType',\n 'deploymentId',\n 'specVersion',\n 'workflowCoreVersion',\n 'ownerId',\n 'projectId',\n 'environment',\n 'executionContext',\n 'createdAt',\n 'startedAt',\n 'updatedAt',\n 'completedAt',\n 'expiredAt',\n 'retryAfter',\n 'error',\n 'metadata',\n 'eventData',\n 'input',\n 'output',\n 'resumeAt',\n];\n\nconst sortByAttributeOrder = (a: string, b: string): number => {\n const aIndex = attributeOrder.indexOf(a as AttributeKey) || 0;\n const bIndex = attributeOrder.indexOf(b as AttributeKey) || 0;\n return aIndex - bIndex;\n};\n\n/**\n * Display names for attributes that should render differently from their key.\n */\nconst attributeDisplayNames: Partial<Record<AttributeKey, string>> = {\n workflowCoreVersion: '@workflow/core version',\n receivedCount: 'times resolved',\n};\n\n/**\n * Get the display name for an attribute key.\n */\nconst getAttributeDisplayName = (attribute: string): string => {\n return attributeDisplayNames[attribute as AttributeKey] ?? attribute;\n};\n\nconst getModuleSpecifierFromName = (value: unknown): string => {\n const raw = String(value);\n const parsedStep = parseStepName(raw);\n if (parsedStep) {\n return parsedStep.moduleSpecifier;\n }\n const parsedWorkflow = parseWorkflowName(raw);\n if (parsedWorkflow) {\n return parsedWorkflow.moduleSpecifier;\n }\n return raw;\n};\n\nconst parseDateValue = (value: unknown): Date | null => {\n if (value == null) {\n return null;\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === 'string' && value.trim().length === 0) {\n return null;\n }\n\n const date =\n typeof value === 'number' ? new Date(value) : new Date(String(value));\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst formatLocalMillisecondTime = (date: Date): string =>\n date.toLocaleString(undefined, {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n fractionalSecondDigits: 3,\n });\n\nexport const localMillisecondTime = (value: unknown): string => {\n const date = parseDateValue(value);\n if (!date) {\n return '-';\n }\n\n // e.g. 12/17/2025, 9:08:55.182 AM\n return formatLocalMillisecondTime(date);\n};\n\nconst localMillisecondTimeOrNull = (value: unknown): string | null => {\n const date = parseDateValue(value);\n if (!date) {\n return null;\n }\n return formatLocalMillisecondTime(date);\n};\n\nconst timestampWithTooltipOrNull = (value: unknown): ReactNode | null => {\n const date = parseDateValue(value);\n if (!date) return null;\n return (\n <TimestampTooltip date={date}>\n <span>{formatLocalMillisecondTime(date)}</span>\n </TimestampTooltip>\n );\n};\n\ninterface DisplayContext {\n stepName?: string;\n}\n\nconst attributeToDisplayFn: Record<\n AttributeKey,\n (value: unknown, context?: DisplayContext) => null | string | ReactNode\n> = {\n // Names that need pretty-printing\n workflowName: (value: unknown) =>\n parseWorkflowName(String(value))?.shortName ?? '?',\n moduleSpecifier: (value: unknown) => getModuleSpecifierFromName(value),\n stepName: (value: unknown) => parseStepName(String(value))?.shortName ?? '?',\n // IDs\n runId: (value: unknown) => String(value),\n stepId: (value: unknown) => String(value),\n hookId: (value: unknown) => String(value),\n eventId: (value: unknown) => String(value),\n // Run/step details\n status: (value: unknown) => String(value),\n attempt: (value: unknown) => String(value),\n // Hook details\n token: (value: unknown) => String(value),\n isWebhook: (value: unknown) => String(value),\n receivedCount: (value: unknown) => String(value),\n lastReceivedAt: localMillisecondTimeOrNull,\n disposedAt: localMillisecondTimeOrNull,\n // Event details\n eventType: (value: unknown) => String(value),\n correlationId: (value: unknown) => String(value),\n // Project details\n deploymentId: (value: unknown) => String(value),\n specVersion: (value: unknown) => String(value),\n workflowCoreVersion: (value: unknown) => String(value),\n // Tenancy (we don't show these)\n ownerId: (_value: unknown) => null,\n projectId: (_value: unknown) => null,\n environment: (_value: unknown) => null,\n executionContext: (_value: unknown) => null,\n // Dates — wrapped with TimestampTooltip showing UTC/local + relative time\n createdAt: timestampWithTooltipOrNull,\n startedAt: timestampWithTooltipOrNull,\n updatedAt: timestampWithTooltipOrNull,\n completedAt: timestampWithTooltipOrNull,\n expiredAt: timestampWithTooltipOrNull,\n retryAfter: timestampWithTooltipOrNull,\n resumeAt: timestampWithTooltipOrNull,\n // Resolved attributes, won't actually use this function\n metadata: (value: unknown) => {\n if (!hasDisplayContent(value)) return null;\n if (isEncryptedMarker(value)) return <EncryptedFieldBlock />;\n if (isExpiredMarker(value)) return <ExpiredFieldBlock />;\n return JsonBlock(value);\n },\n input: (value: unknown, context?: DisplayContext) => {\n if (isEncryptedMarker(value)) return <EncryptedFieldBlock />;\n if (isExpiredMarker(value)) return <ExpiredFieldBlock />;\n // Check if input has args + closure vars structure\n if (value && typeof value === 'object' && 'args' in value) {\n const { args, closureVars, thisVal } = value as {\n args: unknown[];\n closureVars?: Record<string, unknown>;\n thisVal?: unknown;\n };\n const argCount = Array.isArray(args) ? args.length : 0;\n const argLabel = argCount === 1 ? 'argument' : 'arguments';\n const hasClosureVars = hasDisplayContent(closureVars);\n const hasThisVal = hasDisplayContent(thisVal);\n const hasArgs = hasDisplayContent(args);\n\n // Check if this is a doStreamStep - show conversation view with tabs\n if (context?.stepName && isDoStreamStep(context.stepName)) {\n const conversation = extractConversation(args);\n if (conversation && conversation.length > 0) {\n return (\n <>\n <ConversationWithTabs conversation={conversation} args={args} />\n {hasClosureVars && (\n <DetailCard summary=\"Closure Variables\">\n {JsonBlock(closureVars)}\n </DetailCard>\n )}\n {hasThisVal && (\n <DetailCard summary=\"This Value\">\n {JsonBlock(thisVal)}\n </DetailCard>\n )}\n </>\n );\n }\n }\n\n // Don't render an empty \"Input (0 arguments)\" card when no input exists.\n if (!hasArgs && !hasClosureVars && !hasThisVal) {\n return (\n <DetailCard\n summary=\"Input (no data)\"\n disabled\n summaryClassName=\"text-base py-2\"\n />\n );\n }\n\n return (\n <>\n <DetailCard\n summary={`Input (${argCount} ${argLabel})`}\n summaryClassName=\"text-base py-2\"\n contentClassName=\"mt-0\"\n >\n {Array.isArray(args)\n ? args.map((v, i) => (\n <div className=\"mt-2 first:mt-0\" key={i}>\n {JsonBlock(v)}\n </div>\n ))\n : JsonBlock(args)}\n </DetailCard>\n {hasClosureVars && (\n <DetailCard summary=\"Closure Variables\">\n {JsonBlock(closureVars)}\n </DetailCard>\n )}\n {hasThisVal && (\n <DetailCard summary=\"this\">{JsonBlock(thisVal)}</DetailCard>\n )}\n </>\n );\n }\n\n // Fallback: treat as plain array or object\n const argCount = Array.isArray(value) ? value.length : 0;\n const argLabel = argCount === 1 ? 'argument' : 'arguments';\n if (!hasDisplayContent(value)) {\n return (\n <DetailCard\n summary=\"Input (no data)\"\n disabled\n summaryClassName=\"text-base py-2\"\n />\n );\n }\n return (\n <DetailCard\n summary={`Input (${argCount} ${argLabel})`}\n summaryClassName=\"text-base py-2\"\n contentClassName=\"mt-0\"\n >\n {Array.isArray(value)\n ? value.map((v, i) => (\n <div className=\"mt-2 first:mt-0\" key={i}>\n {JsonBlock(v)}\n </div>\n ))\n : JsonBlock(value)}\n </DetailCard>\n );\n },\n output: (value: unknown) => {\n if (!hasDisplayContent(value)) return null;\n if (isEncryptedMarker(value)) return <EncryptedFieldBlock />;\n if (isExpiredMarker(value)) return <ExpiredFieldBlock />;\n return (\n <DetailCard\n summary=\"Output\"\n summaryClassName=\"text-base py-2\"\n contentClassName=\"mt-0\"\n >\n {JsonBlock(value)}\n </DetailCard>\n );\n },\n error: (value: unknown) => {\n if (isEncryptedMarker(value)) return <EncryptedFieldBlock />;\n if (isExpiredMarker(value)) return <ExpiredFieldBlock />;\n if (!hasDisplayContent(value)) return null;\n\n // If the error object has a `stack` field, render it as readable\n // pre-formatted text. Otherwise fall back to the raw JSON viewer.\n if (isStructuredErrorWithStack(value)) {\n return (\n <DetailCard\n summary=\"Error\"\n summaryClassName=\"text-base py-2\"\n contentClassName=\"mt-0\"\n >\n <ErrorStackBlock value={value} />\n </DetailCard>\n );\n }\n\n return (\n <DetailCard\n summary=\"Error\"\n summaryClassName=\"text-base py-2\"\n contentClassName=\"mt-0\"\n >\n {JsonBlock(value)}\n </DetailCard>\n );\n },\n eventData: (value: unknown) => {\n if (isEncryptedMarker(value)) return <EncryptedFieldBlock />;\n if (isExpiredMarker(value)) return <ExpiredFieldBlock />;\n if (!hasDisplayContent(value)) return null;\n return <DetailCard summary=\"Event Data\">{JsonBlock(value)}</DetailCard>;\n },\n};\n\nconst resolvableAttributes = [\n 'input',\n 'output',\n 'error',\n 'metadata',\n 'eventData',\n];\n\nconst ExpiredDataMessage = () => (\n <div\n className=\"text-copy-12 rounded-md border p-4 my-2\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n }}\n >\n <span>The data for this run has expired and is no longer available.</span>\n </div>\n);\n\nexport const AttributeBlock = ({\n attribute,\n value,\n isLoading,\n inline = false,\n context,\n}: {\n attribute: string;\n value: unknown;\n isLoading?: boolean;\n inline?: boolean;\n context?: DisplayContext;\n}) => {\n const isExpandableLoadingTarget =\n attribute === 'input' ||\n attribute === 'output' ||\n attribute === 'eventData';\n if (isLoading && isExpandableLoadingTarget && !hasDisplayContent(value)) {\n return (\n <div\n className={`my-2 flex flex-col ${attribute === 'input' || attribute === 'output' ? 'gap-2 my-3.5' : 'gap-0'}`}\n >\n <span\n className={`${attribute === 'input' || attribute === 'output' ? 'text-base' : 'text-xs'} font-medium first-letter:uppercase`}\n style={{ color: 'var(--ds-gray-700)' }}\n >\n {attribute}\n </span>\n <Skeleton className=\"h-9 w-full rounded-md\" />\n </div>\n );\n }\n\n const displayFn =\n attributeToDisplayFn[attribute as keyof typeof attributeToDisplayFn];\n if (!displayFn) {\n return null;\n }\n const displayValue = displayFn(value, context);\n if (!displayValue) {\n return null;\n }\n\n if (inline) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span\n className=\"text-[11px] font-medium\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n {attribute}\n </span>\n <span className=\"text-[11px]\" style={{ color: 'var(--ds-gray-1000)' }}>\n {displayValue}\n </span>\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n {typeof isLoading === 'boolean' && isLoading && (\n <div className=\"absolute top-9 right-4\">\n <div\n className=\"animate-spin rounded-full h-4 w-4 border-b-2\"\n style={{ borderColor: 'var(--ds-gray-900)' }}\n />\n </div>\n )}\n <div\n key={attribute}\n className={`my-2 flex flex-col ${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'gap-2 my-3.5' : 'gap-0'}`}\n >\n <span\n className={`${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'text-base' : 'text-xs'} font-medium first-letter:uppercase`}\n style={{ color: 'var(--ds-gray-700)' }}\n >\n {attribute}\n </span>\n <span className=\"text-xs\" style={{ color: 'var(--ds-gray-1000)' }}>\n {displayValue}\n </span>\n </div>\n </div>\n );\n};\n\nexport const AttributePanel = ({\n data,\n moduleSpecifier,\n isLoading,\n error,\n expiredAt,\n onStreamClick,\n onDecrypt,\n isDecrypting = false,\n resource,\n}: {\n data: Record<string, unknown>;\n moduleSpecifier?: string;\n isLoading?: boolean;\n error?: Error;\n expiredAt?: string | Date;\n /** Callback when a stream reference is clicked */\n onStreamClick?: (streamId: string) => void;\n /** Callback when an encrypted marker is clicked (triggers decryption) */\n onDecrypt?: () => void;\n /** Whether decryption is currently in progress */\n isDecrypting?: boolean;\n /** Resource type of the selected span — used to show targeted loading skeletons. */\n resource?: string;\n}) => {\n const toast = useToast();\n // Extract workflowCoreVersion from executionContext for display\n const displayData = useMemo(() => {\n const result = { ...data };\n const execCtx = data.executionContext as\n | Record<string, unknown>\n | undefined;\n if (execCtx?.workflowCoreVersion) {\n result.workflowCoreVersion = execCtx.workflowCoreVersion;\n }\n if (moduleSpecifier) {\n result.moduleSpecifier = moduleSpecifier;\n } else if (typeof data.stepName === 'string') {\n result.moduleSpecifier = data.stepName;\n } else if (typeof data.workflowName === 'string') {\n result.moduleSpecifier = data.workflowName;\n }\n return result;\n }, [data, moduleSpecifier]);\n const hasExpired = expiredAt != null && new Date(expiredAt) < new Date();\n const basicAttributes = Object.keys(displayData)\n .filter((key) => !resolvableAttributes.includes(key))\n .sort(sortByAttributeOrder);\n const resolvedAttributes = useMemo(() => {\n const present = Object.keys(displayData)\n .filter((key) => resolvableAttributes.includes(key))\n .sort(sortByAttributeOrder);\n\n if (!isLoading) return present;\n\n // During loading, ensure input/output appear so their skeletons render\n // in the correct position (above the events section).\n const loadingDefaults = ['input', 'output'];\n for (const key of loadingDefaults) {\n if (!present.includes(key)) {\n present.push(key);\n }\n }\n return present.sort(sortByAttributeOrder);\n }, [displayData, isLoading]);\n\n // Filter out attributes that return null\n const visibleBasicAttributes = basicAttributes.filter((attribute) => {\n const displayFn =\n attributeToDisplayFn[attribute as keyof typeof attributeToDisplayFn];\n if (!displayFn) return false;\n const displayValue = displayFn(\n displayData[attribute as keyof typeof displayData]\n );\n return displayValue !== null;\n });\n\n // Keep `moduleSpecifier` immediately after `workflowName` or `stepName`.\n const orderedBasicAttributes = useMemo(() => {\n const attributes = [...visibleBasicAttributes];\n const moduleSpecifierIndex = attributes.indexOf('moduleSpecifier');\n if (moduleSpecifierIndex === -1) {\n return attributes;\n }\n\n attributes.splice(moduleSpecifierIndex, 1);\n const workflowNameIndex = attributes.indexOf('workflowName');\n if (workflowNameIndex !== -1) {\n attributes.splice(workflowNameIndex + 1, 0, 'moduleSpecifier');\n return attributes;\n }\n\n const stepNameIndex = attributes.indexOf('stepName');\n if (stepNameIndex !== -1) {\n attributes.splice(stepNameIndex + 1, 0, 'moduleSpecifier');\n return attributes;\n }\n\n attributes.unshift('moduleSpecifier');\n return attributes;\n }, [visibleBasicAttributes]);\n\n // Memoize context object to avoid object reconstruction on render\n const displayContext = useMemo(\n () => ({\n stepName: displayData.stepName as string | undefined,\n }),\n [displayData.stepName]\n );\n const handleCopyModuleSpecifier = useCallback((value: string) => {\n navigator.clipboard\n .writeText(value)\n .then(() => {\n toast.success('moduleSpecifier copied');\n })\n .catch(() => {\n toast.error('Failed to copy moduleSpecifier');\n });\n }, []);\n\n return (\n <StreamClickContext.Provider value={onStreamClick}>\n <DecryptClickContext.Provider\n value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}\n >\n <div>\n {/* Basic attributes in a vertical layout with border */}\n {visibleBasicAttributes.length > 0 && (\n <div\n className=\"mb-3 flex flex-col overflow-hidden rounded-lg border\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n }}\n >\n {orderedBasicAttributes.map((attribute, index) => {\n const displayValue = attributeToDisplayFn[\n attribute as keyof typeof attributeToDisplayFn\n ]?.(displayData[attribute as keyof typeof displayData]);\n const isModuleSpecifier = attribute === 'moduleSpecifier';\n const moduleSpecifierValue =\n typeof displayValue === 'string'\n ? displayValue\n : String(displayValue ?? displayData.moduleSpecifier ?? '');\n const shouldCapitalizeLabel =\n attribute !== 'workflowCoreVersion';\n const showResumeAtSkeleton =\n isLoading && resource === 'sleep' && !displayData.resumeAt;\n const showDivider =\n index < orderedBasicAttributes.length - 1 ||\n showResumeAtSkeleton;\n\n return (\n <div key={attribute} className=\"py-1\">\n <div className=\"flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1\">\n <span\n className={\n shouldCapitalizeLabel\n ? 'text-[14px] first-letter:uppercase'\n : 'text-[14px]'\n }\n style={{ color: 'var(--ds-gray-700)' }}\n >\n {getAttributeDisplayName(attribute)}\n </span>\n {isModuleSpecifier ? (\n <button\n type=\"button\"\n className=\"min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono\"\n style={{\n color: 'var(--ds-gray-1000)',\n background: 'transparent',\n border: 'none',\n padding: 0,\n }}\n title={moduleSpecifierValue}\n onClick={() =>\n handleCopyModuleSpecifier(moduleSpecifierValue)\n }\n >\n {moduleSpecifierValue}\n </button>\n ) : (\n <span\n className=\"min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {displayValue}\n </span>\n )}\n </div>\n {showDivider ? (\n <div\n className=\"mx-2.5 border-b\"\n style={{ borderColor: 'var(--ds-gray-300)' }}\n />\n ) : null}\n </div>\n );\n })}\n {isLoading && resource === 'sleep' && !displayData.resumeAt && (\n <div className=\"py-1\">\n <div className=\"flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1\">\n <span\n className=\"text-[14px] first-letter:uppercase\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n resumeAt\n </span>\n <Skeleton className=\"h-4 w-[55%]\" />\n </div>\n </div>\n )}\n </div>\n )}\n {error ? (\n <ErrorCard\n title=\"Failed to load resource details\"\n details={error.message}\n className=\"my-4\"\n />\n ) : hasExpired ? (\n <ExpiredDataMessage />\n ) : (\n <>\n {resolvedAttributes.map((attribute) => (\n <AttributeBlock\n isLoading={isLoading}\n key={attribute}\n attribute={attribute}\n value={displayData[attribute as keyof typeof displayData]}\n context={displayContext}\n />\n ))}\n </>\n )}\n </div>\n </DecryptClickContext.Provider>\n </StreamClickContext.Provider>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-view.js","sourceRoot":"","sources":["../../../src/components/sidebar/conversation-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ModelMessage } from 'ai';\nimport { Streamdown } from 'streamdown';\nimport { DataInspector } from '../ui/data-inspector';\n\ninterface ConversationViewProps {\n messages: ModelMessage[];\n}\n\nexport function ConversationView({ messages }: ConversationViewProps) {\n if (messages.length === 0) {\n return (\n <div\n className=\"text-center py-8 text-[11px]\"\n style={{ color: 'var(--ds-gray-600)' }}\n >\n No messages\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3 p-3\">\n {messages.map((message, index) => (\n <MessageBubble key={index} message={message} />\n ))}\n </div>\n );\n}\n\nfunction MessageBubble({ message }: { message: ModelMessage }) {\n const role = message.role;\n const parts = parseContent(message.content);\n const style = getRoleStyle(role);\n\n return (\n <div\n className=\"rounded-md border text-[11px]\"\n style={{\n backgroundColor: style.bg,\n borderColor: style.border,\n }}\n >\n {/* Role header */}\n <div\n className=\"px-2.5 py-1 border-b text-[10px] font-medium uppercase tracking-wide\"\n style={{\n borderColor: style.border,\n color: style.label,\n }}\n >\n {role}\n </div>\n\n {/* Content */}\n <div className=\"px-2.5 py-2 space-y-2\">\n {parts.map((part, i) => (\n <ContentPart key={i} part={part} role={role} />\n ))}\n </div>\n </div>\n );\n}\n\ninterface ParsedPart {\n type: 'text' | 'tool-call' | 'tool-result';\n text?: string;\n toolName?: string;\n input?: unknown;\n output?: unknown;\n}\n\nfunction ContentPart({ part, role }: { part: ParsedPart; role: string }) {\n if (part.type === 'text') {\n if (!part.text) return null;\n\n // Use Streamdown for assistant messages (they often contain markdown)\n if (role === 'assistant') {\n return (\n <div\n className=\"prose prose-sm max-w-none text-[11px] [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n <Streamdown>{part.text}</Streamdown>\n </div>\n );\n }\n\n return (\n <div\n className=\"whitespace-pre-wrap break-words\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {part.text}\n </div>\n );\n }\n\n if (part.type === 'tool-call') {\n return (\n <div\n className=\"rounded border px-2 py-1.5\"\n style={{\n backgroundColor: 'var(--ds-purple-100)',\n borderColor: 'var(--ds-purple-300)',\n }}\n >\n <div className=\"flex items-center gap-1.5 text-[10px] font-medium\">\n <span>🔧</span>\n <span style={{ color: 'var(--ds-purple-900)' }}>{part.toolName}</span>\n </div>\n {part.input != null && (\n <div\n className=\"mt-1.5 overflow-x-auto p-1.5 rounded\"\n style={{ backgroundColor: 'var(--ds-gray-100)' }}\n >\n {typeof part.input === 'string' ? (\n <pre\n className=\"text-[10px]\"\n style={{ color: 'var(--ds-gray-800)' }}\n >\n {part.input}\n </pre>\n ) : (\n <DataInspector data={part.input} />\n )}\n </div>\n )}\n </div>\n );\n }\n\n if (part.type === 'tool-result') {\n return (\n <div\n className=\"rounded border px-2 py-1.5\"\n style={{\n backgroundColor: 'var(--ds-green-100)',\n borderColor: 'var(--ds-green-300)',\n }}\n >\n <div className=\"flex items-center gap-1.5 text-[10px] font-medium\">\n <span>✓</span>\n <span style={{ color: 'var(--ds-green-900)' }}>\n {part.toolName} result\n </span>\n </div>\n {part.output != null && (\n <div\n className=\"mt-1.5 overflow-x-auto max-h-[200px] overflow-y-auto p-1.5 rounded\"\n style={{ backgroundColor: 'var(--ds-gray-100)' }}\n >\n {typeof part.output === 'string' ? (\n <pre\n className=\"text-[10px]\"\n style={{ color: 'var(--ds-gray-800)' }}\n >\n {part.output}\n </pre>\n ) : (\n <DataInspector data={part.output} expandLevel={1} />\n )}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nfunction getRoleStyle(role: string) {\n switch (role) {\n case 'user':\n return {\n bg: 'var(--ds-blue-100)',\n border: 'var(--ds-blue-300)',\n label: 'var(--ds-blue-700)',\n };\n case 'assistant':\n return {\n bg: 'var(--ds-gray-100)',\n border: 'var(--ds-gray-300)',\n label: 'var(--ds-gray-700)',\n };\n case 'system':\n return {\n bg: 'var(--ds-amber-100)',\n border: 'var(--ds-amber-300)',\n label: 'var(--ds-amber-700)',\n };\n case 'tool':\n return {\n bg: 'var(--ds-green-50)',\n border: 'var(--ds-green-300)',\n label: 'var(--ds-green-700)',\n };\n default:\n return {\n bg: 'var(--ds-gray-100)',\n border: 'var(--ds-gray-300)',\n label: 'var(--ds-gray-700)',\n };\n }\n}\n\nfunction parseContent(content: unknown): ParsedPart[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n\n if (Array.isArray(content)) {\n return content.map((part): ParsedPart => {\n if (typeof part === 'string') {\n return { type: 'text', text: part };\n }\n if (part?.type === 'text') {\n return { type: 'text', text: String(part.text ?? '') };\n }\n if (part?.type === 'tool-call') {\n return {\n type: 'tool-call',\n toolName: part.toolName,\n input: part.input,\n };\n }\n if (part?.type === 'tool-result') {\n return {\n type: 'tool-result',\n toolName: part.toolName,\n output: part.output,\n };\n }\n return { type: 'text', text: '' };\n });\n }\n\n return [];\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"copyable-data-block.js","sourceRoot":"","sources":["../../../src/components/sidebar/copyable-data-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAU,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS;QAC1B,KAAK,KAAK,IAAI,EACd,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,EAAE,IAAI,EAAqB;IAC3D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,CACL,eACE,SAAS,EAAC,qDAAqD,EAC/D,KAAK,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAE5C,iBACE,IAAI,EAAC,QAAQ,gBACF,WAAW,EACtB,KAAK,EAAC,MAAM,EACZ,SAAS,EAAC,uSAAuS,EACjT,KAAK,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,EAC5C,OAAO,EAAE,GAAG,EAAE;oBACZ,SAAS,CAAC,SAAS;yBAChB,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;yBACtC,IAAI,CAAC,GAAG,EAAE;wBACT,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;oBACvC,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACP,CAAC,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,GACX,EACT,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,GAAI,IACzB,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { Copy } from 'lucide-react';\nimport { useToast } from '../../lib/toast';\nimport { DataInspector } from '../ui/data-inspector';\n\nconst serializeForClipboard = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nexport function CopyableDataBlock({ data }: { data: unknown }) {\n const toast = useToast();\n return (\n <div\n className=\"relative overflow-x-auto rounded-md border p-3 pt-9\"\n style={{ borderColor: 'var(--ds-gray-300)' }}\n >\n <button\n type=\"button\"\n aria-label=\"Copy data\"\n title=\"Copy\"\n className=\"!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border !bg-[var(--ds-background-100)] !text-[var(--ds-gray-800)] transition-transform transition-colors duration-100 hover:!bg-[var(--ds-gray-alpha-200)] active:!scale-95 active:!bg-[var(--ds-gray-alpha-300)]\"\n style={{ borderColor: 'var(--ds-gray-300)' }}\n onClick={() => {\n navigator.clipboard\n .writeText(serializeForClipboard(data))\n .then(() => {\n toast.success('Copied to clipboard');\n })\n .catch(() => {\n toast.error('Failed to copy');\n });\n }}\n >\n <Copy size={12} />\n </button>\n <DataInspector data={data} />\n </div>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"detail-card.js","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,gBAAgB,GAYjB;IACC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,cACE,SAAS,EAAE,2CAA2C,gBAAgB,IAAI,EAAE,EAAE,EAC9E,KAAK,EAAE;gBACL,WAAW,EAAE,oBAAoB;gBACjC,eAAe,EAAE,oBAAoB;gBACrC,KAAK,EAAE,oBAAoB;gBAC3B,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,GAAG;aACb,YAEA,OAAO,GACJ,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,mBACE,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC,MAA6B,CAAC,IAAI,CAAC,aAElE,kBACE,SAAS,EAAE,iHAAiH,gBAAgB,IAAI,EAAE,EAAE,EACpJ,KAAK,EAAE;oBACL,WAAW,EAAE,oBAAoB;oBACjC,eAAe,EAAE,oBAAoB;oBACrC,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,MAAM;iBAClB,YAED,gBAAM,SAAS,EAAC,2BAA2B,aACzC,KAAC,YAAY,IACX,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,oDAAoD,GAC9D,EACD,OAAO,IACH,GACC,EAEV,eAAK,SAAS,EAAE,sBAAsB,gBAAgB,IAAI,EAAE,EAAE,aAE5D,cACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAChD,EAEF,cACE,SAAS,EAAC,+DAA+D,EACzE,KAAK,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAC5C,EAEF,cACE,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAChD,EACF,wBAAM,QAAQ,GAAO,IACjB,IACE,CACX,CAAC;AACJ,CAAC","sourcesContent":["import { ChevronRight } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nexport function DetailCard({\n summary,\n children,\n onToggle,\n disabled = false,\n summaryClassName,\n contentClassName,\n}: {\n summary: ReactNode;\n children?: ReactNode;\n /** Called when the detail card is expanded/collapsed */\n onToggle?: (open: boolean) => void;\n /** Renders a non-expandable summary card when true. */\n disabled?: boolean;\n /** Extra classes for the summary row. */\n summaryClassName?: string;\n /** Extra classes for expanded content wrapper. */\n contentClassName?: string;\n}) {\n if (disabled) {\n return (\n <div\n className={`rounded-md border px-2.5 py-1.5 text-xs ${summaryClassName ?? ''}`}\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-700)',\n cursor: 'not-allowed',\n opacity: 0.8,\n }}\n >\n {summary}\n </div>\n );\n }\n\n return (\n <details\n className=\"group\"\n onToggle={(e) => onToggle?.((e.target as HTMLDetailsElement).open)}\n >\n <summary\n className={`cursor-pointer rounded-md border px-2.5 py-1.5 text-xs hover:brightness-95 [&::-webkit-details-marker]:hidden ${summaryClassName ?? ''}`}\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-900)',\n listStyle: 'none',\n }}\n >\n <span className=\"flex items-center gap-1.5\">\n <ChevronRight\n size={14}\n className=\"shrink-0 transition-transform group-open:rotate-90\"\n />\n {summary}\n </span>\n </summary>\n {/* Expanded content with connecting line */}\n <div className={`relative pl-6 mt-3 ${contentClassName ?? ''}`}>\n {/* Curved connecting line - vertical part from summary */}\n <div\n className=\"absolute left-3 -top-3 w-px h-3\"\n style={{ backgroundColor: 'var(--ds-gray-400)' }}\n />\n {/* Curved corner */}\n <div\n className=\"absolute left-3 top-0 w-3 h-3 border-l border-b rounded-bl-lg\"\n style={{ borderColor: 'var(--ds-gray-400)' }}\n />\n {/* Horizontal part to content */}\n <div\n className=\"absolute left-6 top-3 w-0 h-px -translate-y-px\"\n style={{ backgroundColor: 'var(--ds-gray-400)' }}\n />\n <div>{children}</div>\n </div>\n </details>\n );\n}\n"]}