@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +16 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +196 -85
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -1
- package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.js +46 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +36 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +254 -0
- package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/new-trace-viewer/context.d.ts +15 -0
- package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/context.js +47 -0
- package/dist/components/new-trace-viewer/icons.d.ts +6 -0
- package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/icons.js +15 -0
- package/dist/components/new-trace-viewer/search.d.ts +19 -0
- package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/search.js +134 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +11 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +462 -0
- package/dist/components/new-trace-viewer/types.d.ts +3 -0
- package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/types.js +2 -0
- package/dist/components/new-trace-viewer/utils.d.ts +61 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +345 -0
- package/dist/components/run-trace-view.js +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +129 -102
- package/dist/components/sidebar/attributes-block.d.ts +28 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +81 -0
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +17 -35
- package/dist/components/sidebar/events-list.d.ts +3 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +36 -22
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar-data-context.js +19 -0
- package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +53 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +3 -27
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/node.js +2 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +3 -3
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +8 -11
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.d.ts +14 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +21 -0
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/context-card.d.ts +47 -0
- package/dist/components/ui/context-card.d.ts.map +1 -0
- package/dist/components/ui/context-card.js +471 -0
- package/dist/components/ui/data-inspector.d.ts +22 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +103 -13
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts +17 -10
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +49 -30
- package/dist/components/ui/icon-button.d.ts +19 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/inspector-theme.d.ts +9 -10
- package/dist/components/ui/inspector-theme.d.ts.map +1 -1
- package/dist/components/ui/inspector-theme.js +39 -72
- package/dist/components/ui/kbd.d.ts +6 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +6 -0
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
- package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js +80 -132
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-trace-view.d.ts +1 -3
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +11 -13
- package/dist/components/workflow-traces/event-colors.d.ts +1 -0
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +12 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +19 -5
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-intersection-observer.d.ts +17 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +29 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
- package/dist/hooks/use-load-more-on-scroll.js +28 -0
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +6 -0
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +154 -2
- package/dist/lib/stream-display.d.ts +18 -0
- package/dist/lib/stream-display.d.ts.map +1 -0
- package/dist/lib/stream-display.js +30 -0
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts +15 -0
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +29 -3
- package/dist/lib/utils.d.ts +20 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +74 -31
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/dist/styles.css +484 -1
- package/package.json +10 -5
- package/src/components/event-list-view.tsx +279 -104
- package/src/components/index.ts +7 -0
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +136 -0
- package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
- package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
- package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
- package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
- package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
- package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +744 -0
- package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
- package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
- package/src/components/new-trace-viewer/context.tsx +90 -0
- package/src/components/new-trace-viewer/icons.tsx +79 -0
- package/src/components/new-trace-viewer/search.ts +178 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +843 -0
- package/src/components/new-trace-viewer/types.ts +2 -0
- package/src/components/new-trace-viewer/utils.test.ts +182 -0
- package/src/components/new-trace-viewer/utils.ts +519 -0
- package/src/components/sidebar/attribute-panel.tsx +194 -240
- package/src/components/sidebar/attributes-block.tsx +173 -0
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -59
- package/src/components/sidebar/entity-detail-panel.tsx +55 -111
- package/src/components/sidebar/events-list.tsx +85 -96
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/sidebar/span-detail-merge.ts +65 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer/components/node.tsx +3 -2
- package/src/components/trace-viewer/trace-viewer.module.css +4 -4
- package/src/components/trace-viewer/util/timing.ts +7 -11
- package/src/components/trace-viewer-new.tsx +55 -0
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.tsx +244 -22
- package/src/components/ui/error-stack-block.tsx +84 -55
- package/src/components/ui/icon-button.tsx +53 -0
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/ui/kbd.tsx +21 -0
- package/src/components/ui/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-trace-view.tsx +19 -15
- package/src/components/workflow-traces/event-colors.ts +12 -0
- package/src/components/workflow-traces/trace-span-construction.ts +24 -5
- package/src/hooks/use-intersection-observer.ts +57 -0
- package/src/hooks/use-load-more-on-scroll.ts +49 -0
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +9 -0
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +166 -1
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/trace-builder.ts +34 -2
- package/src/lib/utils.ts +83 -31
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +484 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
type AttributeChange,
|
|
5
|
+
RESERVED_ATTRIBUTE_KEY_PREFIX,
|
|
6
|
+
} from '@workflow/world';
|
|
7
|
+
import { CopyableDataBlock } from './copyable-data-block';
|
|
8
|
+
import { DetailCard } from './detail-card';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check whether an attribute key is in the reserved (`$`-prefixed)
|
|
12
|
+
* namespace used by framework/library code.
|
|
13
|
+
*/
|
|
14
|
+
export const isReservedAttributeKey = (key: string): boolean =>
|
|
15
|
+
key.startsWith(RESERVED_ATTRIBUTE_KEY_PREFIX);
|
|
16
|
+
|
|
17
|
+
function ReservedBadge() {
|
|
18
|
+
return (
|
|
19
|
+
<span
|
|
20
|
+
className="shrink-0 rounded border px-1 py-px text-[10px] font-medium leading-3"
|
|
21
|
+
style={{
|
|
22
|
+
borderColor: 'var(--ds-gray-alpha-400)',
|
|
23
|
+
backgroundColor: 'var(--ds-gray-100)',
|
|
24
|
+
color: 'var(--ds-gray-700)',
|
|
25
|
+
}}
|
|
26
|
+
title={`Keys prefixed with "${RESERVED_ATTRIBUTE_KEY_PREFIX}" are reserved for framework and library code`}
|
|
27
|
+
>
|
|
28
|
+
Reserved
|
|
29
|
+
</span>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function AttributeRow({
|
|
34
|
+
attributeKey,
|
|
35
|
+
value,
|
|
36
|
+
removed = false,
|
|
37
|
+
}: {
|
|
38
|
+
attributeKey: string;
|
|
39
|
+
value?: string;
|
|
40
|
+
removed?: boolean;
|
|
41
|
+
}) {
|
|
42
|
+
const reserved = isReservedAttributeKey(attributeKey);
|
|
43
|
+
return (
|
|
44
|
+
<div className="flex items-center justify-between gap-3 py-0.5">
|
|
45
|
+
<span
|
|
46
|
+
className="flex min-w-0 items-center gap-1.5 text-label-13 text-gray-900"
|
|
47
|
+
style={reserved ? { color: 'var(--ds-gray-700)' } : undefined}
|
|
48
|
+
>
|
|
49
|
+
<span className="truncate">{attributeKey}</span>
|
|
50
|
+
{reserved && <ReservedBadge />}
|
|
51
|
+
</span>
|
|
52
|
+
{removed ? (
|
|
53
|
+
<span className="shrink-0 text-copy-13 italic text-gray-700">
|
|
54
|
+
removed
|
|
55
|
+
</span>
|
|
56
|
+
) : (
|
|
57
|
+
<span
|
|
58
|
+
className="max-w-[60%] truncate text-copy-13 text-gray-1000"
|
|
59
|
+
title={value}
|
|
60
|
+
>
|
|
61
|
+
{value}
|
|
62
|
+
</span>
|
|
63
|
+
)}
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Sort attribute keys for display: user keys first (alphabetical), then
|
|
70
|
+
* reserved `$`-prefixed keys (alphabetical), so framework metadata doesn't
|
|
71
|
+
* crowd out user-set attributes.
|
|
72
|
+
*/
|
|
73
|
+
export function sortAttributeKeys(keys: string[]): string[] {
|
|
74
|
+
return [...keys].sort((a, b) => {
|
|
75
|
+
const aReserved = isReservedAttributeKey(a);
|
|
76
|
+
const bReserved = isReservedAttributeKey(b);
|
|
77
|
+
if (aReserved !== bReserved) return aReserved ? 1 : -1;
|
|
78
|
+
return a.localeCompare(b);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Collapsible section showing a run's materialized attributes as key-value
|
|
84
|
+
* rows. Reserved (`$`-prefixed) keys are visually de-emphasized with a
|
|
85
|
+
* badge and sorted after user keys.
|
|
86
|
+
*/
|
|
87
|
+
export function RunAttributesCard({
|
|
88
|
+
attributes,
|
|
89
|
+
}: {
|
|
90
|
+
attributes: Record<string, string>;
|
|
91
|
+
}) {
|
|
92
|
+
const keys = sortAttributeKeys(Object.keys(attributes));
|
|
93
|
+
if (keys.length === 0) return null;
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<DetailCard summary="Attributes" defaultOpen contentClassName="mb-4">
|
|
97
|
+
<div className="flex flex-col">
|
|
98
|
+
{keys.map((key) => (
|
|
99
|
+
<AttributeRow attributeKey={key} key={key} value={attributes[key]} />
|
|
100
|
+
))}
|
|
101
|
+
</div>
|
|
102
|
+
</DetailCard>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface AttrSetEventData {
|
|
107
|
+
changes: AttributeChange[];
|
|
108
|
+
writer?:
|
|
109
|
+
| { type: 'workflow' }
|
|
110
|
+
| { type: 'step'; stepId: string; attempt: number };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function isAttrSetEventData(data: unknown): data is AttrSetEventData {
|
|
114
|
+
if (data === null || typeof data !== 'object') return false;
|
|
115
|
+
const record = data as Record<string, unknown>;
|
|
116
|
+
return (
|
|
117
|
+
Array.isArray(record.changes) &&
|
|
118
|
+
record.changes.every(
|
|
119
|
+
(c) =>
|
|
120
|
+
c !== null &&
|
|
121
|
+
typeof c === 'object' &&
|
|
122
|
+
typeof (c as Record<string, unknown>).key === 'string'
|
|
123
|
+
)
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function describeWriter(writer: AttrSetEventData['writer']): string | null {
|
|
128
|
+
if (!writer) return null;
|
|
129
|
+
if (writer.type === 'workflow') return 'Set by workflow';
|
|
130
|
+
if (writer.type === 'step') {
|
|
131
|
+
return `Set by step ${writer.stepId} (attempt ${writer.attempt})`;
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Renders the payload of an `attr_set` event: the list of attribute
|
|
138
|
+
* changes (sets and removals) plus which writer (workflow or step)
|
|
139
|
+
* made them. Falls back to the generic JSON block for unexpected shapes.
|
|
140
|
+
*/
|
|
141
|
+
export function AttrSetEventBlock({ data }: { data: unknown }) {
|
|
142
|
+
if (!isAttrSetEventData(data)) {
|
|
143
|
+
return <CopyableDataBlock data={data} />;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const writerLabel = describeWriter(data.writer);
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div className="flex flex-col px-3 py-1">
|
|
150
|
+
<div className="flex flex-col">
|
|
151
|
+
{data.changes.map((change, index) => (
|
|
152
|
+
<AttributeRow
|
|
153
|
+
attributeKey={change.key}
|
|
154
|
+
key={`${change.key}:${index}`}
|
|
155
|
+
removed={change.value === null}
|
|
156
|
+
value={change.value ?? undefined}
|
|
157
|
+
/>
|
|
158
|
+
))}
|
|
159
|
+
</div>
|
|
160
|
+
{writerLabel && (
|
|
161
|
+
<div
|
|
162
|
+
className="border-t py-1.5 text-label-12"
|
|
163
|
+
style={{
|
|
164
|
+
borderColor: 'var(--ds-gray-alpha-400)',
|
|
165
|
+
color: 'var(--ds-gray-700)',
|
|
166
|
+
}}
|
|
167
|
+
>
|
|
168
|
+
{writerLabel}
|
|
169
|
+
</div>
|
|
170
|
+
)}
|
|
171
|
+
</div>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
@@ -1,8 +1,48 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { Lock } from 'lucide-react';
|
|
4
|
+
import { useContext } from 'react';
|
|
5
|
+
import { CopyButton } from '../new-trace-viewer/components/copy-button';
|
|
6
|
+
import { Button } from '../ui/button';
|
|
7
|
+
import { DataInspector, DecryptClickContext } from '../ui/data-inspector';
|
|
8
|
+
import { Spinner } from '../ui/spinner';
|
|
9
|
+
|
|
10
|
+
const encryptedPlaceholderPreview = `{
|
|
11
|
+
"input": "[encrypted]",
|
|
12
|
+
"result": "[encrypted]"
|
|
13
|
+
}`;
|
|
14
|
+
|
|
15
|
+
export function EncryptedDataBlock() {
|
|
16
|
+
const ctx = useContext(DecryptClickContext);
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div className="relative min-h-20 overflow-hidden rounded-md border border-gray-alpha-400 bg-background-100">
|
|
20
|
+
<pre
|
|
21
|
+
aria-hidden="true"
|
|
22
|
+
className="pointer-events-none m-0 select-none p-3 font-mono text-label-12 text-gray-900 blur-[4px]"
|
|
23
|
+
>
|
|
24
|
+
{encryptedPlaceholderPreview}
|
|
25
|
+
</pre>
|
|
26
|
+
<div className="absolute inset-0 flex items-center justify-center">
|
|
27
|
+
{ctx ? (
|
|
28
|
+
<Button onClick={ctx.onDecrypt} disabled={ctx.isDecrypting} size="xs">
|
|
29
|
+
{ctx.isDecrypting ? (
|
|
30
|
+
<Spinner size={10} />
|
|
31
|
+
) : (
|
|
32
|
+
<Lock className="h-3 w-3" />
|
|
33
|
+
)}
|
|
34
|
+
<span>Decrypt</span>
|
|
35
|
+
</Button>
|
|
36
|
+
) : (
|
|
37
|
+
<span className="inline-flex items-center gap-1 rounded border border-gray-alpha-400 bg-gray-100 px-1.5 py-0.5 text-button-12 font-medium text-gray-700">
|
|
38
|
+
<Lock className="h-3 w-3" />
|
|
39
|
+
Encrypted
|
|
40
|
+
</span>
|
|
41
|
+
)}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
6
46
|
|
|
7
47
|
const serializeForClipboard = (value: unknown): string => {
|
|
8
48
|
if (typeof value === 'string') return value;
|
|
@@ -21,31 +61,13 @@ const serializeForClipboard = (value: unknown): string => {
|
|
|
21
61
|
};
|
|
22
62
|
|
|
23
63
|
export function CopyableDataBlock({ data }: { data: unknown }) {
|
|
24
|
-
const toast = useToast();
|
|
25
64
|
return (
|
|
26
|
-
<div
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
aria-label="Copy data"
|
|
33
|
-
title="Copy"
|
|
34
|
-
className="!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border !bg-[var(--ds-background-100)] !text-[var(--ds-gray-800)] transition-transform transition-colors duration-100 hover:!bg-[var(--ds-gray-alpha-200)] active:!scale-95 active:!bg-[var(--ds-gray-alpha-300)]"
|
|
35
|
-
style={{ borderColor: 'var(--ds-gray-300)' }}
|
|
36
|
-
onClick={() => {
|
|
37
|
-
navigator.clipboard
|
|
38
|
-
.writeText(serializeForClipboard(data))
|
|
39
|
-
.then(() => {
|
|
40
|
-
toast.success('Copied to clipboard');
|
|
41
|
-
})
|
|
42
|
-
.catch(() => {
|
|
43
|
-
toast.error('Failed to copy');
|
|
44
|
-
});
|
|
45
|
-
}}
|
|
46
|
-
>
|
|
47
|
-
<Copy size={12} />
|
|
48
|
-
</button>
|
|
65
|
+
<div className="relative overflow-x-auto rounded-md border border-gray-alpha-400 p-3">
|
|
66
|
+
<CopyButton
|
|
67
|
+
copyText={serializeForClipboard(data)}
|
|
68
|
+
ariaLabel="Copy data"
|
|
69
|
+
className="absolute right-2 top-2 z-10 flex h-6 w-6 items-center justify-center rounded-md border border-gray-alpha-400 !bg-background-100 p-0 text-gray-900 transition-transform transition-colors duration-100 hover:bg-gray-200 active:scale-95 active:bg-gray-300"
|
|
70
|
+
/>
|
|
49
71
|
<DataInspector data={data} />
|
|
50
72
|
</div>
|
|
51
73
|
);
|
|
@@ -1,83 +1,143 @@
|
|
|
1
|
-
import { ChevronRight } from 'lucide-react';
|
|
2
|
-
import type
|
|
1
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
2
|
+
import { type ReactNode, useState } from 'react';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
3
4
|
|
|
4
5
|
export function DetailCard({
|
|
5
6
|
summary,
|
|
6
7
|
children,
|
|
7
8
|
onToggle,
|
|
8
9
|
disabled = false,
|
|
10
|
+
defaultOpen = false,
|
|
11
|
+
variant = 'section',
|
|
12
|
+
trailing,
|
|
9
13
|
summaryClassName,
|
|
10
14
|
contentClassName,
|
|
11
15
|
}: {
|
|
12
16
|
summary: ReactNode;
|
|
13
17
|
children?: ReactNode;
|
|
14
|
-
/** Called when the detail card is expanded/collapsed */
|
|
15
18
|
onToggle?: (open: boolean) => void;
|
|
16
|
-
/** Renders a non-expandable summary card when true. */
|
|
17
19
|
disabled?: boolean;
|
|
18
|
-
|
|
20
|
+
defaultOpen?: boolean;
|
|
21
|
+
variant?: 'section' | 'card';
|
|
22
|
+
trailing?: ReactNode;
|
|
19
23
|
summaryClassName?: string;
|
|
20
|
-
/** Extra classes for expanded content wrapper. */
|
|
21
24
|
contentClassName?: string;
|
|
22
25
|
}) {
|
|
23
|
-
|
|
26
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
27
|
+
|
|
28
|
+
const handleToggle = (e: React.SyntheticEvent<HTMLDetailsElement>) => {
|
|
29
|
+
// React surfaces `toggle` as a bubbling synthetic event even though the
|
|
30
|
+
// native event doesn't bubble. Without this guard, a nested <details>
|
|
31
|
+
// (e.g. an event card inside the Events section) collapsing would flip
|
|
32
|
+
// the outer DetailCard's state. Only react to direct toggles.
|
|
33
|
+
if (e.target !== e.currentTarget) return;
|
|
34
|
+
const next = e.currentTarget.open;
|
|
35
|
+
setOpen(next);
|
|
36
|
+
onToggle?.(next);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
if (variant === 'card') {
|
|
40
|
+
if (disabled) {
|
|
41
|
+
return (
|
|
42
|
+
<div
|
|
43
|
+
className={cn(
|
|
44
|
+
'list-none px-3 py-4 bg-background-200 [&::-webkit-details-marker]:hidden',
|
|
45
|
+
summaryClassName
|
|
46
|
+
)}
|
|
47
|
+
style={{ cursor: 'not-allowed', opacity: 0.8 }}
|
|
48
|
+
>
|
|
49
|
+
{summary}
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
24
53
|
return (
|
|
25
|
-
<
|
|
26
|
-
className=
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
backgroundColor: 'var(--ds-gray-100)',
|
|
30
|
-
color: 'var(--ds-gray-700)',
|
|
31
|
-
cursor: 'not-allowed',
|
|
32
|
-
opacity: 0.8,
|
|
33
|
-
}}
|
|
54
|
+
<details
|
|
55
|
+
className="group/card last:border-b border-gray-alpha-400"
|
|
56
|
+
open={open}
|
|
57
|
+
onToggle={handleToggle}
|
|
34
58
|
>
|
|
35
|
-
|
|
36
|
-
|
|
59
|
+
<summary
|
|
60
|
+
className={cn(
|
|
61
|
+
'list-none cursor-pointer px-3 py-4 border-t border-gray-alpha-400 bg-background-200 hover:bg-gray-100 [&::-webkit-details-marker]:hidden',
|
|
62
|
+
summaryClassName
|
|
63
|
+
)}
|
|
64
|
+
>
|
|
65
|
+
<span className="flex items-center gap-1.5">
|
|
66
|
+
<ChevronRight
|
|
67
|
+
size={14}
|
|
68
|
+
className={cn(
|
|
69
|
+
'shrink-0 text-gray-700 group-hover/card:text-gray-1000',
|
|
70
|
+
open && 'rotate-90'
|
|
71
|
+
)}
|
|
72
|
+
/>
|
|
73
|
+
{summary}
|
|
74
|
+
</span>
|
|
75
|
+
</summary>
|
|
76
|
+
<div className={contentClassName}>{children}</div>
|
|
77
|
+
</details>
|
|
37
78
|
);
|
|
38
79
|
}
|
|
39
80
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
className="absolute left-3 -top-3 w-px h-3"
|
|
67
|
-
style={{ backgroundColor: 'var(--ds-gray-400)' }}
|
|
68
|
-
/>
|
|
69
|
-
{/* Curved corner */}
|
|
70
|
-
<div
|
|
71
|
-
className="absolute left-3 top-0 w-3 h-3 border-l border-b rounded-bl-lg"
|
|
72
|
-
style={{ borderColor: 'var(--ds-gray-400)' }}
|
|
73
|
-
/>
|
|
74
|
-
{/* Horizontal part to content */}
|
|
81
|
+
// Shared height with the expandable summary row. Keeps the trailing /
|
|
82
|
+
// disabled / chevron variants visually identical in height regardless of
|
|
83
|
+
// what's in the trailing slot.
|
|
84
|
+
const rowClasses =
|
|
85
|
+
'flex h-9 items-center gap-2 px-2 -mx-2 text-heading-14 font-medium my-2';
|
|
86
|
+
|
|
87
|
+
if (trailing) {
|
|
88
|
+
return (
|
|
89
|
+
<section className="-mx-4 border-t px-4 border-gray-alpha-400">
|
|
90
|
+
<div className={cn(rowClasses, summaryClassName)}>
|
|
91
|
+
<div className="isolate relative shrink-0 w-3.5 h-3.5 text-gray-700">
|
|
92
|
+
<ChevronRight
|
|
93
|
+
size={14}
|
|
94
|
+
className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
<span className="min-w-0 flex-1">{summary}</span>
|
|
98
|
+
<div className="shrink-0 pr-1">{trailing}</div>
|
|
99
|
+
</div>
|
|
100
|
+
</section>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (disabled) {
|
|
105
|
+
return (
|
|
106
|
+
<section className="-mx-4 border-t px-4 border-gray-alpha-400">
|
|
75
107
|
<div
|
|
76
|
-
className=
|
|
77
|
-
style={{
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
108
|
+
className={cn(rowClasses, summaryClassName)}
|
|
109
|
+
style={{ color: 'var(--ds-gray-700)', cursor: 'not-allowed' }}
|
|
110
|
+
>
|
|
111
|
+
<span className="min-w-0 flex-1">{summary}</span>
|
|
112
|
+
</div>
|
|
113
|
+
</section>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<section className="-mx-4 border-t px-4 border-gray-alpha-400">
|
|
119
|
+
<details className="group" open={open} onToggle={handleToggle}>
|
|
120
|
+
<summary
|
|
121
|
+
className={cn(
|
|
122
|
+
'group/trigger list-none cursor-pointer rounded hover:bg-gray-alpha-100 [&::-webkit-details-marker]:hidden',
|
|
123
|
+
rowClasses,
|
|
124
|
+
summaryClassName
|
|
125
|
+
)}
|
|
126
|
+
>
|
|
127
|
+
<div className="isolate relative shrink-0 text-gray-700 group-hover/trigger:text-gray-1000 w-3.5 h-3.5">
|
|
128
|
+
<ChevronRight
|
|
129
|
+
size={14}
|
|
130
|
+
className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-100 group-open:opacity-0"
|
|
131
|
+
/>
|
|
132
|
+
<ChevronDown
|
|
133
|
+
size={14}
|
|
134
|
+
className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-0 group-open:opacity-100"
|
|
135
|
+
/>
|
|
136
|
+
</div>
|
|
137
|
+
<span className="min-w-0 flex-1">{summary}</span>
|
|
138
|
+
</summary>
|
|
139
|
+
<div className={cn('mb-3', contentClassName)}>{children}</div>
|
|
140
|
+
</details>
|
|
141
|
+
</section>
|
|
82
142
|
);
|
|
83
143
|
}
|