@workflow/web-shared 5.0.0-beta.7 → 5.0.0-beta.8
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.
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +12 -0
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +26 -13
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
- package/dist/components/new-trace-viewer/components/event-list.js +2 -2
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +1 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +1 -1
- package/dist/components/new-trace-viewer/components/timeline.js +1 -1
- package/dist/components/new-trace-viewer/context.js +1 -1
- package/dist/components/new-trace-viewer/detail-panel.js +2 -2
- package/dist/components/new-trace-viewer/icons.js +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +45 -23
- package/dist/components/new-trace-viewer/types.js +1 -1
- package/dist/components/new-trace-viewer/util/constants.js +1 -1
- package/dist/components/new-trace-viewer/utils.js +1 -1
- package/dist/components/run-trace-view.js +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +99 -73
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +6 -3
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +21 -15
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/stream-viewer.js +1 -1
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.js +1 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.js +1 -1
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.js +1 -1
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +39 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/data-inspector.d.ts +1 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +4 -9
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +4 -18
- package/dist/components/ui/inspector-theme.js +1 -1
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.js +1 -1
- package/dist/components/workflow-trace-view.js +1 -1
- package/dist/components/workflow-traces/event-colors.js +1 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-reduced-motion.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- package/dist/lib/hydration.js +1 -1
- package/dist/lib/stream-display.js +1 -1
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.js +1 -1
- package/dist/lib/utils.js +1 -1
- package/package.json +5 -5
- package/src/components/event-list-view.tsx +29 -13
- package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
- package/src/components/new-trace-viewer/components/event-list.tsx +1 -1
- package/src/components/new-trace-viewer/detail-panel.tsx +1 -1
- package/src/components/new-trace-viewer/trace-viewer.tsx +83 -56
- package/src/components/sidebar/attribute-panel.tsx +212 -235
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -41
- package/src/components/sidebar/entity-detail-panel.tsx +28 -28
- package/src/components/sidebar/events-list.tsx +51 -79
- package/src/components/ui/button.tsx +61 -0
- package/src/components/ui/data-inspector.tsx +9 -18
- package/src/components/ui/error-stack-block.tsx +7 -26
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
- package/dist/components/new-trace-viewer/context.js.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
- package/dist/components/new-trace-viewer/icons.js.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/new-trace-viewer/types.js.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
- package/dist/components/new-trace-viewer/utils.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/trace-viewer-new.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/hooks/use-reduced-motion.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/stream-display.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detail-panel.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/detail-panel.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAQ5C,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,OAAO,GACU;IACjB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAErC,OAAO,CACL,iBAAO,SAAS,EAAC,iEAAiE,aAChF,eAAK,SAAS,EAAC,uEAAuE,aACpF,eAAM,SAAS,EAAC,6CAA6C,YAC1D,IAAI,CAAC,IAAI,GACL,EACP,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6FAA6F,EACvG,OAAO,EAAE,OAAO,YAEhB,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,IACL,EACN,cAAK,SAAS,EAAC,+BAA+B,YAC5C,cAAI,SAAS,EAAC,qDAAqD,aACjE,aAAI,SAAS,EAAC,eAAe,yBAAc,EAC3C,aAAI,SAAS,EAAC,0BAA0B,YAAE,IAAI,CAAC,QAAQ,GAAM,EAC7D,aAAI,SAAS,EAAC,eAAe,yBAAc,EAC3C,aAAI,SAAS,EAAC,uCAAuC,YAClD,cAAc,CAAC,UAAU,CAAC,GACxB,EACL,aAAI,SAAS,EAAC,eAAe,uBAAY,EACzC,cAAI,SAAS,EAAC,uCAAuC,kBACjD,cAAc,CAAC,QAAQ,CAAC,IACvB,EACL,aAAI,SAAS,EAAC,eAAe,uBAAY,EACzC,aAAI,SAAS,EAAC,0BAA0B,YACrC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GACrC,IACF,GACD,IACA,CACT,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport { X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport type { Span } from '../trace-viewer/types';\nimport { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';\nimport { getSpanDurationMs } from './utils';\n\ninterface DetailPanelProps {\n span: Span;\n rootStart: number;\n onClose: () => void;\n}\n\nexport function DetailPanel({\n span,\n rootStart,\n onClose,\n}: DetailPanelProps): ReactNode {\n const startMs = getHighResInMs(span.startTime);\n const durationMs = getSpanDurationMs(span);\n const offsetMs = startMs - rootStart;\n\n return (\n <aside className=\"grid h-full max-h-full grid-rows-[2.5rem_1fr] bg-background-200\">\n <div className=\"flex items-center justify-between px-3 border-b border-gray-alpha-400\">\n <span className=\"text-sm font-medium text-gray-1000 truncate\">\n {span.name}\n </span>\n <button\n type=\"button\"\n className=\"p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors\"\n onClick={onClose}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"overflow-y-auto p-3 space-y-3\">\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5 text-sm\">\n <dt className=\"text-gray-900\">Resource</dt>\n <dd className=\"text-gray-1000 font-mono\">{span.resource}</dd>\n <dt className=\"text-gray-900\">Duration</dt>\n <dd className=\"text-gray-1000 tabular-nums font-mono\">\n {formatDuration(durationMs)}\n </dd>\n <dt className=\"text-gray-900\">Offset</dt>\n <dd className=\"text-gray-1000 tabular-nums font-mono\">\n +{formatDuration(offsetMs)}\n </dd>\n <dt className=\"text-gray-900\">Status</dt>\n <dd className=\"text-gray-1000 font-mono\">\n {span.status.code === 2 ? 'Error' : 'OK'}\n </dd>\n </dl>\n </div>\n </aside>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/icons.tsx"],"names":[],"mappings":";AAAA,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,OAAO,CACL,6BACc,YAAY,EACxB,MAAM,EAAC,IAAI,qBACK,OAAO,EACvB,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAChC,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,YAEV,eACE,CAAC,EAAC,skCAAskC,EACxkC,IAAI,EAAC,cAAc,GACb,GACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,OAAO,CACL,6BACc,YAAY,EACxB,MAAM,EAAC,IAAI,qBACK,OAAO,EACvB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,EACV,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAEhC,eACE,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,06CAA06C,EAC56C,IAAI,EAAC,cAAc,GACb,GACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,GAAG,EAAE;IACrB,OAAO,CACL,6BACc,YAAY,EACxB,MAAM,EAAC,IAAI,EACX,cAAc,EAAC,OAAO,EACtB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,EACV,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAEhC,eACE,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,kmBAAkmB,EACpmB,IAAI,EAAC,cAAc,GACb,GACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE;IAC3B,OAAO,CACL,6BACc,YAAY,EACxB,MAAM,EAAC,IAAI,EACX,cAAc,EAAC,OAAO,EACtB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,EACV,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAEhC,eACE,QAAQ,EAAC,SAAS,EAClB,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,0bAA0b,EAC5b,IAAI,EAAC,cAAc,GACb,GACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC","sourcesContent":["const WorkflowIcon = () => {\n return (\n <svg\n data-testid=\"geist-icon\"\n height=\"16\"\n stroke-linejoin=\"round\"\n style={{ color: 'currentColor' }}\n viewBox=\"0 0 16 16\"\n width=\"16\"\n >\n <path\n d=\"M5.75 7L6.4209 7.33594L4.85254 10.4717C5.38789 10.771 5.75 11.3431 5.75 12V14C5.75 14.9665 4.96648 15.75 4 15.75H2C1.03352 15.75 0.25 14.9665 0.25 14V12C0.25 11.0335 1.03352 10.25 2 10.25H3.28711L5.0791 6.66504L5.75 7ZM14 10.25C14.9665 10.25 15.75 11.0335 15.75 12V14C15.75 14.9665 14.9665 15.75 14 15.75H12C11.1185 15.75 10.3909 15.098 10.2695 14.25H7V12.75H10.25V12C10.25 11.0335 11.0335 10.25 12 10.25H14ZM2 11.75C1.86192 11.75 1.75 11.8619 1.75 12V14C1.75 14.1381 1.86192 14.25 2 14.25H4C4.13808 14.25 4.25 14.1381 4.25 14V12C4.25 11.8619 4.13808 11.75 4 11.75H2ZM12 11.75C11.8619 11.75 11.75 11.8619 11.75 12V14C11.75 14.1381 11.8619 14.25 12 14.25H14C14.1381 14.25 14.25 14.1381 14.25 14V12C14.25 11.8619 14.1381 11.75 14 11.75H12ZM9 0.25C9.96649 0.25 10.75 1.03351 10.75 2V4C10.75 4.44642 10.5808 4.85197 10.3057 5.16113L12.2041 8.6416L10.8877 9.36035L8.91895 5.75H7C6.03351 5.75 5.25 4.96649 5.25 4V2C5.25 1.03351 6.03351 0.25 7 0.25H9ZM7 1.75C6.86193 1.75 6.75 1.86193 6.75 2V4C6.75 4.13807 6.86193 4.25 7 4.25H9C9.13807 4.25 9.25 4.13807 9.25 4V2C9.25 1.86193 9.13807 1.75 9 1.75H7Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n );\n};\n\nconst WebhookIcon = () => {\n return (\n <svg\n data-testid=\"geist-icon\"\n height=\"16\"\n stroke-linejoin=\"round\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n style={{ color: 'currentColor' }}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.8349 3.24994C5.14454 4.44567 5.55423 5.97464 6.74996 6.665L7.39465 7.03721L7.02726 7.68466L5.14599 11C5.21289 11.1531 5.25 11.3222 5.25 11.5C5.25 12.1904 4.69036 12.75 4 12.75C3.30964 12.75 2.75 12.1904 2.75 11.5C2.75 10.8634 3.22584 10.338 3.84123 10.26L5.38944 7.5316C3.95909 6.30274 3.55857 4.19264 4.53586 2.49994C5.64043 0.586765 8.08679 -0.0687357 9.99996 1.03583C11.836 2.09584 12.5137 4.39156 11.5892 6.26591L10.4949 4.33754C10.4418 3.53274 10.0009 2.76843 9.24996 2.33487C8.05423 1.64452 6.52525 2.0542 5.8349 3.24994ZM9.146 4.99996C9.21289 4.84686 9.25 4.67776 9.25 4.5C9.25 3.80964 8.69036 3.25 8 3.25C7.30964 3.25 6.75 3.80964 6.75 4.5C6.75 5.13659 7.22586 5.66203 7.84127 5.74002L9.72266 9.05556L10.0956 9.71274L10.75 9.33493C11.9457 8.64458 13.4747 9.05427 14.165 10.25C14.8554 11.4457 14.4457 12.9747 13.25 13.6651C12.5047 14.0953 11.63 14.0983 10.9096 13.75H8.69252C9.85895 15.4685 12.1727 16.0191 14 14.9641C15.9131 13.8595 16.5686 11.4132 15.4641 9.5C14.4886 7.81038 12.4665 7.10169 10.6895 7.71998L9.146 4.99996ZM13.25 11.5C13.25 12.1904 12.6904 12.75 12 12.75C11.591 12.75 11.228 12.5536 10.9999 12.25H7.9298C7.57875 14.1006 5.95279 15.5 4 15.5C1.79086 15.5 0 13.7091 0 11.5C0 9.40018 1.61801 7.67826 3.67529 7.51299L2.58098 9.44147C1.92792 9.89251 1.5 10.6463 1.5 11.5C1.5 12.8807 2.61929 14 4 14C5.38071 14 6.5 12.8807 6.5 11.5V10.75H7.25H10.9999C11.228 10.4464 11.591 10.25 12 10.25C12.6904 10.25 13.25 10.8096 13.25 11.5Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n );\n};\n\nconst SleepIcon = () => {\n return (\n <svg\n data-testid=\"geist-icon\"\n height=\"16\"\n strokeLinejoin=\"round\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n style={{ color: 'currentColor' }}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.25 1.25V2.03971C5.87928 2.18571 4.62678 2.72736 3.6089 3.54824L3.03033 2.96967L2.5 2.43934L1.43934 3.5L1.96967 4.03033L2.54824 4.6089C1.57979 5.80976 1 7.33717 1 9C1 12.866 4.13401 16 8 16C11.866 16 15 12.866 15 9C15 7.33717 14.4202 5.80976 13.4518 4.6089L14.0303 4.03033L14.5607 3.5L13.5 2.43934L12.9697 2.96967L12.3911 3.54824C11.3732 2.72736 10.1207 2.18571 8.75 2.03971V1.25H9.25H10V-0.25H9.25H8.75H7.25H6.75H6V1.25H6.75H7.25ZM2.5 9C2.5 5.96243 4.96243 3.5 8 3.5C11.0376 3.5 13.5 5.96243 13.5 9C13.5 12.0376 11.0376 14.5 8 14.5C4.96243 14.5 2.5 12.0376 2.5 9ZM8.75 6.75V6H7.25V6.75V9V9.75H8.75V9V6.75Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n );\n};\n\nconst StepForwardIcon = () => {\n return (\n <svg\n data-testid=\"geist-icon\"\n height=\"16\"\n strokeLinejoin=\"round\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n style={{ color: 'currentColor' }}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.21969 12.5303L4.75002 13.0607L5.81068 12L5.28035 11.4697L1.81068 7.99999L5.28035 4.53032L5.81068 3.99999L4.75002 2.93933L4.21969 3.46966L0.39647 7.29289C0.00594562 7.68341 0.00594562 8.31658 0.39647 8.7071L4.21969 12.5303ZM11.7804 12.5303L11.25 13.0607L10.1894 12L10.7197 11.4697L14.1894 7.99999L10.7197 4.53032L10.1894 3.99999L11.25 2.93933L11.7804 3.46966L15.6036 7.29289C15.9941 7.68341 15.9941 8.31658 15.6036 8.7071L11.7804 12.5303Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n );\n};\n\nexport { WorkflowIcon, WebhookIcon, SleepIcon, StepForwardIcon };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-viewer.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/trace-viewer.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport { RotateCcw, Search, X, ZoomIn, ZoomOut } from 'lucide-react';\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useReducedMotion } from '../../hooks/use-reduced-motion';\nimport { ErrorBoundary } from '../error-boundary';\nimport {\n EntityDetailPanel,\n type SelectedSpanInfo,\n} from '../sidebar/entity-detail-panel';\nimport { useSidebarDataOptional } from '../sidebar/sidebar-data-context';\nimport type { Trace } from '../trace-viewer/types';\nimport { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';\nimport { CopyButton } from './components/copy-button';\nimport EventList from './components/event-list';\nimport { SplitPane } from './components/split-pane';\nimport {\n Timeline,\n TimelineHeader,\n TIMELINE_PADDING_PX,\n} from './components/timeline';\nimport { ActiveSpanProvider, useActiveSpan } from './context';\nimport { DetailPanel } from './detail-panel';\nimport { computeRootBounds, computeTimeMarkers } from './utils';\n\ninterface NewTraceViewerProps {\n trace: Trace;\n}\n\nconst MIN_VIEWPORT_MS = 0.001;\n\ninterface Viewport {\n start: number;\n end: number;\n}\n\nfunction useAnimatedViewport(initial: Viewport) {\n const [viewport, setViewportState] = useState<Viewport>(initial);\n const animRef = useRef<{\n raf: number;\n from: Viewport;\n to: Viewport;\n start: number;\n } | null>(null);\n const currentRef = useRef(initial);\n currentRef.current = viewport;\n const reducedMotion = useReducedMotion();\n\n const cancel = useCallback(() => {\n if (animRef.current) {\n cancelAnimationFrame(animRef.current.raf);\n animRef.current = null;\n }\n }, []);\n\n const animateTo = useCallback(\n (target: Viewport) => {\n cancel();\n\n if (reducedMotion) {\n currentRef.current = target;\n setViewportState(target);\n return;\n }\n\n const from = currentRef.current;\n const anim = { raf: 0, from, to: target, start: performance.now() };\n\n const tick = () => {\n const t = Math.min((performance.now() - anim.start) / 150, 1);\n const e = 1 - (1 - t) * (1 - t);\n setViewportState({\n start: anim.from.start + (anim.to.start - anim.from.start) * e,\n end: anim.from.end + (anim.to.end - anim.from.end) * e,\n });\n if (t < 1) anim.raf = requestAnimationFrame(tick);\n else animRef.current = null;\n };\n\n animRef.current = anim;\n anim.raf = requestAnimationFrame(tick);\n },\n [cancel, reducedMotion]\n );\n\n const setViewport = useCallback(\n (update: Viewport | ((prev: Viewport) => Viewport)) => {\n cancel();\n if (typeof update === 'function') {\n setViewportState((prev) => {\n const next = update(prev);\n currentRef.current = next;\n return next;\n });\n } else {\n currentRef.current = update;\n setViewportState(update);\n }\n },\n [cancel]\n );\n\n useEffect(() => cancel, [cancel]);\n\n return { viewport, setViewport, animateTo };\n}\n\n// ---------------------------------------------------------------------------\n// Hook: bridge ActiveSpanContext + SidebarDataContext → SelectedSpanInfo\n// ---------------------------------------------------------------------------\n\nfunction useSelectedSpanInfo(): SelectedSpanInfo | null {\n const { activeSpan } = useActiveSpan();\n const sidebar = useSidebarDataOptional();\n\n return useMemo(() => {\n if (!activeSpan || !sidebar) return null;\n\n const correlationId = activeSpan.spanId;\n const rawEvents = correlationId\n ? sidebar.events.filter((e) => e.correlationId === correlationId)\n : [];\n\n return {\n data: activeSpan.attributes?.data,\n resource: activeSpan.attributes?.resource as string | undefined,\n spanId: activeSpan.spanId,\n rawEvents,\n };\n }, [activeSpan, sidebar?.events]);\n}\n\n// ---------------------------------------------------------------------------\n// Root component\n// ---------------------------------------------------------------------------\n\nexport function NewTraceViewer({ trace }: NewTraceViewerProps): ReactNode {\n return (\n <ActiveSpanProvider spans={trace.spans}>\n <NewTraceViewerContent trace={trace} />\n </ActiveSpanProvider>\n );\n}\n\nfunction NewTraceViewerContent({ trace }: NewTraceViewerProps): ReactNode {\n const { activeSpan, activeSpanId, setActiveSpan, clearActiveSpan } =\n useActiveSpan();\n\n const sidebar = useSidebarDataOptional();\n const selectedSpan = useSelectedSpanInfo();\n\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredSpans = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return trace.spans;\n return trace.spans.filter(\n (s) =>\n s.name.toLowerCase().includes(q) || s.resource.toLowerCase().includes(q)\n );\n }, [trace.spans, searchQuery]);\n\n const root = useMemo(() => computeRootBounds(trace.spans), [trace.spans]);\n\n const { viewport, setViewport, animateTo } = useAnimatedViewport({\n start: root.startTime,\n end: root.startTime + root.duration,\n });\n\n const prevRootRef = useRef<Viewport>({\n start: root.startTime,\n end: root.startTime + root.duration,\n });\n\n useEffect(() => {\n const prevRoot = prevRootRef.current;\n const newStart = root.startTime;\n const newEnd = root.startTime + root.duration;\n\n setViewport((prev) => {\n const wasAtFullExtent =\n Math.abs(prev.start - prevRoot.start) < 0.01 &&\n Math.abs(prev.end - prevRoot.end) < 0.01;\n\n if (wasAtFullExtent) {\n return { start: newStart, end: newEnd };\n }\n return prev;\n });\n\n prevRootRef.current = { start: newStart, end: newEnd };\n }, [root.startTime, root.duration]);\n\n const viewDuration = viewport.end - viewport.start;\n\n const timeMarkers = useMemo(\n () => computeTimeMarkers(viewDuration, viewport.start - root.startTime),\n [viewDuration, viewport.start, root.startTime]\n );\n\n const resetZoom = useCallback(() => {\n animateTo({ start: root.startTime, end: root.startTime + root.duration });\n }, [animateTo, root.startTime, root.duration]);\n\n const ZOOM_FACTOR = 0.5;\n\n const zoomBy = useCallback(\n (factor: number) => {\n const rootS = root.startTime;\n const rootE = root.startTime + root.duration;\n const rootD = root.duration;\n\n setViewport((prev) => {\n const prevDuration = prev.end - prev.start;\n const center = (prev.start + prev.end) / 2;\n const newDuration = Math.max(\n MIN_VIEWPORT_MS,\n Math.min(rootD, prevDuration * factor)\n );\n let newStart = center - newDuration / 2;\n let newEnd = center + newDuration / 2;\n\n if (newStart < rootS) {\n newStart = rootS;\n newEnd = rootS + newDuration;\n }\n if (newEnd > rootE) {\n newEnd = rootE;\n newStart = Math.max(rootS, rootE - newDuration);\n }\n\n return { start: newStart, end: newEnd };\n });\n },\n [setViewport, root.startTime, root.duration]\n );\n\n const zoomIn = useCallback(() => zoomBy(ZOOM_FACTOR), [zoomBy]);\n const zoomOut = useCallback(() => zoomBy(1 / ZOOM_FACTOR), [zoomBy]);\n\n const handleSelectSpan = useCallback(\n (spanId: string) => {\n if (spanId === activeSpanId) {\n clearActiveSpan();\n return;\n }\n setActiveSpan(spanId);\n\n const span = trace.spans.find((s) => s.spanId === spanId);\n if (!span) return;\n\n const spanStart = getHighResInMs(span.startTime);\n const spanEnd = getHighResInMs(span.endTime);\n const spanDuration = spanEnd - spanStart;\n\n const rootS = root.startTime;\n const rootE = root.startTime + root.duration;\n const rootD = root.duration;\n\n if (spanDuration > rootD * 0.8) {\n animateTo({ start: rootS, end: rootE });\n return;\n }\n\n const padding = Math.max(spanDuration * 0.2, MIN_VIEWPORT_MS / 2);\n let newStart = spanStart - padding;\n let newEnd = spanEnd + padding;\n\n if (newEnd - newStart < MIN_VIEWPORT_MS) {\n const center = (spanStart + spanEnd) / 2;\n newStart = center - MIN_VIEWPORT_MS / 2;\n newEnd = center + MIN_VIEWPORT_MS / 2;\n }\n\n if (newStart < rootS) {\n const duration = newEnd - newStart;\n newStart = rootS;\n newEnd = Math.min(rootE, rootS + duration);\n }\n if (newEnd > rootE) {\n const duration = newEnd - newStart;\n newEnd = rootE;\n newStart = Math.max(rootS, rootE - duration);\n }\n\n animateTo({ start: newStart, end: newEnd });\n },\n [\n animateTo,\n setActiveSpan,\n clearActiveSpan,\n activeSpanId,\n trace.spans,\n root.startTime,\n root.duration,\n ]\n );\n\n const [altHeld, setAltHeld] = useState(false);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n clearActiveSpan();\n }\n if (e.key === 'Alt') {\n e.preventDefault();\n setAltHeld(true);\n }\n };\n const onKeyUp = (e: KeyboardEvent): void => {\n if (e.key === 'Alt') setAltHeld(false);\n };\n const onBlur = (): void => setAltHeld(false);\n\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n window.removeEventListener('blur', onBlur);\n };\n }, [clearActiveSpan]);\n\n const timelineRef = useRef<HTMLDivElement>(null);\n const [hoverFraction, setHoverFraction] = useState<number | null>(null);\n\n const hoverInfo = useMemo(() => {\n if (hoverFraction == null) return null;\n const absTime = viewport.start + hoverFraction * viewDuration;\n const offset = absTime - root.startTime;\n return { fraction: hoverFraction, label: formatDuration(offset, true) };\n }, [hoverFraction, viewport.start, viewDuration, root.startTime]);\n\n const handleTimelineMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const el = timelineRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const contentWidth = rect.width - TIMELINE_PADDING_PX * 2;\n if (contentWidth <= 0) return;\n const fraction = Math.max(\n 0,\n Math.min(\n 1,\n (e.clientX - rect.left - TIMELINE_PADDING_PX) / contentWidth\n )\n );\n setHoverFraction(fraction);\n },\n []\n );\n\n const handleTimelineMouseLeave = useCallback(() => {\n setHoverFraction(null);\n }, []);\n\n useEffect(() => {\n const el = timelineRef.current;\n if (!el) return;\n\n const rootS = root.startTime;\n const rootE = root.startTime + root.duration;\n const rootD = root.duration;\n if (rootD <= 0) return;\n\n const onWheel = (e: WheelEvent): void => {\n const isZoomGesture = e.ctrlKey || e.metaKey;\n const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);\n\n if (!isZoomGesture && !hasDeltaX) return;\n e.preventDefault();\n\n const rect = el.getBoundingClientRect();\n const contentWidth = rect.width - TIMELINE_PADDING_PX * 2;\n if (contentWidth <= 0) return;\n\n if (isZoomGesture) {\n let dy = e.deltaY;\n if (e.deltaMode === 1) dy *= 16;\n\n const cursorFraction = Math.max(\n 0,\n Math.min(\n 1,\n (e.clientX - rect.left - TIMELINE_PADDING_PX) / contentWidth\n )\n );\n const scaleFactor = Math.pow(2, dy / 200);\n\n setViewport((prev) => {\n const prevDuration = prev.end - prev.start;\n const cursorTime = prev.start + cursorFraction * prevDuration;\n const newDuration = Math.max(\n MIN_VIEWPORT_MS,\n Math.min(rootD, prevDuration * scaleFactor)\n );\n\n let newStart = cursorTime - cursorFraction * newDuration;\n let newEnd = newStart + newDuration;\n\n if (newStart < rootS) {\n newStart = rootS;\n newEnd = rootS + newDuration;\n }\n if (newEnd > rootE) {\n newEnd = rootE;\n newStart = Math.max(rootS, rootE - newDuration);\n }\n\n return { start: newStart, end: newEnd };\n });\n } else {\n let dx = e.deltaX;\n if (e.deltaMode === 1) dx *= 16;\n\n setViewport((prev) => {\n const prevDuration = prev.end - prev.start;\n const panAmount = (dx / contentWidth) * prevDuration;\n\n let newStart = prev.start + panAmount;\n let newEnd = prev.end + panAmount;\n\n if (newStart < rootS) {\n newStart = rootS;\n newEnd = rootS + prevDuration;\n }\n if (newEnd > rootE) {\n newEnd = rootE;\n newStart = Math.max(rootS, rootE - prevDuration);\n }\n\n return { start: newStart, end: newEnd };\n });\n }\n };\n\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [root.startTime, root.duration]);\n\n // Derive the selected span name and metadata for the panel header\n const selectedSpanName = useMemo(() => {\n if (!selectedSpan?.data) return 'Details';\n const data = selectedSpan.data as Record<string, unknown>;\n if (selectedSpan.resource === 'hook') {\n return (data.token as string | undefined) ?? (data.hookId as string);\n }\n\n const stepName = data.stepName as string | undefined;\n const workflowName = data.workflowName as string | undefined;\n return (\n (stepName ? parseStepName(stepName)?.shortName : undefined) ??\n (workflowName ? parseWorkflowName(workflowName)?.shortName : undefined) ??\n stepName ??\n workflowName ??\n (data.hookId as string) ??\n 'Details'\n );\n }, [selectedSpan?.data, selectedSpan?.resource]);\n\n const selectedResource = selectedSpan?.resource as string | undefined;\n const selectedResourceId = useMemo(() => {\n if (!selectedSpan?.data) return undefined;\n const data = selectedSpan.data as Record<string, unknown>;\n if (selectedSpan.resource === 'hook') {\n return (data.hookId as string | undefined) ?? selectedSpan.spanId;\n }\n\n return (\n (data.stepId as string) ??\n (data.runId as string) ??\n (data.hookId as string) ??\n selectedSpan.spanId\n );\n }, [selectedSpan?.data, selectedSpan?.resource, selectedSpan?.spanId]);\n\n return (\n <div\n data-pane=\"pane-root\"\n data-has-detail={activeSpan ? '' : undefined}\n className=\"grid w-full h-full max-h-full grid-cols-[minmax(100px,1fr)] data-[has-detail]:grid-cols-[minmax(100px,1fr)_clamp(280px,420px,100%)]\"\n >\n <div\n id=\"trace-parent\"\n className=\"grid grid-rows-[1fr] h-full min-h-0 overflow-hidden relative bg-background-100\"\n >\n <SplitPane\n startHeader={\n <div className=\"bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center px-2 gap-1.5\">\n <Search className=\"w-3.5 h-3.5 shrink-0 text-gray-800\" />\n <input\n id=\"trace-viewer-search\"\n name=\"trace-viewer-search\"\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search spans...\"\n aria-label=\"Search spans\"\n className=\"flex-1 min-w-0 bg-transparent text-sm text-gray-1000 placeholder:text-gray-800 outline-none\"\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"shrink-0 p-0.5 rounded-sm text-gray-800 hover:text-gray-1000 hover:bg-gray-200 transition-colors\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n }\n endHeader={\n <TimelineHeader markers={timeMarkers} hoverInfo={hoverInfo} />\n }\n >\n <div className=\"block overflow-visible\">\n <EventList\n spans={filteredSpans}\n activeSpanId={activeSpanId}\n onSelectSpan={handleSelectSpan}\n />\n </div>\n <div\n ref={timelineRef}\n className=\"block min-h-0 overflow-visible relative\"\n onDoubleClick={resetZoom}\n onMouseMove={handleTimelineMouseMove}\n onMouseLeave={handleTimelineMouseLeave}\n >\n <Timeline\n spans={filteredSpans}\n viewStart={viewport.start}\n viewEnd={viewport.end}\n markers={timeMarkers}\n selectedId={activeSpanId}\n onSelect={handleSelectSpan}\n hoverFraction={hoverFraction}\n altHeld={altHeld}\n />\n </div>\n </SplitPane>\n <div className=\"absolute right-3 bottom-3 z-[5] flex items-center border border-gray-alpha-400 rounded-lg bg-background-100 shadow-sm overflow-hidden divide-x divide-gray-alpha-400\">\n <button\n type=\"button\"\n className=\"flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100\"\n onClick={zoomOut}\n aria-label=\"Zoom out\"\n >\n <ZoomOut className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n className=\"flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100\"\n onClick={resetZoom}\n aria-label=\"Reset zoom\"\n >\n <RotateCcw className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n className=\"flex items-center justify-center w-8 h-8 text-gray-900 cursor-pointer transition-colors duration-[time:120ms] ease-in-out hover:text-gray-1000 hover:bg-gray-alpha-100\"\n onClick={zoomIn}\n aria-label=\"Zoom in\"\n >\n <ZoomIn className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Detail panel */}\n {activeSpan && sidebar ? (\n <aside className=\"flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto\">\n {/* Panel header */}\n <div className=\"flex-shrink-0 px-4 pt-4 pb-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-[15px] font-semibold text-gray-1000 truncate block\">\n {selectedSpanName}\n </span>\n {selectedResourceId && (\n <div className=\"mt-1 flex items-center gap-2\">\n {selectedResource && (\n <span\n className={`inline-flex items-center rounded-md px-1.5 py-0.5 text-[11px] font-medium leading-none shrink-0 ${\n selectedResource === 'step'\n ? 'bg-green-200 text-green-900'\n : selectedResource === 'run'\n ? 'bg-blue-200 text-blue-900'\n : 'bg-gray-200 text-gray-900'\n }`}\n >\n {selectedResource.charAt(0).toUpperCase() +\n selectedResource.slice(1)}\n </span>\n )}\n <div\n className=\"flex items-center gap-1 text-[13px] font-mono text-gray-700 min-w-0\"\n title={selectedResourceId}\n >\n <span className=\"truncate\">{selectedResourceId}</span>\n <CopyButton\n copyText={selectedResourceId}\n ariaLabel=\"Copy ID\"\n className=\"shrink-0\"\n />\n </div>\n </div>\n )}\n </div>\n <button\n type=\"button\"\n className=\"p-1 rounded-md text-gray-900 hover:text-gray-1000 hover:bg-gray-alpha-200 transition-colors shrink-0\"\n onClick={clearActiveSpan}\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n {/* Panel body */}\n <div className=\"flex-1 overflow-y-auto\">\n <ErrorBoundary>\n <EntityDetailPanel\n run={sidebar.run}\n onStreamClick={sidebar.onStreamClick}\n onRunClick={sidebar.onRunClick}\n spanDetailData={sidebar.spanDetailData}\n spanDetailError={sidebar.spanDetailError}\n spanDetailLoading={sidebar.spanDetailLoading}\n onSpanSelect={sidebar.onSpanSelect}\n onWakeUpSleep={sidebar.onWakeUpSleep}\n onLoadEventData={sidebar.onLoadEventData}\n onResolveHook={sidebar.onResolveHook}\n encryptionKey={sidebar.encryptionKey}\n onDecrypt={sidebar.onDecrypt}\n isDecrypting={sidebar.isDecrypting}\n selectedSpan={selectedSpan}\n />\n </ErrorBoundary>\n </div>\n </aside>\n ) : activeSpan ? (\n <DetailPanel\n span={activeSpan}\n rootStart={root.startTime}\n onClose={clearActiveSpan}\n />\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/types.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/util/constants.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Span, SpanEvent } from '../trace-viewer/types';\nimport { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';\n\n// ---------------------------------------------------------------------------\n// Root bounds\n// ---------------------------------------------------------------------------\n\nexport interface RootBounds {\n startTime: number;\n endTime: number;\n duration: number;\n}\n\nexport function computeRootBounds(spans: Span[]): RootBounds {\n let minStart = Number.POSITIVE_INFINITY;\n let maxEnd = Number.NEGATIVE_INFINITY;\n\n for (const span of spans) {\n const s = getHighResInMs(span.startTime);\n const e = getHighResInMs(span.endTime);\n if (s < minStart) minStart = s;\n if (e > maxEnd) maxEnd = e;\n }\n\n if (!Number.isFinite(minStart) || !Number.isFinite(maxEnd)) {\n return { startTime: 0, endTime: 1, duration: 1 };\n }\n\n const duration = Math.max(maxEnd - minStart, 1);\n return { startTime: minStart, endTime: maxEnd, duration };\n}\n\nexport function getSpanDurationMs(span: Span): number {\n return Math.max(\n 0,\n getHighResInMs(span.endTime) - getHighResInMs(span.startTime)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Time markers\n// ---------------------------------------------------------------------------\n\nexport interface TimeMarker {\n position: number;\n label: string;\n value: number;\n}\n\nconst NICE_INTERVALS = [\n 1, 2, 5, 10, 20, 50, 100, 200, 500, 1_000, 2_000, 5_000, 10_000, 20_000,\n 50_000, 100_000, 200_000, 500_000, 1_000_000, 2_000_000, 5_000_000,\n 10_000_000, 20_000_000, 50_000_000, 100_000_000, 200_000_000, 500_000_000,\n 1_000_000_000, 2_000_000_000, 5_000_000_000,\n];\n\nconst MAX_MARKERS = 8;\n\nfunction pickInterval(viewDuration: number, maxTicks: number): number {\n for (const interval of NICE_INTERVALS) {\n if (viewDuration / interval <= maxTicks) return interval;\n }\n return NICE_INTERVALS[NICE_INTERVALS.length - 1];\n}\n\nexport function computeTimeMarkers(\n viewDuration: number,\n offset: number\n): TimeMarker[] {\n if (viewDuration <= 0) return [];\n\n const maxTicks = 6;\n const interval = pickInterval(viewDuration, maxTicks);\n\n const firstTick = Math.ceil(offset / interval) * interval;\n const markers: TimeMarker[] = [];\n\n for (let t = firstTick; t <= offset + viewDuration; t += interval) {\n const position = (t - offset) / viewDuration;\n if (position < -0.01 || position > 1.01) continue;\n markers.push({\n position: Math.min(Math.max(position, 0), 1),\n label: formatDuration(Math.abs(t), true),\n value: t,\n });\n if (markers.length >= MAX_MARKERS) break;\n }\n\n return markers;\n}\n\n// ---------------------------------------------------------------------------\n// Span gaps — time deltas between consecutive spans (Alt-key overlay)\n// ---------------------------------------------------------------------------\n\nexport interface SpanGap {\n gapMs: number;\n leftFrac: number;\n rightFrac: number;\n rowIndex: number;\n}\n\nexport function computeSpanGaps(\n spans: Span[],\n viewStart: number,\n viewEnd: number\n): SpanGap[] {\n const range = viewEnd - viewStart;\n if (range <= 0) return [];\n\n const gaps: SpanGap[] = [];\n for (let i = 0; i < spans.length - 1; i++) {\n const endTime = getHighResInMs(spans[i].endTime);\n const startTime = getHighResInMs(spans[i + 1].startTime);\n const gapMs = startTime - endTime;\n if (gapMs <= 0) continue;\n\n const leftFrac = Math.min(Math.max((endTime - viewStart) / range, 0), 1);\n const rightFrac = Math.min(Math.max((startTime - viewStart) / range, 0), 1);\n if (rightFrac - leftFrac < 0.001) continue;\n\n gaps.push({ gapMs, leftFrac, rightFrac, rowIndex: i });\n }\n return gaps;\n}\n\n// ---------------------------------------------------------------------------\n// Resource colors\n// ---------------------------------------------------------------------------\n\nexport const RESOURCE_COLORS: Record<\n string,\n {\n bg: string;\n border: string;\n errorBg?: string;\n errorBorder?: string;\n }\n> = {\n run: {\n bg: 'var(--ds-blue-200)',\n border: 'var(--ds-blue-500)',\n errorBg: 'var(--ds-red-200)',\n errorBorder: 'var(--ds-red-500)',\n },\n step: {\n bg: 'var(--ds-green-200)',\n border: 'var(--ds-green-500)',\n errorBg: 'var(--ds-red-200)',\n errorBorder: 'var(--ds-red-500)',\n },\n hook: {\n bg: 'var(--ds-amber-200)',\n border: 'var(--ds-amber-500)',\n errorBg: 'var(--ds-red-200)',\n errorBorder: 'var(--ds-red-500)',\n },\n sleep: {\n bg: 'var(--ds-purple-200)',\n border: 'var(--ds-purple-500)',\n errorBg: 'var(--ds-red-200)',\n errorBorder: 'var(--ds-red-500)',\n },\n default: {\n bg: 'var(--ds-gray-200)',\n border: 'var(--ds-gray-500)',\n errorBg: 'var(--ds-red-200)',\n errorBorder: 'var(--ds-red-500)',\n },\n};\n\nexport function getResourceColor(resource: string): {\n bg: string;\n border: string;\n errorBg?: string;\n errorBorder?: string;\n} {\n return RESOURCE_COLORS[resource] ?? RESOURCE_COLORS.default;\n}\n\n// ---------------------------------------------------------------------------\n// Span segments — split a timeline bar into colored sections by event state\n// ---------------------------------------------------------------------------\n\nexport type SegmentStatus =\n | 'queued'\n | 'running'\n | 'failed'\n | 'retrying'\n | 'succeeded'\n | 'waiting'\n | 'sleeping'\n | 'received';\n\nexport interface Segment {\n startFraction: number;\n endFraction: number;\n status: SegmentStatus;\n}\n\nfunction clampFraction(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction timeToFraction(\n time: number,\n spanStart: number,\n spanDuration: number\n): number {\n if (spanDuration <= 0) return 0;\n return clampFraction((time - spanStart) / spanDuration);\n}\n\ninterface EventMark {\n time: number;\n type: string;\n}\n\nfunction sortedEventMarks(\n events: SpanEvent[],\n relevantNames: string[]\n): EventMark[] {\n return events\n .filter((e) => relevantNames.includes(e.name))\n .map((e) => ({ time: getHighResInMs(e.timestamp), type: e.name }))\n .sort((a, b) => a.time - b.time);\n}\n\nfunction computeStepSegmentsFromSpan(\n startMs: number,\n duration: number,\n events: SpanEvent[]\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const marks = sortedEventMarks(events, [\n 'step_started',\n 'step_retrying',\n 'step_failed',\n 'step_completed',\n ]);\n\n if (marks.length === 0) {\n segments.push({ startFraction: 0, endFraction: 1, status: 'running' });\n return segments;\n }\n\n const firstFraction = timeToFraction(marks[0].time, startMs, duration);\n if (firstFraction > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: firstFraction,\n status: 'queued',\n });\n }\n\n for (let i = 0; i < marks.length; i++) {\n const mark = marks[i];\n const markFrac = timeToFraction(mark.time, startMs, duration);\n const nextMark = marks[i + 1];\n const nextFrac = nextMark\n ? timeToFraction(nextMark.time, startMs, duration)\n : 1;\n\n if (mark.type === 'step_started') {\n if (i === marks.length - 1) {\n segments.push({\n startFraction: markFrac,\n endFraction: 1,\n status: 'succeeded',\n });\n } else {\n const nextType = nextMark.type;\n const attemptStatus: SegmentStatus =\n nextType === 'step_retrying' || nextType === 'step_failed'\n ? 'failed'\n : nextType === 'step_completed'\n ? 'succeeded'\n : 'running';\n segments.push({\n startFraction: markFrac,\n endFraction: nextFrac,\n status: attemptStatus,\n });\n }\n } else if (mark.type === 'step_retrying') {\n segments.push({\n startFraction: markFrac,\n endFraction: nextFrac,\n status: 'retrying',\n });\n } else if (mark.type === 'step_failed') {\n if (markFrac < 0.999) {\n segments.push({\n startFraction: markFrac,\n endFraction: 1,\n status: 'failed',\n });\n }\n }\n }\n\n return segments;\n}\n\nfunction computeHookSegmentsFromSpan(\n startMs: number,\n duration: number,\n events: SpanEvent[]\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const sorted = [...events]\n .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))\n .sort((a, b) => a.time - b.time);\n\n const received = sorted.find((e) => e.name === 'hook_received');\n const disposed = sorted.find((e) => e.name === 'hook_disposed');\n\n if (!received && !disposed) {\n segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });\n return segments;\n }\n\n const receivedFrac = received\n ? timeToFraction(received.time, startMs, duration)\n : null;\n const disposedFrac = disposed\n ? timeToFraction(disposed.time, startMs, duration)\n : null;\n\n if (receivedFrac !== null && receivedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: receivedFrac,\n status: 'waiting',\n });\n } else if (receivedFrac === null && disposedFrac !== null) {\n segments.push({\n startFraction: 0,\n endFraction: disposedFrac,\n status: 'waiting',\n });\n }\n\n if (receivedFrac !== null) {\n segments.push({\n startFraction: receivedFrac,\n endFraction: disposedFrac ?? 1,\n status: 'received',\n });\n }\n\n if (disposedFrac !== null && disposedFrac < 0.999) {\n segments.push({\n startFraction: disposedFrac,\n endFraction: 1,\n status: 'succeeded',\n });\n }\n\n return segments;\n}\n\nfunction computeSleepSegmentsFromSpan(\n _startMs: number,\n duration: number,\n _events: SpanEvent[]\n): Segment[] {\n if (duration <= 0) return [];\n return [{ startFraction: 0, endFraction: 1, status: 'sleeping' }];\n}\n\nfunction computeRunSegmentsFromSpan(\n startMs: number,\n duration: number,\n activeStartMs: number | undefined,\n events: SpanEvent[],\n attributes: Record<string, unknown>\n): Segment[] {\n const segments: Segment[] = [];\n if (duration <= 0) return segments;\n\n const sorted = [...events]\n .map((e) => ({ name: e.name, time: getHighResInMs(e.timestamp) }))\n .sort((a, b) => a.time - b.time);\n\n const hasRunCreated = sorted.some((e) => e.name === 'run_created');\n\n if (!hasRunCreated) {\n const runData = attributes?.data as Record<string, unknown> | undefined;\n const runStatus = runData?.status as string | undefined;\n return computeV1RunSegments(startMs, duration, activeStartMs, runStatus);\n }\n\n const failedEvent = sorted.find((e) => e.name === 'run_failed');\n\n let cursor = 0;\n if (activeStartMs !== undefined && activeStartMs > startMs) {\n const queuedFrac = timeToFraction(activeStartMs, startMs, duration);\n if (queuedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: queuedFrac,\n status: 'queued',\n });\n cursor = queuedFrac;\n }\n }\n\n segments.push({\n startFraction: cursor,\n endFraction: 1,\n status: failedEvent ? 'failed' : 'running',\n });\n\n return segments;\n}\n\nfunction computeV1RunSegments(\n startMs: number,\n duration: number,\n activeStartMs: number | undefined,\n runStatus: string | undefined\n): Segment[] {\n const segments: Segment[] = [];\n\n let cursor = 0;\n if (activeStartMs !== undefined && activeStartMs > startMs) {\n const queuedFrac = timeToFraction(activeStartMs, startMs, duration);\n if (queuedFrac > 0.001) {\n segments.push({\n startFraction: 0,\n endFraction: queuedFrac,\n status: 'queued',\n });\n cursor = queuedFrac;\n }\n }\n\n segments.push({\n startFraction: cursor,\n endFraction: 1,\n status: runStatus === 'failed' ? 'failed' : 'running',\n });\n\n return segments;\n}\n\n/**\n * Compute event-based segments for a span. Dispatches on `span.resource`\n * to the appropriate resource-type-specific segment builder.\n * Returns an empty array for generic (non-workflow) spans.\n */\nexport function computeSpanSegments(span: Span): Segment[] {\n const startMs = getHighResInMs(span.startTime);\n const duration = getSpanDurationMs(span);\n const activeStartMs = span.activeStartTime\n ? getHighResInMs(span.activeStartTime)\n : undefined;\n\n switch (span.resource) {\n case 'step':\n return computeStepSegmentsFromSpan(startMs, duration, span.events);\n case 'hook':\n return computeHookSegmentsFromSpan(startMs, duration, span.events);\n case 'sleep':\n return computeSleepSegmentsFromSpan(startMs, duration, span.events);\n case 'run':\n return computeRunSegmentsFromSpan(\n startMs,\n duration,\n activeStartMs,\n span.events,\n span.attributes\n );\n default:\n return [];\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-trace-view.js","sourceRoot":"","sources":["../../src/components/run-trace-view.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA4B5D,MAAM,UAAU,YAAY,CAAC,EAC3B,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACA;IAClB,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,OAAO,CACL,eAAK,SAAS,EAAC,KAAK,aAClB,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,EACnC,qDAAiC,EACjC,sBAAI,KAAK,CAAC,OAAO,GAAK,IAClB,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,GACtC,GACE,CACP,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { AlertCircle } from 'lucide-react';\nimport type { SpanSelectionInfo } from './sidebar/entity-detail-panel';\nimport { WorkflowTraceViewer } from './workflow-trace-view';\n\ninterface RunTraceViewProps {\n run: WorkflowRun;\n events: Event[];\n isLoading?: boolean;\n error?: Error | null;\n spanDetailData?: WorkflowRun | Step | Hook | Event | null;\n spanDetailLoading?: boolean;\n spanDetailError?: Error | null;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n onCancelRun?: (runId: string) => Promise<void>;\n onStreamClick?: (streamId: string) => void;\n onRunClick?: (runId: string) => void;\n onSpanSelect?: (info: SpanSelectionInfo) => void;\n onLoadMoreSpans?: () => void | Promise<void>;\n hasMoreSpans?: boolean;\n isLoadingMoreSpans?: boolean;\n}\n\nexport function RunTraceView({\n run,\n events,\n isLoading,\n error,\n spanDetailData,\n spanDetailLoading,\n spanDetailError,\n onWakeUpSleep,\n onResolveHook,\n onCancelRun,\n onStreamClick,\n onRunClick,\n onSpanSelect,\n onLoadMoreSpans,\n hasMoreSpans,\n isLoadingMoreSpans,\n}: RunTraceViewProps) {\n if (error && !run) {\n return (\n <div className=\"m-4\">\n <AlertCircle className=\"h-4 w-4\" />\n <p>Error loading workflow run</p>\n <p>{error.message}</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full h-full relative\">\n <WorkflowTraceViewer\n error={error}\n events={events}\n run={run}\n isLoading={isLoading}\n spanDetailData={spanDetailData}\n spanDetailLoading={spanDetailLoading}\n spanDetailError={spanDetailError}\n onWakeUpSleep={onWakeUpSleep}\n onResolveHook={onResolveHook}\n onCancelRun={onCancelRun}\n onStreamClick={onStreamClick}\n onRunClick={onRunClick}\n onSpanSelect={onSpanSelect}\n onLoadMoreSpans={onLoadMoreSpans}\n hasMoreSpans={hasMoreSpans}\n isLoadingMoreSpans={isLoadingMoreSpans}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attribute-panel.js","sourceRoot":"","sources":["../../../src/components/sidebar/attribute-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport type { ModelMessage } from 'ai';\nimport { Lock } from 'lucide-react';\nimport 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 isSystem: (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 errorCode: (value: unknown) => {\n if (typeof value !== 'string' || value.length === 0) return null;\n return String(value);\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-view.js","sourceRoot":"","sources":["../../../src/components/sidebar/conversation-view.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAyB;IAClE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CACL,cACE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,4BAGlC,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,yBAAyB,YACrC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,IAAa,OAAO,EAAE,OAAO,IAAvB,KAAK,CAAsB,CAChD,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,OAAO,EAA6B;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,CACL,eACE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE;YACL,eAAe,EAAE,KAAK,CAAC,EAAE;YACzB,WAAW,EAAE,KAAK,CAAC,MAAM;SAC1B,aAGD,cACE,SAAS,EAAC,sEAAsE,EAChF,KAAK,EAAE;oBACL,WAAW,EAAE,KAAK,CAAC,MAAM;oBACzB,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB,YAEA,IAAI,GACD,EAGN,cAAK,SAAS,EAAC,uBAAuB,YACnC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,WAAW,IAAS,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAzB,CAAC,CAA4B,CAChD,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC;AAUD,SAAS,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAsC;IACrE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAE5B,sEAAsE;QACtE,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,CACL,cACE,SAAS,EAAC,oFAAoF,EAC9F,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAEvC,KAAC,UAAU,cAAE,IAAI,CAAC,IAAI,GAAc,GAChC,CACP,CAAC;QACJ,CAAC;QAED,OAAO,CACL,cACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAEtC,IAAI,CAAC,IAAI,GACN,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,CACL,eACE,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE;gBACL,eAAe,EAAE,sBAAsB;gBACvC,WAAW,EAAE,sBAAsB;aACpC,aAED,eAAK,SAAS,EAAC,mDAAmD,aAChE,0CAAe,EACf,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,YAAG,IAAI,CAAC,QAAQ,GAAQ,IAClE,EACL,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CACrB,cACE,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAE/C,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAChC,cACE,SAAS,EAAC,aAAa,EACvB,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,YAErC,IAAI,CAAC,KAAK,GACP,CACP,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAI,CACpC,GACG,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAChC,OAAO,CACL,eACE,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE;gBACL,eAAe,EAAE,qBAAqB;gBACtC,WAAW,EAAE,qBAAqB;aACnC,aAED,eAAK,SAAS,EAAC,mDAAmD,aAChE,oCAAc,EACd,gBAAM,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,aAC1C,IAAI,CAAC,QAAQ,eACT,IACH,EACL,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CACtB,cACE,SAAS,EAAC,oEAAoE,EAC9E,KAAK,EAAE,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAE/C,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CACjC,cACE,SAAS,EAAC,aAAa,EACvB,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,YAErC,IAAI,CAAC,MAAM,GACR,CACP,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,GAAI,CACrD,GACG,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO;gBACL,EAAE,EAAE,oBAAoB;gBACxB,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,oBAAoB;aAC5B,CAAC;QACJ,KAAK,WAAW;YACd,OAAO;gBACL,EAAE,EAAE,oBAAoB;gBACxB,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,oBAAoB;aAC5B,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,EAAE,EAAE,qBAAqB;gBACzB,MAAM,EAAE,qBAAqB;gBAC7B,KAAK,EAAE,qBAAqB;aAC7B,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,EAAE,EAAE,oBAAoB;gBACxB,MAAM,EAAE,qBAAqB;gBAC7B,KAAK,EAAE,qBAAqB;aAC7B,CAAC;QACJ;YACE,OAAO;gBACL,EAAE,EAAE,oBAAoB;gBACxB,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,oBAAoB;aAC5B,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAc,EAAE;YACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YACzD,CAAC;YACD,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,OAAO;oBACL,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;gBACjC,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC","sourcesContent":["import type { ModelMessage } from 'ai';\nimport { Streamdown } from 'streamdown';\nimport { DataInspector } from '../ui/data-inspector';\n\ninterface ConversationViewProps {\n messages: ModelMessage[];\n}\n\nexport function ConversationView({ messages }: ConversationViewProps) {\n if (messages.length === 0) {\n return (\n <div\n className=\"text-center py-8 text-[11px]\"\n style={{ color: 'var(--ds-gray-600)' }}\n >\n No messages\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3 p-3\">\n {messages.map((message, index) => (\n <MessageBubble key={index} message={message} />\n ))}\n </div>\n );\n}\n\nfunction MessageBubble({ message }: { message: ModelMessage }) {\n const role = message.role;\n const parts = parseContent(message.content);\n const style = getRoleStyle(role);\n\n return (\n <div\n className=\"rounded-md border text-[11px]\"\n style={{\n backgroundColor: style.bg,\n borderColor: style.border,\n }}\n >\n {/* Role header */}\n <div\n className=\"px-2.5 py-1 border-b text-[10px] font-medium uppercase tracking-wide\"\n style={{\n borderColor: style.border,\n color: style.label,\n }}\n >\n {role}\n </div>\n\n {/* Content */}\n <div className=\"px-2.5 py-2 space-y-2\">\n {parts.map((part, i) => (\n <ContentPart key={i} part={part} role={role} />\n ))}\n </div>\n </div>\n );\n}\n\ninterface ParsedPart {\n type: 'text' | 'tool-call' | 'tool-result';\n text?: string;\n toolName?: string;\n input?: unknown;\n output?: unknown;\n}\n\nfunction ContentPart({ part, role }: { part: ParsedPart; role: string }) {\n if (part.type === 'text') {\n if (!part.text) return null;\n\n // Use Streamdown for assistant messages (they often contain markdown)\n if (role === 'assistant') {\n return (\n <div\n className=\"prose prose-sm max-w-none text-[11px] [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n <Streamdown>{part.text}</Streamdown>\n </div>\n );\n }\n\n return (\n <div\n className=\"whitespace-pre-wrap break-words\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {part.text}\n </div>\n );\n }\n\n if (part.type === 'tool-call') {\n return (\n <div\n className=\"rounded border px-2 py-1.5\"\n style={{\n backgroundColor: 'var(--ds-purple-100)',\n borderColor: 'var(--ds-purple-300)',\n }}\n >\n <div className=\"flex items-center gap-1.5 text-[10px] font-medium\">\n <span>🔧</span>\n <span style={{ color: 'var(--ds-purple-900)' }}>{part.toolName}</span>\n </div>\n {part.input != null && (\n <div\n className=\"mt-1.5 overflow-x-auto p-1.5 rounded\"\n style={{ backgroundColor: 'var(--ds-gray-100)' }}\n >\n {typeof part.input === 'string' ? (\n <pre\n className=\"text-[10px]\"\n style={{ color: 'var(--ds-gray-800)' }}\n >\n {part.input}\n </pre>\n ) : (\n <DataInspector data={part.input} />\n )}\n </div>\n )}\n </div>\n );\n }\n\n if (part.type === 'tool-result') {\n return (\n <div\n className=\"rounded border px-2 py-1.5\"\n style={{\n backgroundColor: 'var(--ds-green-100)',\n borderColor: 'var(--ds-green-300)',\n }}\n >\n <div className=\"flex items-center gap-1.5 text-[10px] font-medium\">\n <span>✓</span>\n <span style={{ color: 'var(--ds-green-900)' }}>\n {part.toolName} result\n </span>\n </div>\n {part.output != null && (\n <div\n className=\"mt-1.5 overflow-x-auto max-h-[200px] overflow-y-auto p-1.5 rounded\"\n style={{ backgroundColor: 'var(--ds-gray-100)' }}\n >\n {typeof part.output === 'string' ? (\n <pre\n className=\"text-[10px]\"\n style={{ color: 'var(--ds-gray-800)' }}\n >\n {part.output}\n </pre>\n ) : (\n <DataInspector data={part.output} expandLevel={1} />\n )}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n}\n\nfunction getRoleStyle(role: string) {\n switch (role) {\n case 'user':\n return {\n bg: 'var(--ds-blue-100)',\n border: 'var(--ds-blue-300)',\n label: 'var(--ds-blue-700)',\n };\n case 'assistant':\n return {\n bg: 'var(--ds-gray-100)',\n border: 'var(--ds-gray-300)',\n label: 'var(--ds-gray-700)',\n };\n case 'system':\n return {\n bg: 'var(--ds-amber-100)',\n border: 'var(--ds-amber-300)',\n label: 'var(--ds-amber-700)',\n };\n case 'tool':\n return {\n bg: 'var(--ds-green-50)',\n border: 'var(--ds-green-300)',\n label: 'var(--ds-green-700)',\n };\n default:\n return {\n bg: 'var(--ds-gray-100)',\n border: 'var(--ds-gray-300)',\n label: 'var(--ds-gray-700)',\n };\n }\n}\n\nfunction parseContent(content: unknown): ParsedPart[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n\n if (Array.isArray(content)) {\n return content.map((part): ParsedPart => {\n if (typeof part === 'string') {\n return { type: 'text', text: part };\n }\n if (part?.type === 'text') {\n return { type: 'text', text: String(part.text ?? '') };\n }\n if (part?.type === 'tool-call') {\n return {\n type: 'tool-call',\n toolName: part.toolName,\n input: part.input,\n };\n }\n if (part?.type === 'tool-result') {\n return {\n type: 'tool-result',\n toolName: part.toolName,\n output: part.output,\n };\n }\n return { type: 'text', text: '' };\n });\n }\n\n return [];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"copyable-data-block.js","sourceRoot":"","sources":["../../../src/components/sidebar/copyable-data-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAU,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS;QAC1B,KAAK,KAAK,IAAI,EACd,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,EAAE,IAAI,EAAqB;IAC3D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,CACL,eACE,SAAS,EAAC,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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detail-card.js","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,gBAAgB,EAChB,gBAAgB,GAYjB;IACC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,cACE,SAAS,EAAE,2CAA2C,gBAAgB,IAAI,EAAE,EAAE,EAC9E,KAAK,EAAE;gBACL,WAAW,EAAE,oBAAoB;gBACjC,eAAe,EAAE,oBAAoB;gBACrC,KAAK,EAAE,oBAAoB;gBAC3B,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,GAAG;aACb,YAEA,OAAO,GACJ,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,mBACE,SAAS,EAAC,OAAO,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAC,MAA6B,CAAC,IAAI,CAAC,aAElE,kBACE,SAAS,EAAE,iHAAiH,gBAAgB,IAAI,EAAE,EAAE,EACpJ,KAAK,EAAE;oBACL,WAAW,EAAE,oBAAoB;oBACjC,eAAe,EAAE,oBAAoB;oBACrC,KAAK,EAAE,oBAAoB;oBAC3B,SAAS,EAAE,MAAM;iBAClB,YAED,gBAAM,SAAS,EAAC,2BAA2B,aACzC,KAAC,YAAY,IACX,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,oDAAoD,GAC9D,EACD,OAAO,IACH,GACC,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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events-list.js","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { EVENT_DATA_REF_FIELDS, type Event } from '@workflow/world';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { isExpiredMarker } from '../../lib/hydration';\nimport { ErrorCard } from '../ui/error-card';\nimport {\n ErrorStackBlock,\n isStructuredErrorWithStack,\n} from '../ui/error-stack-block';\nimport { Skeleton } from '../ui/skeleton';\nimport { localMillisecondTime } from './attribute-panel';\nimport { CopyableDataBlock } from './copyable-data-block';\nimport { DetailCard } from './detail-card';\n\n/**\n * Event types whose eventData contains an error field with a StructuredError.\n */\nconst ERROR_EVENT_TYPES = new Set(['step_failed', 'step_retrying']);\n\n/**\n * Event types that carry user-serialized data in their eventData field.\n */\nconst DATA_EVENT_TYPES = new Set([\n 'step_created',\n 'step_completed',\n 'step_failed',\n 'step_retrying',\n 'hook_created',\n 'hook_received',\n 'run_created',\n 'run_completed',\n 'run_failed',\n 'wait_created',\n 'wait_completed',\n]);\n\n/**\n * A single event row that can lazy-load its eventData when expanded.\n */\nfunction EventItem({\n event,\n onLoadEventData,\n encryptionKey,\n}: {\n event: Event;\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n /** When this changes (e.g., Decrypt was clicked), invalidate cached data */\n encryptionKey?: Uint8Array;\n}) {\n const [loadedData, setLoadedData] = useState<unknown | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n const wasExpandedRef = useRef(false);\n /** Mirrors whether we have a fetched payload; avoids stale `loadedData` in load closure. */\n const loadedDataRef = useRef<unknown | null>(null);\n\n // Check if the event already has eventData from the store\n const existingData =\n 'eventData' in event && event.eventData != null ? event.eventData : null;\n const mergedDisplay = loadedData ?? existingData;\n const canHaveData = DATA_EVENT_TYPES.has(event.eventType);\n\n const loadEventData = useCallback(\n async (options?: { force?: boolean }) => {\n if (!onLoadEventData || !event.correlationId || !event.eventId) return;\n if (!options?.force && loadedDataRef.current !== null) {\n return;\n }\n\n try {\n setIsLoading(true);\n setLoadError(null);\n const data = await onLoadEventData(event.correlationId, event.eventId);\n loadedDataRef.current = data;\n setLoadedData(data);\n } catch (err) {\n setLoadError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n },\n [onLoadEventData, event.correlationId, event.eventId]\n );\n\n const handleExpand = useCallback(async () => {\n if (isLoading) return;\n wasExpandedRef.current = true;\n await loadEventData();\n }, [isLoading, loadEventData]);\n\n // When the encryption key changes and this event was previously expanded,\n // re-load the data so it gets decrypted\n useEffect(() => {\n if (!encryptionKey || !wasExpandedRef.current) return;\n loadedDataRef.current = null;\n setLoadedData(null);\n void loadEventData({ force: true });\n }, [encryptionKey, loadEventData]);\n\n const createdAt = new Date(event.createdAt);\n\n const displayPayload = isLoading ? loadedData : mergedDisplay;\n\n return (\n <DetailCard\n summaryClassName=\"text-base py-2\"\n summary={\n <>\n <span\n className=\"font-medium\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {event.eventType}\n </span>{' '}\n -{' '}\n <span style={{ color: 'var(--ds-gray-700)' }}>\n {localMillisecondTime(createdAt.getTime())}\n </span>\n </>\n }\n onToggle={\n canHaveData\n ? (open) => {\n if (open) handleExpand();\n }\n : undefined\n }\n >\n {/* Event attributes */}\n <div\n className=\"flex flex-col divide-y rounded-md border overflow-hidden\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n }}\n >\n <div\n className=\"flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5\"\n style={{ borderColor: 'var(--ds-gray-300)' }}\n >\n <span\n className=\"text-[13px] font-medium\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Event ID\n </span>\n <span\n className=\"max-w-[70%] truncate text-right text-[13px] font-mono\"\n style={{ color: 'var(--ds-gray-1000)' }}\n title={event.eventId}\n >\n {event.eventId}\n </span>\n </div>\n {event.correlationId && (\n <div\n className=\"flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5\"\n style={{ borderColor: 'var(--ds-gray-300)' }}\n >\n <span\n className=\"text-[13px] font-medium\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Correlation ID\n </span>\n <span\n className=\"max-w-[70%] truncate text-right text-[13px] font-mono\"\n style={{ color: 'var(--ds-gray-1000)' }}\n title={event.correlationId}\n >\n {event.correlationId}\n </span>\n </div>\n )}\n </div>\n\n {/* Loading state */}\n {isLoading && (\n <div\n className=\"mt-2 rounded-md border p-3\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n }}\n >\n <Skeleton className=\"h-4 w-[35%]\" />\n <Skeleton className=\"mt-2 h-4 w-[90%]\" />\n <Skeleton className=\"mt-2 h-4 w-[75%]\" />\n </div>\n )}\n\n {/* Error state */}\n {loadError && (\n <ErrorCard\n title=\"Failed to load event data\"\n details={loadError}\n className=\"mt-2\"\n />\n )}\n\n {/* Event data */}\n {displayPayload != null && (\n <div className=\"mt-2\">\n <EventDataBlock eventType={event.eventType} data={displayPayload} />\n </div>\n )}\n </DetailCard>\n );\n}\n\n/**\n * Check if an eventData object has only expired marker values in ref/payload\n * fields for this event type (see {@link EVENT_DATA_REF_FIELDS}). Other keys\n * (e.g. `resumeAt`, `stepName`) are ignored.\n */\nfunction hasOnlyExpiredFields(data: unknown, eventType: string): boolean {\n if (data === null || typeof data !== 'object' || Array.isArray(data)) {\n return false;\n }\n const record = data as Record<string, unknown>;\n const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];\n const presentKeys = refKeys.filter((k) => k in record);\n return (\n presentKeys.length > 0 &&\n presentKeys.every((k) => isExpiredMarker(record[k]))\n );\n}\n\n/**\n * Renders event data, using ErrorStackBlock for error events that contain\n * a structured error with a stack trace, and CopyableDataBlock otherwise.\n */\nfunction EventDataBlock({\n eventType,\n data,\n}: {\n eventType: string;\n data: unknown;\n}) {\n // Expired data — show a simple message instead of the raw stub.\n // Check both the top-level eventData and nested sub-fields (result, input, etc.)\n // since the server stubs each ref field independently.\n if (isExpiredMarker(data) || hasOnlyExpiredFields(data, eventType)) {\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\n // For error events (step_failed, step_retrying), the eventData has the shape\n // { error: StructuredError, stack?: string, ... }. Check both the top-level\n // value and the nested `error` field for a stack trace.\n if (\n ERROR_EVENT_TYPES.has(eventType) &&\n data != null &&\n typeof data === 'object'\n ) {\n const record = data as Record<string, unknown>;\n\n // Check the nested `error` field first (the StructuredError)\n if (isStructuredErrorWithStack(record.error)) {\n return <ErrorStackBlock value={record.error} />;\n }\n\n // Some error formats put the stack at the top level of eventData\n if (isStructuredErrorWithStack(record)) {\n return <ErrorStackBlock value={record} />;\n }\n }\n\n // For non-error events or errors without a stack, fall back to the\n // generic JSON viewer.\n return <CopyableDataBlock data={data} />;\n}\n\nexport function EventsList({\n events,\n isLoading = false,\n error,\n onLoadEventData,\n encryptionKey,\n}: {\n events: Event[];\n isLoading?: boolean;\n error?: Error | null;\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n /** When provided, signals that decryption is active (triggers re-load of expanded events) */\n encryptionKey?: Uint8Array;\n}) {\n // Sort by createdAt\n const sortedEvents = useMemo(\n () =>\n [...events].sort(\n (a, b) =>\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n ),\n [events]\n );\n\n return (\n <div className=\"mt-2\" style={{ color: 'var(--ds-gray-1000)' }}>\n <h3\n className=\"text-label-14 font-medium mt-4 mb-2\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n Events\n </h3>\n {isLoading ? (\n <div className=\"flex flex-col gap-4\">\n <Skeleton className=\"h-9 w-full rounded-md\" />\n <Skeleton className=\"h-9 w-full rounded-md\" />\n <Skeleton className=\"h-9 w-full rounded-md\" />\n </div>\n ) : null}\n {!isLoading && !error && sortedEvents.length === 0 && (\n <div className=\"text-sm\">No events found</div>\n )}\n {sortedEvents.length > 0 && !error ? (\n <div className=\"flex flex-col gap-4\">\n {sortedEvents.map((event) => (\n <EventItem\n key={event.eventId}\n event={event}\n onLoadEventData={onLoadEventData}\n encryptionKey={encryptionKey}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-hook-modal.js","sourceRoot":"","sources":["../../../src/components/sidebar/resolve-hook-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { Send, X } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface ResolveHookModalProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback when the modal should be closed */\n onClose: () => void;\n /** Callback when the form is submitted with the parsed JSON payload */\n onSubmit: (payload: unknown) => Promise<void>;\n /** Whether the submission is in progress */\n isSubmitting?: boolean;\n}\n\n/**\n * Modal component for resolving a hook by entering a JSON payload.\n *\n * Styled to match the Geist design-system dialog component used in the\n * Vercel dashboard so it looks native when rendered inside `front`.\n */\nexport function ResolveHookModal({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting = false,\n}: ResolveHookModalProps): React.JSX.Element | null {\n const [jsonInput, setJsonInput] = useState('');\n const [parseError, setParseError] = useState<string | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus the textarea when the modal opens\n useEffect(() => {\n if (isOpen && textareaRef.current) {\n textareaRef.current.focus();\n }\n }, [isOpen]);\n\n // Reset state when modal closes\n useEffect(() => {\n if (!isOpen) {\n setJsonInput('');\n setParseError(null);\n }\n }, [isOpen]);\n\n // Handle escape key to close\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen && !isSubmitting) {\n onClose();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, isSubmitting, onClose]);\n\n const submitPayload = useCallback(async () => {\n setParseError(null);\n\n // Parse the JSON input\n let payload: unknown;\n try {\n // Allow empty string as null payload\n if (jsonInput.trim() === '') {\n payload = null;\n } else {\n payload = JSON.parse(jsonInput);\n }\n } catch {\n setParseError('Invalid JSON. Please check your input.');\n return;\n }\n\n await onSubmit(payload);\n }, [jsonInput, onSubmit]);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n void submitPayload();\n },\n [submitPayload]\n );\n\n const isMacPlatform =\n typeof navigator !== 'undefined' &&\n (\n (navigator as Navigator & { userAgentData?: { platform?: string } })\n .userAgentData?.platform ?? navigator.userAgent\n )\n .toLowerCase()\n .includes('mac');\n\n // Handle Cmd/Ctrl + Enter to submit\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter' && !isSubmitting) {\n e.preventDefault();\n handleSubmit(e as unknown as React.FormEvent);\n }\n },\n [handleSubmit, isSubmitting]\n );\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"resolve-hook-modal-title\"\n >\n {/* Backdrop — matches Geist dialog ::backdrop */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(0, 0, 0, 0.7)',\n }}\n onClick={isSubmitting ? undefined : onClose}\n />\n\n {/* Modal card — matches Geist dialog.geist-dialog */}\n <div\n style={{\n position: 'relative',\n zIndex: 10,\n width: 480,\n maxWidth: 'calc(100% - 32px)',\n borderRadius: 12,\n border: 'none',\n boxShadow: 'var(--ds-shadow-menu)',\n background: 'var(--ds-background-100)',\n color: 'var(--ds-gray-1000)',\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n }}\n >\n <h2\n id=\"resolve-hook-modal-title\"\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--ds-gray-1000)',\n }}\n >\n Resolve Hook\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isSubmitting}\n aria-label=\"Close modal\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 4,\n borderRadius: 6,\n border: 'none',\n background: 'transparent',\n color: 'var(--ds-gray-900)',\n cursor: isSubmitting ? 'not-allowed' : 'pointer',\n opacity: isSubmitting ? 0.5 : 1,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--ds-gray-alpha-200)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <X style={{ width: 16, height: 16 }} />\n </button>\n </div>\n\n {/* Body */}\n <form onSubmit={handleSubmit}>\n <div style={{ padding: '0 24px 16px' }}>\n <label\n htmlFor=\"json-payload\"\n style={{\n display: 'block',\n fontSize: 14,\n fontWeight: 500,\n marginBottom: 6,\n color: 'var(--ds-gray-1000)',\n }}\n >\n JSON Payload\n </label>\n <p\n style={{\n fontSize: 13,\n marginBottom: 12,\n marginTop: 0,\n color: 'var(--ds-gray-900)',\n lineHeight: 1.5,\n }}\n >\n Enter a JSON value to send to the hook. Leave empty to send{' '}\n <code\n style={{\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 12,\n fontFamily:\n 'var(--font-mono, ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace)',\n background: 'var(--ds-gray-alpha-200)',\n color: 'var(--ds-gray-1000)',\n }}\n >\n null\n </code>\n .\n </p>\n <textarea\n ref={textareaRef}\n id=\"json-payload\"\n value={jsonInput}\n onChange={(e) => {\n setJsonInput(e.target.value);\n setParseError(null);\n }}\n onKeyDown={handleKeyDown}\n disabled={isSubmitting}\n placeholder='{\"key\": \"value\"}'\n style={{\n width: '100%',\n height: 160,\n padding: '8px 12px',\n fontFamily:\n 'var(--font-mono, ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace)',\n fontSize: 13,\n lineHeight: 1.5,\n borderRadius: 8,\n border: `1px solid ${parseError ? 'var(--ds-red-700)' : 'var(--ds-gray-alpha-400)'}`,\n color: 'var(--ds-gray-1000)',\n background: 'var(--ds-background-100)',\n outline: 'none',\n resize: 'none',\n opacity: isSubmitting ? 0.5 : 1,\n cursor: isSubmitting ? 'not-allowed' : 'text',\n boxSizing: 'border-box',\n }}\n />\n {parseError && (\n <p\n style={{\n marginTop: 8,\n fontSize: 13,\n color: 'var(--ds-red-900)',\n margin: '8px 0 0',\n }}\n >\n {parseError}\n </p>\n )}\n <p\n style={{\n marginTop: 8,\n fontSize: 12,\n color: 'var(--ds-gray-800)',\n margin: '8px 0 0',\n }}\n >\n Press{' '}\n <kbd\n style={{\n padding: '2px 5px',\n borderRadius: 4,\n fontSize: 11,\n fontFamily:\n 'var(--font-mono, ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace)',\n background: 'var(--ds-gray-alpha-200)',\n border: '1px solid var(--ds-gray-alpha-400)',\n }}\n >\n {isMacPlatform ? '⌘' : 'Ctrl'}\n +Enter\n </kbd>{' '}\n to submit\n </p>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 8,\n padding: '12px 24px',\n borderTop: '1px solid var(--ds-gray-alpha-400)',\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isSubmitting}\n style={{\n padding: '8px 16px',\n fontSize: 14,\n fontWeight: 500,\n borderRadius: 8,\n border: '1px solid var(--ds-gray-alpha-400)',\n background: 'var(--ds-background-100)',\n color: 'var(--ds-gray-1000)',\n cursor: isSubmitting ? 'not-allowed' : 'pointer',\n opacity: isSubmitting ? 0.5 : 1,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'var(--ds-background-100)';\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => void submitPayload()}\n disabled={isSubmitting}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '8px 16px',\n fontSize: 14,\n fontWeight: 500,\n borderRadius: 8,\n border: 'none',\n background: 'var(--ds-gray-1000)',\n color: 'var(--ds-background-100)',\n cursor: isSubmitting ? 'not-allowed' : 'pointer',\n opacity: isSubmitting ? 0.5 : 1,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!isSubmitting) e.currentTarget.style.opacity = '0.9';\n }}\n onMouseLeave={(e) => {\n if (!isSubmitting) e.currentTarget.style.opacity = '1';\n }}\n >\n <Send style={{ width: 14, height: 14 }} />\n {isSubmitting ? 'Sending...' : 'Send Payload'}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar-data-context.js","sourceRoot":"","sources":["../../../src/components/sidebar/sidebar-data-context.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAgClE,MAAM,kBAAkB,GAAG,aAAa,CAAiC,IAAI,CAAC,CAAC;AAC/E,kBAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,CACL,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACtC,QAAQ,GACmB,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACxC,CAAC","sourcesContent":["'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport type { SpanSelectionInfo } from './entity-detail-panel';\n\nexport interface SidebarDataContextValue {\n run: WorkflowRun;\n events: Event[];\n spanDetailData: WorkflowRun | Step | Hook | Event | null;\n spanDetailError?: Error | null;\n spanDetailLoading?: boolean;\n onSpanSelect: (info: SpanSelectionInfo) => void;\n onStreamClick?: (streamId: string) => void;\n onRunClick?: (runId: string) => void;\n onWakeUpSleep?: (\n runId: string,\n correlationId: string\n ) => Promise<{ stoppedCount: number }>;\n onLoadEventData?: (\n correlationId: string,\n eventId: string\n ) => Promise<unknown | null>;\n onResolveHook?: (\n hookToken: string,\n payload: unknown,\n hook?: Hook\n ) => Promise<void>;\n encryptionKey?: Uint8Array;\n onDecrypt?: () => void;\n isDecrypting?: boolean;\n hasEncryptedData?: boolean;\n}\n\nconst SidebarDataContext = createContext<SidebarDataContextValue | null>(null);\nSidebarDataContext.displayName = 'SidebarDataContext';\n\nexport function SidebarDataProvider({\n value,\n children,\n}: {\n value: SidebarDataContextValue;\n children: ReactNode;\n}) {\n return (\n <SidebarDataContext.Provider value={value}>\n {children}\n </SidebarDataContext.Provider>\n );\n}\n\nexport function useSidebarData(): SidebarDataContextValue {\n const ctx = useContext(SidebarDataContext);\n if (!ctx) {\n throw new Error('useSidebarData must be used within a SidebarDataProvider');\n }\n return ctx;\n}\n\nexport function useSidebarDataOptional(): SidebarDataContextValue | null {\n return useContext(SidebarDataContext);\n}\n"]}
|