@workflow/web-shared 4.0.1-beta.5

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 (148) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +76 -0
  3. package/dist/api/workflow-api-client.d.ts +303 -0
  4. package/dist/api/workflow-api-client.d.ts.map +1 -0
  5. package/dist/api/workflow-api-client.js +797 -0
  6. package/dist/api/workflow-api-client.js.map +1 -0
  7. package/dist/api/workflow-server-actions.d.ts +97 -0
  8. package/dist/api/workflow-server-actions.d.ts.map +1 -0
  9. package/dist/api/workflow-server-actions.js +329 -0
  10. package/dist/api/workflow-server-actions.js.map +1 -0
  11. package/dist/components/ui/alert.d.ts +9 -0
  12. package/dist/components/ui/alert.d.ts.map +1 -0
  13. package/dist/components/ui/alert.jsx +22 -0
  14. package/dist/components/ui/alert.jsx.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +5 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/utils.d.ts +11 -0
  20. package/dist/lib/utils.d.ts.map +1 -0
  21. package/dist/lib/utils.js +19 -0
  22. package/dist/lib/utils.js.map +1 -0
  23. package/dist/run-trace-view.d.ts +8 -0
  24. package/dist/run-trace-view.d.ts.map +1 -0
  25. package/dist/run-trace-view.jsx +25 -0
  26. package/dist/run-trace-view.jsx.map +1 -0
  27. package/dist/sidebar/attribute-panel.d.ts +11 -0
  28. package/dist/sidebar/attribute-panel.d.ts.map +1 -0
  29. package/dist/sidebar/attribute-panel.jsx +153 -0
  30. package/dist/sidebar/attribute-panel.jsx.map +1 -0
  31. package/dist/sidebar/detail-card.d.ts +6 -0
  32. package/dist/sidebar/detail-card.d.ts.map +1 -0
  33. package/dist/sidebar/detail-card.jsx +13 -0
  34. package/dist/sidebar/detail-card.jsx.map +1 -0
  35. package/dist/sidebar/events-list.d.ts +8 -0
  36. package/dist/sidebar/events-list.d.ts.map +1 -0
  37. package/dist/sidebar/events-list.jsx +67 -0
  38. package/dist/sidebar/events-list.jsx.map +1 -0
  39. package/dist/sidebar/workflow-detail-panel.d.ts +8 -0
  40. package/dist/sidebar/workflow-detail-panel.d.ts.map +1 -0
  41. package/dist/sidebar/workflow-detail-panel.jsx +59 -0
  42. package/dist/sidebar/workflow-detail-panel.jsx.map +1 -0
  43. package/dist/trace-viewer/components/map.d.ts +8 -0
  44. package/dist/trace-viewer/components/map.d.ts.map +1 -0
  45. package/dist/trace-viewer/components/map.jsx +164 -0
  46. package/dist/trace-viewer/components/map.jsx.map +1 -0
  47. package/dist/trace-viewer/components/markers.d.ts +22 -0
  48. package/dist/trace-viewer/components/markers.d.ts.map +1 -0
  49. package/dist/trace-viewer/components/markers.jsx +400 -0
  50. package/dist/trace-viewer/components/markers.jsx.map +1 -0
  51. package/dist/trace-viewer/components/node.d.ts +31 -0
  52. package/dist/trace-viewer/components/node.d.ts.map +1 -0
  53. package/dist/trace-viewer/components/node.jsx +116 -0
  54. package/dist/trace-viewer/components/node.jsx.map +1 -0
  55. package/dist/trace-viewer/components/search-input.d.ts +9 -0
  56. package/dist/trace-viewer/components/search-input.d.ts.map +1 -0
  57. package/dist/trace-viewer/components/search-input.jsx +16 -0
  58. package/dist/trace-viewer/components/search-input.jsx.map +1 -0
  59. package/dist/trace-viewer/components/search.d.ts +3 -0
  60. package/dist/trace-viewer/components/search.d.ts.map +1 -0
  61. package/dist/trace-viewer/components/search.jsx +27 -0
  62. package/dist/trace-viewer/components/search.jsx.map +1 -0
  63. package/dist/trace-viewer/components/span-detail-panel.d.ts +10 -0
  64. package/dist/trace-viewer/components/span-detail-panel.d.ts.map +1 -0
  65. package/dist/trace-viewer/components/span-detail-panel.jsx +388 -0
  66. package/dist/trace-viewer/components/span-detail-panel.jsx.map +1 -0
  67. package/dist/trace-viewer/components/ui.d.ts +28 -0
  68. package/dist/trace-viewer/components/ui.d.ts.map +1 -0
  69. package/dist/trace-viewer/components/ui.jsx +54 -0
  70. package/dist/trace-viewer/components/ui.jsx.map +1 -0
  71. package/dist/trace-viewer/components/zoom-button.d.ts +3 -0
  72. package/dist/trace-viewer/components/zoom-button.d.ts.map +1 -0
  73. package/dist/trace-viewer/components/zoom-button.jsx +40 -0
  74. package/dist/trace-viewer/components/zoom-button.jsx.map +1 -0
  75. package/dist/trace-viewer/components/zoom-icons.d.ts +11 -0
  76. package/dist/trace-viewer/components/zoom-icons.d.ts.map +1 -0
  77. package/dist/trace-viewer/components/zoom-icons.jsx +23 -0
  78. package/dist/trace-viewer/components/zoom-icons.jsx.map +1 -0
  79. package/dist/trace-viewer/context.d.ts +183 -0
  80. package/dist/trace-viewer/context.d.ts.map +1 -0
  81. package/dist/trace-viewer/context.jsx +326 -0
  82. package/dist/trace-viewer/context.jsx.map +1 -0
  83. package/dist/trace-viewer/index.d.ts +5 -0
  84. package/dist/trace-viewer/index.d.ts.map +1 -0
  85. package/dist/trace-viewer/index.jsx +4 -0
  86. package/dist/trace-viewer/index.jsx.map +1 -0
  87. package/dist/trace-viewer/trace-viewer.d.ts +22 -0
  88. package/dist/trace-viewer/trace-viewer.d.ts.map +1 -0
  89. package/dist/trace-viewer/trace-viewer.jsx +311 -0
  90. package/dist/trace-viewer/trace-viewer.jsx.map +1 -0
  91. package/dist/trace-viewer/trace-viewer.module.css +1275 -0
  92. package/dist/trace-viewer/types.d.ts +201 -0
  93. package/dist/trace-viewer/types.d.ts.map +1 -0
  94. package/dist/trace-viewer/types.js +2 -0
  95. package/dist/trace-viewer/types.js.map +1 -0
  96. package/dist/trace-viewer/util/constants.d.ts +9 -0
  97. package/dist/trace-viewer/util/constants.d.ts.map +1 -0
  98. package/dist/trace-viewer/util/constants.js +9 -0
  99. package/dist/trace-viewer/util/constants.js.map +1 -0
  100. package/dist/trace-viewer/util/scrollbar-width.d.ts +2 -0
  101. package/dist/trace-viewer/util/scrollbar-width.d.ts.map +1 -0
  102. package/dist/trace-viewer/util/scrollbar-width.js +14 -0
  103. package/dist/trace-viewer/util/scrollbar-width.js.map +1 -0
  104. package/dist/trace-viewer/util/timing.d.ts +8 -0
  105. package/dist/trace-viewer/util/timing.d.ts.map +1 -0
  106. package/dist/trace-viewer/util/timing.js +29 -0
  107. package/dist/trace-viewer/util/timing.js.map +1 -0
  108. package/dist/trace-viewer/util/tree.d.ts +13 -0
  109. package/dist/trace-viewer/util/tree.d.ts.map +1 -0
  110. package/dist/trace-viewer/util/tree.js +223 -0
  111. package/dist/trace-viewer/util/tree.js.map +1 -0
  112. package/dist/trace-viewer/util/use-immediate-style.d.ts +15 -0
  113. package/dist/trace-viewer/util/use-immediate-style.d.ts.map +1 -0
  114. package/dist/trace-viewer/util/use-immediate-style.js +22 -0
  115. package/dist/trace-viewer/util/use-immediate-style.js.map +1 -0
  116. package/dist/trace-viewer/util/use-streaming-spans.d.ts +8 -0
  117. package/dist/trace-viewer/util/use-streaming-spans.d.ts.map +1 -0
  118. package/dist/trace-viewer/util/use-streaming-spans.js +332 -0
  119. package/dist/trace-viewer/util/use-streaming-spans.js.map +1 -0
  120. package/dist/trace-viewer/util/use-trackpad-zoom.d.ts +6 -0
  121. package/dist/trace-viewer/util/use-trackpad-zoom.d.ts.map +1 -0
  122. package/dist/trace-viewer/util/use-trackpad-zoom.jsx +38 -0
  123. package/dist/trace-viewer/util/use-trackpad-zoom.jsx.map +1 -0
  124. package/dist/trace-viewer/worker.d.ts +2 -0
  125. package/dist/trace-viewer/worker.d.ts.map +1 -0
  126. package/dist/trace-viewer/worker.js +107 -0
  127. package/dist/trace-viewer/worker.js.map +1 -0
  128. package/dist/workflow-trace-view.d.ts +12 -0
  129. package/dist/workflow-trace-view.d.ts.map +1 -0
  130. package/dist/workflow-trace-view.jsx +129 -0
  131. package/dist/workflow-trace-view.jsx.map +1 -0
  132. package/dist/workflow-traces/event-colors.d.ts +31 -0
  133. package/dist/workflow-traces/event-colors.d.ts.map +1 -0
  134. package/dist/workflow-traces/event-colors.js +68 -0
  135. package/dist/workflow-traces/event-colors.js.map +1 -0
  136. package/dist/workflow-traces/trace-colors.d.ts +15 -0
  137. package/dist/workflow-traces/trace-colors.d.ts.map +1 -0
  138. package/dist/workflow-traces/trace-colors.js +89 -0
  139. package/dist/workflow-traces/trace-colors.js.map +1 -0
  140. package/dist/workflow-traces/trace-span-construction.d.ts +31 -0
  141. package/dist/workflow-traces/trace-span-construction.d.ts.map +1 -0
  142. package/dist/workflow-traces/trace-span-construction.js +173 -0
  143. package/dist/workflow-traces/trace-span-construction.js.map +1 -0
  144. package/dist/workflow-traces/trace-time-utils.d.ts +13 -0
  145. package/dist/workflow-traces/trace-time-utils.d.ts.map +1 -0
  146. package/dist/workflow-traces/trace-time-utils.js +34 -0
  147. package/dist/workflow-traces/trace-time-utils.js.map +1 -0
  148. package/package.json +59 -0
