@workflow/web-shared 4.1.11 → 4.1.13

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 (52) hide show
  1. package/dist/components/event-list-view.d.ts +1 -1
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +6 -2
  4. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  5. package/dist/components/sidebar/attribute-panel.js +29 -33
  6. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  7. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  8. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  9. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  10. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  11. package/dist/components/ui/alert.js +2 -2
  12. package/dist/components/ui/card.js +2 -2
  13. package/dist/components/ui/context-card.d.ts +47 -0
  14. package/dist/components/ui/context-card.d.ts.map +1 -0
  15. package/dist/components/ui/context-card.js +471 -0
  16. package/dist/components/ui/error-card.js +2 -2
  17. package/dist/components/ui/skeleton.js +2 -2
  18. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  19. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  20. package/dist/components/ui/timestamp-tooltip.js +80 -132
  21. package/dist/components/workflow-traces/trace-span-construction.d.ts +4 -1
  22. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  23. package/dist/components/workflow-traces/trace-span-construction.js +30 -9
  24. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  25. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  26. package/dist/hooks/use-reduced-motion.js +29 -0
  27. package/dist/lib/cn.d.ts +10 -0
  28. package/dist/lib/cn.d.ts.map +1 -0
  29. package/dist/lib/cn.js +83 -0
  30. package/dist/lib/event-materialization.d.ts +3 -0
  31. package/dist/lib/event-materialization.d.ts.map +1 -1
  32. package/dist/lib/event-materialization.js +13 -7
  33. package/dist/lib/utils.d.ts +0 -2
  34. package/dist/lib/utils.d.ts.map +1 -1
  35. package/dist/lib/utils.js +1 -6
  36. package/dist/styles.css +9 -0
  37. package/package.json +8 -6
  38. package/src/components/event-list-view.tsx +10 -1
  39. package/src/components/sidebar/attribute-panel.tsx +122 -121
  40. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  41. package/src/components/ui/alert.tsx +1 -1
  42. package/src/components/ui/card.tsx +1 -1
  43. package/src/components/ui/context-card.tsx +784 -0
  44. package/src/components/ui/error-card.tsx +1 -1
  45. package/src/components/ui/skeleton.tsx +1 -1
  46. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  47. package/src/components/workflow-traces/trace-span-construction.ts +72 -30
  48. package/src/hooks/use-reduced-motion.ts +34 -0
  49. package/src/lib/cn.ts +93 -0
  50. package/src/lib/event-materialization.ts +68 -40
  51. package/src/lib/utils.ts +0 -6
  52. package/src/styles.css +9 -0
package/dist/lib/utils.js CHANGED
@@ -1,8 +1,3 @@
1
- import { clsx } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
- export function cn(...inputs) {
4
- return twMerge(clsx(inputs));
5
- }
6
1
  const durationFormatter = new Intl.NumberFormat(undefined, {
7
2
  maximumFractionDigits: 2,
8
3
  });
@@ -129,4 +124,4 @@ export function identifyStreamSteps(steps) {
129
124
  };
130
125
  });
