@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.4

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 (161) hide show
  1. package/dist/components/index.d.ts +2 -0
  2. package/dist/components/index.d.ts.map +1 -1
  3. package/dist/components/index.js +2 -0
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  6. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  7. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  8. package/dist/components/new-trace-viewer/components/copy-button.js.map +1 -0
  9. package/dist/components/new-trace-viewer/components/event-list.d.ts +8 -0
  10. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  11. package/dist/components/new-trace-viewer/components/event-list.js +38 -0
  12. package/dist/components/new-trace-viewer/components/event-list.js.map +1 -0
  13. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  14. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +1 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +1 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +1 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  28. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +1 -0
  29. package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  31. package/dist/components/new-trace-viewer/components/split-pane.js +99 -0
  32. package/dist/components/new-trace-viewer/components/split-pane.js.map +1 -0
  33. package/dist/components/new-trace-viewer/components/timeline.d.ts +31 -0
  34. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  35. package/dist/components/new-trace-viewer/components/timeline.js +138 -0
  36. package/dist/components/new-trace-viewer/components/timeline.js.map +1 -0
  37. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  38. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/context.js +47 -0
  40. package/dist/components/new-trace-viewer/context.js.map +1 -0
  41. package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
  42. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
  43. package/dist/components/new-trace-viewer/detail-panel.js +12 -0
  44. package/dist/components/new-trace-viewer/detail-panel.js.map +1 -0
  45. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  46. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  47. package/dist/components/new-trace-viewer/icons.js +15 -0
  48. package/dist/components/new-trace-viewer/icons.js.map +1 -0
  49. package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
  50. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/trace-viewer.js +349 -0
  52. package/dist/components/new-trace-viewer/trace-viewer.js.map +1 -0
  53. package/dist/components/new-trace-viewer/types.d.ts +1 -0
  54. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  55. package/dist/components/new-trace-viewer/types.js +2 -0
  56. package/dist/components/new-trace-viewer/types.js.map +1 -0
  57. package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
  58. package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
  59. package/dist/components/new-trace-viewer/util/constants.js +2 -0
  60. package/dist/components/new-trace-viewer/util/constants.js.map +1 -0
  61. package/dist/components/new-trace-viewer/utils.d.ts +42 -0
  62. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  63. package/dist/components/new-trace-viewer/utils.js +305 -0
  64. package/dist/components/new-trace-viewer/utils.js.map +1 -0
  65. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  66. package/dist/components/sidebar/attribute-panel.js +42 -23
  67. package/dist/components/sidebar/attribute-panel.js.map +1 -1
  68. package/dist/components/sidebar/copyable-data-block.js +1 -1
  69. package/dist/components/sidebar/copyable-data-block.js.map +1 -1
  70. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  71. package/dist/components/sidebar/detail-card.js +1 -1
  72. package/dist/components/sidebar/detail-card.js.map +1 -1
  73. package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
  74. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  75. package/dist/components/sidebar/entity-detail-panel.js +3 -25
  76. package/dist/components/sidebar/entity-detail-panel.js.map +1 -1
  77. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  78. package/dist/components/sidebar/events-list.js +2 -2
  79. package/dist/components/sidebar/events-list.js.map +1 -1
  80. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  81. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  82. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  83. package/dist/components/sidebar/sidebar-data-context.js.map +1 -0
  84. package/dist/components/stream-viewer.d.ts +1 -1
  85. package/dist/components/stream-viewer.d.ts.map +1 -1
  86. package/dist/components/stream-viewer.js +2 -26
  87. package/dist/components/stream-viewer.js.map +1 -1
  88. package/dist/components/trace-viewer/util/timing.d.ts +1 -1
  89. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  90. package/dist/components/trace-viewer/util/timing.js +5 -8
  91. package/dist/components/trace-viewer/util/timing.js.map +1 -1
  92. package/dist/components/trace-viewer-new.d.ts +10 -0
  93. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  94. package/dist/components/trace-viewer-new.js +23 -0
  95. package/dist/components/trace-viewer-new.js.map +1 -0
  96. package/dist/components/ui/data-inspector.d.ts +21 -0
  97. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  98. package/dist/components/ui/data-inspector.js +99 -4
  99. package/dist/components/ui/data-inspector.js.map +1 -1
  100. package/dist/components/ui/inspector-theme.d.ts +9 -10
  101. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  102. package/dist/components/ui/inspector-theme.js +38 -71
  103. package/dist/components/ui/inspector-theme.js.map +1 -1
  104. package/dist/components/workflow-trace-view.d.ts +1 -3
  105. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  106. package/dist/components/workflow-trace-view.js +4 -4
  107. package/dist/components/workflow-trace-view.js.map +1 -1
  108. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  109. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  110. package/dist/components/workflow-traces/trace-span-construction.js +16 -3
  111. package/dist/components/workflow-traces/trace-span-construction.js.map +1 -1
  112. package/dist/index.d.ts +1 -0
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/lib/stream-display.d.ts +18 -0
  116. package/dist/lib/stream-display.d.ts.map +1 -0
  117. package/dist/lib/stream-display.js +30 -0
  118. package/dist/lib/stream-display.js.map +1 -0
  119. package/dist/lib/trace-builder.d.ts.map +1 -1
  120. package/dist/lib/trace-builder.js +2 -1
  121. package/dist/lib/trace-builder.js.map +1 -1
  122. package/dist/lib/utils.d.ts +9 -9
  123. package/dist/lib/utils.d.ts.map +1 -1
  124. package/dist/lib/utils.js +26 -31
  125. package/dist/lib/utils.js.map +1 -1
  126. package/dist/styles.css +470 -1
  127. package/package.json +3 -2
  128. package/src/components/index.ts +5 -0
  129. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  130. package/src/components/new-trace-viewer/components/event-list.tsx +116 -0
  131. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  132. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  133. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  134. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  135. package/src/components/new-trace-viewer/components/split-pane.tsx +185 -0
  136. package/src/components/new-trace-viewer/components/timeline.tsx +382 -0
  137. package/src/components/new-trace-viewer/context.tsx +92 -0
  138. package/src/components/new-trace-viewer/detail-panel.tsx +58 -0
  139. package/src/components/new-trace-viewer/icons.tsx +79 -0
  140. package/src/components/new-trace-viewer/trace-viewer.tsx +645 -0
  141. package/src/components/new-trace-viewer/types.ts +0 -0
  142. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  143. package/src/components/new-trace-viewer/utils.ts +450 -0
  144. package/src/components/sidebar/attribute-panel.tsx +43 -32
  145. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  146. package/src/components/sidebar/detail-card.tsx +1 -19
  147. package/src/components/sidebar/entity-detail-panel.tsx +0 -71
  148. package/src/components/sidebar/events-list.tsx +9 -6
  149. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  150. package/src/components/stream-viewer.tsx +18 -40
  151. package/src/components/trace-viewer/util/timing.ts +5 -9
  152. package/src/components/trace-viewer-new.tsx +49 -0
  153. package/src/components/ui/data-inspector.tsx +235 -4
  154. package/src/components/ui/inspector-theme.ts +39 -81
  155. package/src/components/workflow-trace-view.tsx +2 -6
  156. package/src/components/workflow-traces/trace-span-construction.ts +22 -4
  157. package/src/index.ts +1 -0
  158. package/src/lib/stream-display.ts +48 -0
  159. package/src/lib/trace-builder.ts +2 -1
  160. package/src/lib/utils.ts +27 -32
  161. package/src/styles.css +470 -1