@@ -0,0 +1,129 @@
1
+ import { Loader2 } from 'lucide-react';
2
+ import { useEffect, useMemo, useState } from 'react';
3
+ import { toast } from 'sonner';
4
+ import { WorkflowDetailPanel } from './sidebar/workflow-detail-panel';
5
+ import { TraceViewerContextProvider, TraceViewerTimeline, } from './trace-viewer';
6
+ import { getCustomSpanClassName, getCustomSpanEventClassName, } from './workflow-traces/trace-colors';
7
+ import { hookToSpan, runToSpan, stepToSpan, WORKFLOW_LIBRARY, waitToSpan, } from './workflow-traces/trace-span-construction';
8
+ import { otelTimeToMs } from './workflow-traces/trace-time-utils';
9
+ const RE_RENDER_INTERVAL_MS = 2000;
10
+ export const WorkflowTraceViewer = ({ run, steps, hooks, events, env, isLoading, error, }) => {
11
+ const [now, setNow] = useState(() => new Date());
12
+ useEffect(() => {
13
+ if (!run?.completedAt) {
14
+ const interval = setInterval(() => {
15
+ setNow(new Date());
16
+ }, RE_RENDER_INTERVAL_MS);
17
+ return () => clearInterval(interval);
18
+ }
19
+ return undefined;
20
+ }, [run?.completedAt]);
21
+ const trace = useMemo(() => {
22
+ if (!run) {
23
+ return undefined;
24
+ }
25
+ // Group events by their correlation ID to associate with steps/hooks
26
+ const eventsByStepId = new Map();
27
+ const eventsByHookId = new Map();
28
+ const runLevelEvents = [];
29
+ const timerEvents = new Map();
30
+ for (const event of events) {
31
+ if (event.eventType === 'wait_created' ||
32
+ event.eventType === 'wait_completed') {
33
+ const existing = timerEvents.get(event.correlationId) || [];
34
+ existing.push(event);
35
+ timerEvents.set(event.correlationId, existing);
36
+ continue;
37
+ }
38
+ // Try to associate event with a step or hook via correlationId
39
+ // For now, all other events are collected at run level
40
+ const correlationId = event.correlationId;
41
+ if (correlationId) {
42
+ // Check if correlation ID matches a step or hook
43
+ const matchingStep = steps.find((s) => s.stepId === correlationId);
44
+ const matchingHook = hooks.find((h) => h.hookId === correlationId);
45
+ if (matchingStep) {
46
+ const existing = eventsByStepId.get(correlationId) || [];
47
+ existing.push(event);
48
+ eventsByStepId.set(correlationId, existing);
49
+ }
50
+ else if (matchingHook) {
51
+ const existing = eventsByHookId.get(correlationId) || [];
52
+ existing.push(event);
53
+ eventsByHookId.set(correlationId, existing);
54
+ }
55
+ else {
56
+ runLevelEvents.push(event);
57
+ }
58
+ }
59
+ else {
60
+ runLevelEvents.push(event);
61
+ }
62
+ }
63
+ // Chain steps together so each one appears on its own row
64
+ // First step is child of root, each subsequent step is child of previous
65
+ const stepSpans = steps.map((step) => {
66
+ const stepEvents = eventsByStepId.get(step.stepId) || [];
67
+ return stepToSpan(step, stepEvents, now);
68
+ });
69
+ const hookSpans = hooks.map((hook) => {
70
+ const hookEvents = eventsByHookId.get(hook.hookId) || [];
71
+ return hookToSpan(hook, hookEvents);
72
+ });
73
+ const waitSpans = Array.from(timerEvents.entries()).map(([correlationId, events]) => {
74
+ return waitToSpan(correlationId, events, now);
75
+ });
76
+ const runSpan = runToSpan(run, runLevelEvents, now);
77
+ const spans = [...stepSpans, ...hookSpans, ...waitSpans];
78
+ const sortedSpans = [
79
+ runSpan,
80
+ ...spans.slice().sort((a, b) => {
81
+ const aStart = otelTimeToMs(a.startTime);
82
+ const bStart = otelTimeToMs(b.startTime);
83
+ return aStart - bStart;
84
+ }),
85
+ ];
86
+ const sortedCascadingSpans = sortedSpans.map((span, index) => {
87
+ const parentSpanId = index === 0 ? undefined : String(sortedSpans[index - 1].spanId);
88
+ return {
89
+ ...span,
90
+ parentSpanId,
91
+ };
92
+ });
93
+ return {
94
+ traceId: run.runId,
95
+ rootSpanId: run.runId,
96
+ spans: sortedCascadingSpans,
97
+ resources: [
98
+ {
99
+ name: 'workflow',
100
+ attributes: {
101
+ 'service.name': WORKFLOW_LIBRARY.name,
102
+ },
103
+ },
104
+ ],
105
+ };
106
+ }, [run, steps, hooks, events, now]);
107
+ useEffect(() => {
108
+ if (error && !isLoading) {
109
+ console.error(error);
110
+ toast.error('Error loading workflow trace data', {
111
+ description: error.message,
112
+ });
113
+ }
114
+ }, [error, isLoading]);
115
+ return (<div className="relative">
116
+ {isLoading && (<div className="absolute inset-0 z-50 flex items-center justify-center bg-background/80 backdrop-blur-sm">
117
+ <div className="flex flex-col items-center gap-3">
118
+ <Loader2 className="h-8 w-8 animate-spin text-muted-foreground"/>
119
+ <p className="text-sm text-muted-foreground">
120
+ Loading trace data...
121
+ </p>
122
+ </div>
123
+ </div>)}
124
+ <TraceViewerContextProvider withPanel customSpanClassNameFunc={getCustomSpanClassName} customSpanEventClassNameFunc={getCustomSpanEventClassName} customPanelComponent={<WorkflowDetailPanel env={env}/>}>
125
+ <TraceViewerTimeline height={800} trace={trace} withPanel/>
126
+ </TraceViewerContextProvider>
127
+ </div>);
128
+ };
129
+ //# sourceMappingURL=workflow-trace-view.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-trace-view.jsx","sourceRoot":"","sources":["../src/workflow-trace-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Color utilities for workflow event markers
3
+ */
4
+ import type { Event } from '@workflow/world';
5
+ export interface EventColorPalette {
6
+ /** Color of the diamond/marker itself */
7
+ color: string;
8
+ /** Background color for hover info popup */
9
+ background: string;
10
+ /** Border color for hover info popup */
11
+ border: string;
12
+ /** Text color for event name in hover popup */
13
+ text: string;
14
+ /** Secondary text color for timestamp in hover popup */
15
+ secondary: string;
16
+ }
17
+ /**
18
+ * Get the color palette for an event based on its type
19
+ * - Red for failures (step_failed, workflow_failed)
20
+ * - Orange/yellow for retries (step_retrying)
21
+ * - Purple for webhook-related events
22
+ * - Blue otherwise (default)
23
+ */
24
+ export declare function getEventColor(eventType: Event['eventType']): EventColorPalette;
25
+ /**
26
+ * Determine whether to show a vertical line for an event
27
+ * - Show vertical lines for hook-related events
28
+ * - Hide vertical lines for all other workflow events by default
29
+ */
30
+ export declare function shouldShowVerticalLine(eventType: Event['eventType']): boolean;
31
+ //# sourceMappingURL=event-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-colors.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/event-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,GAC5B,iBAAiB,CA8CnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,OAAO,CAY7E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Color utilities for workflow event markers
3
+ */
4
+ /**
5
+ * Get the color palette for an event based on its type
6
+ * - Red for failures (step_failed, workflow_failed)
7
+ * - Orange/yellow for retries (step_retrying)
8
+ * - Purple for webhook-related events
9
+ * - Blue otherwise (default)
10
+ */
11
+ export function getEventColor(eventType) {
12
+ // Failures - Red
13
+ if (eventType === 'step_failed' || eventType === 'workflow_failed') {
14
+ return {
15
+ color: 'var(--ds-red-600)',
16
+ background: 'var(--ds-red-100)',
17
+ border: 'var(--ds-red-500)',
18
+ text: 'var(--ds-red-900)',
19
+ secondary: 'var(--ds-red-700)',
20
+ };
21
+ }
22
+ // Retries - Orange/Yellow
23
+ if (eventType === 'step_retrying') {
24
+ return {
25
+ color: 'var(--ds-amber-600)',
26
+ background: 'var(--ds-amber-100)',
27
+ border: 'var(--ds-amber-500)',
28
+ text: 'var(--ds-amber-900)',
29
+ secondary: 'var(--ds-amber-700)',
30
+ };
31
+ }
32
+ // Webhook-related - Purple
33
+ if (eventType === 'hook_created' ||
34
+ eventType === 'hook_received' ||
35
+ eventType === 'hook_disposed') {
36
+ return {
37
+ color: 'var(--ds-purple-600)',
38
+ background: 'var(--ds-purple-100)',
39
+ border: 'var(--ds-purple-500)',
40
+ text: 'var(--ds-purple-900)',
41
+ secondary: 'var(--ds-purple-700)',
42
+ };
43
+ }
44
+ // Default - Blue
45
+ return {
46
+ color: 'var(--ds-blue-600)',
47
+ background: 'var(--ds-blue-100)',
48
+ border: 'var(--ds-blue-500)',
49
+ text: 'var(--ds-blue-900)',
50
+ secondary: 'var(--ds-blue-700)',
51
+ };
52
+ }
53
+ /**
54
+ * Determine whether to show a vertical line for an event
55
+ * - Show vertical lines for hook-related events
56
+ * - Hide vertical lines for all other workflow events by default
57
+ */
58
+ export function shouldShowVerticalLine(eventType) {
59
+ // Show vertical lines for hook-related events
60
+ if (eventType === 'hook_created' ||
61
+ eventType === 'hook_received' ||
62
+ eventType === 'hook_disposed') {
63
+ return true;
64
+ }
65
+ // Hide vertical lines for all other workflow events
66
+ return false;
67
+ }
68
+ //# sourceMappingURL=event-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-colors.js","sourceRoot":"","sources":["../../src/workflow-traces/event-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,SAA6B;IAE7B,iBAAiB;IACjB,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;QACnE,OAAO;YACL,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,mBAAmB;YAC/B,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,mBAAmB;SAC/B,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,qBAAqB;YAC5B,UAAU,EAAE,qBAAqB;YACjC,MAAM,EAAE,qBAAqB;YAC7B,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,qBAAqB;SACjC,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO;YACL,KAAK,EAAE,sBAAsB;YAC7B,UAAU,EAAE,sBAAsB;YAClC,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,sBAAsB;YAC5B,SAAS,EAAE,sBAAsB;SAClC,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,OAAO;QACL,KAAK,EAAE,oBAAoB;QAC3B,UAAU,EAAE,oBAAoB;QAChC,MAAM,EAAE,oBAAoB;QAC5B,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,oBAAoB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IAClE,8CAA8C;IAC9C,IACE,SAAS,KAAK,cAAc;QAC5B,SAAS,KAAK,eAAe;QAC7B,SAAS,KAAK,eAAe,EAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Color utilities for workflow traces
3
+ */
4
+ import type { SpanNode, SpanNodeEvent } from '../trace-viewer/types';
5
+ /**
6
+ * Get custom CSS class name for a span based on its attributes
7
+ * This is called dynamically by the trace viewer to style spans
8
+ */
9
+ export declare const getCustomSpanClassName: (span: SpanNode) => string;
10
+ /**
11
+ * Get custom CSS class name for a span event based on its type
12
+ * This is called dynamically by the trace viewer to style event markers
13
+ */
14
+ export declare const getCustomSpanEventClassName: (spanEvent: SpanNodeEvent) => string;
15
+ //# sourceMappingURL=trace-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-colors.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsCrE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,QAAQ,KAAG,MAiCvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GACtC,WAAW,aAAa,KACvB,MAwBF,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Color utilities for workflow traces
3
+ */
4
+ import styles from '../trace-viewer/trace-viewer.module.css';
5
+ /**
6
+ * Get the CSS class name for a workflow entity based on its status
7
+ */
8
+ function getStatusClassName(status, isStripped = false) {
9
+ if (isStripped && status === 'pending') {
10
+ return styles.spanPendingStriped;
11
+ }
12
+ switch (status) {
13
+ case 'running':
14
+ return styles.spanRunning;
15
+ case 'pending':
16
+ return styles.spanPending;
17
+ case 'completed':
18
+ return styles.spanCompleted;
19
+ case 'cancelled':
20
+ return styles.spanCancelled;
21
+ case 'paused':
22
+ return styles.spanPaused;
23
+ case 'failed':
24
+ return styles.spanFailed;
25
+ default:
26
+ return '';
27
+ }
28
+ }
29
+ /**
30
+ * Check if a step name indicates it's a sleep step
31
+ */
32
+ function isSleepStep(stepName) {
33
+ return String(stepName).toLowerCase().endsWith('sleep');
34
+ }
35
+ /**
36
+ * Get custom CSS class name for a span based on its attributes
37
+ * This is called dynamically by the trace viewer to style spans
38
+ */
39
+ export const getCustomSpanClassName = (span) => {
40
+ const attributes = span.span.attributes;
41
+ const resource = attributes?.resource;
42
+ if (resource === 'step') {
43
+ const stepData = attributes.data;
44
+ const stepName = stepData?.stepName;
45
+ // DEPRECATED: Check if it's a sleep step
46
+ if (stepName && isSleepStep(stepName)) {
47
+ return styles.spanSleep;
48
+ }
49
+ // Regular step - use status colors
50
+ const isStripped = stepData?.status === 'pending';
51
+ return getStatusClassName(stepData?.status, isStripped);
52
+ }
53
+ if (resource === 'run') {
54
+ const runData = attributes.data;
55
+ return getStatusClassName(runData?.status, false);
56
+ }
57
+ if (resource === 'hook') {
58
+ return styles.spanHook;
59
+ }
60
+ if (resource === 'sleep') {
61
+ return styles.spanSleep;
62
+ }
63
+ // Default: no custom class
64
+ return '';
65
+ };
66
+ /**
67
+ * Get custom CSS class name for a span event based on its type
68
+ * This is called dynamically by the trace viewer to style event markers
69
+ */
70
+ export const getCustomSpanEventClassName = (spanEvent) => {
71
+ const eventName = spanEvent.event.name;
72
+ // Failure events - Red
73
+ if (eventName === 'step_failed' || eventName === 'workflow_failed') {
74
+ return styles.eventFailed;
75
+ }
76
+ // Retry events - Orange/Yellow
77
+ if (eventName === 'step_retrying') {
78
+ return styles.eventRetrying;
79
+ }
80
+ // Webhook-related events - Purple
81
+ if (eventName === 'hook_created' ||
82
+ eventName === 'hook_received' ||
83
+ eventName === 'hook_disposed') {
84
+ return styles.eventHook;
85
+ }
86
+ // Default - Blue
87
+ return styles.eventDefault;
88
+ };
89
+ //# sourceMappingURL=trace-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-colors.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Functions for constructing OpenTelemetry spans from workflow entities
3
+ */
4
+ import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
5
+ import type { Span, SpanEvent } from '../trace-viewer/types';
6
+ export declare const WORKFLOW_LIBRARY: {
7
+ name: string;
8
+ version: string;
9
+ };
10
+ /**
11
+ * Convert workflow events to span events
12
+ * Only includes events that should be displayed as markers
13
+ */
14
+ export declare function convertEventsToSpanEvents(events: Event[], filterTypes?: boolean): SpanEvent[];
15
+ /**
16
+ * Converts a workflow Wait to an OpenTelemetry Span
17
+ */
18
+ export declare function waitToSpan(correlationId: string, events: Event[], nowTime?: Date): Span;
19
+ /**
20
+ * Converts a workflow Step to an OpenTelemetry Span
21
+ */
22
+ export declare function stepToSpan(step: Step, stepEvents: Event[], nowTime?: Date): Span;
23
+ /**
24
+ * Converts a workflow Hook to an OpenTelemetry Span
25
+ */
26
+ export declare function hookToSpan(hook: Hook, hookEvents: Event[]): Span;
27
+ /**
28
+ * Creates a root span for the workflow run
29
+ */
30
+ export declare function runToSpan(run: WorkflowRun, runEvents: Event[], nowTime?: Date): Span;
31
+ //# sourceMappingURL=trace-span-construction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,GACjB,SAAS,EAAE,CAgBb;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CA6BN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,KAAK,EAAE,EACnB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAiCN;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAsChE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CA8BN"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Functions for constructing OpenTelemetry spans from workflow entities
3
+ */
4
+ import { parseStepName, parseWorkflowName } from '@workflow/core/parse-name';
5
+ import { shouldShowVerticalLine } from './event-colors';
6
+ import { calculateDuration, dateToOtelTime } from './trace-time-utils';
7
+ export const WORKFLOW_LIBRARY = {
8
+ name: 'workflow-development-kit',
9
+ version: '4.0.0',
10
+ };
11
+ /**
12
+ * Event types that should be displayed as visual markers in the trace viewer
13
+ */
14
+ const MARKER_EVENT_TYPES = new Set([
15
+ 'hook_created',
16
+ 'hook_received',
17
+ 'hook_disposed',
18
+ 'step_retrying',
19
+ 'step_failed',
20
+ 'workflow_failed',
21
+ 'wait_created',
22
+ 'wait_completed',
23
+ ]);
24
+ /**
25
+ * Convert workflow events to span events
26
+ * Only includes events that should be displayed as markers
27
+ */
28
+ export function convertEventsToSpanEvents(events, filterTypes = true) {
29
+ return events
30
+ .filter((event) => filterTypes ? MARKER_EVENT_TYPES.has(event.eventType) : true)
31
+ .map((event) => ({
32
+ name: event.eventType,
33
+ timestamp: dateToOtelTime(event.createdAt),
34
+ attributes: {
35
+ eventId: event.eventId,
36
+ correlationId: event.correlationId,
37
+ eventData: 'eventData' in event ? event.eventData : undefined,
38
+ },
39
+ // Control whether to show vertical line in timeline
40
+ showVerticalLine: shouldShowVerticalLine(event.eventType),
41
+ }));
42
+ }
43
+ /**
44
+ * Converts a workflow Wait to an OpenTelemetry Span
45
+ */
46
+ export function waitToSpan(correlationId, events, nowTime) {
47
+ const startEvent = events.find((event) => event.eventType === 'wait_created');
48
+ const endEvent = events.find((event) => event.eventType === 'wait_completed');
49
+ const startTime = startEvent?.createdAt ?? nowTime;
50
+ const endTime = endEvent?.createdAt ?? nowTime;
51
+ const start = dateToOtelTime(startTime);
52
+ const end = dateToOtelTime(endTime);
53
+ const duration = calculateDuration(startTime, endTime);
54
+ const spanEvents = convertEventsToSpanEvents(events);
55
+ return {
56
+ spanId: correlationId,
57
+ name: 'sleep',
58
+ kind: 1, // INTERNAL span kind
59
+ resource: 'sleep',
60
+ library: WORKFLOW_LIBRARY,
61
+ status: { code: 0 },
62
+ traceFlags: 1,
63
+ attributes: {
64
+ resource: 'sleep',
65
+ data: {
66
+ correlationId,
67
+ },
68
+ },
69
+ links: [],
70
+ events: spanEvents,
71
+ duration,
72
+ startTime: start,
73
+ endTime: end,
74
+ };
75
+ }
76
+ /**
77
+ * Converts a workflow Step to an OpenTelemetry Span
78
+ */
79
+ export function stepToSpan(step, stepEvents, nowTime) {
80
+ const now = nowTime ?? new Date();
81
+ const parsedName = parseStepName(String(step.stepName));
82
+ // Simplified attributes: only store resource type and full data
83
+ const attributes = {
84
+ resource: 'step',
85
+ data: step,
86
+ };
87
+ const resource = 'step';
88
+ const endTime = step.completedAt ?? now;
89
+ // Convert step-related events to span events (for markers like hook_created, step_retrying, etc.)
90
+ // This determines which events are displayed as markers. In the detail view,
91
+ // we'll show all events that correlate with the selected resource.
92
+ const events = convertEventsToSpanEvents(stepEvents);
93
+ return {
94
+ spanId: String(step.stepId),
95
+ name: parsedName?.shortName ?? '',
96
+ kind: 1, // INTERNAL span kind
97
+ resource,
98
+ library: WORKFLOW_LIBRARY,
99
+ status: { code: 0 },
100
+ traceFlags: 1,
101
+ attributes,
102
+ links: [],
103
+ events,
104
+ startTime: dateToOtelTime(step.startedAt),
105
+ endTime: dateToOtelTime(endTime),
106
+ duration: calculateDuration(step.startedAt, endTime),
107
+ };
108
+ }
109
+ /**
110
+ * Converts a workflow Hook to an OpenTelemetry Span
111
+ */
112
+ export function hookToSpan(hook, hookEvents) {
113
+ // Simplified attributes: only store resource type and full data
114
+ const attributes = {
115
+ resource: 'hook',
116
+ data: hook,
117
+ };
118
+ // TODO: Determine proper end time for hooks
119
+ // If there are hook_received events, use the createdAt of the last hook_received event.
120
+ // Otherwise, set the end time to 1 second after the hook was created.
121
+ const lastHookReceivedEvent = hookEvents.find((event) => event.eventType === 'hook_received');
122
+ const endTime = lastHookReceivedEvent
123
+ ? dateToOtelTime(lastHookReceivedEvent.createdAt)
124
+ : dateToOtelTime(new Date(Math.max(hook.createdAt.getTime() + 10_000, Date.now())));
125
+ // Convert hook-related events to span events
126
+ const events = convertEventsToSpanEvents(hookEvents);
127
+ return {
128
+ spanId: String(hook.hookId),
129
+ name: String(hook.hookId),
130
+ kind: 1, // INTERNAL span kind
131
+ resource: 'hook',
132
+ library: WORKFLOW_LIBRARY,
133
+ status: { code: 1 },
134
+ traceFlags: 1,
135
+ attributes,
136
+ links: [],
137
+ events,
138
+ startTime: dateToOtelTime(hook.createdAt),
139
+ endTime: dateToOtelTime(endTime),
140
+ duration: calculateDuration(hook.createdAt, endTime),
141
+ };
142
+ }
143
+ /**
144
+ * Creates a root span for the workflow run
145
+ */
146
+ export function runToSpan(run, runEvents, nowTime) {
147
+ const now = nowTime ?? new Date();
148
+ // Simplified attributes: only store resource type and full data
149
+ const attributes = {
150
+ resource: 'run',
151
+ data: run,
152
+ };
153
+ const startDate = run.startedAt ?? run.createdAt;
154
+ const endTime = run.completedAt ?? now;
155
+ // Convert run-level events to span events
156
+ const events = convertEventsToSpanEvents(runEvents);
157
+ return {
158
+ spanId: String(run.runId),
159
+ name: String(parseWorkflowName(run.workflowName)?.shortName ?? '?'),
160
+ kind: 1, // INTERNAL span kind
161
+ resource: 'run',
162
+ library: WORKFLOW_LIBRARY,
163
+ status: { code: 0 },
164
+ traceFlags: 1,
165
+ attributes,
166
+ links: [],
167
+ events,
168
+ startTime: dateToOtelTime(startDate),
169
+ endTime: dateToOtelTime(endTime),
170
+ duration: calculateDuration(startDate, endTime),
171
+ };
172
+ }
173
+ //# sourceMappingURL=trace-span-construction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-span-construction.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Time conversion utilities for workflow trace construction
3
+ */
4
+ /**
5
+ * Converts a Date to OpenTelemetry time format [seconds, nanoseconds]
6
+ */
7
+ export declare function dateToOtelTime(date: Date | unknown): [number, number];
8
+ export declare function otelTimeToMs(time: [number, number]): number;
9
+ /**
10
+ * Calculates duration in [seconds, nanoseconds] format
11
+ */
12
+ export declare function calculateDuration(start: Date | unknown, end: Date | unknown): [number, number];
13
+ //# sourceMappingURL=trace-time-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-time-utils.d.ts","sourceRoot":"","sources":["../../src/workflow-traces/trace-time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQrE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,GAAG,OAAO,EACrB,GAAG,EAAE,IAAI,GAAG,OAAO,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CASlB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Time conversion utilities for workflow trace construction
3
+ */
4
+ /**
5
+ * Converts a Date to OpenTelemetry time format [seconds, nanoseconds]
6
+ */
7
+ export function dateToOtelTime(date) {
8
+ if (!date || !(date instanceof Date)) {
9
+ return [0, 0];
10
+ }
11
+ const ms = date.getTime();
12
+ const seconds = Math.floor(ms / 1000);
13
+ const nanoseconds = (ms % 1000) * 1_000_000;
14
+ return [seconds, nanoseconds];
15
+ }
16
+ export function otelTimeToMs(time) {
17
+ const secondsToMs = time[0] * 1_000;
18
+ const nanosecondsToMs = time[1] / 1_000_000;
19
+ return secondsToMs + nanosecondsToMs;
20
+ }
21
+ /**
22
+ * Calculates duration in [seconds, nanoseconds] format
23
+ */
24
+ export function calculateDuration(start, end) {
25
+ if (!start || !(start instanceof Date)) {
26
+ return [0, 0];
27
+ }
28
+ const endTime = end && end instanceof Date ? end : new Date();
29
+ const durationMs = endTime.getTime() - start.getTime();
30
+ const seconds = Math.floor(durationMs / 1000);
31
+ const nanoseconds = (durationMs % 1000) * 1_000_000;
32
+ return [seconds, nanoseconds];
33
+ }
34
+ //# sourceMappingURL=trace-time-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-time-utils.js","sourceRoot":"","sources":["../../src/workflow-traces/trace-time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5C,OAAO,WAAW,GAAG,eAAe,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAqB,EACrB,GAAmB;IAEnB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC"}