131
126
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtJQUN6RCxxQkFBcUIsRUFBRSxDQUFDO0NBQ3pCLENBQUMsQ0FBQztBQUVILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxZQUFZ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QU07WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFlBQVk7U0FDYixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGVwIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgcmV0dXJuIHR3TWVyZ2UoY2xzeChpbnB1dHMpKTtcbn1cblxuY29uc3QgZHVyYXRpb25Gb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQodW5kZWZpbmVkLCB7XG4gIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcbn0pO1xuXG5jb25zdCBNU19JTl9TRUNPTkQgPSAxMDAwO1xuY29uc3QgTVNfSU5fTUlOVVRFID0gNjAgKiBNU19JTl9TRUNPTkQ7XG5jb25zdCBNU19JTl9IT1VSID0gNjAgKiBNU19JTl9NSU5VVEU7XG5jb25zdCBNU19JTl9EQVkgPSAyNCAqIE1TX0lOX0hPVVI7XG5cbi8qKlxuICogRm9ybWF0cyBhIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB0byBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gbXMgLSBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBjb21wYWN0IC0gSWYgdHJ1ZSwgcmV0dXJucyBhIHNpbmdsZS11bml0IGZvcm1hdCAoZS5nLiwgXCI0NXNcIiwgXCIyLjVtXCIpLlxuICogICAgICAgICAgICAgICAgICBJZiBmYWxzZSAoZGVmYXVsdCksIHJldHVybnMgbXVsdGktcGFydCBmb3JtYXQgKGUuZy4sIFwiMWggMzBtXCIsIFwiMmQgNWhcIikuXG4gKlxuICogQ29tcGFjdCBmb3JtYXQ6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCI1MDBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA8IDFoOiBzaG93cyBtaW51dGVzIChlLmcuLCBcIjQ1bVwiKVxuICogLSA+PSAxaDogc2hvd3MgaG91cnMgKGUuZy4sIFwiMi41aFwiKVxuICpcbiAqIEZ1bGwgZm9ybWF0OlxuICogLSA8IDFzOiBzaG93cyBtaWxsaXNlY29uZHMgKGUuZy4sIFwiNTAwbXNcIilcbiAqIC0gPCAxbTogc2hvd3Mgc2Vjb25kcyAoZS5nLiwgXCI0NS41c1wiKVxuICogLSA+PSAxbTogc2hvd3MgaHVtYW4tcmVhZGFibGUgZm9ybWF0IChlLmcuLCBcIjFoIDMwbVwiLCBcIjJkIDVoXCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvbihtczogbnVtYmVyLCBjb21wYWN0ID0gZmFsc2UpOiBzdHJpbmcge1xuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gJzAnO1xuICB9XG5cbiAgLy8gRm9yIGR1cmF0aW9ucyBsZXNzIHRoYW4gMSBzZWNvbmQsIHNob3cgbWlsbGlzZWNvbmRzXG4gIGlmIChtcyA8IE1TX0lOX1NFQ09ORCkge1xuICAgIHJldHVybiBgJHtkdXJhdGlvbkZvcm1hdHRlci5mb3JtYXQobXMpfW1zYDtcbiAgfVxuXG4gIC8vIEZvciBkdXJhdGlvbnMgbGVzcyB0aGFuIDEgbWludXRlLCBzaG93IHNlY29uZHNcbiAgaWYgKG1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke2R1cmF0aW9uRm9ybWF0dGVyLmZvcm1hdChtcyAvIE1TX0lOX1NFQ09ORCl9c2A7XG4gIH1cblxuICAvLyBDb21wYWN0IGZvcm1hdDogbXVsdGktdW5pdCB3aXRob3V0IGRlY2ltYWxzIChlLmcuIFwiOG0gMjBzXCIsIFwiMmggMzBtXCIpXG4gIGlmIChjb21wYWN0KSB7XG4gICAgaWYgKG1zIDwgTVNfSU5fSE9VUikge1xuICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IobXMgLyBNU19JTl9NSU5VVEUpO1xuICAgICAgY29uc3QgcyA9IE1hdGguZmxvb3IoKG1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG4gICAgICByZXR1cm4gcyA+IDAgPyBgJHttfW0gJHtzfXNgIDogYCR7bX1tYDtcbiAgICB9XG4gICAgY29uc3QgaCA9IE1hdGguZmxvb3IobXMgLyBNU19JTl9IT1VSKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobXMgJSBNU19JTl9IT1VSKSAvIE1TX0lOX01JTlVURSk7XG4gICAgcmV0dXJuIG0gPiAwID8gYCR7aH1oICR7bX1tYCA6IGAke2h9aGA7XG4gIH1cblxuICAvLyBGdWxsIGZvcm1hdDogaHVtYW4tcmVhZGFibGUgbXVsdGktcGFydFxuICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihtcyAvIE1TX0lOX0RBWSk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigobXMgJSBNU19JTl9EQVkpIC8gTVNfSU5fSE9VUik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChtcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IoKG1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG5cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGRheXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtkYXlzfWRgKTtcbiAgfVxuICBpZiAoaG91cnMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtob3Vyc31oYCk7XG4gIH1cbiAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHttaW51dGVzfW1gKTtcbiAgfVxuICBpZiAoaG91cnMgPD0gMSAmJiAoc2Vjb25kcyA+IDAgfHwgcGFydHMubGVuZ3RoID09PSAwKSkge1xuICAgIHBhcnRzLnB1c2goYCR7c2Vjb25kc31zYCk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmb3JtYXR0ZWQgcGFnaW5hdGlvbiBkaXNwbGF5IHN0cmluZ1xuICogQHBhcmFtIGN1cnJlbnRQYWdlIC0gVGhlIGN1cnJlbnQgcGFnZSBudW1iZXJcbiAqIEBwYXJhbSB0b3RhbFBhZ2VzIC0gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyB2aXNpdGVkIHNvIGZhclxuICogQHBhcmFtIGhhc01vcmUgLSBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICogQHJldHVybnMgRm9ybWF0dGVkIHN0cmluZyBsaWtlIFwiUGFnZSAxIG9mIDMrXCIgb3IgXCJQYWdlIDIgb2YgMlwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdpbmF0aW9uRGlzcGxheShcbiAgY3VycmVudFBhZ2U6IG51bWJlcixcbiAgdG90YWxQYWdlczogbnVtYmVyLFxuICBoYXNNb3JlOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBpZiAoaGFzTW9yZSkge1xuICAgIHJldHVybiBgUGFnZSAke2N1cnJlbnRQYWdlfSBvZiAke3RvdGFsUGFnZXN9K2A7XG4gIH1cbiAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc31gO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEdXJhYmxlIEFnZW50IFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RlcCBpcyBhIGRvU3RyZWFtU3RlcCAoTExNIGNhbGwgd2l0aCBjb252ZXJzYXRpb24gaW5wdXQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvU3RyZWFtU3RlcChzdGVwTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzdGVwTmFtZS5lbmRzV2l0aCgnLy9kb1N0cmVhbVN0ZXAnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBjb252ZXJzYXRpb24gZnJvbSBhIGh5ZHJhdGVkIGRvU3RyZWFtU3RlcCBpbnB1dC5cbiAqIGRvU3RyZWFtU3RlcCBzaWduYXR1cmU6IChjb252ZXJzYXRpb25Qcm9tcHQsIG1vZGVsLCB3cml0YWJsZSwgdG9vbHMsIG9wdGlvbnMpXG4gKiBTbyBpbnB1dFswXSBpcyB0aGUgY29udmVyc2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnZlcnNhdGlvbihzdGVwSW5wdXQ6IHVua25vd24pOiBNb2RlbE1lc3NhZ2VbXSB8IG51bGwge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RlcElucHV0KSB8fCBzdGVwSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmaXJzdEFyZyA9IHN0ZXBJbnB1dFswXTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlyc3RBcmcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpdCBsb29rcyBsaWtlIE1vZGVsTWVzc2FnZVtdXG4gIGlmIChcbiAgICAhZmlyc3RBcmcuZXZlcnkoKG1zZykgPT4gbXNnICYmIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmICdyb2xlJyBpbiBtc2cpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0QXJnIGFzIE1vZGVsTWVzc2FnZVtdO1xufVxuXG4vKipcbiAqIEEgZG9TdHJlYW1TdGVwIHdpdGggaXRzIGNvbnZlcnNhdGlvbiBpbnB1dCBleHRyYWN0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbjogTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBhbGwgc3RyZWFtIHN0ZXBzIChkb1N0cmVhbVN0ZXApIGluIGEgcnVuIGFuZCBleHRyYWN0cyB0aGVpciBjb252ZXJzYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlTdHJlYW1TdGVwcyhzdGVwczogU3RlcFtdKTogU3RyZWFtU3RlcFtdIHtcbiAgcmV0dXJuIHN0ZXBzXG4gICAgLmZpbHRlcigoc3RlcCkgPT4gaXNEb1N0cmVhbVN0ZXAoc3RlcC5zdGVwTmFtZSkpXG4gICAgLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcC5zdGVwTmFtZS5zcGxpdCgnLy8nKS5wb3AoKSA/PyAndW5rbm93bic7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXAuaW5wdXQpID8/IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgfTtcbiAgICB9KTtcbn1cbiJdfQ==
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtJQUN6RCxxQkFBcUIsRUFBRSxDQUFDO0NBQ3pCLENBQUMsQ0FBQztBQUVILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO0lBQzNELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLElBQUksRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxH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QUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsSUFDRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUN6RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxRQUEwQixDQUFDO0FBQ3BDLENBQUM7QUFZRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQU8sS0FBSztTQUNULE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFNBQVMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTNELE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFlBQVk7U0FDYixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdGVwIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuXG5jb25zdCBkdXJhdGlvbkZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh1bmRlZmluZWQsIHtcbiAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLFxufSk7XG5cbmNvbnN0IE1TX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBNU19JTl9NSU5VVEUgPSA2MCAqIE1TX0lOX1NFQ09ORDtcbmNvbnN0IE1TX0lOX0hPVVIgPSA2MCAqIE1TX0lOX01JTlVURTtcbmNvbnN0IE1TX0lOX0RBWSA9IDI0ICogTVNfSU5fSE9VUjtcblxuLyoqXG4gKiBGb3JtYXRzIGEgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIGNvbXBhY3QgLSBJZiB0cnVlLCByZXR1cm5zIGEgc2luZ2xlLXVuaXQgZm9ybWF0IChlLmcuLCBcIjQ1c1wiLCBcIjIuNW1cIikuXG4gKiAgICAgICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgcmV0dXJucyBtdWx0aS1wYXJ0IGZvcm1hdCAoZS5nLiwgXCIxaCAzMG1cIiwgXCIyZCA1aFwiKS5cbiAqXG4gKiBDb21wYWN0IGZvcm1hdDpcbiAqIC0gPCAxczogc2hvd3MgbWlsbGlzZWNvbmRzIChlLmcuLCBcIjUwMG1zXCIpXG4gKiAtIDwgMW06IHNob3dzIHNlY29uZHMgKGUuZy4sIFwiNDVzXCIpXG4gKiAtIDwgMWg6IHNob3dzIG1pbnV0ZXMgKGUuZy4sIFwiNDVtXCIpXG4gKiAtID49IDFoOiBzaG93cyBob3VycyAoZS5nLiwgXCIyLjVoXCIpXG4gKlxuICogRnVsbCBmb3JtYXQ6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCI1MDBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1LjVzXCIpXG4gKiAtID49IDFtOiBzaG93cyBodW1hbi1yZWFkYWJsZSBmb3JtYXQgKGUuZy4sIFwiMWggMzBtXCIsIFwiMmQgNWhcIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1zOiBudW1iZXIsIGNvbXBhY3QgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmIChtcyA9PT0gMCkge1xuICAgIHJldHVybiAnMCc7XG4gIH1cblxuICAvLyBGb3IgZHVyYXRpb25zIGxlc3MgdGhhbiAxIHNlY29uZCwgc2hvdyBtaWxsaXNlY29uZHNcbiAgaWYgKG1zIDwgTVNfSU5fU0VDT05EKSB7XG4gICAgcmV0dXJuIGAke2R1cmF0aW9uRm9ybWF0dGVyLmZvcm1hdChtcyl9bXNgO1xuICB9XG5cbiAgLy8gRm9yIGR1cmF0aW9ucyBsZXNzIHRoYW4gMSBtaW51dGUsIHNob3cgc2Vjb25kc1xuICBpZiAobXMgPCBNU19JTl9NSU5VVEUpIHtcbiAgICByZXR1cm4gYCR7ZHVyYXRpb25Gb3JtYXR0ZXIuZm9ybWF0KG1zIC8gTVNfSU5fU0VDT05EKX1zYDtcbiAgfVxuXG4gIC8vIENvbXBhY3QgZm9ybWF0OiBtdWx0aS11bml0IHdpdGhvdXQgZGVjaW1hbHMgKGUuZy4gXCI4bSAyMHNcIiwgXCIyaCAzMG1cIilcbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBpZiAobXMgPCBNU19JTl9IT1VSKSB7XG4gICAgICBjb25zdCBtID0gTWF0aC5mbG9vcihtcyAvIE1TX0lOX01JTlVURSk7XG4gICAgICBjb25zdCBzID0gTWF0aC5mbG9vcigobXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EKTtcbiAgICAgIHJldHVybiBzID4gMCA/IGAke219bSAke3N9c2AgOiBgJHttfW1gO1xuICAgIH1cbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihtcyAvIE1TX0lOX0hPVVIpO1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChtcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgICByZXR1cm4gbSA+IDAgPyBgJHtofWggJHttfW1gIDogYCR7aH1oYDtcbiAgfVxuXG4gIC8vIEZ1bGwgZm9ybWF0OiBodW1hbi1yZWFkYWJsZSBtdWx0aS1wYXJ0XG4gIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKG1zIC8gTVNfSU5fREFZKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChtcyAlIE1TX0lOX0RBWSkgLyBNU19JTl9IT1VSKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKG1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigobXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EKTtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoZGF5cyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2RheXN9ZGApO1xuICB9XG4gIGlmIChob3VycyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2hvdXJzfWhgKTtcbiAgfVxuICBpZiAobWludXRlcyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke21pbnV0ZXN9bWApO1xuICB9XG4gIGlmIChob3VycyA8PSAxICYmIChzZWNvbmRzID4gMCB8fCBwYXJ0cy5sZW5ndGggPT09IDApKSB7XG4gICAgcGFydHMucHVzaChgJHtzZWNvbmRzfXNgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZvcm1hdHRlZCBwYWdpbmF0aW9uIGRpc3BsYXkgc3RyaW5nXG4gKiBAcGFyYW0gY3VycmVudFBhZ2UgLSBUaGUgY3VycmVudCBwYWdlIG51bWJlclxuICogQHBhcmFtIHRvdGFsUGFnZXMgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHZpc2l0ZWQgc28gZmFyXG4gKiBAcGFyYW0gaGFzTW9yZSAtIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgcGFnZXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIGxpa2UgXCJQYWdlIDEgb2YgMytcIiBvciBcIlBhZ2UgMiBvZiAyXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25EaXNwbGF5KFxuICBjdXJyZW50UGFnZTogbnVtYmVyLFxuICB0b3RhbFBhZ2VzOiBudW1iZXIsXG4gIGhhc01vcmU6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGlmIChoYXNNb3JlKSB7XG4gICAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc30rYDtcbiAgfVxuICByZXR1cm4gYFBhZ2UgJHtjdXJyZW50UGFnZX0gb2YgJHt0b3RhbFBhZ2VzfWA7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER1cmFibGUgQWdlbnQgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdGVwIGlzIGEgZG9TdHJlYW1TdGVwIChMTE0gY2FsbCB3aXRoIGNvbnZlcnNhdGlvbiBpbnB1dClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9TdHJlYW1TdGVwKHN0ZXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmVuZHNXaXRoKCcvL2RvU3RyZWFtU3RlcCcpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGNvbnZlcnNhdGlvbiBmcm9tIGEgaHlkcmF0ZWQgZG9TdHJlYW1TdGVwIGlucHV0LlxuICogZG9TdHJlYW1TdGVwIHNpZ25hdHVyZTogKGNvbnZlcnNhdGlvblByb21wdCwgbW9kZWwsIHdyaXRhYmxlLCB0b29scywgb3B0aW9ucylcbiAqIFNvIGlucHV0WzBdIGlzIHRoZSBjb252ZXJzYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXBJbnB1dDogdW5rbm93bik6IE1vZGVsTWVzc2FnZVtdIHwgbnVsbCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdGVwSW5wdXQpIHx8IHN0ZXBJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0QXJnID0gc3RlcElucHV0WzBdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaXJzdEFyZykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGl0IGxvb2tzIGxpa2UgTW9kZWxNZXNzYWdlW11cbiAgaWYgKFxuICAgICFmaXJzdEFyZy5ldmVyeSgobXNnKSA9PiBtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgJ3JvbGUnIGluIG1zZylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlyc3RBcmcgYXMgTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogQSBkb1N0cmVhbVN0ZXAgd2l0aCBpdHMgY29udmVyc2F0aW9uIGlucHV0IGV4dHJhY3RlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVN0ZXAge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgY29udmVyc2F0aW9uOiBNb2RlbE1lc3NhZ2VbXTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGFsbCBzdHJlYW0gc3RlcHMgKGRvU3RyZWFtU3RlcCkgaW4gYSBydW4gYW5kIGV4dHJhY3RzIHRoZWlyIGNvbnZlcnNhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeVN0cmVhbVN0ZXBzKHN0ZXBzOiBTdGVwW10pOiBTdHJlYW1TdGVwW10ge1xuICByZXR1cm4gc3RlcHNcbiAgICAuZmlsdGVyKChzdGVwKSA9PiBpc0RvU3RyZWFtU3RlcChzdGVwLnN0ZXBOYW1lKSlcbiAgICAubWFwKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdGVwLnN0ZXBOYW1lLnNwbGl0KCcvLycpLnBvcCgpID8/ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oc3RlcC5pbnB1dCkgPz8gW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBjb252ZXJzYXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xufVxuIl19
package/dist/styles.css CHANGED
@@ -12,6 +12,9 @@
12
12
  * import '@workflow/web-shared/styles.css';