@@ -1 +1 @@
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 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 {\n DecryptClickContext,\n RunClickContext,\n StreamClickContext,\n} 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 { Spinner } from '../ui/spinner';\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) =>\n parseStepName(String(value))?.shortName ?? String(value),\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 onRunClick,\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 a run reference is clicked */\n onRunClick?: (runId: 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 <RunClickContext.Provider value={onRunClick}>\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(\n displayValue ?? displayData.moduleSpecifier ?? ''\n );\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 </RunClickContext.Provider>\n );\n};\n"]}
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 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 {\n DecryptClickContext,\n RunClickContext,\n StreamClickContext,\n} 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 { Spinner } from '../ui/spinner';\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 moduleSpecifier: 'Module',\n workflowName: 'Workflow Name',\n stepName: 'Step Name',\n stepId: 'Step ID',\n hookId: 'Hook ID',\n attempt: 'Attempts',\n eventId: 'Event ID',\n runId: 'Run ID',\n eventType: 'Event Type',\n correlationId: 'Correlation ID',\n deploymentId: 'Deployment ID',\n specVersion: 'Spec Version',\n workflowCoreVersion: '@workflow/core version',\n createdAt: 'Created',\n startedAt: 'Started',\n updatedAt: 'Updated',\n completedAt: 'Completed',\n expiredAt: 'Expired',\n retryAfter: 'Retry After',\n resumeAt: 'Resume',\n lastReceivedAt: 'Last Received',\n disposedAt: 'Disposed',\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) => null,\n moduleSpecifier: (value: unknown) => getModuleSpecifierFromName(value),\n stepName: (_value: unknown) => null,\n // IDs\n runId: (_value: unknown) => null,\n stepId: (_value: unknown) => null,\n hookId: (value: unknown) => String(value),\n eventId: (value: unknown) => String(value),\n // Run/step details\n status: (_value: unknown) => null,\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: (_value: unknown) => null,\n completedAt: timestampWithTooltipOrNull,\n expiredAt: (_value: unknown) => null,\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-label-14 font-medium py-2\"\n />\n );\n }\n\n return (\n <>\n <DetailCard\n summary={`Input (${argCount} ${argLabel})`}\n summaryClassName=\"text-label-14 font-medium 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-label-14 font-medium py-2\"\n />\n );\n }\n return (\n <DetailCard\n summary={`Input (${argCount} ${argLabel})`}\n summaryClassName=\"text-label-14 font-medium 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-label-14 font-medium 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-label-14 font-medium 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-label-14 font-medium 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' || attribute === 'eventData';\n if (isLoading && isExpandableLoadingTarget && !hasDisplayContent(value)) {\n return (\n <div\n className={`my-2 flex flex-col ${attribute === 'input' ? 'gap-2 my-3.5' : 'gap-0'}`}\n >\n <span className=\"text-label-14 text-gray-1000 font-medium first-letter:uppercase\">\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 className=\"text-label-14 text-gray-1000 font-medium first-letter:uppercase\">\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 onRunClick,\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 a run reference is clicked */\n onRunClick?: (runId: 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 appears so its skeleton renders\n // in the correct position (above the events section).\n const loadingDefaults = ['input'];\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 <RunClickContext.Provider value={onRunClick}>\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-md 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(\n displayValue ?? displayData.moduleSpecifier ?? ''\n );\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 </RunClickContext.Provider>\n );\n};\n"]}
@@ -20,7 +20,7 @@ const serializeForClipboard = (value) => {
20
20
  };
21
21
  export function CopyableDataBlock({ data }) {
22
22
  const toast = useToast();
23
- return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border p-3 pt-9", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("button", { type: "button", "aria-label": "Copy data", title: "Copy", 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)]", style: { borderColor: 'var(--ds-gray-300)' }, onClick: () => {
23
+ return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border p-3", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("button", { type: "button", "aria-label": "Copy data", title: "Copy", 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)]", style: { borderColor: 'var(--ds-gray-300)' }, onClick: () => {
24
24
  navigator.clipboard
25
25
  .writeText(serializeForClipboard(data))
26
26
  .then(() => {
@@ -1 +1 @@
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
+ {"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,gDAAgD,EAC1D,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\"\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 +1 @@
1
- {"version":3,"file":"detail-card.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,2CA6DA"}
1
+ {"version":3,"file":"detail-card.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,2CA2CA"}
@@ -15,6 +15,6 @@ export function DetailCard({ summary, children, onToggle, disabled = false, summ
15
15
  backgroundColor: 'var(--ds-gray-100)',
16
16
  color: 'var(--ds-gray-900)',
17
17
  listStyle: 'none',
18
- }, children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(ChevronRight, { size: 14, className: "shrink-0 transition-transform group-open:rotate-90" }), summary] }) }), _jsxs("div", { className: `relative pl-6 mt-3 ${contentClassName ?? ''}`, children: [_jsx("div", { className: "absolute left-3 -top-3 w-px h-3", style: { backgroundColor: 'var(--ds-gray-400)' } }), _jsx("div", { className: "absolute left-3 top-0 w-3 h-3 border-l border-b rounded-bl-lg", style: { borderColor: 'var(--ds-gray-400)' } }), _jsx("div", { className: "absolute left-6 top-3 w-0 h-px -translate-y-px", style: { backgroundColor: 'var(--ds-gray-400)' } }), _jsx("div", { children: children })] })] }));
18
+ }, children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(ChevronRight, { size: 14, className: "shrink-0 transition-transform group-open:rotate-90" }), summary] }) }), _jsx("div", { className: `mt-2 ${contentClassName ?? ''}`, children: children })] }));
19
19
  }
