@workflow/web 4.0.1-beta.13 → 4.0.1-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -2
  3. package/.next/build-manifest.json +4 -4
  4. package/.next/fallback-build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/routes-manifest.json +0 -9
  7. package/.next/server/app/_global-error/page/build-manifest.json +2 -2
  8. package/.next/server/app/_global-error.html +2 -2
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/server/app/_not-found/page/server-reference-manifest.json +184 -4
  17. package/.next/server/app/_not-found/page.js +3 -2
  18. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/page/build-manifest.json +2 -2
  21. package/.next/server/app/page/server-reference-manifest.json +67 -52
  22. package/.next/server/app/page.js +3 -3
  23. package/.next/server/app/page.js.nft.json +1 -1
  24. package/.next/server/app/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/run/[runId]/page/build-manifest.json +2 -2
  26. package/.next/server/app/run/[runId]/page/server-reference-manifest.json +67 -52
  27. package/.next/server/app/run/[runId]/page.js +3 -3
  28. package/.next/server/app/run/[runId]/page.js.nft.json +1 -1
  29. package/.next/server/app/run/[runId]/page_client-reference-manifest.js +1 -1
  30. package/.next/server/app-paths-manifest.json +1 -2
  31. package/.next/server/chunks/ssr/[root-of-the-server]__357a9046._.js +3 -0
  32. package/.next/server/chunks/ssr/[root-of-the-server]__357a9046._.js.map +1 -0
  33. package/.next/server/chunks/ssr/[root-of-the-server]__747eb15e._.js +72 -0
  34. package/.next/server/chunks/ssr/[root-of-the-server]__747eb15e._.js.map +1 -0
  35. package/.next/server/chunks/ssr/[root-of-the-server]__c8f35667._.js +3 -0
  36. package/.next/server/chunks/ssr/[root-of-the-server]__c8f35667._.js.map +1 -0
  37. package/.next/server/chunks/ssr/{[root-of-the-server]__5601d14d._.js → [root-of-the-server]__d67ccd55._.js} +2 -2
  38. package/.next/server/chunks/ssr/{[root-of-the-server]__5601d14d._.js.map → [root-of-the-server]__d67ccd55._.js.map} +1 -1
  39. package/.next/server/chunks/ssr/{[root-of-the-server]__ef8720b3._.js → [root-of-the-server]__e8641565._.js} +2 -2
  40. package/.next/server/chunks/ssr/[root-of-the-server]__e8641565._.js.map +1 -0
  41. package/.next/server/chunks/ssr/[root-of-the-server]__ef9c7ec7._.js +3 -0
  42. package/.next/server/chunks/ssr/[root-of-the-server]__ef9c7ec7._.js.map +1 -0
  43. package/.next/server/chunks/ssr/_2d77ccc1._.js +3 -0
  44. package/.next/server/chunks/ssr/_2d77ccc1._.js.map +1 -0
  45. package/.next/server/chunks/ssr/_30abd234._.js +8 -0
  46. package/.next/server/chunks/ssr/_30abd234._.js.map +1 -0
  47. package/.next/server/chunks/ssr/_6e6035a6._.js +3 -0
  48. package/.next/server/chunks/ssr/_6e6035a6._.js.map +1 -0
  49. package/.next/server/chunks/ssr/_b3bb46c8._.js +3 -0
  50. package/.next/server/chunks/ssr/_b3bb46c8._.js.map +1 -0
  51. package/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +1 -1
  52. package/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js.map +1 -1
  53. package/.next/server/chunks/ssr/packages_web_src_app_run_[runId]_page_tsx_c7d0b139._.js +6 -6
  54. package/.next/server/chunks/ssr/packages_web_src_app_run_[runId]_page_tsx_c7d0b139._.js.map +1 -1
  55. package/.next/server/chunks/ssr/packages_web_src_components_ui_dropdown-menu_tsx_5a66d33b._.js +3 -0
  56. package/.next/server/chunks/ssr/packages_web_src_components_ui_dropdown-menu_tsx_5a66d33b._.js.map +1 -0
  57. package/.next/server/middleware-build-manifest.js +2 -2
  58. package/.next/server/next-font-manifest.js +1 -1
  59. package/.next/server/next-font-manifest.json +0 -4
  60. package/.next/server/pages/500.html +2 -2
  61. package/.next/server/server-reference-manifest.js +1 -1
  62. package/.next/server/server-reference-manifest.json +185 -170
  63. package/.next/static/chunks/4cd756ce08329aa0.js +1 -0
  64. package/.next/static/chunks/9413ec2d2c03a23f.js +1 -0
  65. package/.next/static/chunks/a085c02be6d1c0fa.js +1 -0
  66. package/.next/static/chunks/{22122fa69a524cdf.js → b7c7c49bc91f0883.js} +1 -1
  67. package/.next/static/chunks/cac98b3aeb18c389.css +3 -0
  68. package/.next/static/chunks/cb2a4b461d8e3581.js +1 -0
  69. package/.next/static/chunks/cf77de8f2f364dfe.js +3 -0
  70. package/.next/static/chunks/e5fe8b0871852c0c.js +1 -0
  71. package/.next/static/chunks/e815e2c1cb31fa75.css +1 -0
  72. package/.next/static/chunks/eca703efa10d6b73.js +1 -0
  73. package/.next/static/chunks/f6b74fa7a23429f6.js +14 -0
  74. package/.next/static/chunks/fa8d0e694695293d.js +1 -0
  75. package/.next/static/chunks/turbopack-3e37ac8ac11d9492.js +3 -0
  76. package/.next/static/chunks/{turbopack-453c53e2accaa935.js → turbopack-c46db9a9d9103ea9.js} +1 -1
  77. package/.next/trace +1 -1
  78. package/.next/trace-build +1 -1
  79. package/.next/types/routes.d.ts +1 -2
  80. package/.next/types/validator.ts +0 -9
  81. package/package.json +10 -5
  82. package/.next/server/app/run/[runId]/streams/[streamId]/page/app-paths-manifest.json +0 -3
  83. package/.next/server/app/run/[runId]/streams/[streamId]/page/build-manifest.json +0 -17
  84. package/.next/server/app/run/[runId]/streams/[streamId]/page/next-font-manifest.json +0 -11
  85. package/.next/server/app/run/[runId]/streams/[streamId]/page/react-loadable-manifest.json +0 -1
  86. package/.next/server/app/run/[runId]/streams/[streamId]/page/server-reference-manifest.json +0 -200
  87. package/.next/server/app/run/[runId]/streams/[streamId]/page.js +0 -22
  88. package/.next/server/app/run/[runId]/streams/[streamId]/page.js.map +0 -5
  89. package/.next/server/app/run/[runId]/streams/[streamId]/page.js.nft.json +0 -1
  90. package/.next/server/app/run/[runId]/streams/[streamId]/page_client-reference-manifest.js +0 -2
  91. package/.next/server/chunks/ssr/[root-of-the-server]__072d3021._.js +0 -70
  92. package/.next/server/chunks/ssr/[root-of-the-server]__072d3021._.js.map +0 -1
  93. package/.next/server/chunks/ssr/[root-of-the-server]__0e8b8fa9._.js +0 -3
  94. package/.next/server/chunks/ssr/[root-of-the-server]__0e8b8fa9._.js.map +0 -1
  95. package/.next/server/chunks/ssr/[root-of-the-server]__6e56cd25._.js +0 -4
  96. package/.next/server/chunks/ssr/[root-of-the-server]__6e56cd25._.js.map +0 -1
  97. package/.next/server/chunks/ssr/[root-of-the-server]__cd719c14._.js +0 -4
  98. package/.next/server/chunks/ssr/[root-of-the-server]__cd719c14._.js.map +0 -1
  99. package/.next/server/chunks/ssr/[root-of-the-server]__d4909843._.js +0 -4
  100. package/.next/server/chunks/ssr/[root-of-the-server]__d4909843._.js.map +0 -1
  101. package/.next/server/chunks/ssr/[root-of-the-server]__ef8720b3._.js.map +0 -1
  102. package/.next/server/chunks/ssr/[root-of-the-server]__fb5d0d13._.js +0 -4
  103. package/.next/server/chunks/ssr/[root-of-the-server]__fb5d0d13._.js.map +0 -1
  104. package/.next/server/chunks/ssr/_631c662c._.js +0 -4
  105. package/.next/server/chunks/ssr/_631c662c._.js.map +0 -1
  106. package/.next/server/chunks/ssr/_65c9c827._.js +0 -6
  107. package/.next/server/chunks/ssr/_65c9c827._.js.map +0 -1
  108. package/.next/server/chunks/ssr/_e9cd0664._.js +0 -3
  109. package/.next/server/chunks/ssr/_e9cd0664._.js.map +0 -1
  110. package/.next/server/chunks/ssr/packages_30c0733e._.js +0 -4
  111. package/.next/server/chunks/ssr/packages_30c0733e._.js.map +0 -1
  112. package/.next/server/chunks/ssr/packages_906ab70b._.js +0 -3
  113. package/.next/server/chunks/ssr/packages_906ab70b._.js.map +0 -1
  114. package/.next/server/chunks/ssr/packages_9f053af5._.js +0 -3
  115. package/.next/server/chunks/ssr/packages_9f053af5._.js.map +0 -1
  116. package/.next/server/chunks/ssr/packages_web-shared_dist_trace-viewer_worker_f98ba72c.js +0 -3
  117. package/.next/server/chunks/ssr/packages_web-shared_dist_trace-viewer_worker_f98ba72c.js.map +0 -1
  118. package/.next/server/chunks/ssr/packages_web_src_app_layout-client_tsx_7f30673c._.js +0 -3
  119. package/.next/server/chunks/ssr/packages_web_src_app_layout-client_tsx_7f30673c._.js.map +0 -1
  120. package/.next/server/chunks/ssr/packages_web_src_components_5b4f203e._.js +0 -3
  121. package/.next/server/chunks/ssr/packages_web_src_components_5b4f203e._.js.map +0 -1
  122. package/.next/server/chunks/ssr/packages_web_src_components_d1065930._.js +0 -3
  123. package/.next/server/chunks/ssr/packages_web_src_components_d1065930._.js.map +0 -1
  124. package/.next/server/chunks/ssr/packages_web_src_components_ui_select_tsx_7c5238ef._.js +0 -3
  125. package/.next/server/chunks/ssr/packages_web_src_components_ui_select_tsx_7c5238ef._.js.map +0 -1
  126. package/.next/static/chunks/125dc6396d8c7614.js +0 -1
  127. package/.next/static/chunks/12738c56605f94bd.js +0 -1
  128. package/.next/static/chunks/1b2c32764beea8c6.js +0 -1
  129. package/.next/static/chunks/2677e69032fce46e.js +0 -1
  130. package/.next/static/chunks/33539167f963017b.js +0 -14
  131. package/.next/static/chunks/46d8d17fb5e804aa.js +0 -1
  132. package/.next/static/chunks/5bfebbf730bb3cdc.js +0 -1
  133. package/.next/static/chunks/7d15ec806ba18b85.css +0 -3
  134. package/.next/static/chunks/8f0576d510d06c4c.js +0 -1
  135. package/.next/static/chunks/971151b2a72b5f24.css +0 -1
  136. package/.next/static/chunks/d5f104e0113bd49b.js +0 -2
  137. package/.next/static/chunks/e5b69a828ea58204.js +0 -1
  138. package/.next/static/chunks/turbopack-511fe75cd918d1a5.js +0 -3
  139. /package/.next/static/{dqfnmYEq_BK3Cb_-i5jnc → 8L07V3BgO4DySkjO3mfTV}/_buildManifest.js +0 -0
  140. /package/.next/static/{dqfnmYEq_BK3Cb_-i5jnc → 8L07V3BgO4DySkjO3mfTV}/_clientMiddlewareManifest.json +0 -0
  141. /package/.next/static/{dqfnmYEq_BK3Cb_-i5jnc → 8L07V3BgO4DySkjO3mfTV}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/web-shared/dist/trace-viewer/trace-viewer.module.css [app-ssr] (css module)","../../../../../../packages/web-shared/dist/api/data%3A00e865%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A72338c%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A6504b0%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A97403e%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A69500e%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A5b155d%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A4a8c5b%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A81e12f%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3Ac44f78%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A932c49%20%3Ctext/javascript%3E","../../../../../../packages/web-shared/dist/api/data%3A444e18%20%3Ctext/javascript%3E","../../../../../../packages/web/src/components/error-boundary.tsx","../../../../../../packages/web-shared/src/trace-viewer/util/timing.ts","../../../../../../packages/web-shared/src/trace-viewer/util/use-trackpad-zoom.tsx","../../../../../../packages/web-shared/src/trace-viewer/util/use-immediate-style.ts","../../../../../../packages/web-shared/src/trace-viewer/util/use-streaming-spans.ts","../../../../../../packages/web-shared/src/lib/utils.ts","../../../../../../packages/web-shared/src/trace-viewer/index.tsx","../../../../../../packages/web-shared/src/index.ts","../../../../../../packages/web-shared/src/trace-viewer/util/tree.ts","../../../../../../packages/web-shared/src/trace-viewer/util/constants.ts","../../../../../../packages/web-shared/src/trace-viewer/util/scrollbar-width.ts","../../../../../../packages/web-shared/src/trace-viewer/components/zoom-icons.tsx","../../../../../../packages/web-shared/src/sidebar/detail-card.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/map.tsx","../../../../../../packages/web-shared/src/api/workflow-api-client.ts","../../../../../../packages/web-shared/src/workflow-trace-view.tsx","../../../../../../packages/web-shared/src/trace-viewer/context.tsx","../../../../../../packages/web/src/components/ui/card.tsx","../../../../../../packages/web-shared/src/sidebar/workflow-detail-panel.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/search-input.tsx","../../../../../../packages/web-shared/src/components/ui/skeleton.tsx","../../../../../../packages/web-shared/src/sidebar/attribute-panel.tsx","../../../../../../packages/web-shared/src/trace-viewer/trace-viewer.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/span-detail-panel.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/node.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/search.tsx","../../../../../../packages/web-shared/src/workflow-traces/trace-span-construction.ts","../../../../../../packages/web-shared/src/run-trace-view.tsx","../../../../../../packages/web-shared/src/sidebar/events-list.tsx","../../../../../../packages/web-shared/src/components/ui/alert.tsx","../../../../../../packages/core/src/parse-name.ts","../../../../../../packages/web-shared/src/trace-viewer/components/zoom-button.tsx","../../../../../../packages/web-shared/src/trace-viewer/components/markers.tsx","../../../../../../packages/web-shared/src/workflow-traces/trace-colors.ts","../../../../../../packages/web-shared/src/workflow-traces/trace-time-utils.ts","../../../../../../node_modules/.pnpm/lucide-react%400.469.0_react%4019.1.0/node_modules/lucide-react/src/icons/refresh-cw.ts","../../../../../../packages/web-shared/src/trace-viewer/components/ui.tsx","../../../../../../packages/web-shared/src/workflow-traces/event-colors.ts"],"sourcesContent":["__turbopack_context__.v({\n \"alignEnd\": \"trace-viewer-module__m4L2Da__alignEnd\",\n \"alignStart\": \"trace-viewer-module__m4L2Da__alignStart\",\n \"ancestorDuration\": \"trace-viewer-module__m4L2Da__ancestorDuration\",\n \"ancestorLine\": \"trace-viewer-module__m4L2Da__ancestorLine\",\n \"ancestorLineContainer\": \"trace-viewer-module__m4L2Da__ancestorLineContainer\",\n \"ancestorName\": \"trace-viewer-module__m4L2Da__ancestorName\",\n \"ancestorNode\": \"trace-viewer-module__m4L2Da__ancestorNode\",\n \"ancestorText\": \"trace-viewer-module__m4L2Da__ancestorText\",\n \"buttonLink\": \"trace-viewer-module__m4L2Da__buttonLink\",\n \"childRow\": \"trace-viewer-module__m4L2Da__childRow\",\n \"collapsed\": \"trace-viewer-module__m4L2Da__collapsed\",\n \"color0\": \"trace-viewer-module__m4L2Da__color0\",\n \"color1\": \"trace-viewer-module__m4L2Da__color1\",\n \"color2\": \"trace-viewer-module__m4L2Da__color2\",\n \"color3\": \"trace-viewer-module__m4L2Da__color3\",\n \"color4\": \"trace-viewer-module__m4L2Da__color4\",\n \"colorHighlight\": \"trace-viewer-module__m4L2Da__colorHighlight\",\n \"colorVercel\": \"trace-viewer-module__m4L2Da__colorVercel\",\n \"cursorMarker\": \"trace-viewer-module__m4L2Da__cursorMarker\",\n \"cursorMarkerContainer\": \"trace-viewer-module__m4L2Da__cursorMarkerContainer\",\n \"cursorMarkerLabel\": \"trace-viewer-module__m4L2Da__cursorMarkerLabel\",\n \"cursorMarkerLabelContainer\": \"trace-viewer-module__m4L2Da__cursorMarkerLabelContainer\",\n \"cursorMarkerStickyParent\": \"trace-viewer-module__m4L2Da__cursorMarkerStickyParent\",\n \"cursorSelection\": \"trace-viewer-module__m4L2Da__cursorSelection\",\n \"customEventColor\": \"trace-viewer-module__m4L2Da__customEventColor\",\n \"detailGroup\": \"trace-viewer-module__m4L2Da__detailGroup\",\n \"detailHeading\": \"trace-viewer-module__m4L2Da__detailHeading\",\n \"detailHeadingIcon\": \"trace-viewer-module__m4L2Da__detailHeadingIcon\",\n \"divider\": \"trace-viewer-module__m4L2Da__divider\",\n \"eventDefault\": \"trace-viewer-module__m4L2Da__eventDefault\",\n \"eventDiamond\": \"trace-viewer-module__m4L2Da__eventDiamond\",\n \"eventFailed\": \"trace-viewer-module__m4L2Da__eventFailed\",\n \"eventHook\": \"trace-viewer-module__m4L2Da__eventHook\",\n \"eventMarker\": \"trace-viewer-module__m4L2Da__eventMarker\",\n \"eventMarkers\": \"trace-viewer-module__m4L2Da__eventMarkers\",\n \"eventMarkersContainer\": \"trace-viewer-module__m4L2Da__eventMarkersContainer\",\n \"eventName\": \"trace-viewer-module__m4L2Da__eventName\",\n \"eventRetrying\": \"trace-viewer-module__m4L2Da__eventRetrying\",\n \"eventTimestamp\": \"trace-viewer-module__m4L2Da__eventTimestamp\",\n \"hidden\": \"trace-viewer-module__m4L2Da__hidden\",\n \"hoverInfo\": \"trace-viewer-module__m4L2Da__hoverInfo\",\n \"huge\": \"trace-viewer-module__m4L2Da__huge\",\n \"inert\": \"trace-viewer-module__m4L2Da__inert\",\n \"infraSpanDescription\": \"trace-viewer-module__m4L2Da__infraSpanDescription\",\n \"mapCanvas\": \"trace-viewer-module__m4L2Da__mapCanvas\",\n \"mapContainer\": \"trace-viewer-module__m4L2Da__mapContainer\",\n \"mapThumb\": \"trace-viewer-module__m4L2Da__mapThumb\",\n \"marker\": \"trace-viewer-module__m4L2Da__marker\",\n \"markerLabel\": \"trace-viewer-module__m4L2Da__markerLabel\",\n \"markers\": \"trace-viewer-module__m4L2Da__markers\",\n \"markersContainer\": \"trace-viewer-module__m4L2Da__markersContainer\",\n \"mobile\": \"trace-viewer-module__m4L2Da__mobile\",\n \"notch\": \"trace-viewer-module__m4L2Da__notch\",\n \"note\": \"trace-viewer-module__m4L2Da__note\",\n \"searchBar\": \"trace-viewer-module__m4L2Da__searchBar\",\n \"searchInput\": \"trace-viewer-module__m4L2Da__searchInput\",\n \"searchInputLabel\": \"trace-viewer-module__m4L2Da__searchInputLabel\",\n \"searchInputPrefix\": \"trace-viewer-module__m4L2Da__searchInputPrefix\",\n \"selected\": \"trace-viewer-module__m4L2Da__selected\",\n \"skeleton\": \"trace-viewer-module__m4L2Da__skeleton\",\n \"skeletonRounded\": \"trace-viewer-module__m4L2Da__skeletonRounded\",\n \"small\": \"trace-viewer-module__m4L2Da__small\",\n \"span-skeleton\": \"trace-viewer-module__m4L2Da__span-skeleton\",\n \"spanCancelled\": \"trace-viewer-module__m4L2Da__spanCancelled\",\n \"spanCompleted\": \"trace-viewer-module__m4L2Da__spanCompleted\",\n \"spanDetailPanel\": \"trace-viewer-module__m4L2Da__spanDetailPanel\",\n \"spanDetailPanelAttribute\": \"trace-viewer-module__m4L2Da__spanDetailPanelAttribute\",\n \"spanDetailPanelAttributeKey\": \"trace-viewer-module__m4L2Da__spanDetailPanelAttributeKey\",\n \"spanDetailPanelAttributeValue\": \"trace-viewer-module__m4L2Da__spanDetailPanelAttributeValue\",\n \"spanDetailPanelBody\": \"trace-viewer-module__m4L2Da__spanDetailPanelBody\",\n \"spanDetailPanelClose\": \"trace-viewer-module__m4L2Da__spanDetailPanelClose\",\n \"spanDetailPanelCloseVerticalRule\": \"trace-viewer-module__m4L2Da__spanDetailPanelCloseVerticalRule\",\n \"spanDetailPanelCorner\": \"trace-viewer-module__m4L2Da__spanDetailPanelCorner\",\n \"spanDetailPanelCornerInner\": \"trace-viewer-module__m4L2Da__spanDetailPanelCornerInner\",\n \"spanDetailPanelDuration\": \"trace-viewer-module__m4L2Da__spanDetailPanelDuration\",\n \"spanDetailPanelName\": \"trace-viewer-module__m4L2Da__spanDetailPanelName\",\n \"spanDetailPanelQuickLink\": \"trace-viewer-module__m4L2Da__spanDetailPanelQuickLink\",\n \"spanDetailPanelQuickLinkLabel\": \"trace-viewer-module__m4L2Da__spanDetailPanelQuickLinkLabel\",\n \"spanDetailPanelResizer\": \"trace-viewer-module__m4L2Da__spanDetailPanelResizer\",\n \"spanDetailPanelTop\": \"trace-viewer-module__m4L2Da__spanDetailPanelTop\",\n \"spanDetailPanelTopInfo\": \"trace-viewer-module__m4L2Da__spanDetailPanelTopInfo\",\n \"spanDetailPanelTraceViewer\": \"trace-viewer-module__m4L2Da__spanDetailPanelTraceViewer\",\n \"spanDetailPanelTruncatedHeading\": \"trace-viewer-module__m4L2Da__spanDetailPanelTruncatedHeading\",\n \"spanDuration\": \"trace-viewer-module__m4L2Da__spanDuration\",\n \"spanFailed\": \"trace-viewer-module__m4L2Da__spanFailed\",\n \"spanHook\": \"trace-viewer-module__m4L2Da__spanHook\",\n \"spanName\": \"trace-viewer-module__m4L2Da__spanName\",\n \"spanNameDetailPanel\": \"trace-viewer-module__m4L2Da__spanNameDetailPanel\",\n \"spanNode\": \"trace-viewer-module__m4L2Da__spanNode\",\n \"spanNodeEvent\": \"trace-viewer-module__m4L2Da__spanNodeEvent\",\n \"spanPaused\": \"trace-viewer-module__m4L2Da__spanPaused\",\n \"spanPending\": \"trace-viewer-module__m4L2Da__spanPending\",\n \"spanPendingStriped\": \"trace-viewer-module__m4L2Da__spanPendingStriped\",\n \"spanRunning\": \"trace-viewer-module__m4L2Da__spanRunning\",\n \"spanSleep\": \"trace-viewer-module__m4L2Da__spanSleep\",\n \"spanSpacer\": \"trace-viewer-module__m4L2Da__spanSpacer\",\n \"timeline\": \"trace-viewer-module__m4L2Da__timeline\",\n \"traceNode\": \"trace-viewer-module__m4L2Da__traceNode\",\n \"traceViewer\": \"trace-viewer-module__m4L2Da__traceViewer\",\n \"traceViewerContent\": \"trace-viewer-module__m4L2Da__traceViewerContent\",\n \"unlit\": \"trace-viewer-module__m4L2Da__unlit\",\n \"xHover\": \"trace-viewer-module__m4L2Da__xHover\",\n \"zoom-buttons-fade-in\": \"trace-viewer-module__m4L2Da__zoom-buttons-fade-in\",\n \"zoomButton\": \"trace-viewer-module__m4L2Da__zoomButton\",\n \"zoomButtonGroup\": \"trace-viewer-module__m4L2Da__zoomButtonGroup\",\n \"zoomButtonTraceViewer\": \"trace-viewer-module__m4L2Da__zoomButtonTraceViewer\",\n});\n","/* __next_internal_action_entry_do_not_use__ [{\"6047ee636f7990a0196eaef756fb50484ae8d9593d\":\"cancelRun\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var cancelRun=/*#__PURE__*/createServerReference(\"6047ee636f7990a0196eaef756fb50484ae8d9593d\",callServer,void 0,findSourceMapURL,\"cancelRun\");","/* __next_internal_action_entry_do_not_use__ [{\"70b07885a8aa3b0fb278296b7a04692db6b0769128\":\"fetchEvents\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchEvents=/*#__PURE__*/createServerReference(\"70b07885a8aa3b0fb278296b7a04692db6b0769128\",callServer,void 0,findSourceMapURL,\"fetchEvents\");","/* __next_internal_action_entry_do_not_use__ [{\"70f506d3e7ec39ae905a1f67a3a9dc7afe59188b90\":\"fetchEventsByCorrelationId\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchEventsByCorrelationId=/*#__PURE__*/createServerReference(\"70f506d3e7ec39ae905a1f67a3a9dc7afe59188b90\",callServer,void 0,findSourceMapURL,\"fetchEventsByCorrelationId\");","/* __next_internal_action_entry_do_not_use__ [{\"70c0ec6d6d0c65573d206836358cd160f397a8d936\":\"fetchHook\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchHook=/*#__PURE__*/createServerReference(\"70c0ec6d6d0c65573d206836358cd160f397a8d936\",callServer,void 0,findSourceMapURL,\"fetchHook\");","/* __next_internal_action_entry_do_not_use__ [{\"60df0db10549a1f80823ff4952c35de9944489c7d9\":\"fetchHooks\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchHooks=/*#__PURE__*/createServerReference(\"60df0db10549a1f80823ff4952c35de9944489c7d9\",callServer,void 0,findSourceMapURL,\"fetchHooks\");","/* __next_internal_action_entry_do_not_use__ [{\"702b58cdb0e3fea4d5c166d12eb9a4d56514a7906f\":\"fetchRun\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchRun=/*#__PURE__*/createServerReference(\"702b58cdb0e3fea4d5c166d12eb9a4d56514a7906f\",callServer,void 0,findSourceMapURL,\"fetchRun\");","/* __next_internal_action_entry_do_not_use__ [{\"605182142f891d89e4c0555475fee27f9b074fdf8c\":\"fetchRuns\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchRuns=/*#__PURE__*/createServerReference(\"605182142f891d89e4c0555475fee27f9b074fdf8c\",callServer,void 0,findSourceMapURL,\"fetchRuns\");","/* __next_internal_action_entry_do_not_use__ [{\"786efa9ac298acede46c81f4b1f928ec71f039709f\":\"fetchStep\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchStep=/*#__PURE__*/createServerReference(\"786efa9ac298acede46c81f4b1f928ec71f039709f\",callServer,void 0,findSourceMapURL,\"fetchStep\");","/* __next_internal_action_entry_do_not_use__ [{\"701c4be22594ab998772498ff3c555ed8217ff984e\":\"fetchSteps\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var fetchSteps=/*#__PURE__*/createServerReference(\"701c4be22594ab998772498ff3c555ed8217ff984e\",callServer,void 0,findSourceMapURL,\"fetchSteps\");","/* __next_internal_action_entry_do_not_use__ [{\"707f335fc4756d24b28b1aecaf253ec3d3c360edd1\":\"readStreamServerAction\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var readStreamServerAction=/*#__PURE__*/createServerReference(\"707f335fc4756d24b28b1aecaf253ec3d3c360edd1\",callServer,void 0,findSourceMapURL,\"readStreamServerAction\");","/* __next_internal_action_entry_do_not_use__ [{\"60b4c80cdba6809b0e657b80f7bc428132df364129\":\"recreateRun\"},\"packages/web-shared/dist/api/workflow-server-actions.js\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";export var recreateRun=/*#__PURE__*/createServerReference(\"60b4c80cdba6809b0e657b80f7bc428132df364129\",callServer,void 0,findSourceMapURL,\"recreateRun\");","'use client';\n\nimport { AlertCircle, RefreshCw } from 'lucide-react';\nimport React, { type ReactNode } from 'react';\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n /** Optional title for the error message */\n title?: string;\n /** Optional description for the error message */\n description?: string;\n /** Whether to show a reset button (default: true) */\n showReset?: boolean;\n /** Optional fallback component to render on error */\n fallback?: (error: Error, reset: () => void) => ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary component that catches errors in child components\n * and displays them without breaking the entire application.\n *\n * Errors are localized to this boundary, so other parts of the UI\n * remain functional.\n */\nexport class ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error for debugging\n console.error('Error caught by boundary:', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({\n hasError: false,\n error: null,\n });\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n // Use custom fallback if provided\n if (this.props.fallback) {\n return this.props.fallback(this.state.error, this.handleReset);\n }\n\n // Default error UI\n return (\n <Card className=\"border-destructive/50 bg-destructive/5\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-destructive\">\n <AlertCircle className=\"h-5 w-5\" />\n {this.props.title || 'Error'}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Something went wrong</AlertTitle>\n <AlertDescription>\n {this.props.description ||\n 'An unexpected error occurred in this section.'}\n </AlertDescription>\n </Alert>\n\n <div className=\"bg-muted p-3 rounded-md text-sm font-mono text-muted-foreground overflow-auto max-h-48\">\n <div className=\"text-xs font-semibold mb-2\">Error details:</div>\n <div className=\"whitespace-pre-wrap break-words text-xs\">\n {this.state.error.message}\n </div>\n {this.state.error.stack && (\n <div className=\"mt-2 opacity-60 text-xs\">\n {this.state.error.stack}\n </div>\n )}\n </div>\n\n {this.props.showReset !== false && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={this.handleReset}\n className=\"gap-2\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n Try again\n </Button>\n )}\n </CardContent>\n </Card>\n );\n }\n\n return this.props.children;\n }\n}\n","export function getHighResInMs([seconds, nanoseconds]: [\n number,\n number,\n]): number {\n return seconds * 1000 + nanoseconds / 1e6;\n}\n\nexport function getMsInHighRes(ms: number): [number, number] {\n return [Math.floor(ms / 1000), (ms % 1000) * 1000];\n}\n\nconst durationFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n});\n\nexport function formatDuration(ms: number): string {\n if (ms === 0) {\n return '0';\n } else if (ms >= 1000) {\n return `${durationFormatter.format(ms / 1000)}s`;\n }\n return `${durationFormatter.format(ms)}ms`;\n}\n\nconst timeSelectionFormatter = new Intl.NumberFormat(undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n});\n\nexport function formatTimeSelection(ms: number): string {\n if (ms >= 1000) {\n return `${timeSelectionFormatter.format(ms / 1000)}s`;\n }\n return `${timeSelectionFormatter.format(ms)}ms`;\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * The delta is positive while zooming in, negative while zooming out\n */\nexport type TrackpadZoomHandler = (delta: number) => void;\n\nexport function useTrackpadZoom(handler: TrackpadZoomHandler): void {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n let pendingDelta = 0;\n let nextFrame = 0;\n const onFrame = (): void => {\n handlerRef.current(pendingDelta);\n pendingDelta = 0;\n };\n\n const onWheel = (event: WheelEvent): void => {\n if (!event.ctrlKey && !event.metaKey) return;\n\n event.preventDefault();\n let delta = -event.deltaY;\n\n switch (event.deltaMode) {\n case WheelEvent.DOM_DELTA_PAGE:\n delta *= window.innerHeight;\n break;\n case WheelEvent.DOM_DELTA_LINE:\n delta *= 20;\n break;\n default:\n break;\n }\n\n pendingDelta += delta;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n window.addEventListener('wheel', onWheel, { passive: false });\n\n return () => {\n window.removeEventListener('wheel', onWheel);\n cancelAnimationFrame(nextFrame);\n };\n }, []);\n}\n","import type { CSSProperties, MutableRefObject } from 'react';\nimport { useCallback, useRef } from 'react';\n\ntype SetStyle = (propertyName: string, value: string | undefined) => void;\n\ninterface ImmediateStyle {\n setStyle: SetStyle;\n styleRef: MutableRefObject<CSSProperties>;\n style: CSSProperties;\n}\n\n/**\n * Update an element's style without forcing renders, but in a way that is still\n * safe if the element re-renders for another reason.\n * @returns The current style & a method to update the style\n */\nexport function useImmediateStyle(\n ref: MutableRefObject<HTMLElement | null>\n): ImmediateStyle {\n const styleRef = useRef<CSSProperties>({});\n const setStyle = useCallback<SetStyle>(\n (propertyName, value) => {\n // @ts-expect-error typeof keyof CSSProperties is too big of a union\n styleRef.current[propertyName] = value;\n if (!ref.current) return;\n if (!value) {\n ref.current.style.removeProperty(propertyName);\n return;\n }\n ref.current.style.setProperty(propertyName, value);\n },\n [ref]\n );\n\n return { setStyle, styleRef, style: { ...styleRef.current } };\n}\n","import { clsx } from 'clsx';\nimport { useEffect, useRef, useState } from 'react';\nimport { getSpanClassName } from '../components/node';\nimport { useTraceViewer } from '../context';\nimport type {\n VisibleSpan,\n VisibleSpanEvent,\n WorkerRequest,\n WorkerResponse,\n} from '../types';\nimport {\n MARKER_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n TIMELINE_PADDING,\n} from './constants';\nimport { adjustSpanVisibility } from './tree';\n\ntype UpdateFilter = (filter: string) => void;\n\ninterface QueuedSpan {\n /** The distance from this span to the viewport */\n d: number;\n /** The span that's waiting to be rendered */\n span: VisibleSpan;\n}\n\nfunction emptyArrayInit<T>(): T[] {\n return [];\n}\n\nexport const useStreamingSpans = (\n highlightedSpans?: string[]\n): {\n rows: VisibleSpan[][];\n spans: VisibleSpan[];\n events: VisibleSpanEvent[];\n scale: number;\n} => {\n const { state, dispatch } = useTraceViewer();\n const {\n root,\n filter: ctxFilter,\n scale,\n timelineRef,\n timelineWidth,\n spanMap,\n scrollSnapshotRef,\n selected,\n memoCacheRef,\n customSpanClassNameFunc,\n } = state;\n const timelineHeight = useStableValue(state.timelineHeight);\n const counterRef = useRef(0);\n const [rows, setRows] = useState<VisibleSpan[][]>(emptyArrayInit);\n const [visibleSpans, setVisibleSpans] =\n useState<VisibleSpan[]>(emptyArrayInit);\n const [visibleEvents, setVisibleEvents] =\n useState<VisibleSpanEvent[]>(emptyArrayInit);\n const [resultScale, setResultScale] = useState(-1);\n\n const updateFilterRef = useRef<UpdateFilter>(undefined);\n useEffect(() => updateFilterRef.current?.(ctxFilter), [ctxFilter]);\n\n useEffect(() => {\n if (!highlightedSpans?.length) return;\n\n for (const row of rows) {\n for (const node of row) {\n const isHighlighted = highlightedSpans.includes(node.span.spanId);\n if (node.isHighlighted === isHighlighted) continue;\n node.isHighlighted = isHighlighted;\n memoCacheRef.current.set(node.span.spanId, {});\n }\n }\n dispatch({\n type: 'forceRender',\n });\n }, [rows, highlightedSpans, dispatch, memoCacheRef]);\n\n useEffect(() => {\n if (!root.startTime) return;\n\n const worker = new Worker(new URL('../worker', import.meta.url));\n let requestId = ++counterRef.current;\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as WorkerResponse;\n\n switch (data.type) {\n case 'setRowsResult': {\n if (data.isEnd) {\n for (const row of data.rows) {\n for (const node of row) {\n // Ensure that we remap to the original span to reduce memory overhead\n // and confusion down the line\n node.span = spanMap[node.span.spanId]?.span ?? node.span;\n }\n }\n }\n setRows(data.rows);\n break;\n }\n case 'updateHighlight': {\n if (data.requestId !== requestId) return;\n const { matches } = data;\n setRows((previous) => {\n for (const row of previous) {\n for (const node of row) {\n const isHighlighted = matches.has(node.span.spanId);\n if (node.isHighlighted === isHighlighted) continue;\n node.isHighlighted = isHighlighted;\n memoCacheRef.current.set(node.span.spanId, {});\n }\n }\n return previous;\n });\n dispatch({\n type: 'forceRender',\n });\n break;\n }\n default:\n break;\n }\n };\n worker.addEventListener('message', onMessage);\n\n const message: WorkerRequest = {\n requestId,\n type: 'calculateSpanPositions',\n root,\n };\n worker.postMessage(message);\n\n updateFilterRef.current = (_filter) => {\n const filter = _filter.trim().toLocaleLowerCase();\n if (!filter) {\n setRows((previous) =>\n previous.map((row) =>\n row.map((node) => {\n node.isHighlighted = undefined;\n return {\n ...node,\n };\n })\n )\n );\n return;\n }\n\n requestId = ++counterRef.current;\n const filterMessage: WorkerRequest = {\n type: 'filterSpans',\n requestId,\n root,\n filter,\n };\n worker.postMessage(filterMessage);\n };\n\n return () => {\n worker.terminate();\n };\n }, [root, spanMap, dispatch, memoCacheRef]);\n\n useEffect(() => {\n if (!rows.length) return;\n\n const $timeline = timelineRef.current;\n let snapshot = scrollSnapshotRef.current;\n let hasScrolled = false;\n let isDone = false;\n let maxD = 0;\n let currentD = 0;\n const overscan = Math.max(500, timelineWidth * 0.5);\n const queue = new Array<QueuedSpan[] | null>(rows.length).fill(null);\n\n const buildQueue = (): void => {\n isDone = true;\n\n const lastRow = Math.min(\n 1 + currentD + Math.ceil(snapshot?.endRow ?? Number.POSITIVE_INFINITY),\n rows.length\n );\n for (let i = lastRow; i--; ) {\n if (queue[i]) continue;\n const rowDelta = getRowDelta(i);\n if (Math.abs(rowDelta) > currentD) {\n isDone = false;\n if (rowDelta > 0) {\n continue;\n } else {\n break;\n }\n }\n\n const queueRow: QueuedSpan[] = [];\n const row = rows[i];\n if (!row) continue;\n\n for (const span of row) {\n if (!adjustSpanVisibility(span, scale)) continue;\n\n const d = getDistance(span);\n maxD = Math.max(d, maxD);\n\n queueRow.push({\n d,\n span,\n });\n }\n\n queue[i] = queueRow;\n }\n };\n\n /**\n * This returns the signed distance between the row and the targeted rows\n */\n const getRowDelta = (row: number): number => {\n if (!snapshot) return 0;\n\n if (row < snapshot.startRow) {\n return row - snapshot.startRow;\n } else if (row > snapshot.endRow) {\n return row - snapshot.endRow;\n }\n\n return 0;\n };\n\n const getDistance = (span: VisibleSpan): number => {\n if (!snapshot) return 0;\n\n let xDistance = 0;\n if (span.endTime < snapshot.startTime) {\n xDistance = snapshot.startTime - span.endTime;\n } else if (span.startTime > snapshot.endTime) {\n xDistance = span.startTime - snapshot.endTime;\n }\n\n const yDistance = Math.abs(getRowDelta(span.row));\n\n if (!xDistance && !yDistance) return 0;\n\n return Math.sqrt(\n (xDistance / scale) ** 2 + (yDistance * ROW_HEIGHT + ROW_PADDING) ** 2\n );\n };\n\n const updateSnapshot = (): void => {\n if (!$timeline) return;\n\n const { scrollLeft, scrollTop } = $timeline;\n const anchorX = 0;\n const anchorT = scrollLeft / scale;\n const startRow =\n (scrollTop - MARKER_HEIGHT - TIMELINE_PADDING) /\n (ROW_HEIGHT + ROW_PADDING);\n const endRow =\n startRow + Math.ceil(timelineHeight / (ROW_HEIGHT + ROW_PADDING));\n\n snapshot = {\n anchorT,\n anchorX,\n scrollLeft,\n scrollTop,\n startTime: root.startTime + scrollLeft / scale,\n endTime: root.startTime + (scrollLeft + timelineWidth) / scale,\n startRow,\n endRow,\n scale,\n };\n scrollSnapshotRef.current = snapshot;\n\n for (let i = queue.length; i--; ) {\n queue[i] = null;\n }\n };\n\n let nextFrame = 0;\n const onFrame = (): void => {\n if (hasScrolled || !snapshot) {\n hasScrolled = false;\n updateSnapshot();\n }\n buildQueue();\n const visible: VisibleSpan[] = [];\n const events: VisibleSpanEvent[] = [];\n for (const row of queue) {\n if (!row) continue;\n\n for (const { d, span } of row) {\n if (d > currentD) continue;\n visible.push(span);\n if (span.events) {\n events.push(...span.events);\n }\n }\n }\n\n if (currentD < overscan && (!isDone || currentD < maxD)) {\n currentD = Math.min(overscan, currentD + 100);\n nextFrame = requestAnimationFrame(onFrame);\n }\n\n setVisibleSpans(visible);\n setVisibleEvents(events);\n setResultScale(scale);\n };\n onFrame();\n\n let ignoreT = Date.now();\n const onWheel = (event: WheelEvent): void => {\n if (event.ctrlKey || event.metaKey) {\n ignoreT = Date.now();\n }\n };\n $timeline?.addEventListener('wheel', onWheel);\n\n const onScroll = (): void => {\n if (Date.now() - ignoreT <= 50) return;\n\n hasScrolled = true;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n $timeline?.addEventListener('scroll', onScroll);\n\n return () => {\n cancelAnimationFrame(nextFrame);\n $timeline?.removeEventListener('wheel', onWheel);\n $timeline?.removeEventListener('scroll', onScroll);\n };\n }, [\n rows,\n root,\n scale,\n scrollSnapshotRef,\n timelineRef,\n timelineWidth,\n timelineHeight,\n ]);\n\n useEffect(() => {\n if (!selected) return;\n\n let span: VisibleSpan | undefined;\n for (const x of visibleSpans) {\n if (x.span.spanId === selected.span.spanId) {\n span = x;\n break;\n }\n }\n\n const $span = span?.ref?.current;\n if (!span || !$span) return;\n\n span.isSelected = true;\n // Get both the base span className and custom class name\n const baseClassName = getSpanClassName(span, scale);\n const customClassName = customSpanClassNameFunc\n ? customSpanClassNameFunc(span)\n : '';\n $span.className = clsx(baseClassName, customClassName);\n\n return () => {\n span.isSelected = false;\n const baseClassName = getSpanClassName(span, scale);\n const customClassName = customSpanClassNameFunc\n ? customSpanClassNameFunc(span)\n : '';\n $span.className = clsx(baseClassName, customClassName);\n };\n }, [visibleSpans, scale, selected, customSpanClassNameFunc]);\n\n return {\n rows,\n spans: visibleSpans,\n events: visibleEvents,\n scale: resultScale,\n };\n};\n\n/**\n * This hook keeps returning the same value until the current value\n * has been stable for a few frames in a row\n */\nfunction useStableValue<T>(value: T): T {\n const [cached, setCached] = useState(value);\n\n useEffect(() => {\n if (cached === value) return;\n\n let frameCount = 0;\n let nextFrame = 0;\n const onFrame = (): void => {\n if (++frameCount <= 3) {\n nextFrame = requestAnimationFrame(onFrame);\n return;\n }\n\n setCached(value);\n };\n onFrame();\n\n return () => {\n cancelAnimationFrame(nextFrame);\n };\n }, [cached, value]);\n\n return cached;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * Returns a formatted pagination display string\n * @param currentPage - The current page number\n * @param totalPages - The total number of pages visited so far\n * @param hasMore - Whether there are more pages available\n * @returns Formatted string like \"Page 1 of 3+\" or \"Page 2 of 2\"\n */\nexport function getPaginationDisplay(\n currentPage: number,\n totalPages: number,\n hasMore: boolean\n): string {\n if (hasMore) {\n return `Page ${currentPage} of ${totalPages}+`;\n }\n return `Page ${currentPage} of ${totalPages}`;\n}\n","export { PanelResizer } from './components/span-detail-panel';\nexport { TraceViewerContextProvider, useTraceViewer } from './context';\nexport * from './trace-viewer';\nexport type { Trace } from './types';\n","export {\n parseStepName,\n parseWorkflowName,\n} from '@workflow/core/parse-name';\n\nexport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nexport * from './api/workflow-api-client';\nexport { RunTraceView } from './run-trace-view';\nexport type { Span, SpanEvent } from './trace-viewer/types';\nexport { WorkflowTraceViewer } from './workflow-trace-view';\n","import type {\n RootNode,\n Span,\n SpanNode,\n SpanNodeEvent,\n Trace,\n TraceNode,\n VisibleSpan,\n} from '../types';\nimport { getHighResInMs, getMsInHighRes } from './timing';\n\nexport const parseTrace = (\n trace: Trace\n): { root: RootNode; map: Record<string, SpanNode> } => {\n const { spans } = trace;\n const root: RootNode = {\n startTime: 0,\n endTime: 0,\n duration: 0,\n depth: 0,\n children: [],\n };\n const map: Record<string, SpanNode> = {};\n\n const resourceIndices = new Map<string, number>();\n const getResourceIndex = (resource: string): number => {\n const existing = resourceIndices.get(resource);\n if (existing) return existing;\n\n const index = resourceIndices.size + 1;\n resourceIndices.set(resource, index);\n return index;\n };\n\n let hasUserSpans = false;\n for (const span of spans) {\n const startTime = getHighResInMs(span.startTime);\n const endTime = getHighResInMs(span.endTime);\n const duration = getHighResInMs(span.duration);\n if (endTime > root.endTime) {\n root.endTime = endTime;\n root.duration = endTime - root.startTime;\n }\n if (root.startTime === 0 || startTime < root.startTime) {\n root.startTime = startTime;\n root.duration = root.endTime - startTime;\n }\n const isVercelResource = span.resource.startsWith('vercel.');\n if (!isVercelResource) {\n hasUserSpans = true;\n }\n\n const isVercel =\n isVercelResource &&\n (span.resource !== 'vercel.serverless-runtime' ||\n !('http.method' in span.attributes));\n\n const resourceIndex = isVercel ? 0 : getResourceIndex(span.resource);\n\n let label: string | undefined;\n if (isVercel) {\n label = `▲ ${span.name}`;\n }\n map[span.spanId] = {\n parent: null as unknown as SpanNode,\n startTime,\n endTime,\n duration,\n span,\n depth: 0,\n label,\n events: parseEvents(span),\n isVercel,\n children: [],\n resourceIndex,\n };\n }\n\n const addTo = (node: SpanNode, parentId?: string): void => {\n let parent: TraceNode | undefined;\n if (parentId) {\n parent = map[parentId];\n if (!parent) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Could not find parent span with spanId: %s', parentId);\n }\n parent = root;\n }\n } else {\n parent = root;\n }\n node.parent = parent;\n parent.children.push(node);\n };\n\n const updateDepth = (node: TraceNode): void => {\n if ('parent' in node) {\n node.depth = node.parent.depth + 1;\n }\n for (const child of node.children) {\n updateDepth(child);\n }\n };\n\n let hintIdCounter = 1;\n const addInstrumentationHint = (node: TraceNode, name: string): boolean => {\n if ('parent' in node) {\n if (node.span.name === name) {\n let waitUntilStart = node.endTime;\n // Detect the parent that's most likely to be at the bottom of the UI\n const findParent = (span: SpanNode): SpanNode => {\n if (!span.children.length) {\n if (span.span.name === 'waitUntil') {\n waitUntilStart = span.startTime;\n return span.parent as SpanNode;\n }\n return span;\n }\n\n return (\n span.children\n .map(findParent)\n .sort((a, b) => a.duration - b.duration)[0] || span\n );\n };\n const parent = findParent(node);\n\n const spanId = `instrumentation-hint-${hintIdCounter++}`;\n const offset = node.duration * 0.05;\n const startTime = node.startTime + offset;\n const endTime = Math.max(\n startTime + offset,\n Math.min(waitUntilStart - node.duration * 0.01, node.endTime - offset)\n );\n const duration = endTime - startTime;\n const hint: SpanNode = {\n parent,\n startTime,\n endTime,\n duration,\n span: {\n spanId,\n name: 'Add your spans here',\n resource: '',\n kind: 0,\n library: {\n name: '',\n },\n status: {\n code: 200,\n },\n traceFlags: 0,\n attributes: {},\n links: [],\n events: [],\n startTime: getMsInHighRes(startTime),\n endTime: getMsInHighRes(endTime),\n duration: getMsInHighRes(duration),\n },\n depth: node.depth + 1,\n isVercel: false,\n isInstrumentationHint: true,\n children: [],\n resourceIndex: 1,\n };\n parent.children.push(hint);\n map[spanId] = hint;\n return true;\n }\n }\n for (const child of node.children) {\n if (addInstrumentationHint(child, name)) return true;\n }\n return false;\n };\n\n // Create tree by matching nodes to their parents\n for (const node of Object.values(map)) {\n addTo(node, node.span.parentSpanId);\n }\n\n // Adjust depth of each node now that the tree is fully constructed\n updateDepth(root);\n\n // Add hints in the places where user spans would appear\n if (!hasUserSpans) {\n for (const name of [\n 'Invoke Function',\n 'Invoke Middleware',\n 'Vercel Runtime',\n ]) {\n if (addInstrumentationHint(root, name)) break;\n }\n }\n\n return { root, map };\n};\n\nconst parseEvents = (span: Span): SpanNodeEvent[] | undefined => {\n if (!span.events.length) return;\n\n const keyPrefix = `${span.spanId}:ev`;\n\n return span.events\n .map<SpanNodeEvent>((event, index) => ({\n key: `${keyPrefix}${index}`,\n timestamp: getHighResInMs(event.timestamp),\n event,\n }))\n .sort((a, b) => a.timestamp - b.timestamp);\n};\n\n/**\n * Adds a node to a row and attempts to find the ideal placement\n * within an existing row, creating a new one if necessary\n */\nexport const addToRow = (\n placed: VisibleSpan[][],\n node: VisibleSpan,\n precision: number\n): void => {\n const parent = node.parent as VisibleSpan | undefined;\n for (let y = (parent?.row || -1) + 1; ; ++y) {\n let row = placed[y];\n if (!row) {\n row = [];\n placed.push(row);\n } else if (\n !row.every(\n ({ startTime, endTime }) =>\n startTime + precision > node.endTime ||\n endTime - precision < node.startTime\n )\n ) {\n continue;\n }\n node.row = y;\n row.push(node);\n break;\n }\n};\n\nexport const spanVisiblityHelper = (\n node: TraceNode,\n scale: number,\n visible: VisibleSpan[]\n): void => {\n if ('parent' in node) {\n const n = node as VisibleSpan;\n n.row = -1;\n // Always make spans visible regardless of width\n n.isVisible = true;\n n.isHovered = false;\n if (!n.isVisible) return;\n\n visible.push(n);\n }\n\n for (const child of node.children) {\n spanVisiblityHelper(child, scale, visible);\n }\n};\n\nexport const adjustSpanVisibility = (\n span: VisibleSpan,\n _scale: number\n): boolean => {\n // Always make spans visible regardless of width\n span.isVisible = true;\n span.isHovered = false;\n\n return span.isVisible;\n};\n","export const SEARCH_HEIGHT = 40;\nexport const SEARCH_GAP = 8;\nexport const MAP_HEIGHT = 56;\nexport const TIMELINE_PADDING = 8;\nexport const ROW_PADDING = 2;\nexport const ROW_HEIGHT = 24;\nexport const MARKER_HEIGHT = 24;\nexport const MARKER_NOTCH_HEIGHT = 8;\n","export const detectScrollbarWidth = (): number => {\n if (!('document' in globalThis)) return 0;\n const size = 400;\n const container = document.createElement('div');\n container.style.width = `${size}px`;\n container.style.height = `${size}px`;\n container.style.overflow = 'scroll';\n document.body.appendChild(container);\n const scrollbarWidth = size - container.scrollWidth;\n container.remove();\n\n return scrollbarWidth;\n};\n","import type { ReactNode } from 'react';\n\nexport function IconZoomIn({ size = 16 }: { size?: number }): ReactNode {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <title>Zoom In</title>\n <path\n d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M11 8v6M8 11h6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M20 20l-3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function IconZoomOut({ size = 16 }: { size?: number }): ReactNode {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <title>Zoom Out</title>\n <path\n d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 11h6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M20 20l-3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function IconMinus({ size = 16 }: { size?: number }): ReactNode {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <title>Minus</title>\n <path\n d=\"M6 12h12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function DetailCard({\n summary,\n children,\n}: {\n summary: ReactNode;\n children?: ReactNode;\n}) {\n return (\n <details className=\"group\">\n <summary\n className=\"cursor-pointer rounded-md border px-3 py-2 text-copy-14 hover:brightness-95\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-900)',\n }}\n >\n {summary}\n </summary>\n <div className=\"p-2\">{children}</div>\n </details>\n );\n}\n","import {\n type MutableRefObject,\n memo,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport type { VisibleSpan } from '../types';\nimport { MAP_HEIGHT, TIMELINE_PADDING } from '../util/constants';\nimport { useImmediateStyle } from '../util/use-immediate-style';\n\nconst getDpi = (): number => {\n if ('devicePixelRatio' in globalThis) {\n return globalThis.devicePixelRatio || 1;\n }\n return 1;\n};\n\nconst useDpi = (): number => {\n const [dpi, setDpi] = useState(1);\n useLayoutEffect(() => {\n const onChange = (): void => setDpi(getDpi());\n const media = matchMedia(`(resolution: ${dpi}dppx)`);\n media.addEventListener('change', onChange);\n onChange();\n\n return () => {\n media.removeEventListener('change', onChange);\n };\n }, [dpi]);\n return dpi;\n};\n\nconst padding = TIMELINE_PADDING;\n\nexport const MiniMap = memo(function MiniMap({\n timelineRef,\n rows,\n scale,\n}: {\n timelineRef: MutableRefObject<HTMLDivElement | null>;\n rows: VisibleSpan[][];\n scale: number;\n}) {\n const {\n state: { root, baseScale, timelineWidth, width: fullWidth, scrollbarWidth },\n } = useTraceViewer();\n const mapWidth = fullWidth + TIMELINE_PADDING * 2;\n const dpi = useDpi();\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n const thumbRatio =\n (fullWidth / (fullWidth - scrollbarWidth)) *\n Math.min(fullWidth / timelineWidth, baseScale / scale);\n const thumbWidth = Math.min(\n fullWidth,\n (timelineWidth - scrollbarWidth) * thumbRatio\n );\n useEffect(() => {\n let isHeld = false;\n let clientX = 0;\n let rect: DOMRect | undefined;\n\n const isValidEventTarget = (target: EventTarget | null): boolean => {\n return Boolean(containerRef.current?.contains(target as HTMLElement));\n };\n\n let nextFrame = 0;\n const onFrame = (): void => {\n if (!isHeld || !rect) return;\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n const x = clientX - thumbWidth * 0.5 - rect.left;\n $timeline.scrollLeft = x / thumbRatio;\n };\n\n const onPointerMove = (event: PointerEvent): void => {\n ({ clientX } = event);\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n const onPointerDown = (event: PointerEvent): void => {\n if (!isValidEventTarget(event.target)) return;\n isHeld = true;\n rect = containerRef.current?.getBoundingClientRect();\n onPointerMove(event);\n };\n\n const onPointerUp = (): void => {\n isHeld = false;\n rect = undefined;\n };\n\n const onTouchStart = (event: TouchEvent): void => {\n if (!isValidEventTarget(event.target)) return;\n if (event.cancelable) {\n event.preventDefault();\n }\n };\n const onTouchMove = (event: TouchEvent): void => {\n if (!isHeld) return;\n if (event.cancelable) {\n event.preventDefault();\n }\n };\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('pointermove', onPointerMove);\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('blur', onPointerUp);\n window.addEventListener('touchstart', onTouchStart, { passive: false });\n window.addEventListener('touchmove', onTouchMove, { passive: false });\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('blur', onPointerUp);\n window.removeEventListener('touchstart', onTouchStart);\n window.removeEventListener('touchmove', onTouchMove);\n cancelAnimationFrame(nextFrame);\n };\n }, [timelineRef, thumbRatio, thumbWidth]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!canvas || !ctx) return;\n\n const render = (): void => {\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.scale(dpi, dpi);\n\n const gap = 1;\n const height = 3;\n const ratio = (mapWidth - padding * 2) / root.duration;\n\n // TODO: fill spans based on depth\n ctx.fillStyle = '#ccc';\n ctx.beginPath();\n for (const row of rows) {\n for (const span of row) {\n const y = padding - gap + (gap + height) * span.row;\n if (y >= MAP_HEIGHT - height - padding) break;\n\n const x = padding + (span.startTime - root.startTime) * ratio;\n const width = span.duration * ratio;\n\n ctx.roundRect(x, y, width, height, height);\n }\n }\n ctx.fill();\n };\n\n const nextFrame = requestAnimationFrame(render);\n\n return () => cancelAnimationFrame(nextFrame);\n }, [dpi, root, mapWidth, rows]);\n\n const thumbRef = useRef<HTMLDivElement>(null);\n const { style: thumbStyle, setStyle: setThumbStyle } =\n useImmediateStyle(thumbRef);\n useLayoutEffect(() => {\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n let nextFrame = 0;\n const onFrame = (): void => {\n setThumbStyle(\n 'transform',\n `translateX(${padding + $timeline.scrollLeft * thumbRatio}px)`\n );\n };\n onFrame();\n\n const onScroll = (): void => {\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n $timeline.addEventListener('scroll', onScroll);\n\n return () => {\n cancelAnimationFrame(nextFrame);\n $timeline.removeEventListener('scroll', onScroll);\n };\n }, [timelineRef, thumbRatio, setThumbStyle]);\n\n return (\n <div\n className={styles.mapContainer}\n ref={containerRef}\n style={{\n width: thumbWidth > 0 ? mapWidth : '100%',\n height: MAP_HEIGHT,\n }}\n >\n <canvas\n className={styles.mapCanvas}\n height={MAP_HEIGHT * dpi}\n ref={canvasRef}\n style={{ width: mapWidth, height: MAP_HEIGHT }}\n width={mapWidth * dpi}\n />\n <div\n className={styles.mapThumb}\n ref={thumbRef}\n style={{\n transform: thumbStyle.transform,\n width:\n thumbWidth > 0\n ? thumbWidth\n : `calc(100% - ${TIMELINE_PADDING * 2}px)`,\n top: 2,\n height: MAP_HEIGHT - 4,\n }}\n />\n </div>\n );\n});\n","'use client';\n\nimport type {\n Event,\n Hook,\n Step,\n WorkflowRun,\n WorkflowRunStatus,\n} from '@workflow/world';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getPaginationDisplay } from '../lib/utils';\nimport type { EnvMap, ServerActionError } from './workflow-server-actions';\nimport {\n cancelRun as cancelRunServerAction,\n fetchEvents,\n fetchEventsByCorrelationId,\n fetchHook,\n fetchHooks,\n fetchRun,\n fetchRuns,\n fetchStep,\n fetchSteps,\n readStreamServerAction,\n recreateRun as recreateRunServerAction,\n} from './workflow-server-actions';\n\nconst MAX_ITEMS = 1000;\nconst LIVE_POLL_LIMIT = 10;\nconst LIVE_STEP_UPDATE_INTERVAL_MS = 2000;\nconst LIVE_UPDATE_INTERVAL_MS = 5000;\n\n/**\n * Helper to convert ServerActionError to WorkflowAPIError\n */\nfunction createWorkflowAPIError(\n serverError: ServerActionError\n): WorkflowAPIError {\n return new WorkflowAPIError(serverError.message, {\n cause: serverError.cause,\n request: serverError.request,\n layer: serverError.layer,\n });\n}\n\n/**\n * Gets a user-facing error message from an error object.\n * Handles both WorkflowAPIError and regular Error instances.\n */\nexport const getErrorMessage = (error: Error | WorkflowAPIError): string => {\n if ('layer' in error && error.layer) {\n if (error instanceof WorkflowAPIError) {\n if (error.request?.status === 403) {\n return 'Your current Vercel account does not have access to this data. Please use `vercel login` to log in, or use `vercel switch` to ensure you can access the correct team.';\n }\n }\n\n // WorkflowAPIError already has user-facing messages\n return error.message;\n }\n\n return error instanceof Error ? error.message : 'An error occurred';\n};\n\n/**\n * Helper to handle server action results and throw WorkflowAPIError on failure\n */\nfunction unwrapServerActionResult<T>(result: {\n success: boolean;\n data?: T;\n error?: ServerActionError;\n}): T {\n if (!result.success) {\n if (!result.error) {\n throw new WorkflowAPIError('Unknown error occurred', { layer: 'client' });\n }\n throw createWorkflowAPIError(result.error);\n }\n return result.data as T;\n}\n\n/**\n * Error instance for API and server-side errors.\n * `error.message` will be a user-facing error message, to be displayed in UI.\n * `error.cause` will be a developer-facing error message, to be displayed in logs.\n *\n * If the error originates from an HTTP request made from a server action,\n * these fields will be populated:\n * - `error.request` will be a JSON-serializable object representing the request made.\n * - `error.layer` will be 'API'\n *\n * If the error originates from inside the server action, or there's an error with\n * calling the server action, these fields will be populated:\n * - `error.layer` will be 'server'\n */\nexport class WorkflowAPIError extends Error {\n request?: any;\n layer?: 'client' | 'server' | 'API';\n constructor(\n message: string,\n options?: {\n cause?: unknown;\n request?: any;\n layer?: 'client' | 'server' | 'API';\n }\n ) {\n super(message, { cause: options?.cause });\n this.name = 'WorkflowAPIError';\n this.request = options?.request;\n this.layer = options?.layer;\n if (options?.cause instanceof Error) {\n this.stack = `${this.stack}\\nCaused by: ${options.cause.stack}`;\n }\n }\n}\n\ninterface PageResult<T> {\n data: T[] | null;\n isLoading: boolean;\n error: Error | null;\n}\n\ninterface PaginatedList<T> {\n data: PageResult<T>;\n allData: PageResult<T>[];\n error: Error | null;\n isLoading: boolean;\n currentPage: number;\n totalPages: number;\n nextPage: () => void;\n previousPage: () => void;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n reload: () => void;\n pageInfo: string;\n}\n\n/**\n * Returns a list of runs with pagination control\n */\nexport function useWorkflowRuns(\n env: EnvMap,\n params: {\n workflowName?: string;\n status?: WorkflowRunStatus;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n }\n): PaginatedList<WorkflowRun> {\n const { workflowName, status, limit = 10, sortOrder = 'desc' } = params;\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [hasMore, setHasMore] = useState(false);\n const [currentPage, setCurrentPage] = useState(0);\n const [pageHistory, setPageHistory] = useState<(string | undefined)[]>([\n undefined,\n ]);\n const [maxPagesVisited, setMaxPagesVisited] = useState(1);\n\n // Store PageResult for each page\n const [allPageResults, setAllPageResults] = useState<\n Map<number, PageResult<WorkflowRun>>\n >(new Map([[0, { data: null, isLoading: true, error: null }]]));\n\n // Cache for fetched pages - key is cursor (or 'initial' for first page)\n const pageCache = useRef<\n Map<\n string,\n {\n data: WorkflowRun[];\n cursor?: string;\n hasMore: boolean;\n }\n >\n >(new Map());\n\n const fetchPage = useCallback(\n async (pageIndex: number, pageCursor?: string, force: boolean = false) => {\n const cacheKey = pageCursor ?? 'initial';\n\n // Set loading state for this page\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: prev.get(pageIndex)?.data ?? null,\n isLoading: true,\n error: null,\n });\n return newMap;\n });\n\n // Check cache first unless force reload\n if (!force && pageCache.current.has(cacheKey)) {\n const cached = pageCache.current.get(cacheKey);\n if (cached) {\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: cached.data,\n isLoading: false,\n error: null,\n });\n return newMap;\n });\n setCursor(cached.cursor);\n setHasMore(cached.hasMore);\n return;\n }\n }\n\n try {\n const serverResult = await fetchRuns(env, {\n cursor: pageCursor,\n sortOrder,\n limit: limit,\n workflowName,\n status,\n });\n const result = unwrapServerActionResult(serverResult);\n\n // Cache the result\n pageCache.current.set(cacheKey, {\n data: result.data,\n cursor: result.cursor,\n hasMore: result.hasMore,\n });\n\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: result.data,\n isLoading: false,\n error: null,\n });\n return newMap;\n });\n setCursor(result.cursor);\n setHasMore(result.hasMore);\n } catch (err) {\n const error =\n err instanceof WorkflowAPIError\n ? err\n : err instanceof Error\n ? new WorkflowAPIError(err.message, {\n cause: err,\n layer: 'client',\n })\n : new WorkflowAPIError(String(err), { layer: 'client' });\n\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: prev.get(pageIndex)?.data ?? null,\n isLoading: false,\n error,\n });\n return newMap;\n });\n }\n },\n [env, workflowName, limit, sortOrder, status]\n );\n\n // Initial load\n // biome-ignore lint/correctness/useExhaustiveDependencies: Want to refetch first page on param change\n useEffect(() => {\n fetchPage(0, undefined, true);\n }, [fetchPage, sortOrder, env, limit, workflowName, status]);\n\n const nextPage = useCallback(() => {\n if (hasMore && cursor) {\n const newPage = currentPage + 1;\n\n setPageHistory((prev) => [...prev, cursor]);\n setCurrentPage(newPage);\n setMaxPagesVisited((prev) => Math.max(prev, newPage + 1));\n\n // Initialize next page if not already loaded\n if (!allPageResults.has(newPage)) {\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(newPage, { data: null, isLoading: true, error: null });\n return newMap;\n });\n }\n\n fetchPage(newPage, cursor);\n }\n }, [hasMore, cursor, fetchPage, currentPage, allPageResults]);\n\n const previousPage = useCallback(() => {\n if (currentPage > 0) {\n const newPage = currentPage - 1;\n const prevCursor = pageHistory[newPage];\n\n setCurrentPage(newPage);\n fetchPage(newPage, prevCursor);\n }\n }, [currentPage, pageHistory, fetchPage]);\n\n const reload = useCallback(() => {\n // Clear cache and results\n pageCache.current.clear();\n setAllPageResults(\n new Map([[0, { data: null, isLoading: true, error: null }]])\n );\n // Reset to first page\n setCurrentPage(0);\n setPageHistory([undefined]);\n setMaxPagesVisited(1);\n // Force fetch first page\n fetchPage(0, undefined, true);\n }, [fetchPage]);\n\n const currentPageResult = allPageResults.get(currentPage) ?? {\n data: null,\n isLoading: true,\n error: null,\n };\n\n // Compute global error (any page has error)\n const globalError =\n Array.from(allPageResults.values()).find((p) => p.error)?.error ?? null;\n\n // Compute global loading (any page is loading)\n const globalLoading = Array.from(allPageResults.values()).some(\n (p) => p.isLoading\n );\n\n const totalPages = hasMore ? currentPage + 2 : currentPage + 1;\n const currentPageNumber = currentPage + 1;\n\n // Only show \"+\" if we're on the last visited page AND there are more pages\n const isOnLastVisitedPage = currentPageNumber === maxPagesVisited;\n const showPlus = isOnLastVisitedPage && hasMore;\n const pageInfo = getPaginationDisplay(\n currentPageNumber,\n maxPagesVisited,\n showPlus\n );\n\n return {\n data: currentPageResult,\n allData: Array.from(allPageResults.values()),\n error: globalError,\n isLoading: globalLoading,\n currentPage,\n totalPages,\n nextPage,\n previousPage,\n hasNextPage: hasMore,\n hasPreviousPage: currentPage > 0,\n reload,\n pageInfo,\n };\n}\n\n/**\n * Returns a list of hooks with pagination control\n */\nexport function useWorkflowHooks(\n env: EnvMap,\n params: {\n runId?: string;\n limit?: number;\n sortOrder?: 'asc' | 'desc';\n }\n): PaginatedList<Hook> {\n const { runId, limit = 10, sortOrder = 'desc' } = params;\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [hasMore, setHasMore] = useState(false);\n const [currentPage, setCurrentPage] = useState(0);\n const [pageHistory, setPageHistory] = useState<(string | undefined)[]>([\n undefined,\n ]);\n const [maxPagesVisited, setMaxPagesVisited] = useState(1);\n\n // Store PageResult for each page\n const [allPageResults, setAllPageResults] = useState<\n Map<number, PageResult<Hook>>\n >(new Map([[0, { data: null, isLoading: true, error: null }]]));\n\n // Cache for fetched pages - key is cursor (or 'initial' for first page)\n const pageCache = useRef<\n Map<\n string,\n {\n data: Hook[];\n cursor?: string;\n hasMore: boolean;\n }\n >\n >(new Map());\n\n const fetchPage = useCallback(\n async (pageIndex: number, pageCursor?: string, force: boolean = false) => {\n const cacheKey = pageCursor ?? 'initial';\n\n // Set loading state for this page\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: prev.get(pageIndex)?.data ?? null,\n isLoading: true,\n error: null,\n });\n return newMap;\n });\n\n // Check cache first unless force reload\n if (!force && pageCache.current.has(cacheKey)) {\n const cached = pageCache.current.get(cacheKey);\n if (cached) {\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: cached.data,\n isLoading: false,\n error: null,\n });\n return newMap;\n });\n setCursor(cached.cursor);\n setHasMore(cached.hasMore);\n return;\n }\n }\n\n try {\n const serverResult = await fetchHooks(env, {\n runId,\n cursor: pageCursor,\n sortOrder,\n limit: limit,\n });\n const result = unwrapServerActionResult(serverResult);\n\n // Cache the result\n pageCache.current.set(cacheKey, {\n data: result.data,\n cursor: result.cursor,\n hasMore: result.hasMore,\n });\n\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: result.data,\n isLoading: false,\n error: null,\n });\n return newMap;\n });\n setCursor(result.cursor);\n setHasMore(result.hasMore);\n } catch (err) {\n const error =\n err instanceof WorkflowAPIError\n ? err\n : err instanceof Error\n ? new WorkflowAPIError(err.message, {\n cause: err,\n layer: 'client',\n })\n : new WorkflowAPIError(String(err), { layer: 'client' });\n\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(pageIndex, {\n data: prev.get(pageIndex)?.data ?? null,\n isLoading: false,\n error,\n });\n return newMap;\n });\n }\n },\n [env, runId, limit, sortOrder]\n );\n\n // Initial load\n useEffect(() => {\n fetchPage(0, undefined);\n }, [fetchPage]);\n\n const nextPage = useCallback(() => {\n if (hasMore && cursor) {\n const newPage = currentPage + 1;\n\n setPageHistory((prev) => [...prev, cursor]);\n setCurrentPage(newPage);\n setMaxPagesVisited((prev) => Math.max(prev, newPage + 1));\n\n // Initialize next page if not already loaded\n if (!allPageResults.has(newPage)) {\n setAllPageResults((prev) => {\n const newMap = new Map(prev);\n newMap.set(newPage, { data: null, isLoading: true, error: null });\n return newMap;\n });\n }\n\n fetchPage(newPage, cursor);\n }\n }, [hasMore, cursor, fetchPage, currentPage, allPageResults]);\n\n const previousPage = useCallback(() => {\n if (currentPage > 0) {\n const newPage = currentPage - 1;\n const prevCursor = pageHistory[newPage];\n\n setCurrentPage(newPage);\n fetchPage(newPage, prevCursor);\n }\n }, [currentPage, pageHistory, fetchPage]);\n\n const reload = useCallback(() => {\n // Clear cache and results\n pageCache.current.clear();\n setAllPageResults(\n new Map([[0, { data: null, isLoading: true, error: null }]])\n );\n // Reset to first page\n setCurrentPage(0);\n setPageHistory([undefined]);\n setMaxPagesVisited(1);\n // Force fetch first page\n fetchPage(0, undefined, true);\n }, [fetchPage]);\n\n const currentPageResult = allPageResults.get(currentPage) ?? {\n data: null,\n isLoading: true,\n error: null,\n };\n\n // Compute global error (any page has error)\n const globalError =\n Array.from(allPageResults.values()).find((p) => p.error)?.error ?? null;\n\n // Compute global loading (any page is loading)\n const globalLoading = Array.from(allPageResults.values()).some(\n (p) => p.isLoading\n );\n\n const totalPages = hasMore ? currentPage + 2 : currentPage + 1;\n const currentPageNumber = currentPage + 1;\n\n // Only show \"+\" if we're on the last visited page AND there are more pages\n const isOnLastVisitedPage = currentPageNumber === maxPagesVisited;\n const showPlus = isOnLastVisitedPage && hasMore;\n const pageInfo = getPaginationDisplay(\n currentPageNumber,\n maxPagesVisited,\n showPlus\n );\n\n return {\n data: currentPageResult,\n allData: Array.from(allPageResults.values()),\n error: globalError,\n isLoading: globalLoading,\n currentPage,\n totalPages,\n nextPage,\n previousPage,\n hasNextPage: hasMore,\n hasPreviousPage: currentPage > 0,\n reload,\n pageInfo,\n };\n}\n\n// Helper function to exhaustively fetch steps\nasync function fetchAllSteps(\n env: EnvMap,\n runId: string\n): Promise<{ data: Step[]; cursor?: string }> {\n let stepsData: Step[] = [];\n let stepsCursor: string | undefined;\n while (true) {\n const serverResult = await fetchSteps(env, runId, {\n cursor: stepsCursor,\n sortOrder: 'asc',\n limit: 100,\n });\n const result = unwrapServerActionResult(serverResult);\n\n stepsData = [...stepsData, ...result.data];\n if (!result.hasMore || !result.cursor || stepsData.length >= MAX_ITEMS) {\n break;\n }\n stepsCursor = result.cursor;\n }\n\n return { data: stepsData, cursor: stepsCursor };\n}\n\n// Helper function to exhaustively fetch hooks\nasync function fetchAllHooks(\n env: EnvMap,\n runId: string\n): Promise<{ data: Hook[]; cursor?: string }> {\n let hooksData: Hook[] = [];\n let hooksCursor: string | undefined;\n while (true) {\n const serverResult = await fetchHooks(env, {\n runId,\n cursor: hooksCursor,\n sortOrder: 'asc',\n limit: 100,\n });\n const result = unwrapServerActionResult(serverResult);\n\n hooksData = [...hooksData, ...result.data];\n if (!result.hasMore || !result.cursor || hooksData.length >= MAX_ITEMS) {\n break;\n }\n hooksCursor = result.cursor;\n }\n\n return { data: hooksData, cursor: hooksCursor };\n}\n\n// Helper function to exhaustively fetch events\nasync function fetchAllEvents(\n env: EnvMap,\n runId: string\n): Promise<{ data: Event[]; cursor?: string }> {\n let eventsData: Event[] = [];\n let eventsCursor: string | undefined;\n while (true) {\n const serverResult = await fetchEvents(env, runId, {\n cursor: eventsCursor,\n sortOrder: 'asc',\n limit: 1000,\n });\n const result = unwrapServerActionResult(serverResult);\n\n eventsData = [...eventsData, ...result.data];\n if (!result.hasMore || !result.cursor || eventsData.length >= MAX_ITEMS) {\n break;\n }\n eventsCursor = result.cursor;\n }\n\n return { data: eventsData, cursor: eventsCursor };\n}\n\n/**\n * Returns (and keeps up-to-date) all data related to a run.\n * Items returned will _not_ have resolved data (like input/output values).\n */\nexport function useWorkflowTraceViewerData(\n env: EnvMap,\n runId: string,\n options: { live?: boolean } = {}\n) {\n const { live = false } = options;\n\n const [run, setRun] = useState<WorkflowRun | null>(null);\n const [steps, setSteps] = useState<Step[]>([]);\n const [hooks, setHooks] = useState<Hook[]>([]);\n const [events, setEvents] = useState<Event[]>([]);\n const [loading, setLoading] = useState(true);\n const [auxiliaryDataLoading, setAuxiliaryDataLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const [stepsCursor, setStepsCursor] = useState<string | undefined>();\n const [hooksCursor, setHooksCursor] = useState<string | undefined>();\n const [eventsCursor, setEventsCursor] = useState<string | undefined>();\n\n const isFetchingRef = useRef(false);\n const [initialLoadCompleted, setInitialLoadCompleted] = useState(false);\n\n // Fetch all data for a run\n const fetchAllData = useCallback(async () => {\n if (isFetchingRef.current) {\n return;\n }\n\n isFetchingRef.current = true;\n setLoading(true);\n setAuxiliaryDataLoading(true);\n setError(null);\n\n const promises = [\n fetchRun(env, runId).then((result) => {\n // The run is the most visible part - so we can start showing UI\n // as soon as we have the run\n setLoading(false);\n setRun(unwrapServerActionResult(result));\n }),\n fetchAllSteps(env, runId).then((result) => {\n setSteps(result.data);\n setStepsCursor(result.cursor);\n }),\n fetchAllHooks(env, runId).then((result) => {\n setHooks(result.data);\n setHooksCursor(result.cursor);\n }),\n fetchAllEvents(env, runId).then((result) => {\n setEvents(result.data);\n setEventsCursor(result.cursor);\n }),\n ];\n\n try {\n // Fetch run\n await Promise.all(promises);\n } catch (err) {\n const error =\n err instanceof WorkflowAPIError\n ? err\n : err instanceof Error\n ? new WorkflowAPIError(err.message, { cause: err, layer: 'client' })\n : new WorkflowAPIError(String(err), { layer: 'client' });\n\n setError(error);\n } finally {\n setLoading(false);\n setAuxiliaryDataLoading(false);\n isFetchingRef.current = false;\n setInitialLoadCompleted(true);\n }\n }, [env, runId]);\n\n // Helper to merge steps by ID\n const mergeSteps = useCallback((prev: Step[], newData: Step[]): Step[] => {\n const combined = [...prev, ...newData];\n const uniqueById = new Map(combined.map((s) => [(s as any).stepId, s]));\n return Array.from(uniqueById.values());\n }, []);\n\n // Helper to merge hooks by ID\n const mergeHooks = useCallback((prev: Hook[], newData: Hook[]): Hook[] => {\n const combined = [...prev, ...newData];\n const uniqueById = new Map(combined.map((h) => [(h as any).hookId, h]));\n return Array.from(uniqueById.values());\n }, []);\n\n // Helper to merge events by ID\n const mergeEvents = useCallback(\n (prev: Event[], newData: Event[]): Event[] => {\n const combined = [...prev, ...newData];\n const uniqueById = new Map(combined.map((e) => [(e as any).eventId, e]));\n return Array.from(uniqueById.values());\n },\n []\n );\n\n const pollRun = useCallback(async (): Promise<boolean> => {\n if (run?.completedAt) {\n return false;\n }\n const serverResult = await fetchRun(env, runId);\n const result = unwrapServerActionResult(serverResult);\n setRun(result);\n return true;\n }, [env, runId, run?.completedAt]);\n\n // Poll for new steps\n const pollSteps = useCallback(async (): Promise<boolean> => {\n const serverResult = await fetchSteps(env, runId, {\n cursor: stepsCursor,\n sortOrder: 'asc',\n limit: LIVE_POLL_LIMIT,\n });\n const result = unwrapServerActionResult(serverResult);\n if (result.data.length > 0) {\n setSteps((prev) => mergeSteps(prev, result.data));\n if (result.cursor) {\n setStepsCursor(result.cursor);\n }\n return true;\n }\n return false;\n }, [env, runId, stepsCursor, mergeSteps]);\n\n // Poll for new hooks\n const pollHooks = useCallback(async (): Promise<boolean> => {\n const serverResult = await fetchHooks(env, {\n runId,\n cursor: hooksCursor,\n sortOrder: 'asc',\n limit: LIVE_POLL_LIMIT,\n });\n const result = unwrapServerActionResult(serverResult);\n if (result.data.length > 0) {\n setHooks((prev) => mergeHooks(prev, result.data));\n if (result.cursor) {\n setHooksCursor(result.cursor);\n }\n return true;\n }\n\n return false;\n }, [env, runId, hooksCursor, mergeHooks]);\n\n // Poll for new events\n const pollEvents = useCallback(async (): Promise<boolean> => {\n const serverResult = await fetchEvents(env, runId, {\n cursor: eventsCursor,\n sortOrder: 'asc',\n limit: LIVE_POLL_LIMIT,\n });\n const result = unwrapServerActionResult(serverResult);\n if (result.data.length > 0) {\n setEvents((prev) => mergeEvents(prev, result.data));\n if (result.cursor) {\n setEventsCursor(result.cursor);\n }\n return true;\n }\n\n return false;\n }, [env, runId, eventsCursor, mergeEvents]);\n\n // Update function for live polling\n const update = useCallback(\n async (stepsOnly: boolean = false): Promise<{ foundNewItems: boolean }> => {\n if (isFetchingRef.current || !initialLoadCompleted) {\n return { foundNewItems: false };\n }\n\n let foundNewItems = false;\n\n try {\n const [_, stepsUpdated, hooksUpdated, eventsUpdated] =\n await Promise.all([\n stepsOnly ? Promise.resolve(false) : pollRun(),\n pollSteps(),\n stepsOnly ? Promise.resolve(false) : pollHooks(),\n stepsOnly ? Promise.resolve(false) : pollEvents(),\n ]);\n foundNewItems = stepsUpdated || hooksUpdated || eventsUpdated;\n } catch (err) {\n console.error('Update error:', err);\n }\n\n return { foundNewItems };\n },\n [pollSteps, pollHooks, pollEvents, initialLoadCompleted, pollRun]\n );\n\n // Initial load\n useEffect(() => {\n fetchAllData();\n }, [fetchAllData]);\n\n // Live polling\n useEffect(() => {\n if (!live || !initialLoadCompleted || run?.completedAt) {\n return;\n }\n\n const interval = setInterval(() => {\n update();\n }, LIVE_UPDATE_INTERVAL_MS);\n const stepInterval = setInterval(() => {\n update(true);\n }, LIVE_STEP_UPDATE_INTERVAL_MS);\n\n return () => {\n clearInterval(interval);\n clearInterval(stepInterval);\n };\n }, [live, initialLoadCompleted, update, run?.completedAt]);\n\n return {\n run: run ?? ({} as WorkflowRun),\n steps,\n hooks,\n events,\n loading,\n auxiliaryDataLoading,\n error,\n update,\n };\n}\n\n// Helper function to fetch resource and get correlation ID\nasync function fetchResourceWithCorrelationId(\n env: EnvMap,\n resource: 'run' | 'step' | 'hook',\n resourceId: string,\n options: { runId?: string; resolveData?: 'none' | 'all' } = {}\n): Promise<{\n data: WorkflowRun | Step | Hook;\n correlationId: string;\n}> {\n let resourceData: WorkflowRun | Step | Hook;\n let correlationId: string;\n const resolveData = options.resolveData ?? 'all';\n\n if (resource === 'run') {\n const serverResult = await fetchRun(env, resourceId, resolveData);\n resourceData = unwrapServerActionResult(serverResult);\n correlationId = (resourceData as WorkflowRun).runId;\n } else if (resource === 'step') {\n const { runId } = options;\n if (!runId) {\n throw new WorkflowAPIError('runId is required for step resource', {\n layer: 'client',\n });\n }\n const serverResult = await fetchStep(env, runId, resourceId, resolveData);\n resourceData = unwrapServerActionResult(serverResult);\n correlationId = (resourceData as Step).stepId;\n } else if (resource === 'hook') {\n const serverResult = await fetchHook(env, resourceId, resolveData);\n resourceData = unwrapServerActionResult(serverResult);\n correlationId = (resourceData as Hook).hookId;\n } else {\n throw new WorkflowAPIError(`Unknown resource type: ${resource}`, {\n layer: 'client',\n });\n }\n\n return { data: resourceData, correlationId };\n}\n\n/**\n * Returns (and keeps up-to-date) data inherent to a specific run/step/hook,\n * resolving input/output/metadata, AND loading all related events with full event data.\n */\nexport function useWorkflowResourceData(\n env: EnvMap,\n resource: 'run' | 'step' | 'hook' | 'sleep',\n resourceId: string,\n options: { refreshInterval?: number; runId?: string } = {}\n) {\n const { refreshInterval = 0, runId } = options;\n\n const [data, setData] = useState<WorkflowRun | Step | Hook | Event | null>(\n null\n );\n // const [events, setEvents] = useState<Event[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setData(null);\n setError(null);\n try {\n if (resource === 'sleep') {\n const events = await fetchEventsByCorrelationId(env, resourceId, {\n sortOrder: 'asc',\n limit: 100,\n withData: true,\n });\n const eventsData = unwrapServerActionResult(events);\n const waitStartEvent = eventsData.data.find(\n (event) => event.eventType === 'wait_created'\n );\n if (waitStartEvent) {\n setData({\n waitId: waitStartEvent.correlationId,\n runId: waitStartEvent.runId,\n createdAt: waitStartEvent.createdAt,\n resumeAt: waitStartEvent.eventData.resumeAt,\n } as unknown as Event);\n }\n return;\n }\n // Fetch resource with full data\n const { data: resourceData } = await fetchResourceWithCorrelationId(\n env,\n resource,\n resourceId,\n {\n runId,\n }\n );\n\n setData(resourceData);\n if (resource === 'run') {\n setLoading(false);\n return;\n }\n\n // // Fetch events by correlation ID\n // const eventsData = await fetchAllEventsByCorrelationId(\n // env,\n // correlationId\n // );\n // setEvents(eventsData);\n } catch (err) {\n const error =\n err instanceof WorkflowAPIError\n ? err\n : err instanceof Error\n ? new WorkflowAPIError(err.message, { cause: err, layer: 'client' })\n : new WorkflowAPIError(String(err), { layer: 'client' });\n\n setError(error);\n } finally {\n setLoading(false);\n }\n }, [env, resource, resourceId, runId]);\n\n // Initial load\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n // Refresh interval\n useEffect(() => {\n if (!refreshInterval || refreshInterval <= 0) {\n return;\n }\n\n const interval = setInterval(fetchData, refreshInterval);\n return () => clearInterval(interval);\n }, [refreshInterval, fetchData]);\n\n return {\n data,\n // events,\n loading,\n error,\n refresh: fetchData,\n };\n}\n\n/**\n * Cancel a workflow run\n */\nexport async function cancelRun(env: EnvMap, runId: string): Promise<void> {\n try {\n const result = await cancelRunServerAction(env, runId);\n unwrapServerActionResult(result);\n } catch (err) {\n console.error('Error canceling run:', err);\n if (err instanceof WorkflowAPIError) {\n throw err;\n }\n throw new WorkflowAPIError(\n err instanceof Error ? err.message : 'Failed to cancel run',\n { cause: err, layer: 'client' }\n );\n }\n}\n\n/**\n * Start a new workflow run\n */\nexport async function recreateRun(env: EnvMap, runId: string): Promise<string> {\n try {\n const result = await recreateRunServerAction(env, runId);\n return unwrapServerActionResult(result);\n } catch (err) {\n console.error('Error starting run:', err);\n if (err instanceof WorkflowAPIError) {\n throw err;\n }\n throw new WorkflowAPIError(\n err instanceof Error ? err.message : 'Failed to start run',\n { cause: err, layer: 'client' }\n );\n }\n}\n\nexport async function readStream(\n env: EnvMap,\n streamId: string,\n startIndex?: number\n): Promise<ReadableStream<Uint8Array>> {\n try {\n const result = await readStreamServerAction(env, streamId, startIndex);\n return unwrapServerActionResult(result);\n } catch (err) {\n console.error('Error reading stream:', err);\n if (err instanceof WorkflowAPIError) {\n throw err;\n }\n throw new WorkflowAPIError(\n err instanceof Error ? err.message : 'Failed to read stream',\n { cause: err, layer: 'client' }\n );\n }\n}\n","import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { useEffect, useMemo, useState } from 'react';\nimport { toast } from 'sonner';\nimport type { EnvMap } from './api/workflow-server-actions';\nimport { Skeleton } from './components/ui/skeleton';\nimport { WorkflowDetailPanel } from './sidebar/workflow-detail-panel';\nimport {\n TraceViewerContextProvider,\n TraceViewerTimeline,\n} from './trace-viewer';\nimport {\n getCustomSpanClassName,\n getCustomSpanEventClassName,\n} from './workflow-traces/trace-colors';\nimport {\n hookToSpan,\n runToSpan,\n stepToSpan,\n WORKFLOW_LIBRARY,\n waitToSpan,\n} from './workflow-traces/trace-span-construction';\nimport { otelTimeToMs } from './workflow-traces/trace-time-utils';\n\nconst RE_RENDER_INTERVAL_MS = 2000;\n\nexport const WorkflowTraceViewer = ({\n run,\n steps,\n hooks,\n events,\n env,\n isLoading,\n error,\n}: {\n run: WorkflowRun;\n steps: Step[];\n hooks: Hook[];\n events: Event[];\n env: EnvMap;\n isLoading?: boolean;\n error?: Error | null;\n}) => {\n const [now, setNow] = useState(() => new Date());\n\n useEffect(() => {\n if (!run?.completedAt) {\n const interval = setInterval(() => {\n setNow(new Date());\n }, RE_RENDER_INTERVAL_MS);\n return () => clearInterval(interval);\n }\n return undefined;\n }, [run?.completedAt]);\n\n const trace = useMemo(() => {\n if (!run) {\n return undefined;\n }\n // Group events by their correlation ID to associate with steps/hooks\n const eventsByStepId = new Map<string, Event[]>();\n const eventsByHookId = new Map<string, Event[]>();\n const runLevelEvents: Event[] = [];\n const timerEvents = new Map<string, Event[]>();\n\n for (const event of events) {\n if (\n event.eventType === 'wait_created' ||\n event.eventType === 'wait_completed'\n ) {\n const existing = timerEvents.get(event.correlationId) || [];\n existing.push(event);\n timerEvents.set(event.correlationId, existing);\n continue;\n }\n // Try to associate event with a step or hook via correlationId\n // For now, all other events are collected at run level\n const correlationId = event.correlationId;\n if (correlationId) {\n // Check if correlation ID matches a step or hook\n const matchingStep = steps.find((s) => s.stepId === correlationId);\n const matchingHook = hooks.find((h) => h.hookId === correlationId);\n\n if (matchingStep) {\n const existing = eventsByStepId.get(correlationId) || [];\n existing.push(event);\n eventsByStepId.set(correlationId, existing);\n } else if (matchingHook) {\n const existing = eventsByHookId.get(correlationId) || [];\n existing.push(event);\n eventsByHookId.set(correlationId, existing);\n } else {\n runLevelEvents.push(event);\n }\n } else {\n runLevelEvents.push(event);\n }\n }\n\n // Chain steps together so each one appears on its own row\n // First step is child of root, each subsequent step is child of previous\n const stepSpans = steps.map((step) => {\n const stepEvents = eventsByStepId.get(step.stepId) || [];\n return stepToSpan(step, stepEvents, now);\n });\n\n const hookSpans = hooks.map((hook) => {\n const hookEvents = eventsByHookId.get(hook.hookId) || [];\n return hookToSpan(hook, hookEvents, now);\n });\n\n const waitSpans = Array.from(timerEvents.entries()).map(\n ([correlationId, events]) => {\n return waitToSpan(correlationId, events, now);\n }\n );\n\n const runSpan = runToSpan(run, runLevelEvents, now);\n const spans = [...stepSpans, ...hookSpans, ...waitSpans];\n const sortedSpans = [\n runSpan,\n ...spans.slice().sort((a, b) => {\n const aStart = otelTimeToMs(a.startTime);\n const bStart = otelTimeToMs(b.startTime);\n return aStart - bStart;\n }),\n ];\n\n const sortedCascadingSpans = sortedSpans.map((span, index) => {\n const parentSpanId =\n index === 0 ? undefined : String(sortedSpans[index - 1].spanId);\n return {\n ...span,\n parentSpanId,\n };\n });\n\n return {\n traceId: run.runId,\n rootSpanId: run.runId,\n spans: sortedCascadingSpans,\n resources: [\n {\n name: 'workflow',\n attributes: {\n 'service.name': WORKFLOW_LIBRARY.name,\n },\n },\n ],\n };\n }, [run, steps, hooks, events, now]);\n\n useEffect(() => {\n if (error && !isLoading) {\n console.error(error);\n toast.error('Error loading workflow trace data', {\n description: error.message,\n });\n }\n }, [error, isLoading]);\n\n if (isLoading || !trace) {\n return (\n <div className=\"relative w-full h-full\">\n <div className=\"border-b border-gray-alpha-400 w-full\" />\n <Skeleton className=\"w-full ml-2 mt-1 mb-1 h-[56px]\" />\n <div className=\"p-2 relative w-full\">\n <Skeleton className=\"w-full mt-6 h-[20px]\" />\n <Skeleton className=\"w-[10%] mt-2 ml-6 h-[20px]\" />\n <Skeleton className=\"w-[10%] mt-2 ml-12 h-[20px]\" />\n <Skeleton className=\"w-[20%] mt-2 ml-16 h-[20px]\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"relative w-full h-full\">\n <TraceViewerContextProvider\n withPanel\n customSpanClassNameFunc={getCustomSpanClassName}\n customSpanEventClassNameFunc={getCustomSpanEventClassName}\n customPanelComponent={<WorkflowDetailPanel env={env} />}\n >\n <TraceViewerTimeline height=\"100%\" trace={trace} withPanel />\n </TraceViewerContextProvider>\n </div>\n );\n};\n","import type { Dispatch, MutableRefObject, ReactNode, Reducer } from 'react';\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type {\n GetQuickLinks,\n MemoCache,\n MemoCacheKey,\n QuickLink,\n Resource,\n RootNode,\n ScrollSnapshot,\n SpanNode,\n VisibleSpanEvent,\n} from './types';\nimport {\n MAP_HEIGHT,\n MARKER_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n SEARCH_GAP,\n SEARCH_HEIGHT,\n TIMELINE_PADDING,\n} from './util/constants';\nimport { detectScrollbarWidth } from './util/scrollbar-width';\n\nexport interface TraceViewerState {\n /**\n * The root node for the tree\n */\n root: RootNode;\n /**\n * A map of spanId to span nodes\n */\n spanMap: Record<string, SpanNode>;\n /**\n * A map of resource name to resource\n */\n resourceMap: Record<string, Resource['attributes']>;\n /**\n * The current (debounced) search input value\n */\n filter: string;\n /**\n * The span that is currently focused and visible in the panel\n */\n selected: SpanNode | null;\n /**\n * The initial scale of the trace. At this scale the entire trace is visible\n */\n baseScale: number;\n /**\n * The multiplier of the base scale to get the current scale\n */\n scaleRatio: number;\n /**\n * The scale of 1ms in pixels\n */\n scale: number;\n /**\n * The width of the entire trace viewer in pixels\n */\n width: number;\n /**\n * The height of the entire trace viewer in pixels\n */\n height: number;\n /**\n * The width of the timeline view in pixels\n */\n timelineWidth: number;\n /**\n * The height of the timeline view in pixels\n */\n timelineHeight: number;\n /**\n * The width of the side panel in pixels\n */\n panelWidth: number;\n /**\n * The height of the side panel in pixels\n */\n panelHeight: number;\n /**\n * The width of scrollbars on this device\n */\n scrollbarWidth: number;\n /**\n * A ref for the timeline element\n */\n timelineRef: MutableRefObject<HTMLDivElement | null>;\n /**\n * A ref for updating timeline scroll position immediately after a scale operation\n */\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n /**\n * A reference for the last time each node was mutated. Used for more efficent control\n * of what React re-renders and when.\n */\n memoCacheRef: MutableRefObject<MemoCache>;\n /**\n * A constant, wrapped version of the getQuickLinks property with caching\n */\n getQuickLinks: GetQuickLinks;\n /**\n * Whether the panel is being rendered attached to the timeline\n */\n withPanel: boolean;\n /**\n * Whether the trace viewer is small enough that it should be in mobile mode\n */\n isMobile: boolean;\n /**\n * Panel to render instead of the default span detail panel. The panel\n * should use the context to get the selected span and other state.\n */\n customPanelComponent: ReactNode | null;\n /**\n * A function to provide custom class names for spans.\n */\n customSpanClassNameFunc?: (span: SpanNode) => string;\n /**\n * A function to provide custom class names for span events.\n */\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}\n\nexport type TraceViewerAction =\n | {\n type: 'setRoot';\n root: RootNode;\n spanMap: Record<string, SpanNode>;\n resources: Resource[];\n }\n | {\n type: 'setSize';\n width: number;\n height: number;\n }\n | {\n type: 'setPanelWidth';\n width: number;\n }\n | {\n type: 'setFilter';\n filter: string;\n }\n | {\n type: 'deselect';\n }\n | {\n type: 'select';\n id: string;\n }\n | {\n type: 'escape';\n }\n | {\n type: 'toggleSelection';\n id: string;\n }\n | {\n type: 'detectBaseScale';\n }\n | {\n type: 'setScale';\n scale: number;\n }\n | {\n type: 'resetScale';\n }\n | {\n type: 'scaleToNode';\n id: string;\n }\n | {\n type: 'scaleToRange';\n t1: number;\n t2: number;\n }\n | {\n type: 'adjustScaleRatio';\n direction: -1 | 0 | 1;\n }\n | {\n type: 'trackpadScale';\n delta: number;\n anchorT: number;\n anchorX: number;\n }\n | {\n type: 'minScale';\n }\n | {\n type: 'setScrollSnapshot';\n /**\n * The time that will remain the same location after scaling\n */\n anchorT: number;\n /**\n * The anchor point relative to the timeline's left position\n */\n anchorX: number;\n }\n | {\n type: 'setWithPanel';\n withPanel: boolean;\n }\n | {\n type: 'forceRender';\n };\n\nexport interface TraceViewerContextProps {\n state: TraceViewerState;\n dispatch: Dispatch<TraceViewerAction>;\n}\n\nexport const initialState: TraceViewerState = {\n root: {\n startTime: 0,\n endTime: 1,\n duration: 1,\n depth: 0,\n children: [],\n },\n spanMap: {},\n resourceMap: {},\n filter: '',\n selected: null,\n baseScale: 1,\n scaleRatio: 1,\n scale: 1,\n width: 640,\n height: 480,\n timelineWidth: 640,\n timelineHeight: 480,\n panelWidth: 380,\n panelHeight: 480,\n scrollbarWidth: 0,\n timelineRef: { current: null },\n scrollSnapshotRef: { current: undefined },\n memoCacheRef: { current: new Map() },\n getQuickLinks: () => [],\n withPanel: false,\n isMobile: false,\n customPanelComponent: null,\n};\n\nconst getMinScale = (state: TraceViewerState): number => {\n return (\n (state.width -\n state.scrollbarWidth -\n Number(Boolean(state.selected && state.withPanel)) * state.panelWidth) /\n state.root.duration\n );\n};\n\nexport const TraceViewerContext = createContext<TraceViewerContextProps>({\n state: initialState,\n dispatch: () => {\n // noop\n },\n});\nTraceViewerContext.displayName = 'TraceViewerContext';\n\nconst reducer: Reducer<TraceViewerState, TraceViewerAction> = (\n state,\n action\n) => {\n switch (action.type) {\n case 'setRoot':\n state.scrollSnapshotRef.current = undefined;\n state.memoCacheRef.current.clear();\n return reducer(\n {\n ...state,\n root: action.root,\n spanMap: action.spanMap,\n resourceMap: Object.fromEntries(\n action.resources.map(({ name, attributes }) => [name, attributes])\n ),\n },\n {\n type: 'detectBaseScale',\n }\n );\n case 'setSize': {\n const lowerHeight =\n action.height - MAP_HEIGHT - SEARCH_HEIGHT - 3 * SEARCH_GAP;\n\n const isMobile = state.withPanel && action.width <= 768;\n\n let newState = {\n ...state,\n width: action.width,\n height: action.height,\n timelineWidth:\n action.width -\n Number(Boolean(state.selected && state.withPanel && !isMobile)) *\n state.panelWidth,\n timelineHeight: lowerHeight,\n panelHeight: lowerHeight,\n isMobile,\n };\n\n if (newState.width !== state.width) {\n newState = reducer(newState, {\n type: 'detectBaseScale',\n });\n }\n\n return newState;\n }\n case 'setPanelWidth': {\n const panelWidth = Math.max(\n 240,\n Math.min(action.width, state.width - 240)\n );\n return {\n ...state,\n timelineWidth: state.width - panelWidth,\n panelWidth,\n };\n }\n case 'setFilter':\n return {\n ...state,\n filter: action.filter,\n };\n case 'deselect':\n return reducer(\n {\n ...state,\n selected: null,\n timelineWidth: state.width,\n },\n {\n type: 'minScale',\n }\n );\n case 'select': {\n const node = state.spanMap[action.id];\n if (!node) {\n return state;\n }\n\n return {\n ...state,\n selected: node,\n timelineWidth:\n state.width -\n (state.withPanel && !state.isMobile ? state.panelWidth : 0),\n };\n }\n case 'escape': {\n if (state.selected) {\n return reducer(state, {\n type: 'deselect',\n });\n }\n return reducer(state, {\n type: 'resetScale',\n });\n }\n case 'toggleSelection': {\n let newState = state;\n if (state.selected) {\n newState = reducer(newState, {\n type: 'deselect',\n });\n }\n if (state.selected?.span.spanId === action.id) {\n return newState;\n }\n return reducer(newState, {\n type: 'select',\n id: action.id,\n });\n }\n case 'detectBaseScale': {\n const baseScale =\n (state.width - state.scrollbarWidth) / state.root.duration;\n\n return {\n ...state,\n baseScale,\n scale: baseScale * state.scaleRatio,\n };\n }\n case 'setScale':\n return {\n ...state,\n scaleRatio: action.scale,\n scale: state.baseScale * action.scale,\n };\n case 'resetScale':\n return reducer(state, {\n type: 'scaleToRange',\n t1: state.root.startTime,\n t2: state.root.endTime,\n });\n case 'scaleToNode': {\n const node = state.spanMap[action.id];\n if (!node) {\n return state;\n }\n return reducer(\n reducer(state, {\n type: 'setScale',\n scale:\n (state.width -\n state.scrollbarWidth -\n (state.withPanel && !state.isMobile ? state.panelWidth : 0)) /\n node.duration /\n state.baseScale,\n }),\n {\n type: 'setScrollSnapshot',\n anchorT: node.startTime - state.root.startTime,\n anchorX: 0,\n }\n );\n }\n case 'scaleToRange': {\n const duration = Math.abs(action.t1 - action.t2);\n\n return reducer(\n reducer(state, {\n type: 'setScale',\n scale:\n (state.width -\n state.scrollbarWidth -\n (state.selected && state.withPanel ? state.panelWidth : 0)) /\n duration /\n state.baseScale,\n }),\n {\n type: 'setScrollSnapshot',\n anchorT: Math.min(action.t1, action.t2) - state.root.startTime,\n anchorX: 0,\n }\n );\n }\n case 'adjustScaleRatio': {\n let { scaleRatio } = state;\n switch (action.direction) {\n case -1:\n scaleRatio *= 0.8;\n break;\n case 1:\n scaleRatio *= 1.25;\n break;\n default:\n scaleRatio = 1;\n break;\n }\n\n const $timeline = state.timelineRef.current;\n if (!$timeline) {\n console.warn('timelineRef is null');\n return state;\n }\n\n const { clientWidth, scrollLeft } = $timeline;\n\n return reducer(\n reducer(\n {\n ...state,\n scaleRatio,\n scale: state.baseScale * scaleRatio,\n },\n {\n type: 'minScale',\n }\n ),\n {\n type: 'setScrollSnapshot',\n anchorT: (scrollLeft + clientWidth * 0.5) / state.scale,\n anchorX: clientWidth * 0.5,\n }\n );\n }\n case 'trackpadScale': {\n const minScaleRatio = getMinScale(state) / state.baseScale;\n const scaleRatio = Math.max(\n minScaleRatio,\n state.scaleRatio *\n (1 +\n 0.2 * Math.sign(action.delta) * Math.sqrt(Math.abs(action.delta)))\n );\n\n return reducer(\n {\n ...state,\n scaleRatio,\n scale: state.baseScale * scaleRatio,\n },\n {\n type: 'setScrollSnapshot',\n anchorT: action.anchorT,\n anchorX: action.anchorX,\n }\n );\n }\n case 'minScale': {\n const minScale = getMinScale(state);\n if (state.scale >= minScale) return state;\n return {\n ...state,\n scale: minScale,\n scaleRatio: minScale / state.baseScale,\n };\n }\n case 'setScrollSnapshot': {\n const $timeline = state.timelineRef.current;\n if (!$timeline) return state;\n\n const { anchorT, anchorX } = action;\n\n const scrollLeft = anchorT * state.scale - anchorX;\n const { scrollTop } = $timeline;\n const startRow =\n (scrollTop - MARKER_HEIGHT - TIMELINE_PADDING) /\n (ROW_HEIGHT + ROW_PADDING);\n const endRow =\n startRow + Math.ceil(state.timelineHeight / (ROW_HEIGHT + ROW_PADDING));\n\n state.scrollSnapshotRef.current = {\n anchorT,\n anchorX,\n scrollLeft,\n scrollTop,\n startTime: state.root.startTime + scrollLeft / state.scale,\n endTime:\n state.root.startTime +\n (scrollLeft + state.timelineWidth) / state.scale,\n startRow,\n endRow,\n scale: state.scale,\n };\n\n return state;\n }\n case 'setWithPanel': {\n if (state.withPanel === action.withPanel) return state;\n return {\n ...state,\n withPanel: action.withPanel,\n };\n }\n case 'forceRender':\n state.memoCacheRef.current.set('', {});\n return {\n ...state,\n };\n }\n};\n\nexport function TraceViewerContextProvider({\n getQuickLinks,\n withPanel = false,\n children,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n customPanelComponent = null,\n}: {\n getQuickLinks?: GetQuickLinks;\n withPanel?: boolean;\n children: ReactNode;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n customPanelComponent?: ReactNode;\n}): ReactNode {\n const timelineRef = useRef<HTMLDivElement>(null);\n const scrollSnapshotRef = useRef<ScrollSnapshot>(undefined);\n const getQuickLinksRef = useRef(getQuickLinks);\n getQuickLinksRef.current = getQuickLinks;\n const memoCacheRef = useRef(new Map<string, MemoCacheKey>());\n const quickLinksCache = useRef(new Map<string, QuickLink[]>());\n const [state, dispatch] = useReducer(reducer, initialState, (initial) => {\n return {\n ...initial,\n scrollbarWidth: detectScrollbarWidth(),\n timelineRef,\n scrollSnapshotRef,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n customPanelComponent,\n memoCacheRef,\n withPanel,\n getQuickLinks: (span) => {\n const cacheKey = span.spanId;\n const existing = quickLinksCache.current.get(cacheKey);\n if (existing) return existing;\n\n const value = getQuickLinksRef.current?.(span) || [];\n quickLinksCache.current.set(cacheKey, value);\n return value;\n },\n };\n });\n\n useEffect(\n () =>\n dispatch({\n type: 'setWithPanel',\n withPanel,\n }),\n [withPanel]\n );\n\n const value: TraceViewerContextProps = useMemo(\n () => ({ state, dispatch }),\n [state, dispatch]\n );\n\n return (\n <TraceViewerContext.Provider value={value}>\n {children}\n </TraceViewerContext.Provider>\n );\n}\n\nexport const useTraceViewer = (): TraceViewerContextProps =>\n useContext(TraceViewerContext);\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'rounded-lg border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n));\nCard.displayName = 'Card';\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n));\nCardHeader.displayName = 'CardHeader';\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'text-2xl font-semibold leading-none tracking-tight',\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = 'CardTitle';\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nCardDescription.displayName = 'CardDescription';\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n));\nCardContent.displayName = 'CardContent';\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n));\nCardFooter.displayName = 'CardFooter';\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n};\n","'use client';\n\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport clsx from 'clsx';\nimport { useEffect, useMemo } from 'react';\nimport { toast } from 'sonner';\nimport { useWorkflowResourceData } from '../api/workflow-api-client';\nimport type { EnvMap } from '../api/workflow-server-actions';\nimport { EventsList } from '../sidebar/events-list';\nimport { useTraceViewer } from '../trace-viewer';\nimport { AttributePanel } from './attribute-panel';\n\n/**\n * Custom panel component for workflow traces that displays entity details\n */\nexport function WorkflowDetailPanel({\n env,\n}: {\n env: EnvMap;\n}): React.JSX.Element | null {\n const { state } = useTraceViewer();\n const { selected } = state;\n\n const data = selected?.span.attributes?.data as\n | Step\n | WorkflowRun\n | Hook\n | Event;\n\n // Determine resource ID and runId (needed for steps)\n const { resource, resourceId, runId } = useMemo(() => {\n const resource = selected?.span.attributes?.resource;\n if (resource === 'step') {\n const step = data as Step;\n return { resource: 'step', resourceId: step.stepId, runId: step.runId };\n } else if (resource === 'run') {\n const run = data as WorkflowRun;\n return { resource: 'run', resourceId: run.runId, runId: undefined };\n } else if (resource === 'hook') {\n const hook = data as Hook;\n return { resource: 'hook', resourceId: hook.hookId, runId: undefined };\n } else if (resource === 'sleep') {\n return {\n resource: 'sleep',\n resourceId: selected?.span?.spanId,\n runId: undefined,\n };\n }\n return { resource: undefined, resourceId: undefined, runId: undefined };\n }, [selected, data]);\n\n // Fetch full resource data with events\n const {\n data: fetchedData,\n error,\n loading,\n } = useWorkflowResourceData(\n env,\n resource as 'run' | 'step' | 'hook',\n resourceId ?? '',\n { runId }\n );\n\n useEffect(() => {\n if (error && selected && resource) {\n toast.error(`Failed to load ${resource} details`, {\n description: error.message,\n });\n }\n }, [error, resource, selected]);\n\n if (!selected || !resource || !resourceId) {\n return null;\n }\n\n const displayData = fetchedData || data;\n\n return (\n <div className={clsx('flex flex-col px-2')}>\n {/* Content display */}\n <AttributePanel\n data={displayData}\n isLoading={loading}\n error={error ?? undefined}\n />\n {resource !== 'run' && (\n <EventsList\n correlationId={resourceId}\n env={env}\n events={selected.span.events}\n />\n )}\n </div>\n );\n}\n","import type { ChangeEventHandler, ReactNode } from 'react';\nimport styles from '../trace-viewer.module.css';\n\nexport function SearchInput({\n height,\n width,\n value,\n placeholder,\n onChange,\n}: {\n height: number | string;\n width?: number | string;\n value: string;\n placeholder?: string;\n onChange: ChangeEventHandler<HTMLInputElement>;\n}): ReactNode {\n return (\n <label className={styles.searchInputLabel}>\n <div className={styles.searchInputPrefix}>\n <MagnifyingGlassIcon />\n </div>\n <input\n type=\"search\"\n value={value}\n placeholder={placeholder}\n onChange={onChange}\n style={{ height, width }}\n />\n </label>\n );\n}\n\nfunction MagnifyingGlassIcon(): ReactNode {\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11.5 11.5L14 14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { cn } from '../../lib/utils';\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-muted', className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n","'use client';\n\nimport { parseStepName, parseWorkflowName } from '@workflow/core/parse-name';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport { AlertCircle } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { Alert, AlertDescription, AlertTitle } from '../components/ui/alert';\nimport { DetailCard } from './detail-card';\n\nconst JsonBlock = (value: unknown) => {\n return (\n <pre\n className=\"text-copy-12 overflow-x-auto rounded-md border p-4\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-1000)',\n }}\n >\n <code>{JSON.stringify(value, null, 2)}</code>\n </pre>\n );\n};\n\ntype AttributeKey =\n | keyof Step\n | keyof WorkflowRun\n | keyof Hook\n | keyof Event\n | 'eventData'\n | 'resumeAt';\n\nconst attributeOrder: AttributeKey[] = [\n 'workflowName',\n 'stepName',\n 'status',\n 'stepId',\n 'hookId',\n 'eventId',\n 'runId',\n 'attempt',\n 'token',\n 'correlationId',\n 'eventType',\n 'deploymentId',\n 'ownerId',\n 'projectId',\n 'environment',\n 'executionContext',\n 'createdAt',\n 'startedAt',\n 'updatedAt',\n 'completedAt',\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\nconst attributeToDisplayFn: Record<\n AttributeKey,\n (value: unknown) => null | string | ReactNode\n> = {\n // Names that need pretty-printing\n workflowName: (value: unknown) =>\n parseWorkflowName(String(value))?.shortName ?? '?',\n stepName: (value: unknown) => parseStepName(String(value))?.shortName ?? '?',\n // IDs\n runId: (value: unknown) => String(value),\n stepId: (value: unknown) => String(value),\n hookId: (value: unknown) => String(value),\n eventId: (value: unknown) => String(value),\n // Run/step details\n status: (value: unknown) => String(value),\n attempt: (value: unknown) => String(value),\n // Hook details\n token: (value: unknown) => String(value),\n // Event details\n eventType: (value: unknown) => String(value),\n correlationId: (value: unknown) => String(value),\n // Project details\n deploymentId: (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\n // TODO: relative time with tooltips for ISO times\n createdAt: (value: unknown) => new Date(String(value)).toLocaleString(),\n startedAt: (value: unknown) => new Date(String(value)).toLocaleString(),\n updatedAt: (value: unknown) => new Date(String(value)).toLocaleString(),\n completedAt: (value: unknown) => new Date(String(value)).toLocaleString(),\n retryAfter: (value: unknown) => new Date(String(value)).toLocaleString(),\n resumeAt: (value: unknown) => new Date(String(value)).toLocaleString(),\n // Resolved attributes, won't actually use this function\n metadata: JsonBlock,\n input: (value: unknown) => {\n // Check if input has args + closure vars structure\n if (value && typeof value === 'object' && 'args' in value) {\n const { args, closureVars } = value as {\n args: unknown[];\n closureVars?: Record<string, unknown>;\n };\n const argCount = Array.isArray(args) ? args.length : 0;\n const hasClosureVars = closureVars && Object.keys(closureVars).length > 0;\n\n return (\n <>\n <DetailCard summary={`Input (${argCount} arguments)`}>\n {Array.isArray(args)\n ? args.map((v, i) => (\n <div className=\"mt-2\" 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 </>\n );\n }\n\n // Fallback: treat as plain array or object\n const argCount = Array.isArray(value) ? value.length : 0;\n return (\n <DetailCard summary={`Input (${argCount} arguments)`}>\n {Array.isArray(value)\n ? value.map((v, i) => (\n <div className=\"mt-2\" key={i}>\n {JsonBlock(v)}\n </div>\n ))\n : JsonBlock(value)}\n </DetailCard>\n );\n },\n output: (value: unknown) => {\n return <DetailCard summary=\"Output\">{JsonBlock(value)}</DetailCard>;\n },\n error: (value: unknown) => {\n // Handle structured error format\n if (value && typeof value === 'object' && 'message' in value) {\n const error = value as {\n message: string;\n stack?: string;\n code?: string;\n };\n\n return (\n <DetailCard summary=\"Error\">\n <div className=\"flex flex-col gap-2\">\n {/* Show code if it exists */}\n {error.code && (\n <div>\n <span\n className=\"text-copy-12 font-medium\"\n style={{ color: 'var(--ds-gray-700)' }}\n >\n Error Code:{' '}\n </span>\n <code\n className=\"text-copy-12\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {error.code}\n </code>\n </div>\n )}\n {/* Show stack if available, otherwise just the message */}\n <pre\n className=\"text-copy-12 overflow-x-auto rounded-md border p-4\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-1000)',\n whiteSpace: 'pre-wrap',\n }}\n >\n <code>{error.stack || error.message}</code>\n </pre>\n </div>\n </DetailCard>\n );\n }\n\n // Fallback for plain string errors\n return (\n <DetailCard summary=\"Error\">\n <pre\n className=\"text-copy-12 overflow-x-auto rounded-md border p-4\"\n style={{\n borderColor: 'var(--ds-gray-300)',\n backgroundColor: 'var(--ds-gray-100)',\n color: 'var(--ds-gray-1000)',\n whiteSpace: 'pre-wrap',\n }}\n >\n <code>{String(value)}</code>\n </pre>\n </DetailCard>\n );\n },\n eventData: (value: unknown) => {\n return <DetailCard summary=\"Event Data\">{JsonBlock(value)}</DetailCard>;\n },\n};\n\nconst resolvableAttributes = [\n 'input',\n 'output',\n 'error',\n 'metadata',\n 'eventData',\n];\n\nexport const AttributeBlock = ({\n attribute,\n value,\n isLoading,\n}: {\n attribute: string;\n value: unknown;\n isLoading?: boolean;\n}) => {\n const displayFn =\n attributeToDisplayFn[attribute as keyof typeof attributeToDisplayFn];\n if (!displayFn) {\n return null;\n }\n const displayValue = displayFn(value);\n if (!displayValue) {\n return null;\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 key={attribute} className=\"flex flex-col gap-0 my-2\">\n <span className=\"font-medium\" style={{ color: 'var(--ds-gray-500)' }}>\n {attribute}\n </span>\n <span style={{ color: 'var(--ds-gray-1000)' }}>{displayValue}</span>\n </div>\n </div>\n );\n};\n\nexport const AttributePanel = ({\n data,\n isLoading,\n error,\n}: {\n data: Record<string, unknown>;\n isLoading?: boolean;\n error?: Error;\n}) => {\n const displayData = data;\n const basicAttributes = Object.keys(displayData)\n .filter((key) => !resolvableAttributes.includes(key))\n .sort(sortByAttributeOrder);\n const resolvedAttributes = Object.keys(displayData)\n .filter((key) => resolvableAttributes.includes(key))\n .sort(sortByAttributeOrder);\n\n return (\n <div>\n {basicAttributes.map((attribute) => (\n <AttributeBlock\n key={attribute}\n attribute={attribute}\n value={displayData[attribute as keyof typeof displayData]}\n />\n ))}\n {error ? (\n <Alert variant=\"destructive\" className=\"my-4\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Failed to load resource details</AlertTitle>\n <AlertDescription className=\"text-sm\">\n {error.message}\n </AlertDescription>\n </Alert>\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 />\n ))\n )}\n </div>\n );\n};\n","'use client';\n\nimport { clsx } from 'clsx';\nimport type { CSSProperties, MouseEventHandler, ReactNode } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport { MiniMap } from './components/map';\nimport { CursorMarker, EventMarkers, Markers } from './components/markers';\nimport { SpanNodes } from './components/node';\nimport { SearchBar } from './components/search';\nimport { SpanDetailPanel } from './components/span-detail-panel';\nimport { ZoomButton } from './components/zoom-button';\nimport { TraceViewerContextProvider, useTraceViewer } from './context';\nimport styles from './trace-viewer.module.css';\nimport type { GetQuickLinks, Trace } from './types';\nimport {\n MAP_HEIGHT,\n MARKER_HEIGHT,\n MARKER_NOTCH_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n SEARCH_GAP,\n SEARCH_HEIGHT,\n TIMELINE_PADDING,\n} from './util/constants';\nimport { parseTrace } from './util/tree';\nimport { useStreamingSpans } from './util/use-streaming-spans';\n\ninterface TraceViewerProps {\n trace?: Trace;\n className?: string;\n scrollLock?: boolean;\n height?: string | number;\n withPanel?: boolean;\n getQuickLinks?: GetQuickLinks;\n highlightedSpans?: string[];\n}\n\nexport function TraceViewerProvider({\n getQuickLinks,\n children,\n}: Pick<TraceViewerProps, 'getQuickLinks'> & {\n children: ReactNode;\n}): ReactNode {\n return (\n <TraceViewerContextProvider getQuickLinks={getQuickLinks}>\n {children}\n </TraceViewerContextProvider>\n );\n}\n\ninterface LastClickRef {\n x: number;\n y: number;\n t: number;\n spanId: string;\n}\n\nconst skeletonTrace: Trace = {\n traceId: 'skeleton',\n spans: [\n {\n parentSpanId: '',\n spanId: 'root',\n name: 'root span',\n kind: 1,\n resource: 'vercel.runtime',\n startTime: [5000, 0],\n endTime: [6000, 0],\n duration: [1000, 0],\n library: {\n name: 'vercel-site',\n },\n status: {\n code: 1,\n },\n attributes: {\n 'vercel.ownerId': 'team_abc',\n },\n traceFlags: 1,\n events: [],\n links: [],\n },\n ],\n resources: [\n {\n name: 'vercel.runtime',\n attributes: {},\n },\n ],\n rootSpanId: 'root',\n};\n\nexport function TraceViewerTimeline({\n trace = skeletonTrace,\n className = '',\n scrollLock = false,\n height,\n withPanel = false,\n highlightedSpans,\n}: Omit<TraceViewerProps, 'getQuickLinks'>): ReactNode {\n const isSkeleton = trace === skeletonTrace;\n const { state, dispatch } = useTraceViewer();\n const { timelineRef, scrollSnapshotRef } = state;\n const memoCache = state.memoCacheRef.current;\n const hideSearchBar =\n (highlightedSpans?.length ?? 0) > 0 || trace.spans.length <= 10;\n\n useEffect(() => {\n const { root, map: spanMap } = parseTrace(trace);\n dispatch({\n type: 'setRoot',\n root,\n spanMap,\n resources: trace.resources || [],\n });\n }, [dispatch, trace]);\n\n const { rows, spans, events, scale } = useStreamingSpans(highlightedSpans);\n\n const ref = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const $el = ref.current;\n if (!$el) return;\n\n const onResize = (): void => {\n const padding = 2 * TIMELINE_PADDING;\n const rect = $el.getBoundingClientRect();\n\n dispatch({\n type: 'setSize',\n width: rect.width - padding,\n height: rect.height,\n });\n };\n\n onResize();\n\n const observer = new ResizeObserver(onResize);\n observer.observe($el);\n window.addEventListener('resize', onResize);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', onResize);\n };\n }, [dispatch]);\n\n const lastClickRef = useRef<LastClickRef>({\n t: 0,\n x: -1,\n y: -1,\n spanId: '',\n });\n const onClick: MouseEventHandler = useCallback(\n (event) => {\n // NOTE(wits): We manually implement double-click logic here so that we can support double\n // clicking a span even if the first click moves the span that the user is clicking on due\n // to the panel opening. If we used a regular double click listener we would need to delay\n // the opening of the panel artificially. This implementation allows us to always be\n // FAST while also avoiding a FRUSTRATING situation.\n const prev = lastClickRef.current;\n const t = Date.now();\n const { clientX: x, clientY: y } = event;\n const d = Math.sqrt((x - prev.x) ** 2 + (y - prev.y) ** 2);\n // double click\n if (t - prev.t <= 500 && d <= 8) {\n event.stopPropagation();\n event.preventDefault();\n if (!prev.spanId) {\n dispatch({\n type: 'resetScale',\n });\n return;\n }\n dispatch({\n type: 'select',\n id: prev.spanId,\n });\n dispatch({\n type: 'scaleToNode',\n id: prev.spanId,\n });\n return;\n }\n const target = event.target as HTMLElement;\n if (!target.closest(`.${String(styles.timeline)}`)) return;\n const $button = target.closest<HTMLButtonElement>('[data-span-id]');\n const spanId = $button?.dataset.spanId || '';\n lastClickRef.current = {\n x,\n y,\n t,\n spanId,\n };\n if (!spanId) return;\n dispatch({\n type: 'toggleSelection',\n id: spanId,\n });\n event.stopPropagation();\n },\n [dispatch]\n );\n\n // Zoom helper\n useLayoutEffect(() => {\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n const snapshot = scrollSnapshotRef.current;\n if (snapshot) {\n $timeline.scrollLeft = snapshot.anchorT * scale - snapshot.anchorX;\n }\n }, [scrollSnapshotRef, timelineRef, scale]);\n\n // Selection helper\n useEffect(() => {\n const spanId = state.selected?.span.spanId;\n if (!spanId) return;\n\n const timeout = setTimeout(() => {\n const $timeline = state.timelineRef.current;\n const $span = $timeline?.querySelector(`[data-span-id=\"${spanId}\"]`);\n if (!$timeline || !$span) return;\n\n const viewRect = $timeline.getBoundingClientRect();\n const spanRect = $span.getBoundingClientRect();\n\n // If the selected span is narrower than the timeline, scroll it into view\n if (\n spanRect.width < viewRect.width &&\n (spanRect.left < viewRect.left ||\n spanRect.right > viewRect.right ||\n spanRect.top < viewRect.top ||\n spanRect.bottom > viewRect.bottom)\n ) {\n $span.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }, 500);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [state.selected, state.timelineRef]);\n\n // Global keyboard shortcuts\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n dispatch({\n type: 'escape',\n });\n }\n };\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [dispatch]);\n\n // Scroll locking\n useEffect(() => {\n if (!scrollLock) return;\n\n const $html = document.documentElement;\n const $body = document.body;\n\n $html.style.overflow = 'clip';\n $body.style.overflow = 'clip';\n\n const onScroll = (event?: Event): void => {\n if (event?.cancelable) {\n event.preventDefault();\n } else {\n window.scrollTo({\n left: 0,\n top: 0,\n behavior: 'instant',\n });\n }\n };\n onScroll();\n window.addEventListener('scroll', onScroll, {\n passive: false,\n });\n\n return () => {\n $html.style.overflow = '';\n $body.style.overflow = '';\n window.removeEventListener('scroll', onScroll);\n };\n }, [scrollLock]);\n\n const timelineHeight = Math.max(\n state.timelineHeight - state.scrollbarWidth,\n MARKER_HEIGHT +\n ROW_PADDING +\n rows.length * (ROW_HEIGHT + ROW_PADDING) -\n ROW_PADDING +\n // When there are enough spans to be near the bottom edge, add some extra padding\n // to avoid overlapping with the zoom buttons, etc.\n 84\n );\n\n const inert = Boolean(state.isMobile && state.selected);\n\n return (\n <div\n className={clsx(\n styles.traceViewer,\n isSkeleton && styles.skeleton,\n className\n )}\n onClickCapture={onClick}\n ref={ref}\n style={\n {\n height,\n '--timeline-padding': `${TIMELINE_PADDING}px`,\n '--row-height': `${ROW_HEIGHT}px`,\n '--row-padding': `${ROW_PADDING}px`,\n '--search-height': `${!hideSearchBar ? SEARCH_HEIGHT : 0}px`,\n '--search-gap': `${!hideSearchBar ? SEARCH_GAP : 2}px`,\n '--map-height': `${MAP_HEIGHT}px`,\n '--timeline-width': `${state.timelineWidth}px`,\n '--timeline-height': `${state.timelineHeight}px`,\n '--timeline-scroll-width': `${Math.round(state.root.duration * state.scale)}px`,\n '--panel-width': `${state.panelWidth}px`,\n '--panel-height': `${state.panelHeight}px`,\n '--height': `${state.height}px`,\n '--scrollbar-width': `${state.scrollbarWidth}px`,\n '--marker-height': `${MARKER_HEIGHT}px`,\n '--marker-notch-height': `${MARKER_NOTCH_HEIGHT}px`,\n } as CSSProperties\n }\n >\n {!hideSearchBar ? <SearchBar /> : null}\n <MiniMap rows={rows} scale={scale} timelineRef={timelineRef} />\n <div className={clsx(styles.traceViewerContent, inert && styles.inert)}>\n <div className={styles.timeline} ref={timelineRef}>\n <div\n style={{\n position: 'relative',\n width: state.timelineWidth,\n height: state.timelineHeight - TIMELINE_PADDING * 2,\n padding: TIMELINE_PADDING,\n paddingBottom: 0,\n }}\n >\n <div\n className={styles.traceNode}\n style={{\n width: state.root.duration * scale || undefined,\n height: timelineHeight - TIMELINE_PADDING * 2,\n }}\n >\n <Markers scale={scale} />\n <EventMarkers events={events} root={state.root} scale={scale} />\n <CursorMarker\n dispatch={dispatch}\n events={events}\n memoCacheRef={state.memoCacheRef}\n root={state.root}\n scale={scale}\n scrollSnapshotRef={scrollSnapshotRef}\n spans={spans}\n timelineRef={timelineRef}\n />\n <SpanNodes\n cacheKey={memoCache.get('')}\n cache={memoCache}\n customSpanClassNameFunc={state.customSpanClassNameFunc}\n customSpanEventClassNameFunc={\n state.customSpanEventClassNameFunc\n }\n root={state.root}\n scale={scale}\n scrollSnapshotRef={scrollSnapshotRef}\n spans={spans}\n />\n </div>\n </div>\n </div>\n <div className={styles.zoomButtonTraceViewer}>\n <ZoomButton />\n </div>\n </div>\n {withPanel ? (\n <div\n className={clsx(\n styles.spanDetailPanelTraceViewer,\n !state.selected && styles.hidden,\n state.isMobile && styles.mobile\n )}\n >\n <SpanDetailPanel attached />\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function TraceViewerPanel({\n className = '',\n children = null,\n}: {\n className?: string;\n children?: ReactNode;\n}): ReactNode {\n const { state } = useTraceViewer();\n\n if (!state.selected) {\n return children;\n }\n\n return (\n <div\n className={clsx(styles.spanDetailPanelTraceViewer, className)}\n style={\n {\n position: 'relative',\n '--search-height': '0',\n '--search-gap': '0',\n '--map-height': '0',\n '--panel-width': `100%`,\n '--panel-height': `100%`,\n '--height': `100%`,\n '--scrollbar-width': `${state.scrollbarWidth}px`,\n } as CSSProperties\n }\n >\n <SpanDetailPanel />\n </div>\n );\n}\n\nexport function TraceViewer(props: TraceViewerProps): ReactNode {\n return (\n <TraceViewerContextProvider getQuickLinks={props.getQuickLinks} withPanel>\n <TraceViewerTimeline withPanel {...props} />\n </TraceViewerContextProvider>\n );\n}\n","'use client';\n\nimport { clsx } from 'clsx';\nimport type { PointerEventHandler, ReactNode } from 'react';\nimport {\n Fragment,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { initialState, useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport type {\n GetQuickLinks,\n QuickLinkValue,\n RootNode,\n Span,\n SpanNode,\n TraceNode,\n} from '../types';\nimport { formatDuration } from '../util/timing';\nimport { getSpanColorClassName } from './node';\nimport {\n ButtonLink,\n IconChevronDown,\n IconCross,\n IconExternalSmall,\n Link,\n Note,\n Skeleton,\n} from './ui';\n\nconst percentage = (n: number): string => `${(100 * n).toFixed(3)}%`;\n\ninterface GroupedAttribute {\n prefix: string;\n attributes: Attribute[];\n}\n\ninterface Attribute {\n suffix: string;\n key: string;\n value: string;\n}\n\nconst sortWord = (a: string, b: string): number => {\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n return 0;\n};\n\nconst getGroupedAttributes = (\n attributes: Span['attributes']\n): GroupedAttribute[] => {\n // Build groups of items with the same prefix\n const groups: Record<string, GroupedAttribute> = {};\n for (const [key, value] of Object.entries(attributes)) {\n const dotIndex = key.indexOf('.');\n let prefix = '';\n let suffix = '';\n if (dotIndex !== -1) {\n prefix = key.substring(0, dotIndex);\n suffix = key.substring(dotIndex + 1);\n } else {\n suffix = key;\n }\n\n let group = groups[prefix];\n if (!group) {\n group = {\n prefix,\n attributes: [],\n };\n groups[prefix] = group;\n }\n group.attributes.push({\n key,\n suffix,\n value: String(value),\n });\n }\n\n // List and sort everything\n const result = Array.from(Object.values(groups)).sort((a, b) =>\n sortWord(a.prefix, b.prefix)\n );\n for (const group of result) {\n group.attributes.sort((a, b) => sortWord(a.suffix, b.suffix));\n }\n return result;\n};\n\n// biome-ignore lint/correctness/noUnusedFunctionParameters: ignored using `--suppress`\nconst getAncestors = (_root: RootNode, start: SpanNode | null): SpanNode[] => {\n const result: SpanNode[] = [];\n\n if (!start) return result;\n\n for (let node: TraceNode = start; 'parent' in node; node = node.parent) {\n result.unshift(node);\n }\n\n return result;\n};\n\nexport const SpanDetailPanelBody = () => {\n const {\n state: { root, selected, resourceMap, getQuickLinks },\n dispatch,\n } = useTraceViewer();\n\n const ancestors = useMemo(\n () => getAncestors(root, selected),\n [root, selected]\n );\n\n const attributeGroups = useMemo(\n () => getGroupedAttributes(selected?.span.attributes ?? {}),\n [selected]\n );\n\n const resourceAttributeGroups = useMemo(() => {\n const resourceName = selected?.span.resource;\n if (!resourceName) return [];\n const resourceAttributes = resourceMap[resourceName];\n if (!resourceAttributes) return [];\n return getGroupedAttributes(resourceAttributes);\n }, [resourceMap, selected]);\n\n if (!selected) return null;\n\n const { span } = selected;\n\n const isEntrySpan = detectIsEntrySpan(selected);\n\n return (\n <>\n {selected.isVercel ? <InfraSpanDescription node={selected} /> : null}\n {selected.isInstrumentationHint ? <InstrumentationHint /> : null}\n {!selected.isInstrumentationHint && ancestors.length ? (\n <DetailGroup className={styles.ancestorGroup} name=\"Location\">\n {ancestors.map((node) => (\n <button\n className={styles.ancestorNode}\n key={`${selected.span.spanId}.${node.span.spanId}`}\n onClick={() =>\n dispatch({\n type: 'select',\n id: node.span.spanId,\n })\n }\n type=\"button\"\n >\n <div className={styles.ancestorText}>\n <span className={styles.ancestorName}>\n {node.label || node.span.name}\n </span>\n <span className={styles.ancestorDuration}>\n {formatDuration(node.duration)}\n </span>\n </div>\n <span aria-hidden className={styles.ancestorLineContainer}>\n <span\n className={clsx(\n styles.ancestorLine,\n getSpanColorClassName(node)\n )}\n style={{\n left: percentage(\n (node.startTime - root.startTime) / root.duration\n ),\n width: percentage(node.duration / root.duration),\n }}\n />\n </span>\n </button>\n ))}\n </DetailGroup>\n ) : null}\n {isEntrySpan ? (\n <EntrySpanLinks getQuickLinks={getQuickLinks} span={selected.span} />\n ) : null}\n {selected.events?.length ? (\n <DetailGroup name=\"Events\">\n {selected.events.map((event) => (\n <Fragment key={event.key}>\n <dl className={styles.spanDetailPanelAttribute}>\n <dt className={styles.spanDetailPanelAttributeKey}>\n {event.event.name}\n </dt>\n <dd className={styles.spanDetailPanelAttributeValue}>\n {formatDuration(event.timestamp - root.startTime)}\n </dd>\n </dl>\n {Object.entries(event.event.attributes).map(([key, value]) => (\n <DetailLine\n key={key}\n name={`${event.event.name}.${key}`}\n value={value}\n />\n ))}\n </Fragment>\n ))}\n </DetailGroup>\n ) : null}\n {attributeGroups.length ? (\n <DetailGroup name=\"Attributes\">\n {attributeGroups.map((group) => (\n <Fragment key={group.prefix}>\n {group.attributes.map(({ key, value }) => (\n <DetailLine key={key} name={key} value={value} />\n ))}\n </Fragment>\n ))}\n </DetailGroup>\n ) : null}\n {resourceAttributeGroups.length ? (\n <DetailGroup name=\"Resource\">\n {resourceAttributeGroups.map((group) => (\n <Fragment key={group.prefix}>\n {group.attributes.map(({ key, value }) => (\n <DetailLine key={key} name={key} value={value} />\n ))}\n </Fragment>\n ))}\n </DetailGroup>\n ) : null}\n {selected.isInstrumentationHint ? null : (\n <DetailGroup name=\"Library\">\n <DetailLine name=\"name\" value={span.library.name} />\n {span.library.version ? (\n <DetailLine name=\"version\" value={span.library.version} />\n ) : null}\n </DetailGroup>\n )}\n </>\n );\n};\n\nexport function SpanDetailPanel({\n attached = false,\n}: {\n attached?: boolean;\n}): ReactNode {\n const {\n state: { selected, isMobile, customPanelComponent },\n dispatch,\n } = useTraceViewer();\n\n if (!selected) return null;\n\n const { span } = selected;\n\n return (\n <div className={clsx(styles.spanDetailPanel, isMobile && styles.mobile)}>\n {attached && !isMobile ? <PanelResizer /> : null}\n <div className={styles.spanDetailPanelTop}>\n <div className={styles.spanDetailPanelTopInfo}>\n <div className={styles.spanDetailPanelTruncatedHeading}>\n {selected.isInstrumentationHint ? null : (\n <span className={styles.spanDetailPanelDuration}>\n {formatDuration(selected.duration)}\n </span>\n )}\n <span className={styles.spanDetailPanelName} title={span.name}>\n {span.name}\n </span>\n </div>\n <div className={styles.spanDetailPanelCorner}>\n <div className={styles.spanDetailPanelCloseVerticalRule} />\n <button\n aria-label=\"Close Span Details\"\n className={styles.spanDetailPanelClose}\n onClick={() =>\n dispatch({\n type: 'deselect',\n })\n }\n type=\"button\"\n >\n <IconCross color=\"gray-700\" size={24} />\n </button>\n </div>\n </div>\n </div>\n <div className={clsx('flex gap-3', styles.spanDetailPanelBody)}>\n {customPanelComponent || <SpanDetailPanelBody />}\n </div>\n </div>\n );\n}\n\nconst EXPANDED_STORAGE_KEY_PREFIX = 'vc-trace-span-exp:';\n\nfunction DetailGroup({\n name,\n className = '',\n children,\n}: {\n name: string;\n className?: string;\n children: ReactNode;\n}): ReactNode {\n const [isExpanded, setIsExpanded] = useState(() => {\n if (!('localStorage' in globalThis)) return true;\n return (\n localStorage.getItem(`${EXPANDED_STORAGE_KEY_PREFIX}${name}`) !== '0'\n );\n });\n\n const toggleExpanded = useCallback(() => {\n setIsExpanded((x) => {\n const willBeExpanded = !x;\n localStorage.setItem(\n `${EXPANDED_STORAGE_KEY_PREFIX}${name}`,\n String(Number(willBeExpanded))\n );\n return willBeExpanded;\n });\n }, [name]);\n\n return (\n <div\n className={clsx(\n styles.detailGroup,\n isExpanded ? styles.expanded : styles.collapsed,\n className\n )}\n >\n <button\n className={styles.detailHeading}\n onClick={toggleExpanded}\n type=\"button\"\n >\n <span>{name}</span>\n <IconChevronDown />\n </button>\n {isExpanded ? children : null}\n </div>\n );\n}\n\nconst CommonHttpVerbs = new Set([\n 'OPTIONS',\n 'HEAD',\n 'GET',\n 'PUT',\n 'POST',\n 'DELETE',\n]);\nconst KnownSpans: Record<string, string> = {\n 'Resolve Deployment': `How long it took Vercel's routing layer to retrieve details for the deployment.`,\n 'Resolve Cache': `How long it took Vercel's routing layer to check for a cached function invocation.`,\n 'Resolve Route': `How long it took Vercel's routing layer to resolve routing rules, including redirects and rewrites.`,\n 'Invoke Middleware': `How long it took this middleware to start and run user code.`,\n 'Invoke Function': `How long it took this Vercel Function to start and run user code.`,\n waitUntil: `How long it took to run user code inside of waitUntil.`,\n 'Start VM': `How long it took to start the Virtual Machine which contains the Vercel Function.`,\n 'Spawn Node.js': `How long it took the Virtual Machine to start the Node.js runtime.`,\n 'Spawn Python': `How long it took the Virtual Machine to start the Python runtime.`,\n 'Init User Code': `How long it took to import the user code and run any globally-scoped code.`,\n};\n\nconst ColdStartSpanNames = new Set([\n 'Start VM',\n 'Spawn Node.js',\n 'Spawn Python',\n 'Init User Code',\n]);\n\nconst getRegion = (\n node: SpanNode | RootNode | null | undefined\n): string | null => {\n if (!node || !('span' in node)) {\n return null;\n }\n\n const attr = node.span.attributes;\n const region = attr['vercel.region'] || attr['vercel.function.region'];\n if (region) return String(region);\n return null;\n};\n\nconst getNote = (node: SpanNode): ReactNode => {\n const { name } = node.span;\n const region = getRegion(node);\n const parentRegion = getRegion(node.parent);\n\n if (node.span.attributes['vercel.middleware.internal'] === 'true') {\n return 'The Vercel Toolbar created this middleware.';\n } else if (\n ColdStartSpanNames.has(name) ||\n (name === 'Invoke Function' &&\n node.children.some((x) => ColdStartSpanNames.has(x.span.name)))\n ) {\n return 'This function encountered a cold start.';\n } else if (region && parentRegion && region !== parentRegion) {\n return 'This request was routed across regions.';\n }\n\n return null;\n};\n\nconst detectIsEntrySpan = (node: SpanNode): boolean => {\n if (!node.isVercel) return false;\n const { name } = node.span;\n const spaceIndex = name.indexOf(' ');\n if (spaceIndex === -1) return false;\n const firstWord = name.substring(0, spaceIndex);\n return CommonHttpVerbs.has(firstWord);\n};\n\nfunction InfraSpanDescription({ node }: { node: SpanNode }): ReactNode {\n const { name } = node.span;\n let description = KnownSpans[name];\n\n if (!description && detectIsEntrySpan(node)) {\n description = `How long it took for Vercel to process the request and send the response.`;\n }\n\n if (!description) return null;\n\n const note = getNote(node);\n\n return (\n <DetailGroup name=\"What is this?\">\n <div className={styles.infraSpanDescription}>\n <span>{description}</span>\n {note ? <Note>{note}</Note> : note}\n </div>\n </DetailGroup>\n );\n}\n\nconst EntrySpanLinks = memo(function EntrySpanLinks({\n getQuickLinks,\n span,\n}: {\n getQuickLinks: GetQuickLinks;\n span: Span;\n}): ReactNode {\n const links = getQuickLinks(span);\n\n if (!links.length) return null;\n\n return (\n <DetailGroup name=\"Links\">\n {links.map(({ key, value }) => (\n <EntrySpanLink key={key} link={value} name={key} />\n ))}\n </DetailGroup>\n );\n});\n\ninterface ResolvablePromise<T> extends Promise<T> {\n __resolvedValue?: T;\n __rejectedValue?: unknown;\n}\n\nfunction usePromise<T>(promise: ResolvablePromise<T>): T | undefined {\n const [_, setLatest] = useState({});\n const fulfilled =\n promise.__resolvedValue !== undefined ||\n promise.__rejectedValue !== undefined;\n useEffect(() => {\n if (fulfilled) return;\n\n promise\n .then((value) => {\n promise.__resolvedValue = value;\n })\n .catch((err) => {\n promise.__rejectedValue = err;\n })\n .finally(() => setLatest({}));\n }, [promise, fulfilled]);\n\n return promise.__resolvedValue;\n}\n\nfunction EntrySpanLink({\n name,\n link: linkPromise,\n}: {\n name: string;\n link: Promise<QuickLinkValue>;\n}): ReactNode {\n const link = usePromise(linkPromise);\n\n return (\n <Link\n as={link ? undefined : 'span'}\n className={clsx(\n styles.spanDetailPanelAttribute,\n styles.spanDetailPanelQuickLink\n )}\n href={link?.href || ''}\n >\n <span className={styles.spanDetailPanelAttributeKey}>{name}</span>\n <span\n className={clsx(\n styles.spanDetailPanelAttributeValue,\n styles.spanDetailPanelQuickLinkLabel\n )}\n >\n {link ? (\n <>\n {link.label}\n {link.icon || <IconExternalSmall color=\"gray-900\" />}\n </>\n ) : (\n <>\n <Skeleton height={18} width={32 + name.length * 8} />\n <Skeleton height={18} rounded width={18} />\n </>\n )}\n </span>\n </Link>\n );\n}\n\nfunction InstrumentationHint(): ReactNode {\n return (\n <DetailGroup name=\"What is this?\">\n <div className={styles.infraSpanDescription}>\n <span>{`You can visualize your application's spans alongside Vercel's spans in this viewer.`}</span>\n <ButtonLink\n href=\"https://vercel.com/docs/session-tracing#adding-custom-spans\"\n size=\"small\"\n target=\"_blank\"\n >\n Get Started\n </ButtonLink>\n </div>\n </DetailGroup>\n );\n}\n\nfunction DetailLine({\n name,\n value,\n}: {\n name: string;\n value: unknown;\n}): ReactNode {\n return (\n <dl className={styles.spanDetailPanelAttribute}>\n <dt className={styles.spanDetailPanelAttributeKey}>{name}</dt>\n <dd\n className={styles.spanDetailPanelAttributeValue}\n title={String(value)}\n >\n {String(value)}\n </dd>\n </dl>\n );\n}\n\ninterface ResizeGestureRef {\n start: {\n x: number;\n width: number;\n };\n x: number;\n width: number;\n isHeld: boolean;\n}\n\n/**\n * Resizer component for the trace viewer panel.\n */\nexport function PanelResizer(): ReactNode {\n const {\n state: { panelWidth },\n dispatch,\n } = useTraceViewer();\n const gestureRef = useRef<ResizeGestureRef>({\n start: {\n x: 0,\n width: panelWidth,\n },\n x: 0,\n width: panelWidth,\n isHeld: false,\n });\n gestureRef.current.width = panelWidth;\n\n const onPointerDown = useCallback<PointerEventHandler>((event) => {\n if (event.pointerType !== 'mouse') return;\n event.preventDefault();\n const g = gestureRef.current;\n g.start.x = event.clientX;\n g.x = event.clientX;\n g.start.width = g.width;\n g.isHeld = true;\n }, []);\n\n const onDoubleClick = useCallback(() => {\n dispatch({\n type: 'setPanelWidth',\n width: initialState.panelWidth,\n });\n }, [dispatch]);\n\n useEffect(() => {\n let nextFrame = 0;\n const onFrame = (): void => {\n const g = gestureRef.current;\n const width = g.start.width + g.start.x - g.x;\n dispatch({\n type: 'setPanelWidth',\n width,\n });\n };\n\n const onPointerMove = (event: PointerEvent): void => {\n if (!gestureRef.current.isHeld) return;\n event.preventDefault();\n gestureRef.current.x = event.clientX;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n const onPointerUp = (): void => {\n gestureRef.current.isHeld = false;\n };\n\n window.addEventListener('pointermove', onPointerMove);\n window.addEventListener('pointerup', onPointerUp);\n\n return () => {\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n };\n }, [dispatch]);\n\n return (\n <div\n aria-hidden\n className={styles.spanDetailPanelResizer}\n onDoubleClick={onDoubleClick}\n onPointerDown={onPointerDown}\n />\n );\n}\n","import { clsx } from 'clsx';\nimport type { CSSProperties, MutableRefObject, ReactNode } from 'react';\nimport { memo, useRef } from 'react';\nimport styles from '../trace-viewer.module.css';\nimport type {\n MemoCache,\n MemoCacheKey,\n RootNode,\n ScrollSnapshot,\n SpanNode,\n VisibleSpan,\n VisibleSpanEvent,\n} from '../types';\nimport { MARKER_HEIGHT, ROW_HEIGHT, ROW_PADDING } from '../util/constants';\nimport { formatDuration } from '../util/timing';\n\nconst isSpanSmall = (node: VisibleSpan, scale: number): boolean =>\n node.duration * scale < 64;\n\nconst isSpanHuge = (node: VisibleSpan, scale: number): boolean =>\n node.duration * scale >= 500;\n\nexport const getSpanColorClassName = (node: SpanNode): string => {\n if (node.isVercel) return String(styles.colorVercel);\n return String(styles[`color${node.resourceIndex % 5}` as 'color0']);\n};\n\nexport const getSpanClassName = (node: VisibleSpan, scale: number): string => {\n const isHuge = isSpanHuge(node, scale);\n const isHovered = node.isHovered && !isHuge && node.isHighlighted !== false;\n\n return clsx(\n styles.spanNode,\n isHuge && styles.huge,\n isSpanSmall(node, scale) && styles.small,\n node.isSelected && styles.selected,\n isHovered && styles.xHover,\n node.isHighlighted ? styles.colorHighlight : getSpanColorClassName(node),\n node.isHighlighted === false && styles.unlit\n );\n};\n\nconst getDuration = (node: SpanNode): string => {\n if (node.isInstrumentationHint) {\n return 'Get Started';\n }\n\n return formatDuration(node.duration);\n};\n\nexport const SpanNodes = memo(function SpanNodes({\n root,\n scale,\n spans,\n scrollSnapshotRef,\n cache,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n}: {\n root: RootNode;\n scale: number;\n spans: VisibleSpan[];\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n cacheKey?: MemoCacheKey;\n cache: MemoCache;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}) {\n return spans.map((x) => (\n <SpanComponent\n cacheKey={cache.get(x.span.spanId)}\n customSpanEventClassNameFunc={customSpanEventClassNameFunc}\n customSpanClassNameFunc={customSpanClassNameFunc}\n key={x.span.spanId}\n node={x}\n root={root}\n scale={scale}\n scrollSnapshotRef={scrollSnapshotRef}\n />\n ));\n});\n\nexport const SpanComponent = memo(function SpanComponent({\n node,\n root,\n scale,\n scrollSnapshotRef,\n customSpanClassNameFunc,\n customSpanEventClassNameFunc,\n}: {\n node: VisibleSpan;\n root: RootNode;\n scale: number;\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n cacheKey?: MemoCacheKey;\n customSpanClassNameFunc?: (span: SpanNode) => string;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}): ReactNode {\n const ref = useRef<HTMLButtonElement>(null);\n node.ref = ref;\n\n const { span } = node;\n const duration = getDuration(node);\n\n const left = (node.startTime - root.startTime) * scale;\n let top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * node.row;\n const actualWidth = node.duration * scale;\n // Enforce minimum width so very short spans are always visible\n const MIN_SPAN_WIDTH = 4;\n const width = Math.max(actualWidth, MIN_SPAN_WIDTH);\n let height = ROW_HEIGHT;\n const isHuge = isSpanHuge(node, scale);\n // Check if span is small based on actual width, not minimum width\n const isSmall = actualWidth < 64;\n const isHovered = node.isHovered && !isHuge && node.isHighlighted !== false;\n if (isSmall && !isHovered) {\n height *= 0.4;\n top += (ROW_HEIGHT - height) * 0.5;\n }\n\n let isNearRightSide = false;\n if (isHovered) {\n let { duration: visibleDuration, endTime: visibleEndTime } = root;\n const snapshot = scrollSnapshotRef.current;\n if (snapshot) {\n visibleDuration = snapshot.endTime - snapshot.startTime;\n visibleEndTime = snapshot.endTime;\n }\n isNearRightSide = visibleEndTime - node.startTime < 0.25 * visibleDuration;\n }\n\n // Get custom class name from callback if provided\n const customClassName = customSpanClassNameFunc\n ? customSpanClassNameFunc(node)\n : '';\n\n return (\n <>\n <button\n aria-label={`${span.name} - ${duration}`}\n className={clsx(getSpanClassName(node, scale), customClassName)}\n data-span-id={span.spanId}\n data-start-time={node.startTime - root.startTime}\n data-right-side={isNearRightSide}\n ref={ref}\n style={\n {\n // Use actualWidth for CSS variable so hover expansion is accurate\n '--span-width': `${Math.max(actualWidth, 1)}px`,\n minWidth: isHovered ? width : undefined,\n width: isHovered ? undefined : width,\n height,\n maxWidth:\n isHovered && !isNearRightSide\n ? (root.endTime - node.startTime) * scale\n : undefined,\n containIntrinsicWidth: isHovered ? undefined : width,\n containIntrinsicHeight: height,\n left: isNearRightSide ? undefined : left,\n right: isNearRightSide\n ? (root.endTime - node.endTime) * scale\n : undefined,\n top,\n } as CSSProperties\n }\n type=\"button\"\n >\n {isSmall && !isHovered ? null : (\n <>\n <span className={styles.spanName}>{node.label || span.name}</span>\n {isHuge ? <span className={styles.spanSpacer} /> : null}\n {isHovered || width > 128 ? (\n <span className={styles.spanDuration}>{duration}</span>\n ) : null}\n </>\n )}\n </button>\n {node.events && !isSmall\n ? node.events.map((x) => (\n <SpanEventComponent\n customSpanEventClassNameFunc={customSpanEventClassNameFunc}\n event={x}\n key={x.key}\n node={node}\n root={root}\n scale={scale}\n />\n ))\n : null}\n </>\n );\n});\n\nexport const SpanEventComponent = memo(function SpanEventComponent({\n event,\n node,\n root,\n scale,\n customSpanEventClassNameFunc,\n}: {\n event: VisibleSpanEvent;\n node: VisibleSpan;\n root: RootNode;\n scale: number;\n customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;\n}): ReactNode {\n const ref = useRef<HTMLDivElement>(null);\n event.ref = ref;\n\n const {\n event: { name },\n } = event;\n const timestamp = formatDuration(event.timestamp - root.startTime);\n\n const left = (event.timestamp - root.startTime) * scale;\n const top = MARKER_HEIGHT + (ROW_HEIGHT + ROW_PADDING) * node.row;\n\n // Get custom class name from callback if provided\n const customClassName = customSpanEventClassNameFunc\n ? customSpanEventClassNameFunc(event)\n : '';\n\n return (\n <div\n title={`${name} at ${timestamp}`}\n className={clsx(\n styles.spanNodeEvent,\n customClassName,\n node.isHighlighted\n ? styles.colorHighlight\n : getSpanColorClassName(node),\n node.isHighlighted === false && styles.unlit\n )}\n data-hovered={event.isHovered}\n ref={ref}\n style={\n {\n left,\n top,\n } as CSSProperties\n }\n >\n <div\n className={clsx(\n styles.hoverInfo,\n (event.timestamp - node.startTime) / node.duration < 0.5\n ? styles.alignStart\n : styles.alignEnd\n )}\n >\n <span className={styles.eventName}>{name}</span>\n <span className={styles.eventTimestamp}>{timestamp}</span>\n </div>\n <div className={styles.eventDiamond} />\n </div>\n );\n});\n","import { type ReactNode, useEffect, useState } from 'react';\nimport { useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport { SEARCH_HEIGHT } from '../util/constants';\nimport { SearchInput } from './search-input';\n\nexport function SearchBar(): ReactNode {\n return (\n <nav className={styles.searchBar}>\n <SearchInputWrapper />\n </nav>\n );\n}\n\nfunction SearchInputWrapper(): ReactNode {\n const { dispatch } = useTraceViewer();\n const [value, setValue] = useState('');\n\n useEffect(() => {\n const timeout = setTimeout(\n () =>\n dispatch({\n type: 'setFilter',\n filter: value,\n }),\n 100\n );\n\n return () => {\n clearTimeout(timeout);\n };\n }, [dispatch, value]);\n\n return (\n <div className={styles.searchInput}>\n <SearchInput\n height={SEARCH_HEIGHT}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Search spans…\"\n value={value}\n width=\"100%\"\n />\n </div>\n );\n}\n","/**\n * Functions for constructing OpenTelemetry spans from workflow entities\n */\n\nimport { parseStepName, parseWorkflowName } from '@workflow/core/parse-name';\nimport type { Event, Hook, Step, WorkflowRun } from '@workflow/world';\nimport type { Span, SpanEvent } from '../trace-viewer/types';\nimport { shouldShowVerticalLine } from './event-colors';\nimport { calculateDuration, dateToOtelTime } from './trace-time-utils';\n\nexport const WORKFLOW_LIBRARY = {\n name: 'workflow-development-kit',\n version: '4.0.0',\n};\n\n/**\n * Event types that should be displayed as visual markers in the trace viewer\n */\nconst MARKER_EVENT_TYPES: Set<Event['eventType']> = new Set([\n 'hook_created',\n 'hook_received',\n 'hook_disposed',\n 'step_retrying',\n 'step_failed',\n 'workflow_failed',\n 'wait_created',\n 'wait_completed',\n]);\n\n/**\n * Convert workflow events to span events\n * Only includes events that should be displayed as markers\n */\nexport function convertEventsToSpanEvents(\n events: Event[],\n filterTypes = true\n): SpanEvent[] {\n return events\n .filter((event) =>\n filterTypes ? MARKER_EVENT_TYPES.has(event.eventType) : true\n )\n .map((event) => ({\n name: event.eventType,\n timestamp: dateToOtelTime(event.createdAt),\n attributes: {\n eventId: event.eventId,\n correlationId: event.correlationId,\n eventData: 'eventData' in event ? event.eventData : undefined,\n },\n // Control whether to show vertical line in timeline\n showVerticalLine: shouldShowVerticalLine(event.eventType),\n }));\n}\n\n/**\n * Converts a workflow Wait to an OpenTelemetry Span\n */\nexport function waitToSpan(\n correlationId: string,\n events: Event[],\n nowTime?: Date\n): Span {\n const startEvent = events.find((event) => event.eventType === 'wait_created');\n const endEvent = events.find((event) => event.eventType === 'wait_completed');\n const startTime = startEvent?.createdAt ?? nowTime;\n const endTime = endEvent?.createdAt ?? nowTime;\n const start = dateToOtelTime(startTime);\n const end = dateToOtelTime(endTime);\n const duration = calculateDuration(startTime, endTime);\n const spanEvents = convertEventsToSpanEvents(events);\n return {\n spanId: correlationId,\n name: 'sleep',\n kind: 1, // INTERNAL span kind\n resource: 'sleep',\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes: {\n resource: 'sleep' as const,\n data: {\n correlationId,\n },\n },\n links: [],\n events: spanEvents,\n duration,\n startTime: start,\n endTime: end,\n };\n}\n\n/**\n * Converts a workflow Step to an OpenTelemetry Span\n */\nexport function stepToSpan(\n step: Step,\n stepEvents: Event[],\n nowTime?: Date\n): Span {\n const now = nowTime ?? new Date();\n const parsedName = parseStepName(String(step.stepName));\n\n // Simplified attributes: only store resource type and full data\n const attributes = {\n resource: 'step' as const,\n data: step,\n };\n\n const resource = 'step';\n const endTime = step.completedAt ?? now;\n\n // Convert step-related events to span events (for markers like hook_created, step_retrying, etc.)\n // This determines which events are displayed as markers. In the detail view,\n // we'll show all events that correlate with the selected resource.\n const events = convertEventsToSpanEvents(stepEvents);\n\n return {\n spanId: String(step.stepId),\n name: parsedName?.shortName ?? '',\n kind: 1, // INTERNAL span kind\n resource,\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes,\n links: [],\n events,\n startTime: dateToOtelTime(step.startedAt),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(step.startedAt, endTime),\n };\n}\n\n/**\n * Converts a workflow Hook to an OpenTelemetry Span\n */\nexport function hookToSpan(\n hook: Hook,\n hookEvents: Event[],\n nowTime: Date\n): Span {\n // Simplified attributes: only store resource type and full data\n const attributes = {\n resource: 'hook' as const,\n data: hook,\n };\n\n const lastHookReceivedEvent = hookEvents\n .slice()\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n )\n .find((event) => event.eventType === 'hook_received');\n\n const endTime = lastHookReceivedEvent\n ? lastHookReceivedEvent.createdAt\n : new Date(\n Math.max(new Date(hook.createdAt).getTime() + 10_000, nowTime.getTime())\n );\n\n // Convert hook-related events to span events\n const events = convertEventsToSpanEvents(hookEvents);\n\n return {\n spanId: String(hook.hookId),\n name: String(hook.hookId),\n kind: 1, // INTERNAL span kind\n resource: 'hook',\n library: WORKFLOW_LIBRARY,\n status: { code: 1 },\n traceFlags: 1,\n attributes,\n links: [],\n events,\n startTime: dateToOtelTime(hook.createdAt),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(hook.createdAt, endTime),\n };\n}\n\n/**\n * Creates a root span for the workflow run\n */\nexport function runToSpan(\n run: WorkflowRun,\n runEvents: Event[],\n nowTime?: Date\n): Span {\n const now = nowTime ?? new Date();\n\n // Simplified attributes: only store resource type and full data\n const attributes = {\n resource: 'run' as const,\n data: run,\n };\n\n const startDate = run.startedAt ?? run.createdAt;\n const endTime = run.completedAt ?? now;\n\n // Convert run-level events to span events\n const events = convertEventsToSpanEvents(runEvents);\n\n return {\n spanId: String(run.runId),\n name: String(parseWorkflowName(run.workflowName)?.shortName ?? '?'),\n kind: 1, // INTERNAL span kind\n resource: 'run',\n library: WORKFLOW_LIBRARY,\n status: { code: 0 },\n traceFlags: 1,\n attributes,\n links: [],\n events,\n startTime: dateToOtelTime(startDate),\n endTime: dateToOtelTime(endTime),\n duration: calculateDuration(startDate, endTime),\n };\n}\n","'use client';\n\nimport type { WorkflowRun } from '@workflow/world';\nimport { AlertCircle } from 'lucide-react';\nimport { useWorkflowTraceViewerData } from './api/workflow-api-client';\nimport type { EnvMap } from './api/workflow-server-actions';\nimport { WorkflowTraceViewer } from './workflow-trace-view';\n\ninterface RunTraceViewProps {\n env: EnvMap;\n runId: string;\n}\n\nexport function RunTraceView({ env, runId }: RunTraceViewProps) {\n // Fetch all run data with live updates\n const {\n run: runData,\n steps: allSteps,\n hooks: allHooks,\n events: allEvents,\n loading,\n error,\n } = useWorkflowTraceViewerData(env, runId, { live: true });\n const run = runData ?? ({} as WorkflowRun);\n\n if (error && !runData) {\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 steps={allSteps}\n events={allEvents}\n hooks={allHooks}\n env={env}\n run={run}\n isLoading={loading}\n />\n </div>\n );\n}\n","'use client';\n\nimport { AlertCircle } from 'lucide-react';\nimport { useCallback } from 'react';\nimport useSWR from 'swr';\nimport {\n type EnvMap,\n fetchEventsByCorrelationId,\n} from '../api/workflow-server-actions';\nimport { Alert, AlertDescription, AlertTitle } from '../components/ui/alert';\nimport type { SpanEvent } from '../trace-viewer/types';\nimport { convertEventsToSpanEvents } from '../workflow-traces/trace-span-construction';\nimport { AttributeBlock } from './attribute-panel';\nimport { DetailCard } from './detail-card';\n\nexport function EventsList({\n correlationId,\n env,\n events,\n}: {\n correlationId: string;\n env: EnvMap;\n events: SpanEvent[];\n}) {\n const fetchEvents = useCallback(() => {\n return fetchEventsByCorrelationId(env, correlationId, {\n sortOrder: 'asc',\n limit: 100,\n withData: true,\n }).then((evts) => {\n if (!evts.success) {\n throw new Error(evts.error?.message || 'Failed to fetch events');\n }\n return convertEventsToSpanEvents(evts.data.data || [], false);\n });\n }, [env, correlationId]);\n\n const {\n data,\n error: eventError,\n isLoading: eventsLoading,\n } = useSWR<SpanEvent[] | null>(\n ['workflow', 'events', correlationId],\n fetchEvents,\n {\n fallbackData: events,\n revalidateOnFocus: false,\n }\n );\n\n const displayData = (data?.length ? data : events) || [];\n\n return (\n <div className=\"mt-2\" style={{ color: 'var(--ds-gray-1000)' }}>\n <h3\n className=\"text-heading-16 font-medium mt-4 mb-2\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n Events {!eventsLoading && `(${displayData.length})`}\n </h3>\n {/* Events section */}\n {eventError ? (\n <Alert variant=\"destructive\" className=\"my-4\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Failed to load event data</AlertTitle>\n <AlertDescription className=\"text-sm\">\n {eventError.message}\n </AlertDescription>\n </Alert>\n ) : null}\n {eventsLoading ? <div>Loading events...</div> : null}\n {!eventsLoading && !eventError && displayData.length === 0 && (\n <div className=\"text-sm\">No events found</div>\n )}\n {displayData.length > 0 && !eventError ? (\n <div className=\"flex flex-col gap-2\">\n {displayData.map((event, index) => (\n <DetailCard\n key={`${event.name}-${index}`}\n summary={\n <>\n <span\n className=\"font-medium\"\n style={{ color: 'var(--ds-gray-1000)' }}\n >\n {event.name}\n </span>{' '}\n -{' '}\n <span style={{ color: 'var(--ds-gray-700)' }}>\n {new Date(\n event.timestamp[0] * 1000 + event.timestamp[1] / 1e6\n ).toLocaleString()}\n </span>\n </>\n }\n >\n <div className=\"mt-2 px-4\">\n {Object.entries(event.attributes)\n .filter(([key]) => key !== 'eventData')\n .map(([key, value]) => (\n <AttributeBlock key={key} attribute={key} value={value} />\n ))}\n <div className=\"relative\">\n {eventError && <div>Error loading event data</div>}\n {!eventError &&\n !eventsLoading &&\n event.attributes.eventData && (\n <AttributeBlock\n isLoading={eventsLoading}\n attribute=\"eventData\"\n value={event.attributes.eventData}\n />\n )}\n </div>\n </div>\n </DetailCard>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground',\n destructive:\n 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = 'Alert';\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn('mb-1 font-medium leading-none tracking-tight', className)}\n {...props}\n />\n));\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm [&_p]:leading-relaxed', className)}\n {...props}\n />\n));\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription };\n","/**\n * Parse a machine readable name.\n *\n * @see {@link ../../swc-plugin-workflow/transform/src/naming.rs} for the naming scheme.\n */\nfunction parseName(\n tag: string,\n name: string\n): { shortName: string; path: string; functionName: string } | null {\n if (typeof name !== 'string') {\n return null;\n }\n // Looks like {prefix}//{filepath}//{function_name}\"\n // Where:\n // - {prefix} is either 'workflow' or 'step'\n // - {filepath} is the path to the file\n // - {function_name} is the name of the function\n const [prefix, path, ...functionNameParts] = name.split('//');\n if (prefix !== tag || !path || functionNameParts.length === 0) {\n return null;\n }\n\n let shortName = functionNameParts.at(-1) ?? '';\n const functionName = functionNameParts.join('//');\n const filename = path.split('/').at(-1) ?? '';\n const fileNameWithoutExtension = filename.split('.').at(0) ?? '';\n\n // Default exports will use the file name as the short name. \"__default\" was only\n // used for one package version, so this is a minor backwards compatibility fix.\n if (\n ['default', '__default'].includes(shortName) &&\n fileNameWithoutExtension\n ) {\n shortName = fileNameWithoutExtension;\n }\n\n return {\n shortName,\n path,\n functionName,\n };\n}\n\n/**\n * Parse a workflow name into its components.\n *\n * @param name - The workflow name to parse.\n * @returns An object with `shortName`, `path`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseWorkflowName(name: string) {\n return parseName('workflow', name);\n}\n\n/**\n * Parse a step name into its components.\n *\n * @param name - The step name to parse.\n * @returns An object with `shortName`, `path`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseStepName(name: string) {\n return parseName('step', name);\n}\n","'use client';\nimport { type ReactNode, useCallback } from 'react';\nimport { useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport { IconMinus, IconZoomIn, IconZoomOut } from './zoom-icons';\n\nexport function ZoomButton(): ReactNode {\n const { dispatch } = useTraceViewer();\n\n const onZoomIn = useCallback((): void => {\n dispatch({\n type: 'adjustScaleRatio',\n direction: 1,\n });\n }, [dispatch]);\n\n const onZoomOut = useCallback((): void => {\n dispatch({\n type: 'adjustScaleRatio',\n direction: -1,\n });\n }, [dispatch]);\n\n const onResetZoom = useCallback((): void => {\n dispatch({\n type: 'adjustScaleRatio',\n direction: 0,\n });\n }, [dispatch]);\n\n return (\n <div className={styles.zoomButtonGroup}>\n <button\n aria-label=\"Zoom Out\"\n className={styles.zoomButton}\n onClick={onZoomOut}\n type=\"button\"\n >\n <IconZoomOut size={18} />\n </button>\n <div className={styles.divider} />\n <button\n aria-label=\"Reset Zoom\"\n className={styles.zoomButton}\n onClick={onResetZoom}\n type=\"button\"\n >\n <IconMinus size={18} />\n </button>\n <div className={styles.divider} />\n <button\n aria-label=\"Zoom In\"\n className={styles.zoomButton}\n onClick={onZoomIn}\n type=\"button\"\n >\n <IconZoomIn size={18} />\n </button>\n </div>\n );\n}\n","import { clsx } from 'clsx';\nimport type {\n CSSProperties,\n Dispatch,\n MutableRefObject,\n ReactNode,\n} from 'react';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { type TraceViewerAction, useTraceViewer } from '../context';\nimport styles from '../trace-viewer.module.css';\nimport type {\n MemoCache,\n RootNode,\n ScrollSnapshot,\n VisibleSpan,\n VisibleSpanEvent,\n} from '../types';\nimport {\n MARKER_HEIGHT,\n ROW_HEIGHT,\n ROW_PADDING,\n TIMELINE_PADDING,\n} from '../util/constants';\nimport { formatDuration, formatTimeSelection } from '../util/timing';\nimport { useImmediateStyle } from '../util/use-immediate-style';\nimport { useTrackpadZoom } from '../util/use-trackpad-zoom';\n\nconst DIVISORS = [1, 2, 4, 5, 8, 10];\n\nexport function Markers({ scale }: { scale: number }): ReactNode {\n const {\n state: { root },\n } = useTraceViewer();\n\n const fullDuration = root.duration;\n const logFull = Math.floor(Math.log10(fullDuration));\n const logHalf = Math.floor(Math.log10(fullDuration * 0.5));\n let markerDuration = Math.max(\n 2,\n 10 ** logFull * (logHalf === logFull ? 1 : 0.5)\n );\n let markerWidth = markerDuration * scale;\n let divisor = 1;\n for (const d of DIVISORS) {\n if (markerDuration / d < 24) break;\n divisor = d;\n }\n markerDuration /= divisor;\n markerWidth /= divisor;\n const markerCount = Math.ceil(fullDuration / markerDuration);\n\n // How often labels should appear for markers, e.g. 3 === one label for every third marker\n const labelSpacing = Math.ceil(100 / markerWidth) || 1;\n\n return (\n <div className={styles.markersContainer}>\n <div\n aria-hidden\n className={styles.markers}\n style={\n {\n width: Math.floor(root.duration * scale + 15),\n visibility: scale !== -1 ? 'visible' : 'hidden',\n '--marker-width': `${markerWidth}px`,\n } as CSSProperties\n }\n >\n {new Array(markerCount).fill(null).map((_, i) => {\n const hasLabel = i % labelSpacing === 0;\n return (\n <span\n className={clsx(styles.marker, !hasLabel && styles.notch)}\n key={String(i)}\n >\n {hasLabel ? (\n <span className={styles.markerLabel}>\n {formatDuration(markerDuration * i)}\n </span>\n ) : null}\n </span>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function EventMarkers({\n events,\n root,\n scale,\n}: {\n events: VisibleSpanEvent[];\n root: RootNode;\n scale: number;\n}): ReactNode {\n // Filter out events that should not show vertical lines (workflow-specific feature)\n const eventsWithVerticalLines = useMemo(\n () => events.filter((x) => x.event.showVerticalLine !== false),\n [events]\n );\n\n return (\n <div className={styles.eventMarkersContainer}>\n <div\n aria-hidden\n className={styles.eventMarkers}\n style={\n {\n width: Math.floor(root.duration * scale),\n } as CSSProperties\n }\n >\n {eventsWithVerticalLines.map((x) => {\n return (\n <span\n className={clsx(styles.eventMarker)}\n key={x.key}\n style={{\n left: Math.floor((x.timestamp - root.startTime) * scale),\n ...(x.event.color && { borderLeftColor: x.event.color }),\n }}\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nconst HOVER_OVERSCAN = 2;\n\ninterface TrackpadZoom {\n anchorX: number;\n anchorT: number;\n}\n\nexport function CursorMarker({\n memoCacheRef,\n timelineRef,\n root,\n spans,\n events,\n scale,\n dispatch,\n scrollSnapshotRef,\n}: {\n memoCacheRef: MutableRefObject<MemoCache>;\n timelineRef: MutableRefObject<HTMLDivElement | null>;\n root: RootNode;\n spans: VisibleSpan[];\n events: VisibleSpanEvent[];\n scale: number;\n dispatch: Dispatch<TraceViewerAction>;\n scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;\n}): ReactNode {\n const hasEnteredRef = useRef(false);\n const spansRef = useRef(spans);\n spansRef.current = spans;\n const eventsRef = useRef(events);\n eventsRef.current = events;\n const labelRef = useRef<HTMLDivElement>(null);\n const { style: labelStyle, setStyle: setLabelStyle } =\n useImmediateStyle(labelRef);\n const labelTextRef = useRef<HTMLDivElement>(null);\n\n const ref = useRef<HTMLDivElement>(null);\n const { style, setStyle } = useImmediateStyle(ref);\n const rectRef = useRef<DOMRect>(undefined);\n\n const selectionRef = useRef<HTMLDivElement>(null);\n const { style: selectionStyle, setStyle: setSelectionStyle } =\n useImmediateStyle(selectionRef);\n\n const xRef = useRef(0);\n useEffect(() => {\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n let x = xRef.current;\n let xStart = 0;\n let isDragging = false;\n let isExternalDrag = false;\n let hasMoved = false;\n let isRightClick = false;\n let scrollX = 0;\n let scrollY = 0;\n const hoverStartT = Date.now() + 500;\n const updateRect = (): void => {\n if (rectRef.current) return;\n rectRef.current = $timeline.getBoundingClientRect();\n };\n\n const getRowFromY = (y: number): number => {\n if (!rectRef.current) return 0;\n return (\n (y - MARKER_HEIGHT - TIMELINE_PADDING) / (ROW_HEIGHT + ROW_PADDING)\n );\n };\n\n const removeHover = (): void => {\n const cache = memoCacheRef.current;\n // Remove hover styling from any elements that have it\n for (const span of spansRef.current) {\n if (!span.isHovered) continue;\n span.isHovered = false;\n cache.set(span.span.spanId, {});\n }\n dispatch({\n type: 'forceRender',\n });\n };\n\n let nextFrame = 0;\n const onFrame = (): void => {\n if (!hasEnteredRef.current) return;\n if (!rectRef.current) updateRect();\n const rect = rectRef.current;\n if (!rect) return;\n\n const { scrollLeft, scrollTop } = $timeline;\n\n const left = Math.max(\n 0,\n Math.min(\n x + scrollLeft - rect.left - TIMELINE_PADDING,\n root.duration * scale\n )\n );\n const leftStyle = `${left - scrollLeft + TIMELINE_PADDING}px`;\n setStyle('left', leftStyle);\n setLabelStyle('left', leftStyle);\n\n const t = root.startTime + left / scale;\n const labelT = t - root.startTime;\n if (labelT < 0 || labelT > root.duration) {\n labelTextRef.current?.removeAttribute('data-text');\n } else {\n labelTextRef.current?.setAttribute(\n 'data-text',\n formatTimeSelection(labelT)\n );\n }\n\n if (isDragging) {\n const xDelta = x - xStart;\n const width = Math.abs(xDelta);\n if (!hasMoved) {\n if (width < 4) return;\n hasMoved = true;\n setSelectionStyle('display', 'flex');\n removeHover();\n }\n\n if (xDelta > 0) {\n setSelectionStyle('left', '');\n setSelectionStyle('right', '0');\n } else {\n setSelectionStyle('left', '0');\n setSelectionStyle('right', '');\n }\n setSelectionStyle('width', `${width}px`);\n\n const leftStart = Math.max(\n 0,\n Math.min(\n xStart + scrollLeft - rect.left - TIMELINE_PADDING,\n root.duration * scale\n )\n );\n const labelTStart = leftStart / scale;\n let t1: number;\n let t2: number;\n if (labelTStart < labelT) {\n t1 = labelTStart;\n t2 = labelT;\n } else {\n t1 = labelT;\n t2 = labelTStart;\n }\n selectionRef.current?.setAttribute(\n 'data-range',\n `${formatTimeSelection(t1)} — ${formatTimeSelection(t2)}`\n );\n selectionRef.current?.setAttribute(\n 'data-duration',\n `${formatTimeSelection(t2 - t1)} selected`\n );\n }\n\n if (Date.now() < hoverStartT) {\n nextFrame = requestAnimationFrame(onFrame);\n return;\n }\n\n if (scrollLeft !== scrollX || scrollTop !== scrollY) {\n scrollX = scrollLeft;\n scrollY = scrollTop;\n nextFrame = requestAnimationFrame(onFrame);\n return;\n }\n\n if (x - rect.left < 128) {\n labelTextRef.current?.setAttribute('data-align', 'left');\n } else if (x - rect.left > rect.width - 128) {\n labelTextRef.current?.setAttribute('data-align', 'right');\n } else {\n labelTextRef.current?.removeAttribute('data-align');\n }\n\n if (!hasMoved && !isExternalDrag) {\n const cache = memoCacheRef.current;\n\n // Span Hover\n const rowMin = getRowFromY(scrollTop) - HOVER_OVERSCAN;\n const rowMax = getRowFromY(scrollTop + rect.height) + HOVER_OVERSCAN;\n for (const span of spansRef.current) {\n const isHovered =\n span.row >= rowMin &&\n span.row <= rowMax &&\n t >= span.startTime &&\n t <= span.endTime;\n if (span.isHovered === isHovered) continue;\n span.isHovered = isHovered;\n cache.set(span.span.spanId, {});\n }\n\n // Event Hover\n const eventSpreadPx = 12;\n const eventSpreadMs = eventSpreadPx / scale;\n for (const event of eventsRef.current) {\n const isHovered =\n t >= event.timestamp - eventSpreadMs &&\n t <= event.timestamp + eventSpreadMs;\n if (event.isHovered === isHovered) continue;\n event.isHovered = isHovered;\n const $event = event.ref?.current;\n if (!$event) continue;\n $event.setAttribute('data-hovered', String(isHovered));\n }\n\n dispatch({\n type: 'forceRender',\n });\n }\n };\n nextFrame = requestAnimationFrame(onFrame);\n\n const onPointerEnter = (event: PointerEvent): void => {\n if (event.pointerType !== 'mouse') return;\n hasEnteredRef.current = true;\n };\n const onPointerLeave = (): void => {\n if (!hasEnteredRef.current) return;\n hasEnteredRef.current = false;\n removeHover();\n };\n\n const onMouseMove = ({ clientX }: MouseEvent): void => {\n x = clientX;\n xRef.current = x;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n const onContextMenu = (event: MouseEvent): void => {\n event.preventDefault();\n };\n const onMouseDown = (event: MouseEvent): void => {\n if (event.button === 2) {\n isRightClick = true;\n event.preventDefault();\n } else if (event.button !== 0) {\n return;\n } else {\n isRightClick = false;\n }\n if (timelineRef.current?.contains(event.target as HTMLElement)) {\n xStart = x;\n isDragging = true;\n } else {\n isExternalDrag = true;\n requestAnimationFrame(removeHover);\n }\n };\n const onMouseUp = (event: Event): void => {\n isExternalDrag = false;\n\n if (!isDragging) return;\n isDragging = false;\n\n if (!hasMoved) return;\n hasMoved = false;\n setSelectionStyle('display', '');\n setSelectionStyle('left', '');\n setSelectionStyle('right', '');\n setSelectionStyle('width', '');\n\n event.preventDefault();\n event.stopImmediatePropagation();\n\n if (isRightClick) {\n isRightClick = false;\n return;\n }\n\n if (!rectRef.current) updateRect();\n const rect = rectRef.current;\n if (!rect) return;\n\n const { scrollLeft } = $timeline;\n\n const start = Math.max(\n 0,\n Math.min(\n (xStart + scrollLeft - rect.left - TIMELINE_PADDING) / scale,\n root.duration\n )\n );\n const end = Math.max(\n 0,\n Math.min(\n (x + scrollLeft - rect.left - TIMELINE_PADDING) / scale,\n root.duration\n )\n );\n\n dispatch({\n type: 'scaleToRange',\n t1: start + root.startTime,\n t2: end + root.startTime,\n });\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!isDragging) return;\n if (event.key !== 'Escape') return;\n\n isRightClick = true;\n onMouseUp(event);\n };\n\n const onWindowScroll = (): void => {\n rectRef.current = undefined;\n trackpadZoomRef.current = undefined;\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n const onScroll = (): void => {\n cancelAnimationFrame(nextFrame);\n nextFrame = requestAnimationFrame(onFrame);\n };\n\n const observer = new ResizeObserver(() => {\n // NOTE: I tried to use the entry from this to immediately set the rect,\n // but for some reason it has different dimensions than the one from\n // .getBoundingClientRect()\n rectRef.current = undefined;\n });\n observer.observe($timeline);\n\n window.addEventListener('mousemove', onMouseMove);\n $timeline.addEventListener('contextmenu', onContextMenu);\n window.addEventListener('mousedown', onMouseDown);\n window.addEventListener('mouseup', onMouseUp);\n window.addEventListener('blur', onMouseUp);\n window.addEventListener('keydown', onKeyDown, true);\n window.addEventListener('scroll', onWindowScroll);\n $timeline.addEventListener('scroll', onScroll);\n $timeline.addEventListener('pointerenter', onPointerEnter);\n $timeline.addEventListener('pointerleave', onPointerLeave);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('mousemove', onMouseMove);\n $timeline.removeEventListener('contextmenu', onContextMenu);\n window.removeEventListener('mousedown', onMouseDown);\n window.removeEventListener('mouseup', onMouseUp);\n window.removeEventListener('blur', onMouseUp);\n window.removeEventListener('keydown', onKeyDown, true);\n window.removeEventListener('scroll', onWindowScroll);\n $timeline.removeEventListener('scroll', onScroll);\n $timeline.removeEventListener('pointerenter', onPointerEnter);\n $timeline.removeEventListener('pointerleave', onPointerLeave);\n cancelAnimationFrame(nextFrame);\n xRef.current = x;\n removeHover();\n };\n }, [\n dispatch,\n root,\n scale,\n setStyle,\n setLabelStyle,\n setSelectionStyle,\n memoCacheRef,\n timelineRef,\n scrollSnapshotRef,\n ]);\n\n const trackpadZoomRef = useRef<TrackpadZoom>(undefined);\n useTrackpadZoom((delta) => {\n const $timeline = timelineRef.current;\n if (!$timeline) return;\n\n rectRef.current ??= $timeline.getBoundingClientRect();\n const rect = rectRef.current;\n const anchorX = Math.max(\n 0,\n Math.min(\n xRef.current - rect.left - TIMELINE_PADDING,\n rect.width - 2 * TIMELINE_PADDING\n )\n );\n\n let anchorT = 0;\n let existing = trackpadZoomRef.current;\n if (existing?.anchorX === anchorX) {\n anchorT = existing.anchorT;\n } else {\n anchorT = ($timeline.scrollLeft + anchorX) / scale;\n existing = {\n anchorT,\n anchorX,\n };\n trackpadZoomRef.current = existing;\n }\n\n dispatch({\n type: 'trackpadScale',\n delta: delta / 64,\n anchorT,\n anchorX,\n });\n });\n\n return (\n <>\n <div className={styles.cursorMarkerStickyParent}>\n <div\n className={styles.cursorMarkerLabelContainer}\n ref={labelRef}\n style={labelStyle}\n >\n <div className={styles.cursorMarkerLabel} ref={labelTextRef} />\n </div>\n </div>\n <div className={styles.cursorMarkerStickyParent}>\n <div className={styles.cursorMarkerContainer} ref={ref} style={style}>\n <div className={styles.cursorMarker}>\n <div\n className={styles.cursorSelection}\n ref={selectionRef}\n style={selectionStyle}\n />\n </div>\n </div>\n </div>\n </>\n );\n}\n","/**\n * Color utilities for workflow traces\n */\n\nimport type { Step, WorkflowRun } from '@workflow/world';\nimport styles from '../trace-viewer/trace-viewer.module.css';\nimport type { SpanNode, SpanNodeEvent } from '../trace-viewer/types';\n\n/**\n * Get the CSS class name for a workflow entity based on its status\n */\nfunction getStatusClassName(\n status: Step['status'] | WorkflowRun['status'],\n isStripped = false\n): string {\n if (isStripped && status === 'pending') {\n return styles.spanPendingStriped;\n }\n\n switch (status) {\n case 'running':\n return styles.spanRunning;\n case 'pending':\n return styles.spanPending;\n case 'completed':\n return styles.spanCompleted;\n case 'cancelled':\n return styles.spanCancelled;\n case 'paused':\n return styles.spanPaused;\n case 'failed':\n return styles.spanFailed;\n default:\n return '';\n }\n}\n\n/**\n * Check if a step name indicates it's a sleep step\n */\nfunction isSleepStep(stepName: string): boolean {\n return String(stepName).toLowerCase().endsWith('sleep');\n}\n\n/**\n * Get custom CSS class name for a span based on its attributes\n * This is called dynamically by the trace viewer to style spans\n */\nexport const getCustomSpanClassName = (span: SpanNode): string => {\n const attributes = span.span.attributes;\n const resource = attributes?.resource;\n\n if (resource === 'step') {\n const stepData = attributes.data as Step;\n const stepName = stepData?.stepName;\n\n // DEPRECATED: Check if it's a sleep step\n if (stepName && isSleepStep(stepName)) {\n return styles.spanSleep;\n }\n\n // Regular step - use status colors\n const isStripped = stepData?.status === 'pending';\n return getStatusClassName(stepData?.status, isStripped);\n }\n\n if (resource === 'run') {\n const runData = attributes.data as WorkflowRun;\n return getStatusClassName(runData?.status, false);\n }\n\n if (resource === 'hook') {\n return styles.spanHook;\n }\n\n if (resource === 'sleep') {\n return styles.spanSleep;\n }\n\n // Default: no custom class\n return '';\n};\n\n/**\n * Get custom CSS class name for a span event based on its type\n * This is called dynamically by the trace viewer to style event markers\n */\nexport const getCustomSpanEventClassName = (\n spanEvent: SpanNodeEvent\n): string => {\n const eventName = spanEvent.event.name;\n\n // Failure events - Red\n if (eventName === 'step_failed' || eventName === 'workflow_failed') {\n return styles.eventFailed;\n }\n\n // Retry events - Orange/Yellow\n if (eventName === 'step_retrying') {\n return styles.eventRetrying;\n }\n\n // Webhook-related events - Purple\n if (\n eventName === 'hook_created' ||\n eventName === 'hook_received' ||\n eventName === 'hook_disposed'\n ) {\n return styles.eventHook;\n }\n\n // Default - Blue\n return styles.eventDefault;\n};\n","/**\n * Time conversion utilities for workflow trace construction\n */\n\n/**\n * Converts a Date to OpenTelemetry time format [seconds, nanoseconds]\n */\nexport function dateToOtelTime(\n date: Date | string | unknown\n): [number, number] {\n if (typeof date === 'string') {\n date = new Date(date);\n }\n if (!date || !(date instanceof Date)) {\n return [0, 0];\n }\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nexport function otelTimeToMs(time: [number, number]): number {\n const secondsToMs = time[0] * 1_000;\n const nanosecondsToMs = time[1] / 1_000_000;\n return secondsToMs + nanosecondsToMs;\n}\n\n/**\n * Calculates duration in [seconds, nanoseconds] format\n */\nexport function calculateDuration(\n start: Date | string | unknown,\n end: Date | string | unknown\n): [number, number] {\n if (typeof start === 'string') {\n start = new Date(start);\n }\n if (typeof end === 'string') {\n end = new Date(end);\n }\n if (!start || !(start instanceof Date)) {\n return [0, 0];\n }\n const endTime = end && end instanceof Date ? end : new Date();\n const durationMs = endTime.getTime() - start.getTime();\n const seconds = Math.floor(durationMs / 1000);\n const nanoseconds = (durationMs % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name RefreshCw\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst RefreshCw = createLucideIcon('RefreshCw', [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8', key: 'v9h5vc' }],\n ['path', { d: 'M21 3v5h-5', key: '1q7to0' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16', key: '3uifl3' }],\n ['path', { d: 'M8 16H3v5', key: '1cv678' }],\n]);\n\nexport default RefreshCw;\n","'use client';\n\nimport { clsx } from 'clsx';\nimport type { AnchorHTMLAttributes, ReactNode } from 'react';\nimport styles from '../trace-viewer.module.css';\n\n// Color token mapping helper\nconst colorTokenMap: Record<string, string> = {\n 'gray-700': 'var(--ds-gray-700)',\n 'gray-900': 'var(--ds-gray-900)',\n};\n\nexport function IconCross({\n size = 16,\n color = 'gray-700',\n}: {\n size?: number;\n color?: string;\n}): ReactNode {\n const style = { color: colorTokenMap[color] || color } as const;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n aria-hidden\n >\n <title>Cross</title>\n <path\n d=\"M6 6l12 12M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function IconChevronDown({ size = 16 }: { size?: number }): ReactNode {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n className={styles.detailHeadingIcon}\n >\n <title>Chevron Down</title>\n <path\n d=\"M6 9l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function IconExternalSmall({\n size = 16,\n color = 'gray-900',\n}: {\n size?: number;\n color?: string;\n}): ReactNode {\n const style = { color: colorTokenMap[color] || color } as const;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n aria-hidden\n >\n <title>External Small</title>\n <path\n d=\"M14 4h6m0 0v6m0-6L10 14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M20 14v4a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function Link(\n props: AnchorHTMLAttributes<HTMLAnchorElement> & { as?: 'a' | 'span' }\n): ReactNode {\n const { as: asProp, className, href, children, ...rest } = props;\n const Element: any = asProp || 'a';\n if (Element === 'span' || !href) {\n return (\n <span className={className} {...rest}>\n {children}\n </span>\n );\n }\n return (\n <a className={className} href={href} {...rest}>\n {children}\n </a>\n );\n}\n\nexport function ButtonLink(\n props: AnchorHTMLAttributes<HTMLAnchorElement> & {\n size?: 'small' | 'medium' | 'large';\n }\n): ReactNode {\n const { className, children, size: _size, ...rest } = props;\n return (\n <a {...rest} className={clsx(styles.buttonLink, className)}>\n {children}\n </a>\n );\n}\n\nexport function Note({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}): ReactNode {\n return <div className={clsx(styles.note, className)}>{children}</div>;\n}\n\nexport function Skeleton({\n width,\n height,\n rounded,\n}: {\n width: number;\n height: number;\n rounded?: boolean;\n}): ReactNode {\n return (\n <span\n className={clsx(styles.skeleton, rounded && styles.skeletonRounded)}\n style={{ width, height }}\n aria-hidden\n />\n );\n}\n","/**\n * Color utilities for workflow event markers\n */\n\nimport type { Event } from '@workflow/world';\n\nexport interface EventColorPalette {\n /** Color of the diamond/marker itself */\n color: string;\n /** Background color for hover info popup */\n background: string;\n /** Border color for hover info popup */\n border: string;\n /** Text color for event name in hover popup */\n text: string;\n /** Secondary text color for timestamp in hover popup */\n secondary: string;\n}\n\n/**\n * Get the color palette for an event based on its type\n * - Red for failures (step_failed, workflow_failed)\n * - Orange/yellow for retries (step_retrying)\n * - Purple for webhook-related events\n * - Blue otherwise (default)\n */\nexport function getEventColor(\n eventType: Event['eventType']\n): EventColorPalette {\n // Failures - Red\n if (eventType === 'step_failed' || eventType === 'workflow_failed') {\n return {\n color: 'var(--ds-red-600)',\n background: 'var(--ds-red-100)',\n border: 'var(--ds-red-500)',\n text: 'var(--ds-red-900)',\n secondary: 'var(--ds-red-700)',\n };\n }\n\n // Retries - Orange/Yellow\n if (eventType === 'step_retrying') {\n return {\n color: 'var(--ds-amber-600)',\n background: 'var(--ds-amber-100)',\n border: 'var(--ds-amber-500)',\n text: 'var(--ds-amber-900)',\n secondary: 'var(--ds-amber-700)',\n };\n }\n\n // Webhook-related - Purple\n if (\n eventType === 'hook_created' ||\n eventType === 'hook_received' ||\n eventType === 'hook_disposed'\n ) {\n return {\n color: 'var(--ds-purple-600)',\n background: 'var(--ds-purple-100)',\n border: 'var(--ds-purple-500)',\n text: 'var(--ds-purple-900)',\n secondary: 'var(--ds-purple-700)',\n };\n }\n\n // Default - Blue\n return {\n color: 'var(--ds-blue-600)',\n background: 'var(--ds-blue-100)',\n border: 'var(--ds-blue-500)',\n text: 'var(--ds-blue-900)',\n secondary: 'var(--ds-blue-700)',\n };\n}\n\n/**\n * Determine whether to show a vertical line for an event\n * - Show vertical lines for hook-related events\n * - Hide vertical lines for all other workflow events by default\n */\nexport function shouldShowVerticalLine(eventType: Event['eventType']): boolean {\n // Show vertical lines for hook-related events\n if (\n eventType === 'hook_created' ||\n eventType === 'hook_received' ||\n eventType === 'hook_disposed'\n ) {\n return true;\n }\n\n // Hide vertical lines for all other workflow events\n return false;\n}\n"],"names":[],"mappings":"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","ignoreList":[47]}