13
13
  */
14
14
 
15
+ @custom-variant dark-theme (&:where(.dark-theme, .dark-theme *, .dark, .dark *, [data-theme="dark"], [data-theme="dark"] *));
16
+ @custom-variant light-theme (&:where(.light-theme, .light-theme *, .light, .light *));
17
+
15
18
  :root {
16
19
  /* Background */
17
20
  --ds-background-100: hsl(0, 0%, 100%);
@@ -100,6 +103,9 @@
100
103
 
101
104
  /* Shadows */
102
105
  --ds-shadow-small: 0px 1px 2px rgba(0, 0, 0, 0.04);
106
+ --ds-shadow-tooltip:
107
+ 0 0 0 1px rgba(0, 0, 0, 0.08), 0px 1px 1px rgba(0, 0, 0, 0.02),
108
+ 0px 4px 8px rgba(0, 0, 0, 0.04), 0 0 0 1px var(--ds-background-200);
103
109
  }
104
110
 
105
111
  /* Dark theme defaults */
@@ -182,5 +188,8 @@
182
188
  --ds-pink-900: hsl(336, 80%, 70%);
183
189
 
184
190
  --ds-shadow-small: 0px 1px 2px rgba(0, 0, 0, 0.3);
191
+ --ds-shadow-tooltip:
192
+ 0 0 0 1px rgba(255, 255, 255, 0.145), 0px 1px 1px rgba(0, 0, 0, 0.02),
193
+ 0px 4px 8px rgba(0, 0, 0, 0.04), 0 0 0 1px var(--ds-background-200);
185
194
  }