20
20
  //# sourceMappingURL=detail-card.js.map
@@ -1 +1 @@
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"]}
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,EACV,cAAK,SAAS,EAAE,QAAQ,gBAAgB,IAAI,EAAE,EAAE,YAAG,QAAQ,GAAO,IAC1D,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 <div className={`mt-2 ${contentClassName ?? ''}`}>{children}</div>\n </details>\n );\n}\n"]}
@@ -26,7 +26,7 @@ export interface SelectedSpanInfo {
26
26
  * This component is rendered OUTSIDE the trace viewer context — it
27
27
  * receives all data via props rather than reading from context.
28
28
  */
29
- export declare function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting, selectedSpan, hasEncryptedData, }: {
29
+ export declare function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting, selectedSpan, }: {
30
30
  run: WorkflowRun;
31
31
  /** Callback when a stream reference is clicked */
32
32
  onStreamClick?: (streamId: string) => void;
@@ -56,7 +56,5 @@ export declare function EntityDetailPanel({ run, onStreamClick, onRunClick, span
56
56
  isDecrypting?: boolean;
57
57
  /** Info about the currently selected span from the trace viewer */
58
58
  selectedSpan: SelectedSpanInfo | null;
59
- /** Run-level hint: the run contains encrypted data (from probe). */
60
- hasEncryptedData?: boolean;
61
59
  }): React.JSX.Element | null;
62
60
  //# sourceMappingURL=entity-detail-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-detail-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAyBtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAoB,EACpB,YAAY,EACZ,gBAAwB,GACzB,EAAE;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0DAA0D;IAC1D,cAAc,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IACzD,6CAA6C;IAC7C,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,sEAAsE;IACtE,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,iDAAiD;IACjD,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sFAAsF;IACtF,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACtC,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA2Z3B"}
1
+ {"version":3,"file":"entity-detail-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAuBtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAoB,EACpB,YAAY,GACb,EAAE;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0DAA0D;IAC1D,cAAc,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IACzD,6CAA6C;IAC7C,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,sEAAsE;IACtE,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,iDAAiD;IACjD,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sFAAsF;IACtF,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAyV3B"}
@@ -3,10 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import clsx from 'clsx';
4
4
  import { Send, Zap } from 'lucide-react';
5
5
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
- import { isEncryptedMarker } from '../../lib/hydration';
7
6
  import { useToast } from '../../lib/toast';
8
7
  import { DecryptClickContext } from '../ui/data-inspector';
9
- import { DecryptButton } from '../ui/decrypt-button';
10
8
  import { AttributePanel } from './attribute-panel';
11
9
  import { EventsList } from './events-list';
12
10
  import { ResolveHookModal } from './resolve-hook-modal';
@@ -26,7 +24,7 @@ function isHook(data) {
26
24
  * This component is rendered OUTSIDE the trace viewer context — it
27
25
  * receives all data via props rather than reading from context.
28
26
  */
29
- export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, hasEncryptedData = false, }) {
27
+ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, }) {
30
28
  const toast = useToast();
31
29
  const [stoppingSleep, setStoppingSleep] = useState(false);
32
30
  const [showResolveHookModal, setShowResolveHookModal] = useState(false);
@@ -118,15 +116,6 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
118
116
  ]);
119
117
  const error = spanDetailError ?? undefined;
120
118
  const loading = spanDetailLoading ?? false;
121
- const hasEncryptedFields = useMemo(() => {
122
- if (!spanDetailData)
123
- return false;
124
- const d = spanDetailData;
125
- return (isEncryptedMarker(d.input) ||
126
- isEncryptedMarker(d.output) ||
127
- isEncryptedMarker(d.error) ||
128
- isEncryptedMarker(d.metadata));
129
- }, [spanDetailData]);
130
119
  // Get the hook token for resolving (prefer fetched data, then hooks array fallback)
131
120
  const hookToken = useMemo(() => {
132
121
  if (resource !== 'hook' || !resourceId)
@@ -242,20 +231,9 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
242
231
  if (!selectedSpan || !resource || !resourceId) {
243
232
  return null;
244
233
  }
245
- const resourceLabel = resource.charAt(0).toUpperCase() + resource.slice(1);
246
234
  const hasPendingActions = (resource === 'sleep' && canWakeUp) ||
247
235
  (resource === 'hook' && canResolveHook);
248
- const runStateLabel = run.completedAt ? 'Completed' : 'Live';
249
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx("div", { className: "border-b px-3 py-3", style: { borderColor: 'var(--ds-gray-200)' }, children: _jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex items-center rounded-full border px-2 py-0.5 text-[13px] font-medium", style: {
250
- borderColor: 'var(--ds-gray-300)',
251
- color: 'var(--ds-gray-900)',
252
- backgroundColor: 'var(--ds-background-100)',
253
- }, children: resourceLabel }), _jsx("span", { className: "text-[13px]", style: {
254
- color: run.completedAt
255
- ? 'var(--ds-gray-700)'
256
- : 'var(--ds-green-800)',
257
- }, children: runStateLabel })] }), _jsx("p", { className: "mt-1 truncate font-mono text-[13px]", style: { color: 'var(--ds-gray-700)' }, title: resourceId, children: resourceId })] }), (hasEncryptedFields || hasEncryptedData || encryptionKey) &&
258
- onDecrypt && (_jsx(DecryptButton, { decrypted: !!encryptionKey, loading: isDecrypting, onClick: onDecrypt }))] }) }), _jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { className: "flex-1 overflow-y-auto px-3 pt-3 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
236
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { className: "flex-1 overflow-y-auto px-3 pt-3 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
259
237
  borderColor: 'var(--ds-gray-300)',
260
238
  backgroundColor: 'var(--ds-gray-100)',
261
239
  }, children: [_jsx("p", { className: "mb-2 px-1 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Actions" }), _jsxs("div", { className: "flex flex-col gap-2", children: [resource === 'sleep' && canWakeUp && (_jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', stoppingSleep
@@ -268,6 +246,6 @@ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailDa
268
246
  : 'cursor-pointer'), style: {
269
247
  background: 'var(--ds-gray-1000)',
270
248
  color: 'var(--ds-background-100)',
271
- }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsxs("div", { className: "space-y-4", children: [_jsxs("section", { children: [_jsx("h3", { className: "mb-2 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Details" }), _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, onRunClick: onRunClick, onDecrypt: onDecrypt, isDecrypting: isDecrypting, resource: resource })] }), resource !== 'run' && rawEvents && (_jsx("section", { children: _jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }) }))] })] }) }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
249
+ }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsxs("div", { className: "space-y-4", children: [_jsx("section", { children: _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, onRunClick: onRunClick, onDecrypt: onDecrypt, isDecrypting: isDecrypting, resource: resource }) }), resource !== 'run' && rawEvents && (_jsx("section", { children: _jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }) }))] })] }) }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
272
250
  }