186
195
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "4.1.11",
4
+ "version": "4.1.13",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -38,6 +38,7 @@
38
38
  "directory": "packages/web-shared"
39
39
  },
40
40
  "dependencies": {
41
+ "@radix-ui/react-slot": "1.1.1",
41
42
  "@tailwindcss/postcss": "4.3.0",
42
43
  "class-variance-authority": "0.7.1",
43
44
  "clsx": "2.1.1",
@@ -46,15 +47,16 @@
46
47
  "react": "19.1.0",
47
48
  "react-dom": "19.1.0",
48
49
  "react-inspector": "9.0.0",
50
+ "react-use-measure": "2.1.1",
49
51
  "react-virtuoso": "4.18.1",
50
52
  "shiki": "4.2.0",
51
53
  "sonner": "2.0.7",
52
54
  "streamdown": "2.3.0",
53
55
  "tailwind-merge": "3.5.0",
54
56
  "tailwindcss": "4",
55
- "@workflow/core": "4.5.0",
56
- "@workflow/utils": "4.1.3",
57
- "@workflow/world": "4.2.0"
57
+ "@workflow/core": "4.6.1",
58
+ "@workflow/utils": "4.1.4",
59
+ "@workflow/world": "4.2.1"
58
60
  },
59
61
  "devDependencies": {
60
62
  "@biomejs/biome": "^2.4.4",
@@ -62,8 +64,8 @@
62
64
  "@types/react": "19",
63
65
  "@types/react-dom": "19",
64
66
  "ai": "6.0.116",
65
- "typescript": "^5.9.3",
66
- "vitest": "^4.0.18",
67
+ "typescript": "^6.0.3",
68
+ "vitest": "^4.1.10",
67
69
  "@workflow/tsconfig": "4.0.1"
68
70
  },
69
71
  "scripts": {
@@ -19,6 +19,7 @@ import {
19
19
  import { isEncryptedMarker } from '../lib/hydration';
20
20
  import { useToast } from '../lib/toast';
21
21
  import { formatDuration } from '../lib/utils';
22
+ import { ContextCardProvider } from './ui/context-card';
22
23
  import { DataInspector, DecryptClickContext } from './ui/data-inspector';
23
24
  import { DecryptButton } from './ui/decrypt-button';
24
25
  import {
@@ -1162,7 +1163,7 @@ function EventRow({
1162
1163
  // Main component
1163
1164
  // ──────────────────────────────────────────────────────────────────────────
1164
1165
 
1165
- export function EventListView({
1166
+ function EventListViewInner({
1166
1167
  events,
1167
1168
  run,
1168
1169
  onLoadEventData,
@@ -1745,3 +1746,11 @@ export function EventListView({
1745
1746
  </DecryptClickContext.Provider>
1746
1747
  );
1747
1748
  }
1749
+
1750
+ export function EventListView(props: EventsListProps) {
1751
+ return (
1752
+ <ContextCardProvider>
1753
+ <EventListViewInner {...props} />
1754
+ </ContextCardProvider>
1755
+ );
1756
+ }
@@ -3,17 +3,19 @@
3
3
  import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
4
  import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
5
5
  import type { ModelMessage } from 'ai';
6
+ import { format } from 'date-fns';
6
7
  import { Lock } from 'lucide-react';
7
- import { Spinner } from '../ui/spinner';
8
8
  import type { KeyboardEvent, ReactNode } from 'react';
9
9
  import { useCallback, useContext, useMemo, useState } from 'react';
10
10
  import { isEncryptedMarker, isExpiredMarker } from '../../lib/hydration';
11
11
  import { useToast } from '../../lib/toast';
12
12
  import { extractConversation, isDoStreamStep } from '../../lib/utils';
13
+ import { ContextCardProvider } from '../ui/context-card';
13
14
  import { DecryptClickContext, StreamClickContext } from '../ui/data-inspector';
14
15
  import { ErrorCard } from '../ui/error-card';
15
16
  import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
16
17
  import { Skeleton } from '../ui/skeleton';
18
+ import { Spinner } from '../ui/spinner';
17
19
  import { TimestampTooltip } from '../ui/timestamp-tooltip';
18
20
  import { ConversationView } from './conversation-view';
19
21
  import { CopyableDataBlock } from './copyable-data-block';
@@ -255,6 +257,7 @@ type AttributeKey =
255
257
  | keyof WorkflowRun
256
258
  | keyof Hook
257
259
  | keyof Event
260
+ | 'occurredAt'
258
261
  | 'moduleSpecifier'
259
262
  | 'eventData'
260
263
  | 'resumeAt'
@@ -287,6 +290,7 @@ const attributeOrder: AttributeKey[] = [
287
290
  'projectId',
288
291
  'environment',
289
292
  'executionContext',
293
+ 'occurredAt',
290
294
  'createdAt',
291
295
  'startedAt',
292
296
  'updatedAt',
@@ -312,6 +316,7 @@ const sortByAttributeOrder = (a: string, b: string): number => {
312
316
  */
313
317
  const attributeDisplayNames: Partial<Record<AttributeKey, string>> = {
314
318
  workflowCoreVersion: '@workflow/core version',
319
+ occurredAt: 'Occurred',
315
320
  receivedCount: 'times resolved',
316
321
  };
317
322
 
@@ -352,15 +357,7 @@ const parseDateValue = (value: unknown): Date | null => {
352
357
  };
353
358
 
354
359
  const formatLocalMillisecondTime = (date: Date): string =>
355
- date.toLocaleString(undefined, {
356
- year: 'numeric',
357
- month: 'numeric',
358
- day: 'numeric',
359
- hour: 'numeric',
360
- minute: 'numeric',
361
- second: 'numeric',
362
- fractionalSecondDigits: 3,
363
- });
360
+ format(date, 'MMM dd HH:mm:ss.SS OO').toUpperCase();
364
361
 
365
362
  export const localMillisecondTime = (value: unknown): string => {
366
363
  const date = parseDateValue(value);
@@ -368,7 +365,6 @@ export const localMillisecondTime = (value: unknown): string => {
368
365
  return '-';
369
366
  }
370
367
 
371
- // e.g. 12/17/2025, 9:08:55.182 AM
372
368
  return formatLocalMillisecondTime(date);
373
369
  };
374
370
 
@@ -430,6 +426,7 @@ const attributeToDisplayFn: Record<
430
426
  environment: (_value: unknown) => null,
431
427
  executionContext: (_value: unknown) => null,
432
428
  // Dates — wrapped with TimestampTooltip showing UTC/local + relative time
429
+ occurredAt: timestampWithTooltipOrNull,
433
430
  createdAt: timestampWithTooltipOrNull,
434
431
  startedAt: timestampWithTooltipOrNull,
435
432
  updatedAt: timestampWithTooltipOrNull,
@@ -828,122 +825,126 @@ export const AttributePanel = ({
828
825
  }, []);
829
826
 
830
827
  return (
831
- <StreamClickContext.Provider value={onStreamClick}>
832
- <DecryptClickContext.Provider
833
- value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}
834
- >
835
- <div>
836
- {/* Basic attributes in a vertical layout with border */}
837
- {visibleBasicAttributes.length > 0 && (
838
- <div
839
- className="mb-3 flex flex-col overflow-hidden rounded-lg border"
840
- style={{
841
- borderColor: 'var(--ds-gray-300)',
842
- }}
843
- >
844
- {orderedBasicAttributes.map((attribute, index) => {
845
- const displayValue = attributeToDisplayFn[
846
- attribute as keyof typeof attributeToDisplayFn
847
- ]?.(displayData[attribute as keyof typeof displayData]);
848
- const isModuleSpecifier = attribute === 'moduleSpecifier';
849
- const moduleSpecifierValue =
850
- typeof displayValue === 'string'
851
- ? displayValue
852
- : String(displayValue ?? displayData.moduleSpecifier ?? '');
853
- const shouldCapitalizeLabel =
854
- attribute !== 'workflowCoreVersion';
855
- const showResumeAtSkeleton =
856
- isLoading && resource === 'sleep' && !displayData.resumeAt;
857
- const showDivider =
858
- index < orderedBasicAttributes.length - 1 ||
859
- showResumeAtSkeleton;
860
-
861
- return (
862
- <div key={attribute} className="py-1">
828
+ <ContextCardProvider>
829
+ <StreamClickContext.Provider value={onStreamClick}>
830
+ <DecryptClickContext.Provider
831
+ value={onDecrypt ? { onDecrypt, isDecrypting } : undefined}
832
+ >
833
+ <div>
834
+ {/* Basic attributes in a vertical layout with border */}
835
+ {visibleBasicAttributes.length > 0 && (
836
+ <div
837
+ className="mb-3 flex flex-col overflow-hidden rounded-lg border"
838
+ style={{
839
+ borderColor: 'var(--ds-gray-300)',
840
+ }}
841
+ >
842
+ {orderedBasicAttributes.map((attribute, index) => {
843
+ const displayValue = attributeToDisplayFn[
844
+ attribute as keyof typeof attributeToDisplayFn
845
+ ]?.(displayData[attribute as keyof typeof displayData]);
846
+ const isModuleSpecifier = attribute === 'moduleSpecifier';
847
+ const moduleSpecifierValue =
848
+ typeof displayValue === 'string'
849
+ ? displayValue
850
+ : String(
851
+ displayValue ?? displayData.moduleSpecifier ?? ''
852
+ );
853
+ const shouldCapitalizeLabel =
854
+ attribute !== 'workflowCoreVersion';
855
+ const showResumeAtSkeleton =
856
+ isLoading && resource === 'sleep' && !displayData.resumeAt;
857
+ const showDivider =
858
+ index < orderedBasicAttributes.length - 1 ||
859
+ showResumeAtSkeleton;
860
+
861
+ return (
862
+ <div key={attribute} className="py-1">
863
+ <div className="flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1">
864
+ <span
865
+ className={
866
+ shouldCapitalizeLabel
867
+ ? 'text-[14px] first-letter:uppercase'
868
+ : 'text-[14px]'
869
+ }
870
+ style={{ color: 'var(--ds-gray-700)' }}
871
+ >
872
+ {getAttributeDisplayName(attribute)}
873
+ </span>
874
+ {isModuleSpecifier ? (
875
+ <button
876
+ type="button"
877
+ className="min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono"
878
+ style={{
879
+ color: 'var(--ds-gray-1000)',
880
+ background: 'transparent',
881
+ border: 'none',
882
+ padding: 0,
883
+ }}
884
+ title={moduleSpecifierValue}
885
+ onClick={() =>
886
+ handleCopyModuleSpecifier(moduleSpecifierValue)
887
+ }
888
+ >
889
+ {moduleSpecifierValue}
890
+ </button>
891
+ ) : (
892
+ <span
893
+ className="min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono"
894
+ style={{ color: 'var(--ds-gray-1000)' }}
895
+ >
896
+ {displayValue}
897
+ </span>
898
+ )}
899
+ </div>
900
+ {showDivider ? (
901
+ <div
902
+ className="mx-2.5 border-b"
903
+ style={{ borderColor: 'var(--ds-gray-300)' }}
904
+ />
905
+ ) : null}
906
+ </div>
907
+ );
908
+ })}
909
+ {isLoading && resource === 'sleep' && !displayData.resumeAt && (
910
+ <div className="py-1">
863
911
  <div className="flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1">
864
912
  <span
865
- className={
866
- shouldCapitalizeLabel
867
- ? 'text-[14px] first-letter:uppercase'
868
- : 'text-[14px]'
869
- }
913
+ className="text-[14px] first-letter:uppercase"
870
914
  style={{ color: 'var(--ds-gray-700)' }}
871
915
  >
872
- {getAttributeDisplayName(attribute)}
916
+ resumeAt
873
917
  </span>
874
- {isModuleSpecifier ? (
875
- <button
876
- type="button"
877
- className="min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono"
878
- style={{
879
- color: 'var(--ds-gray-1000)',
880
- background: 'transparent',
881
- border: 'none',
882
- padding: 0,
883
- }}
884
- title={moduleSpecifierValue}
885
- onClick={() =>
886
- handleCopyModuleSpecifier(moduleSpecifierValue)
887
- }
888
- >
889
- {moduleSpecifierValue}
890
- </button>
891
- ) : (
892
- <span
893
- className="min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono"
894
- style={{ color: 'var(--ds-gray-1000)' }}
895
- >
896
- {displayValue}
897
- </span>
898
- )}
918
+ <Skeleton className="h-4 w-[55%]" />
899
919
  </div>
900
- {showDivider ? (
901
- <div
902
- className="mx-2.5 border-b"
903
- style={{ borderColor: 'var(--ds-gray-300)' }}
904
- />
905
- ) : null}
906
920
  </div>
907
- );
908
- })}
909
- {isLoading && resource === 'sleep' && !displayData.resumeAt && (
910
- <div className="py-1">
911
- <div className="flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1">
912
- <span
913
- className="text-[14px] first-letter:uppercase"
914
- style={{ color: 'var(--ds-gray-700)' }}
915
- >
916
- resumeAt
917
- </span>
918
- <Skeleton className="h-4 w-[55%]" />
919
- </div>
920
- </div>
921
- )}
922
- </div>
923
- )}
924
- {error ? (
925
- <ErrorCard
926
- title="Failed to load resource details"
927
- details={error.message}
928
- className="my-4"
929
- />
930
- ) : hasExpired ? (
931
- <ExpiredDataMessage />
932
- ) : (
933
- <>
934
- {resolvedAttributes.map((attribute) => (
935
- <AttributeBlock
936
- isLoading={isLoading}
937
- key={attribute}
938
- attribute={attribute}
939
- value={displayData[attribute as keyof typeof displayData]}
940
- context={displayContext}
941
- />
942
- ))}
943
- </>
944
- )}
945
- </div>
946
- </DecryptClickContext.Provider>
947
- </StreamClickContext.Provider>
921
+ )}
922
+ </div>
923
+ )}
924
+ {error ? (
925
+ <ErrorCard
926
+ title="Failed to load resource details"
927
+ details={error.message}
928
+ className="my-4"
929
+ />
930
+ ) : hasExpired ? (
931
+ <ExpiredDataMessage />
932
+ ) : (
933
+ <>
934
+ {resolvedAttributes.map((attribute) => (
935
+ <AttributeBlock
936
+ isLoading={isLoading}
937
+ key={attribute}
938
+ attribute={attribute}
939
+ value={displayData[attribute as keyof typeof displayData]}
940
+ context={displayContext}
941
+ />
942
+ ))}
943
+ </>
944
+ )}
945
+ </div>
946
+ </DecryptClickContext.Provider>
947
+ </StreamClickContext.Provider>
948
+ </ContextCardProvider>
948
949
  );
949
950
  };
@@ -1314,10 +1314,10 @@
1314
1314
  .segQueued {
1315
1315
  background: repeating-linear-gradient(
1316
1316
  45deg,
1317
- var(--ds-gray-alpha-200),
1318
- var(--ds-gray-alpha-200) 6px,
1319
- var(--ds-gray-alpha-100) 6px,
1320
- var(--ds-gray-alpha-100) 12px
1317
+ var(--ds-gray-200),
1318
+ var(--ds-gray-200) 6px,
1319
+ var(--ds-gray-100) 6px,
1320
+ var(--ds-gray-100) 12px
1321
1321
  );
1322
1322
  }
1323
1323
 
@@ -1,7 +1,7 @@
1
1
  import { cva, type VariantProps } from 'class-variance-authority';
2
2
  import * as React from 'react';
3
3
 
4
- import { cn } from '../../lib/utils';
4
+ import { cn } from '../../lib/cn';
5
5
 
6
6
  const alertVariants = cva(
7
7
  'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4',
@@ -2,7 +2,7 @@
2
2
 
3
3
  import * as React from 'react';
4
4
 
5
- import { cn } from '../../lib/utils';
5
+ import { cn } from '../../lib/cn';
6
6
 
7
7
  const Card = React.forwardRef<
8
8
  HTMLDivElement,