273
251
  //# sourceMappingURL=entity-detail-panel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-detail-panel.js","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport clsx from 'clsx';\nimport { Send, Zap } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isEncryptedMarker } from '../../lib/hydration';\nimport { useToast } from '../../lib/toast';\nimport { DecryptClickContext } from '../ui/data-inspector';\nimport { DecryptButton } from '../ui/decrypt-button';\nimport { AttributePanel } from './attribute-panel';\nimport { EventsList } from './events-list';\nimport { ResolveHookModal } from './resolve-hook-modal';\n\n// Type guards for runtime validation of span attribute data\nfunction isStep(data: unknown): data is Step {\n return data !== null && typeof data === 'object' && 'stepId' in data;\n}\n\nfunction isWorkflowRun(data: unknown): data is WorkflowRun {\n return data !== null && typeof data === 'object' && 'runId' in data;\n}\n\nfunction isHook(data: unknown): data is Hook {\n return data !== null && typeof data === 'object' && 'hookId' in data;\n}\n\n/**\n * Info about the currently selected span\n */\nexport type SpanSelectionInfo = {\n resource: 'run' | 'step' | 'hook' | 'sleep';\n resourceId: string;\n runId?: string;\n};\n\n/**\n * Info about the selected span from the trace viewer.\n */\nexport interface SelectedSpanInfo {\n /** The raw data from the span attributes (step/run/hook object from the trace) */\n data?: unknown;\n /** The span resource type (from span attributes) */\n resource?: string;\n /** The span ID (correlationId for filtering events) */\n spanId?: string;\n /** Raw correlated events from the store (NOT from the trace worker pipeline) */\n rawEvents?: Event[];\n}\n\n/**\n * Panel component for workflow traces that displays entity details.\n *\n * This component is rendered OUTSIDE the trace viewer context — it\n * receives all data via props rather than reading from context.\n */\nexport function EntityDetailPanel({\n run,\n onStreamClick,\n onRunClick,\n spanDetailData,\n spanDetailError,\n spanDetailLoading,\n onSpanSelect,\n onWakeUpSleep,\n onLoadEventData,\n onResolveHook,\n encryptionKey,\n onDecrypt,\n isDecrypting = false,\n selectedSpan,\n hasEncryptedData = false,\n}: {\n run: WorkflowRun;\n /** Callback when a stream reference is clicked */\n onStreamClick?: (streamId: string) => void;\n /** Callback when a run reference is clicked */\n onRunClick?: (runId: string) => void;\n /** Pre-fetched span detail data for the selected span. */\n spanDetailData: WorkflowRun | Step | Hook | Event | null;\n /** Error from external span detail fetch. */\n spanDetailError?: Error | null;\n /** Loading state from external span detail fetch. */\n spanDetailLoading?: boolean;\n /** Callback when a span is selected. Use this to fetch data externally and pass via spanDetailData. */\n onSpanSelect: (info: SpanSelectionInfo) => void;\n /** Callback to wake up a pending sleep call. */\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n /** Callback to load event data for a specific event (lazy loading) */\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n /** Callback to resolve a hook with a payload. */\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n /** Encryption key (available after Decrypt is clicked), used to re-load event data */\n encryptionKey?: Uint8Array;\n /** Callback to initiate decryption of encrypted run data */\n onDecrypt?: () => void;\n /** Whether the encryption key is currently being fetched */\n isDecrypting?: boolean;\n /** Info about the currently selected span from the trace viewer */\n selectedSpan: SelectedSpanInfo | null;\n /** Run-level hint: the run contains encrypted data (from probe). */\n hasEncryptedData?: boolean;\n}): React.JSX.Element | null {\n const toast = useToast();\n const [stoppingSleep, setStoppingSleep] = useState(false);\n const [showResolveHookModal, setShowResolveHookModal] = useState(false);\n const [resolvingHook, setResolvingHook] = useState(false);\n // Track hooks that were resolved in this session so the button hides\n // immediately without waiting for the next event poll.\n const [resolvedHookIds, setResolvedHookIds] = useState<Set<string>>(\n new Set()\n );\n\n const data = selectedSpan?.data;\n const rawEvents = selectedSpan?.rawEvents;\n const rawEventsLength = rawEvents?.length ?? 0;\n\n // Determine resource type, ID, and runId from the selected span\n const { resource, resourceId, runId } = useMemo(() => {\n if (!selectedSpan) {\n return { resource: undefined, resourceId: undefined, runId: undefined };\n }\n\n const res = selectedSpan.resource;\n if (res === 'step' && isStep(data)) {\n return { resource: 'step', resourceId: data.stepId, runId: data.runId };\n }\n if (res === 'run' && isWorkflowRun(data)) {\n return { resource: 'run', resourceId: data.runId, runId: undefined };\n }\n if (res === 'hook' && isHook(data)) {\n return { resource: 'hook', resourceId: data.hookId, runId: undefined };\n }\n if (res === 'sleep') {\n const waitData = data as { runId?: string } | undefined;\n return {\n resource: 'sleep',\n resourceId: selectedSpan.spanId,\n runId: waitData?.runId,\n };\n }\n return { resource: undefined, resourceId: undefined, runId: undefined };\n }, [selectedSpan, data]);\n\n // Notify parent when span selection changes.\n // Use a ref for the callback so the effect only fires when the actual\n // selection values change, not when the callback identity changes due to\n // parent re-renders from polling.\n const onSpanSelectRef = useRef(onSpanSelect);\n onSpanSelectRef.current = onSpanSelect;\n\n useEffect(() => {\n if (\n resource &&\n resourceId &&\n ['run', 'step', 'hook', 'sleep'].includes(resource)\n ) {\n onSpanSelectRef.current({\n resource: resource as 'run' | 'step' | 'hook' | 'sleep',\n resourceId,\n runId,\n });\n }\n }, [resource, resourceId, runId]);\n\n // Check if this sleep is still pending and can be woken up\n const canWakeUp = useMemo(() => {\n void rawEventsLength;\n if (resource !== 'sleep' || !rawEvents) return false;\n const terminalStates = ['completed', 'failed', 'cancelled'];\n if (terminalStates.includes(run.status)) return false;\n const hasWaitCreated = rawEvents.some(\n (e) => e.eventType === 'wait_created'\n );\n if (!hasWaitCreated) return false;\n const hasWaitCompleted = rawEvents.some(\n (e) => e.eventType === 'wait_completed'\n );\n return !hasWaitCompleted;\n }, [resource, rawEvents, rawEventsLength, run.status]);\n\n // Check if this hook can be resolved\n const canResolveHook = useMemo(() => {\n void rawEventsLength;\n if (resource !== 'hook' || !rawEvents || !resourceId) return false;\n\n // Check if we already resolved this hook in this session\n if (resolvedHookIds.has(resourceId)) return false;\n\n const terminalStates = ['completed', 'failed', 'cancelled'];\n if (terminalStates.includes(run.status)) return false;\n const hasHookDisposed = rawEvents.some(\n (e) => e.eventType === 'hook_disposed'\n );\n if (hasHookDisposed) return false;\n return true;\n }, [\n resource,\n resourceId,\n rawEvents,\n rawEventsLength,\n run.status,\n resolvedHookIds,\n ]);\n\n const error = spanDetailError ?? undefined;\n const loading = spanDetailLoading ?? false;\n\n const hasEncryptedFields = useMemo(() => {\n if (!spanDetailData) return false;\n const d = spanDetailData as Record<string, unknown>;\n return (\n isEncryptedMarker(d.input) ||\n isEncryptedMarker(d.output) ||\n isEncryptedMarker(d.error) ||\n isEncryptedMarker(d.metadata)\n );\n }, [spanDetailData]);\n\n // Get the hook token for resolving (prefer fetched data, then hooks array fallback)\n const hookToken = useMemo(() => {\n if (resource !== 'hook' || !resourceId) return undefined;\n // 1. Try the externally-fetched detail data first\n if (isHook(spanDetailData) && spanDetailData.token) {\n return spanDetailData.token;\n }\n // 2. Try the span's inline data (reconstructed from hook_created event)\n if (isHook(data) && (data as Hook).token) {\n return (data as Hook).token;\n }\n return undefined;\n }, [resource, resourceId, spanDetailData, data]);\n\n useEffect(() => {\n if (error && selectedSpan && resource) {\n toast.error(`Failed to load ${resource} details`, {\n description: error.message,\n });\n }\n }, [error, resource, selectedSpan]);\n\n const handleWakeUp = async () => {\n if (stoppingSleep || !resourceId) return;\n if (!onWakeUpSleep) {\n toast.error('Unable to wake up sleep', {\n description: 'No wake-up handler provided.',\n });\n return;\n }\n\n try {\n setStoppingSleep(true);\n const result = await onWakeUpSleep(run.runId, resourceId);\n if (result.stoppedCount > 0) {\n toast.success('Run woken up', {\n description:\n 'The sleep call has been interrupted and the run woken up.',\n });\n } else {\n toast.info('Sleep already completed', {\n description: 'This sleep call has already finished.',\n });\n }\n } catch (err) {\n console.error('Failed to wake up run:', err);\n toast.error('Failed to wake up run', {\n description:\n err instanceof Error ? err.message : 'An unknown error occurred',\n });\n } finally {\n setStoppingSleep(false);\n }\n };\n\n const handleResolveHook = useCallback(\n async (payload: unknown) => {\n if (resolvingHook) return;\n if (!onResolveHook) {\n toast.error('Unable to resolve hook', {\n description: 'No resolve handler provided.',\n });\n return;\n }\n if (!hookToken) {\n toast.error('Unable to resolve hook', {\n description:\n 'Missing hook token. Try refreshing the run data and retry.',\n });\n return;\n }\n\n try {\n setResolvingHook(true);\n const candidate = spanDetailData ?? data;\n const hook = isHook(candidate) ? candidate : undefined;\n await onResolveHook(hookToken, payload, hook);\n toast.success('Hook resolved', {\n description: 'The payload has been sent and the hook resolved.',\n });\n setShowResolveHookModal(false);\n // Mark this hook as resolved locally so the button hides immediately\n if (resourceId) {\n setResolvedHookIds((prev) => new Set(prev).add(resourceId));\n }\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 setResolvingHook(false);\n }\n },\n [onResolveHook, hookToken, resolvingHook, spanDetailData, data]\n );\n\n // Prefer externally-fetched details when available. For sleep spans, the\n // host fetches full correlated events (withData=true) and materializes a wait\n // entity, so this includes resumeAt/completedAt without bloating trace payloads.\n const displayData = (spanDetailData ?? data) as\n | WorkflowRun\n | Step\n | Hook\n | Event;\n\n const moduleSpecifier = useMemo(() => {\n const displayRecord = displayData as Record<string, unknown>;\n const displayStepName = displayRecord.stepName;\n const displayWorkflowName = displayRecord.workflowName;\n if (typeof displayStepName === 'string') {\n return displayStepName;\n }\n if (typeof displayWorkflowName === 'string') {\n return displayWorkflowName;\n }\n if (typeof run.workflowName === 'string') {\n return run.workflowName;\n }\n return undefined;\n }, [displayData, run.workflowName]);\n\n if (!selectedSpan || !resource || !resourceId) {\n return null;\n }\n\n const resourceLabel = resource.charAt(0).toUpperCase() + resource.slice(1);\n const hasPendingActions =\n (resource === 'sleep' && canWakeUp) ||\n (resource === 'hook' && canResolveHook);\n const runStateLabel = run.completedAt ? 'Completed' : 'Live';\n\n return (\n <div className=\"flex h-full flex-col\">\n <div\n className=\"border-b px-3 py-3\"\n style={{ borderColor: 'var(--ds-gray-200)' }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span\n className=\"inline-flex items-center rounded-full border px-2 py-0.5 text-[13px] font-medium\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n color: 'var(--ds-gray-900)',\n backgroundColor: 'var(--ds-background-100)',\n }}\n >\n {resourceLabel}\n </span>\n <span\n className=\"text-[13px]\"\n style={{\n color: run.completedAt\n ? 'var(--ds-gray-700)'\n : 'var(--ds-green-800)',\n }}\n >\n {runStateLabel}\n </span>\n </div>\n <p\n className=\"mt-1 truncate font-mono text-[13px]\"\n style={{ color: 'var(--ds-gray-700)' }}\n title={resourceId}\n >\n {resourceId}\n </p>\n </div>\n {(hasEncryptedFields || hasEncryptedData || encryptionKey) &&\n onDecrypt && (\n <DecryptButton\n decrypted={!!encryptionKey}\n loading={isDecrypting}\n onClick={onDecrypt}\n />\n )}\n </div>\n </div>\n\n <DecryptClickContext.Provider\n value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}\n >\n <div className=\"flex-1 overflow-y-auto px-3 pt-3 pb-8\">\n {hasPendingActions && (\n <div\n className=\"mb-4 rounded-lg border p-2\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n }}\n >\n <p\n className=\"mb-2 px-1 text-[13px] font-medium uppercase tracking-wide\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Actions\n </p>\n <div className=\"flex flex-col gap-2\">\n {/* Wake up button for pending sleep calls */}\n {resource === 'sleep' && canWakeUp && (\n <button\n type=\"button\"\n onClick={handleWakeUp}\n disabled={stoppingSleep}\n className={clsx(\n 'flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium',\n 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors',\n stoppingSleep\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n style={{\n background: 'var(--ds-amber-200)',\n color: 'var(--ds-amber-900)',\n }}\n >\n <Zap className=\"h-4 w-4\" />\n {stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'}\n </button>\n )}\n\n {/* Resolve hook button for pending hooks */}\n {resource === 'hook' && canResolveHook && (\n <button\n type=\"button\"\n onClick={() => setShowResolveHookModal(true)}\n disabled={resolvingHook}\n className={clsx(\n 'flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium',\n 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors',\n resolvingHook\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n style={{\n background: 'var(--ds-gray-1000)',\n color: 'var(--ds-background-100)',\n }}\n >\n <Send className=\"h-4 w-4\" />\n Resolve Hook\n </button>\n )}\n </div>\n </div>\n )}\n\n <div className=\"space-y-4\">\n <section>\n <h3\n className=\"mb-2 text-[13px] font-medium uppercase tracking-wide\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Details\n </h3>\n <AttributePanel\n data={displayData}\n moduleSpecifier={moduleSpecifier}\n expiredAt={run.expiredAt}\n isLoading={loading}\n error={error ?? undefined}\n onStreamClick={onStreamClick}\n onRunClick={onRunClick}\n onDecrypt={onDecrypt}\n isDecrypting={isDecrypting}\n resource={resource}\n />\n </section>\n\n {resource !== 'run' && rawEvents && (\n <section>\n <EventsList\n events={rawEvents}\n onLoadEventData={onLoadEventData}\n encryptionKey={encryptionKey}\n />\n </section>\n )}\n </div>\n </div>\n </DecryptClickContext.Provider>\n\n {/* Resolve Hook Modal */}\n <ResolveHookModal\n isOpen={showResolveHookModal}\n onClose={() => setShowResolveHookModal(false)}\n onSubmit={handleResolveHook}\n isSubmitting={resolvingHook}\n />\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"entity-detail-panel.js","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport clsx from 'clsx';\nimport { Send, Zap } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useToast } from '../../lib/toast';\nimport { DecryptClickContext } from '../ui/data-inspector';\nimport { AttributePanel } from './attribute-panel';\nimport { EventsList } from './events-list';\nimport { ResolveHookModal } from './resolve-hook-modal';\n\n// Type guards for runtime validation of span attribute data\nfunction isStep(data: unknown): data is Step {\n return data !== null && typeof data === 'object' && 'stepId' in data;\n}\n\nfunction isWorkflowRun(data: unknown): data is WorkflowRun {\n return data !== null && typeof data === 'object' && 'runId' in data;\n}\n\nfunction isHook(data: unknown): data is Hook {\n return data !== null && typeof data === 'object' && 'hookId' in data;\n}\n\n/**\n * Info about the currently selected span\n */\nexport type SpanSelectionInfo = {\n resource: 'run' | 'step' | 'hook' | 'sleep';\n resourceId: string;\n runId?: string;\n};\n\n/**\n * Info about the selected span from the trace viewer.\n */\nexport interface SelectedSpanInfo {\n /** The raw data from the span attributes (step/run/hook object from the trace) */\n data?: unknown;\n /** The span resource type (from span attributes) */\n resource?: string;\n /** The span ID (correlationId for filtering events) */\n spanId?: string;\n /** Raw correlated events from the store (NOT from the trace worker pipeline) */\n rawEvents?: Event[];\n}\n\n/**\n * Panel component for workflow traces that displays entity details.\n *\n * This component is rendered OUTSIDE the trace viewer context — it\n * receives all data via props rather than reading from context.\n */\nexport function EntityDetailPanel({\n run,\n onStreamClick,\n onRunClick,\n spanDetailData,\n spanDetailError,\n spanDetailLoading,\n onSpanSelect,\n onWakeUpSleep,\n onLoadEventData,\n onResolveHook,\n encryptionKey,\n onDecrypt,\n isDecrypting = false,\n selectedSpan,\n}: {\n run: WorkflowRun;\n /** Callback when a stream reference is clicked */\n onStreamClick?: (streamId: string) => void;\n /** Callback when a run reference is clicked */\n onRunClick?: (runId: string) => void;\n /** Pre-fetched span detail data for the selected span. */\n spanDetailData: WorkflowRun | Step | Hook | Event | null;\n /** Error from external span detail fetch. */\n spanDetailError?: Error | null;\n /** Loading state from external span detail fetch. */\n spanDetailLoading?: boolean;\n /** Callback when a span is selected. Use this to fetch data externally and pass via spanDetailData. */\n onSpanSelect: (info: SpanSelectionInfo) => void;\n /** Callback to wake up a pending sleep call. */\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n /** Callback to load event data for a specific event (lazy loading) */\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n /** Callback to resolve a hook with a payload. */\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n /** Encryption key (available after Decrypt is clicked), used to re-load event data */\n encryptionKey?: Uint8Array;\n /** Callback to initiate decryption of encrypted run data */\n onDecrypt?: () => void;\n /** Whether the encryption key is currently being fetched */\n isDecrypting?: boolean;\n /** Info about the currently selected span from the trace viewer */\n selectedSpan: SelectedSpanInfo | null;\n}): React.JSX.Element | null {\n const toast = useToast();\n const [stoppingSleep, setStoppingSleep] = useState(false);\n const [showResolveHookModal, setShowResolveHookModal] = useState(false);\n const [resolvingHook, setResolvingHook] = useState(false);\n // Track hooks that were resolved in this session so the button hides\n // immediately without waiting for the next event poll.\n const [resolvedHookIds, setResolvedHookIds] = useState<Set<string>>(\n new Set()\n );\n\n const data = selectedSpan?.data;\n const rawEvents = selectedSpan?.rawEvents;\n const rawEventsLength = rawEvents?.length ?? 0;\n\n // Determine resource type, ID, and runId from the selected span\n const { resource, resourceId, runId } = useMemo(() => {\n if (!selectedSpan) {\n return { resource: undefined, resourceId: undefined, runId: undefined };\n }\n\n const res = selectedSpan.resource;\n if (res === 'step' && isStep(data)) {\n return { resource: 'step', resourceId: data.stepId, runId: data.runId };\n }\n if (res === 'run' && isWorkflowRun(data)) {\n return { resource: 'run', resourceId: data.runId, runId: undefined };\n }\n if (res === 'hook' && isHook(data)) {\n return { resource: 'hook', resourceId: data.hookId, runId: undefined };\n }\n if (res === 'sleep') {\n const waitData = data as { runId?: string } | undefined;\n return {\n resource: 'sleep',\n resourceId: selectedSpan.spanId,\n runId: waitData?.runId,\n };\n }\n return { resource: undefined, resourceId: undefined, runId: undefined };\n }, [selectedSpan, data]);\n\n // Notify parent when span selection changes.\n // Use a ref for the callback so the effect only fires when the actual\n // selection values change, not when the callback identity changes due to\n // parent re-renders from polling.\n const onSpanSelectRef = useRef(onSpanSelect);\n onSpanSelectRef.current = onSpanSelect;\n\n useEffect(() => {\n if (\n resource &&\n resourceId &&\n ['run', 'step', 'hook', 'sleep'].includes(resource)\n ) {\n onSpanSelectRef.current({\n resource: resource as 'run' | 'step' | 'hook' | 'sleep',\n resourceId,\n runId,\n });\n }\n }, [resource, resourceId, runId]);\n\n // Check if this sleep is still pending and can be woken up\n const canWakeUp = useMemo(() => {\n void rawEventsLength;\n if (resource !== 'sleep' || !rawEvents) return false;\n const terminalStates = ['completed', 'failed', 'cancelled'];\n if (terminalStates.includes(run.status)) return false;\n const hasWaitCreated = rawEvents.some(\n (e) => e.eventType === 'wait_created'\n );\n if (!hasWaitCreated) return false;\n const hasWaitCompleted = rawEvents.some(\n (e) => e.eventType === 'wait_completed'\n );\n return !hasWaitCompleted;\n }, [resource, rawEvents, rawEventsLength, run.status]);\n\n // Check if this hook can be resolved\n const canResolveHook = useMemo(() => {\n void rawEventsLength;\n if (resource !== 'hook' || !rawEvents || !resourceId) return false;\n\n // Check if we already resolved this hook in this session\n if (resolvedHookIds.has(resourceId)) return false;\n\n const terminalStates = ['completed', 'failed', 'cancelled'];\n if (terminalStates.includes(run.status)) return false;\n const hasHookDisposed = rawEvents.some(\n (e) => e.eventType === 'hook_disposed'\n );\n if (hasHookDisposed) return false;\n return true;\n }, [\n resource,\n resourceId,\n rawEvents,\n rawEventsLength,\n run.status,\n resolvedHookIds,\n ]);\n\n const error = spanDetailError ?? undefined;\n const loading = spanDetailLoading ?? false;\n\n // Get the hook token for resolving (prefer fetched data, then hooks array fallback)\n const hookToken = useMemo(() => {\n if (resource !== 'hook' || !resourceId) return undefined;\n // 1. Try the externally-fetched detail data first\n if (isHook(spanDetailData) && spanDetailData.token) {\n return spanDetailData.token;\n }\n // 2. Try the span's inline data (reconstructed from hook_created event)\n if (isHook(data) && (data as Hook).token) {\n return (data as Hook).token;\n }\n return undefined;\n }, [resource, resourceId, spanDetailData, data]);\n\n useEffect(() => {\n if (error && selectedSpan && resource) {\n toast.error(`Failed to load ${resource} details`, {\n description: error.message,\n });\n }\n }, [error, resource, selectedSpan]);\n\n const handleWakeUp = async () => {\n if (stoppingSleep || !resourceId) return;\n if (!onWakeUpSleep) {\n toast.error('Unable to wake up sleep', {\n description: 'No wake-up handler provided.',\n });\n return;\n }\n\n try {\n setStoppingSleep(true);\n const result = await onWakeUpSleep(run.runId, resourceId);\n if (result.stoppedCount > 0) {\n toast.success('Run woken up', {\n description:\n 'The sleep call has been interrupted and the run woken up.',\n });\n } else {\n toast.info('Sleep already completed', {\n description: 'This sleep call has already finished.',\n });\n }\n } catch (err) {\n console.error('Failed to wake up run:', err);\n toast.error('Failed to wake up run', {\n description:\n err instanceof Error ? err.message : 'An unknown error occurred',\n });\n } finally {\n setStoppingSleep(false);\n }\n };\n\n const handleResolveHook = useCallback(\n async (payload: unknown) => {\n if (resolvingHook) return;\n if (!onResolveHook) {\n toast.error('Unable to resolve hook', {\n description: 'No resolve handler provided.',\n });\n return;\n }\n if (!hookToken) {\n toast.error('Unable to resolve hook', {\n description:\n 'Missing hook token. Try refreshing the run data and retry.',\n });\n return;\n }\n\n try {\n setResolvingHook(true);\n const candidate = spanDetailData ?? data;\n const hook = isHook(candidate) ? candidate : undefined;\n await onResolveHook(hookToken, payload, hook);\n toast.success('Hook resolved', {\n description: 'The payload has been sent and the hook resolved.',\n });\n setShowResolveHookModal(false);\n // Mark this hook as resolved locally so the button hides immediately\n if (resourceId) {\n setResolvedHookIds((prev) => new Set(prev).add(resourceId));\n }\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 setResolvingHook(false);\n }\n },\n [onResolveHook, hookToken, resolvingHook, spanDetailData, data]\n );\n\n // Prefer externally-fetched details when available. For sleep spans, the\n // host fetches full correlated events (withData=true) and materializes a wait\n // entity, so this includes resumeAt/completedAt without bloating trace payloads.\n const displayData = (spanDetailData ?? data) as\n | WorkflowRun\n | Step\n | Hook\n | Event;\n\n const moduleSpecifier = useMemo(() => {\n const displayRecord = displayData as Record<string, unknown>;\n const displayStepName = displayRecord.stepName;\n const displayWorkflowName = displayRecord.workflowName;\n if (typeof displayStepName === 'string') {\n return displayStepName;\n }\n if (typeof displayWorkflowName === 'string') {\n return displayWorkflowName;\n }\n if (typeof run.workflowName === 'string') {\n return run.workflowName;\n }\n return undefined;\n }, [displayData, run.workflowName]);\n\n if (!selectedSpan || !resource || !resourceId) {\n return null;\n }\n\n const hasPendingActions =\n (resource === 'sleep' && canWakeUp) ||\n (resource === 'hook' && canResolveHook);\n\n return (\n <div className=\"flex h-full flex-col\">\n <DecryptClickContext.Provider\n value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}\n >\n <div className=\"flex-1 overflow-y-auto px-3 pt-3 pb-8\">\n {hasPendingActions && (\n <div\n className=\"mb-4 rounded-lg border p-2\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n }}\n >\n <p\n className=\"mb-2 px-1 text-[13px] font-medium uppercase tracking-wide\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Actions\n </p>\n <div className=\"flex flex-col gap-2\">\n {/* Wake up button for pending sleep calls */}\n {resource === 'sleep' && canWakeUp && (\n <button\n type=\"button\"\n onClick={handleWakeUp}\n disabled={stoppingSleep}\n className={clsx(\n 'flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium',\n 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors',\n stoppingSleep\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n style={{\n background: 'var(--ds-amber-200)',\n color: 'var(--ds-amber-900)',\n }}\n >\n <Zap className=\"h-4 w-4\" />\n {stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'}\n </button>\n )}\n\n {/* Resolve hook button for pending hooks */}\n {resource === 'hook' && canResolveHook && (\n <button\n type=\"button\"\n onClick={() => setShowResolveHookModal(true)}\n disabled={resolvingHook}\n className={clsx(\n 'flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium',\n 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors',\n resolvingHook\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer'\n )}\n style={{\n background: 'var(--ds-gray-1000)',\n color: 'var(--ds-background-100)',\n }}\n >\n <Send className=\"h-4 w-4\" />\n Resolve Hook\n </button>\n )}\n </div>\n </div>\n )}\n\n <div className=\"space-y-4\">\n <section>\n <AttributePanel\n data={displayData}\n moduleSpecifier={moduleSpecifier}\n expiredAt={run.expiredAt}\n isLoading={loading}\n error={error ?? undefined}\n onStreamClick={onStreamClick}\n onRunClick={onRunClick}\n onDecrypt={onDecrypt}\n isDecrypting={isDecrypting}\n resource={resource}\n />\n </section>\n\n {resource !== 'run' && rawEvents && (\n <section>\n <EventsList\n events={rawEvents}\n onLoadEventData={onLoadEventData}\n encryptionKey={encryptionKey}\n />\n </section>\n )}\n </div>\n </div>\n </DecryptClickContext.Provider>\n\n {/* Resolve Hook Modal */}\n <ResolveHookModal\n isOpen={showResolveHookModal}\n onClose={() => setShowResolveHookModal(false)}\n onSubmit={handleResolveHook}\n isSubmitting={resolvingHook}\n />\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAyRpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA2CA"}
1
+ {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA4RpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA2CA"}