@oneuptime/common 11.4.0 → 11.4.1

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 (178) hide show
  1. package/Server/API/AIAgentTaskAPI.ts +10 -24
  2. package/Server/API/TelemetryAPI.ts +4 -3
  3. package/Server/Services/AIAgentTaskService.ts +62 -0
  4. package/Server/Services/AnalyticsDatabaseService.ts +27 -0
  5. package/Server/Services/LogAggregationService.ts +29 -11
  6. package/Server/Services/MetricService.ts +603 -13
  7. package/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.ts +1 -1
  8. package/Server/Utils/AI/Sentinel/README.md +10 -0
  9. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +44 -0
  10. package/Server/Utils/Monitor/MonitorMetricUtil.ts +108 -2
  11. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +146 -0
  12. package/Tests/Server/Services/LogAggregationService.test.ts +22 -0
  13. package/Tests/Server/Services/MetricServiceAggregate.test.ts +194 -0
  14. package/Tests/Types/AI/AIAgentTaskStatus.test.ts +86 -0
  15. package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +127 -0
  16. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.test.ts +152 -0
  17. package/Tests/Types/Trace/TraceRecordingRuleDefinition.test.ts +308 -0
  18. package/Tests/UI/Components/Dropdown.test.tsx +17 -0
  19. package/Tests/UI/Components/EntityDropdown.test.tsx +130 -0
  20. package/Tests/UI/Components/Modal.test.tsx +144 -2
  21. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +90 -0
  22. package/Tests/UI/Utils/Theme.test.ts +161 -0
  23. package/Types/BaseDatabase/AggregateBy.ts +12 -0
  24. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  25. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  26. package/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.ts +19 -0
  27. package/Types/Dashboard/DashboardTemplates.ts +9 -1
  28. package/Types/Monitor/CriteriaFilter.ts +4 -0
  29. package/Types/Monitor/HttpPhaseTimings.ts +16 -0
  30. package/Types/Monitor/MonitorMetricType.ts +17 -0
  31. package/Types/Monitor/PingMonitor/PingMonitorResponse.ts +20 -0
  32. package/Types/Probe/ProbeMonitorResponse.ts +14 -0
  33. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +8 -5
  34. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +4 -1
  35. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +6 -3
  36. package/UI/Components/CodeBlock/CodeBlock.tsx +2 -1
  37. package/UI/Components/CodeEditor/CodeEditor.tsx +3 -0
  38. package/UI/Components/Divider/Divider.tsx +1 -1
  39. package/UI/Components/Dropdown/Dropdown.tsx +13 -4
  40. package/UI/Components/EntityDropdown/EntityDropdown.tsx +110 -2
  41. package/UI/Components/ErrorBoundary.tsx +2 -1
  42. package/UI/Components/EventItem/EventItem.tsx +2 -2
  43. package/UI/Components/GanttChart/Bar/Index.tsx +1 -1
  44. package/UI/Components/Graphs/UptimeBarTooltip.tsx +30 -23
  45. package/UI/Components/Header/Header.tsx +7 -0
  46. package/UI/Components/Header/HeaderIconDropdownButton.tsx +2 -0
  47. package/UI/Components/Label/Label.tsx +2 -2
  48. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +22 -10
  49. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +9 -3
  50. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +8 -8
  51. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +44 -20
  52. package/UI/Components/Modal/ConfirmModal.tsx +1 -1
  53. package/UI/Components/Modal/Modal.tsx +213 -121
  54. package/UI/Components/Modal/ModalFooter.tsx +33 -22
  55. package/UI/Components/ModelTable/TableView.tsx +1 -1
  56. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +20 -12
  57. package/UI/Components/Pill/Pill.tsx +21 -13
  58. package/UI/Components/StatusBubble/StatusBubble.tsx +3 -3
  59. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +7 -1
  60. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +9 -3
  61. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +62 -4
  62. package/UI/Components/Workflow/Component.tsx +53 -33
  63. package/UI/Components/Workflow/ComponentPortViewer.tsx +6 -6
  64. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +8 -8
  65. package/UI/Components/Workflow/ComponentsModal.tsx +16 -9
  66. package/UI/Components/Workflow/Workflow.tsx +13 -11
  67. package/UI/Utils/Theme.ts +140 -0
  68. package/Utils/Dashboard/Components/DashboardLogChartComponent.ts +104 -0
  69. package/Utils/Dashboard/Components/Index.ts +7 -0
  70. package/Utils/Monitor/MonitorMetricType.ts +70 -2
  71. package/build/dist/Server/API/AIAgentTaskAPI.js +8 -23
  72. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  73. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  74. package/build/dist/Server/Services/AIAgentTaskService.js +59 -0
  75. package/build/dist/Server/Services/AIAgentTaskService.js.map +1 -1
  76. package/build/dist/Server/Services/AnalyticsDatabaseService.js +19 -0
  77. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  78. package/build/dist/Server/Services/LogAggregationService.js +21 -7
  79. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  80. package/build/dist/Server/Services/MetricService.js +449 -7
  81. package/build/dist/Server/Services/MetricService.js.map +1 -1
  82. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js +1 -1
  83. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +29 -0
  84. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  85. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +86 -2
  86. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  87. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  88. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  89. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  90. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  91. package/build/dist/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.js +2 -0
  92. package/build/dist/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.js.map +1 -0
  93. package/build/dist/Types/Dashboard/DashboardTemplates.js +9 -1
  94. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  95. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  96. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  97. package/build/dist/Types/Monitor/HttpPhaseTimings.js +2 -0
  98. package/build/dist/Types/Monitor/HttpPhaseTimings.js.map +1 -0
  99. package/build/dist/Types/Monitor/MonitorMetricType.js +15 -0
  100. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  101. package/build/dist/Types/Monitor/PingMonitor/PingMonitorResponse.js +2 -0
  102. package/build/dist/Types/Monitor/PingMonitor/PingMonitorResponse.js.map +1 -0
  103. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +7 -4
  104. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  105. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +4 -1
  106. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  107. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +6 -3
  108. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  109. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +1 -1
  110. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  111. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +3 -1
  112. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  113. package/build/dist/UI/Components/Divider/Divider.js +1 -1
  114. package/build/dist/UI/Components/Divider/Divider.js.map +1 -1
  115. package/build/dist/UI/Components/Dropdown/Dropdown.js +10 -4
  116. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  117. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +76 -3
  118. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  119. package/build/dist/UI/Components/ErrorBoundary.js +2 -1
  120. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  121. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  122. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  123. package/build/dist/UI/Components/GanttChart/Bar/Index.js +1 -1
  124. package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +1 -1
  125. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +29 -23
  126. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  127. package/build/dist/UI/Components/Header/Header.js +1 -0
  128. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  129. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  130. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  131. package/build/dist/UI/Components/Label/Label.js +2 -2
  132. package/build/dist/UI/Components/Label/Label.js.map +1 -1
  133. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +20 -8
  134. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  135. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +8 -2
  136. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  137. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +8 -8
  138. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +40 -20
  139. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  140. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  141. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  142. package/build/dist/UI/Components/Modal/Modal.js +109 -51
  143. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  144. package/build/dist/UI/Components/Modal/ModalFooter.js +13 -10
  145. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  146. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  147. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  148. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +17 -12
  149. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  150. package/build/dist/UI/Components/Pill/Pill.js +12 -13
  151. package/build/dist/UI/Components/Pill/Pill.js.map +1 -1
  152. package/build/dist/UI/Components/StatusBubble/StatusBubble.js +3 -3
  153. package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
  154. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  155. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  156. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -2
  157. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  158. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +36 -6
  159. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  160. package/build/dist/UI/Components/Workflow/Component.js +43 -33
  161. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  162. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js +6 -6
  163. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js.map +1 -1
  164. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +8 -8
  165. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  166. package/build/dist/UI/Components/Workflow/ComponentsModal.js +15 -9
  167. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  168. package/build/dist/UI/Components/Workflow/Workflow.js +13 -11
  169. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  170. package/build/dist/UI/Utils/Theme.js +106 -0
  171. package/build/dist/UI/Utils/Theme.js.map +1 -0
  172. package/build/dist/Utils/Dashboard/Components/DashboardLogChartComponent.js +92 -0
  173. package/build/dist/Utils/Dashboard/Components/DashboardLogChartComponent.js.map +1 -0
  174. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  175. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  176. package/build/dist/Utils/Monitor/MonitorMetricType.js +70 -3
  177. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  178. package/package.json +1 -1
@@ -45,8 +45,13 @@ export interface TelemetryViewerProps<T> {
45
45
  searchAttributeSuggestions?: Array<string> | undefined;
46
46
  searchValueSuggestions?: Record<string, Array<string>> | undefined;
47
47
  searchFieldAliasMap?: Record<string, string> | undefined;
48
+ /*
49
+ * Return `false` when the field is filtered via the raw search string
50
+ * rather than a chip — the search bar then keeps the token in the input
51
+ * and submits the search instead of clearing the token.
52
+ */
48
53
  onSearchFieldValueSelect?:
49
- | ((fieldKey: string, value: string) => void)
54
+ | ((fieldKey: string, value: string) => boolean | void)
50
55
  | undefined;
51
56
  searchHelpRows?: Array<SearchHelpRow> | undefined;
52
57
  searchHelpCombinedExample?: string | undefined;
@@ -147,6 +152,7 @@ function TelemetryViewerInner<T>(props: TelemetryViewerProps<T>): ReactElement {
147
152
  helpCombinedExample={props.searchHelpCombinedExample}
148
153
  isAttributesLoading={props.searchAttributesLoading}
149
154
  isValuesLoading={props.searchValuesLoading}
155
+ isLoading={props.isLoading}
150
156
  />
151
157
  </div>
152
158
 
@@ -242,15 +242,21 @@ const TelemetryHistogram: FunctionComponent<TelemetryHistogramProps> = (
242
242
  <XAxis
243
243
  dataKey="time"
244
244
  tickFormatter={formatTickTime}
245
- tick={{ fontSize: 10, fill: "#9ca3af" }}
246
- axisLine={{ stroke: "#e5e7eb" }}
245
+ tick={{
246
+ fontSize: 10,
247
+ fill: "var(--ou-chart-tick, #9ca3af)",
248
+ }}
249
+ axisLine={{ stroke: "var(--ou-chart-grid, #e5e7eb)" }}
247
250
  tickLine={false}
248
251
  minTickGap={40}
249
252
  dy={4}
250
253
  interval="preserveStartEnd"
251
254
  />
252
255
  <YAxis
253
- tick={{ fontSize: 10, fill: "#9ca3af" }}
256
+ tick={{
257
+ fontSize: 10,
258
+ fill: "var(--ou-chart-tick, #9ca3af)",
259
+ }}
254
260
  axisLine={false}
255
261
  tickLine={false}
256
262
  width={48}
@@ -31,8 +31,16 @@ export interface TelemetrySearchBarProps {
31
31
  attributeSuggestions?: Array<string> | undefined;
32
32
  // field → allowed value completions (resolved field keys).
33
33
  valueSuggestions?: Record<string, Array<string>> | undefined;
34
- // Called when the user picks a concrete field:value chip from the dropdown.
35
- onFieldValueSelect?: ((fieldKey: string, value: string) => void) | undefined;
34
+ /*
35
+ * Called when the user picks a concrete field:value chip from the dropdown.
36
+ * Return `false` when the field is NOT consumed as a chip (the parent
37
+ * filters it through the raw search string instead, e.g. `name:` in the
38
+ * metrics viewer) — the bar then keeps the token in the input and submits
39
+ * the search as-is rather than clearing the token.
40
+ */
41
+ onFieldValueSelect?:
42
+ | ((fieldKey: string, value: string) => boolean | void)
43
+ | undefined;
36
44
  // User-facing alias → backing field key (e.g. "service" -> "serviceId").
37
45
  fieldAliasMap?: Record<string, string> | undefined;
38
46
  placeholder?: string | undefined;
@@ -43,6 +51,8 @@ export interface TelemetrySearchBarProps {
43
51
  isAttributesLoading?: boolean | undefined;
44
52
  // Loading state for `@attribute:value` autocomplete (per-key value fetch).
45
53
  isValuesLoading?: boolean | undefined;
54
+ // Loading state for the telemetry results shown by the parent viewer.
55
+ isLoading?: boolean | undefined;
46
56
  }
47
57
 
48
58
  export interface TelemetrySearchBarRef {
@@ -198,7 +208,24 @@ const TelemetrySearchBar: React.ForwardRefExoticComponent<
198
208
  ? filteredSuggestions[0]!
199
209
  : partialValue);
200
210
 
201
- props.onFieldValueSelect(fieldPrefix, resolvedMatch);
211
+ const consumed: boolean | void = props.onFieldValueSelect(
212
+ fieldPrefix,
213
+ resolvedMatch,
214
+ );
215
+
216
+ if (consumed === false) {
217
+ /*
218
+ * The parent filters this field through the raw search
219
+ * string. Keep the token in the input and submit — clearing
220
+ * it here would erase the filter the user just typed.
221
+ */
222
+ props.onSubmit();
223
+ setShowSuggestions(false);
224
+ setShowHelp(false);
225
+ e.preventDefault();
226
+ return;
227
+ }
228
+
202
229
  const parts: Array<string> = props.value.split(/\s+/);
203
230
  parts.pop();
204
231
  const remaining: string = parts.join(" ");
@@ -256,12 +283,32 @@ const TelemetrySearchBar: React.ForwardRefExoticComponent<
256
283
  const applySuggestion: (suggestion: string) => void = useCallback(
257
284
  (suggestion: string): void => {
258
285
  if (isValueMode) {
286
+ let consumed: boolean | void = undefined;
259
287
  if (props.onFieldValueSelect) {
260
- props.onFieldValueSelect(fieldPrefix, suggestion);
288
+ consumed = props.onFieldValueSelect(fieldPrefix, suggestion);
261
289
  }
262
290
 
263
291
  const parts: Array<string> = props.value.split(/\s+/);
264
292
  parts.pop();
293
+
294
+ if (consumed === false) {
295
+ /*
296
+ * Not consumed as a chip — the parent filters this field via
297
+ * the raw search string, so complete the token in place
298
+ * instead of clearing it.
299
+ */
300
+ const completedToken: string = `${hasAtPrefix ? "@" : ""}${fieldPrefix}:${suggestion}`;
301
+ props.onChange(
302
+ parts.length > 0
303
+ ? `${parts.join(" ")} ${completedToken}`
304
+ : completedToken,
305
+ );
306
+ setShowSuggestions(false);
307
+ setShowHelp(false);
308
+ inputRef.current?.focus();
309
+ return;
310
+ }
311
+
265
312
  const remaining: string = parts.join(" ");
266
313
  props.onChange(remaining ? remaining + " " : "");
267
314
  setShowSuggestions(false);
@@ -337,6 +384,7 @@ const TelemetrySearchBar: React.ForwardRefExoticComponent<
337
384
  ? "border-indigo-400 ring-2 ring-indigo-100"
338
385
  : "border-gray-200 hover:border-gray-300"
339
386
  }`}
387
+ aria-busy={props.isLoading || false}
340
388
  >
341
389
  <Icon
342
390
  icon={IconProp.Search}
@@ -367,6 +415,16 @@ const TelemetrySearchBar: React.ForwardRefExoticComponent<
367
415
  spellCheck={false}
368
416
  autoComplete="off"
369
417
  />
418
+ {props.isLoading && (
419
+ <div
420
+ className="flex-none text-indigo-500"
421
+ role="status"
422
+ aria-label="Loading results"
423
+ title="Loading results..."
424
+ >
425
+ <Icon icon={IconProp.Spinner} className="h-4 w-4 animate-spin" />
426
+ </div>
427
+ )}
370
428
  {props.value.length > 0 && (
371
429
  <button
372
430
  type="button"
@@ -36,8 +36,9 @@ const getCategoryColors: (
36
36
  ): CategoryColorScheme => {
37
37
  if (componentType === ComponentType.Trigger) {
38
38
  return {
39
- bg: "#fefce8",
40
- border: "#fde68a",
39
+ bg: "color-mix(in srgb, #f59e0b 12%, var(--ou-surface-primary, #ffffff))",
40
+ border:
41
+ "color-mix(in srgb, #f59e0b 38%, var(--ou-border-default, #e5e7eb))",
41
42
  headerBg: "linear-gradient(135deg, #f59e0b, #d97706)",
42
43
  headerText: "#ffffff",
43
44
  iconColor: "#ffffff",
@@ -52,8 +53,9 @@ const getCategoryColors: (
52
53
 
53
54
  if (lowerCategory.includes("condition") || lowerCategory.includes("logic")) {
54
55
  return {
55
- bg: "#faf5ff",
56
- border: "#e9d5ff",
56
+ bg: "color-mix(in srgb, #a855f7 12%, var(--ou-surface-primary, #ffffff))",
57
+ border:
58
+ "color-mix(in srgb, #a855f7 38%, var(--ou-border-default, #e5e7eb))",
57
59
  headerBg: "linear-gradient(135deg, #a855f7, #7c3aed)",
58
60
  headerText: "#ffffff",
59
61
  iconColor: "#ffffff",
@@ -66,8 +68,9 @@ const getCategoryColors: (
66
68
 
67
69
  if (lowerCategory.includes("api") || lowerCategory.includes("webhook")) {
68
70
  return {
69
- bg: "#eff6ff",
70
- border: "#bfdbfe",
71
+ bg: "color-mix(in srgb, #3b82f6 12%, var(--ou-surface-primary, #ffffff))",
72
+ border:
73
+ "color-mix(in srgb, #3b82f6 38%, var(--ou-border-default, #e5e7eb))",
71
74
  headerBg: "linear-gradient(135deg, #3b82f6, #2563eb)",
72
75
  headerText: "#ffffff",
73
76
  iconColor: "#ffffff",
@@ -87,8 +90,9 @@ const getCategoryColors: (
87
90
  lowerCategory.includes("notification")
88
91
  ) {
89
92
  return {
90
- bg: "#ecfdf5",
91
- border: "#a7f3d0",
93
+ bg: "color-mix(in srgb, #10b981 12%, var(--ou-surface-primary, #ffffff))",
94
+ border:
95
+ "color-mix(in srgb, #10b981 38%, var(--ou-border-default, #e5e7eb))",
92
96
  headerBg: "linear-gradient(135deg, #10b981, #059669)",
93
97
  headerText: "#ffffff",
94
98
  iconColor: "#ffffff",
@@ -105,8 +109,9 @@ const getCategoryColors: (
105
109
  lowerCategory.includes("custom")
106
110
  ) {
107
111
  return {
108
- bg: "#fef2f2",
109
- border: "#fecaca",
112
+ bg: "color-mix(in srgb, #ef4444 12%, var(--ou-surface-primary, #ffffff))",
113
+ border:
114
+ "color-mix(in srgb, #ef4444 38%, var(--ou-border-default, #e5e7eb))",
110
115
  headerBg: "linear-gradient(135deg, #ef4444, #dc2626)",
111
116
  headerText: "#ffffff",
112
117
  iconColor: "#ffffff",
@@ -119,8 +124,9 @@ const getCategoryColors: (
119
124
 
120
125
  if (lowerCategory.includes("json") || lowerCategory.includes("util")) {
121
126
  return {
122
- bg: "#f0fdf4",
123
- border: "#bbf7d0",
127
+ bg: "color-mix(in srgb, #22c55e 12%, var(--ou-surface-primary, #ffffff))",
128
+ border:
129
+ "color-mix(in srgb, #22c55e 38%, var(--ou-border-default, #e5e7eb))",
124
130
  headerBg: "linear-gradient(135deg, #22c55e, #16a34a)",
125
131
  headerText: "#ffffff",
126
132
  iconColor: "#ffffff",
@@ -137,8 +143,9 @@ const getCategoryColors: (
137
143
  lowerCategory.includes("timer")
138
144
  ) {
139
145
  return {
140
- bg: "#fff7ed",
141
- border: "#fed7aa",
146
+ bg: "color-mix(in srgb, #f97316 12%, var(--ou-surface-primary, #ffffff))",
147
+ border:
148
+ "color-mix(in srgb, #f97316 38%, var(--ou-border-default, #e5e7eb))",
142
149
  headerBg: "linear-gradient(135deg, #f97316, #ea580c)",
143
150
  headerText: "#ffffff",
144
151
  iconColor: "#ffffff",
@@ -151,8 +158,8 @@ const getCategoryColors: (
151
158
 
152
159
  // Default / database models
153
160
  return {
154
- bg: "#f8fafc",
155
- border: "#e2e8f0",
161
+ bg: "var(--ou-surface-secondary, #f8fafc)",
162
+ border: "var(--ou-border-default, #e2e8f0)",
156
163
  headerBg: "linear-gradient(135deg, #6366f1, #4f46e5)",
157
164
  headerText: "#ffffff",
158
165
  iconColor: "#ffffff",
@@ -223,8 +230,14 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
223
230
  style={{
224
231
  width: "16rem",
225
232
  borderRadius: "12px",
226
- border: `2px dashed ${isHovering ? "#94a3b8" : "#cbd5e1"}`,
227
- backgroundColor: isHovering ? "#f8fafc" : "#ffffff",
233
+ border: `2px dashed ${
234
+ isHovering
235
+ ? "var(--ou-text-subtle, #94a3b8)"
236
+ : "var(--ou-border-strong, #cbd5e1)"
237
+ }`,
238
+ backgroundColor: isHovering
239
+ ? "var(--ou-surface-secondary, #f8fafc)"
240
+ : "var(--ou-surface-primary, #ffffff)",
228
241
  padding: "1.5rem",
229
242
  display: "flex",
230
243
  flexDirection: "column",
@@ -245,7 +258,9 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
245
258
  width: "2.5rem",
246
259
  height: "2.5rem",
247
260
  borderRadius: "50%",
248
- backgroundColor: isHovering ? "#e2e8f0" : "#f1f5f9",
261
+ backgroundColor: isHovering
262
+ ? "var(--ou-border-default, #e2e8f0)"
263
+ : "var(--ou-surface-tertiary, #f1f5f9)",
249
264
  display: "flex",
250
265
  alignItems: "center",
251
266
  justifyContent: "center",
@@ -255,7 +270,9 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
255
270
  <Icon
256
271
  icon={IconProp.Add}
257
272
  style={{
258
- color: isHovering ? "#64748b" : "#94a3b8",
273
+ color: isHovering
274
+ ? "var(--ou-text-muted, #64748b)"
275
+ : "var(--ou-text-subtle, #94a3b8)",
259
276
  width: "1.25rem",
260
277
  height: "1.25rem",
261
278
  transition: "all 0.2s ease",
@@ -264,7 +281,9 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
264
281
  </div>
265
282
  <p
266
283
  style={{
267
- color: isHovering ? "#64748b" : "#94a3b8",
284
+ color: isHovering
285
+ ? "var(--ou-text-muted, #64748b)"
286
+ : "var(--ou-text-subtle, #94a3b8)",
268
287
  fontSize: "0.8125rem",
269
288
  fontWeight: 500,
270
289
  textAlign: "center",
@@ -302,13 +321,13 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
302
321
  ? colors.selectedBorder
303
322
  : colors.border
304
323
  }`,
305
- backgroundColor: "#ffffff",
324
+ backgroundColor: "var(--ou-surface-primary, #ffffff)",
306
325
  overflow: "visible",
307
326
  boxShadow: props.selected
308
- ? colors.selectedShadow
327
+ ? `var(--ou-card-shadow-selected, ${colors.selectedShadow})`
309
328
  : isHovering
310
- ? `0 8px 25px -5px rgba(0, 0, 0, 0.1), 0 4px 10px -6px rgba(0, 0, 0, 0.05)`
311
- : `0 1px 3px 0 rgba(0, 0, 0, 0.07), 0 1px 2px -1px rgba(0, 0, 0, 0.05)`,
329
+ ? "var(--ou-card-shadow-hover, 0 8px 25px -5px rgba(0, 0, 0, 0.1), 0 4px 10px -6px rgba(0, 0, 0, 0.05))"
330
+ : "var(--ou-card-shadow, 0 1px 3px 0 rgba(0, 0, 0, 0.07), 0 1px 2px -1px rgba(0, 0, 0, 0.05))",
312
331
  transition: "all 0.2s ease",
313
332
  transform: isHovering ? "translateY(-1px)" : "none",
314
333
  position: "relative",
@@ -364,11 +383,12 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
364
383
  width: "22px",
365
384
  height: "22px",
366
385
  borderRadius: "50%",
367
- backgroundColor: "#fef2f2",
386
+ backgroundColor:
387
+ "color-mix(in srgb, #ef4444 15%, var(--ou-surface-primary, #ffffff))",
368
388
  display: "flex",
369
389
  alignItems: "center",
370
390
  justifyContent: "center",
371
- border: "1px solid #fecaca",
391
+ border: "1px solid rgb(248 113 113 / 45%)",
372
392
  }}
373
393
  >
374
394
  <Icon
@@ -451,8 +471,8 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
451
471
  style={{
452
472
  display: "inline-flex",
453
473
  alignItems: "center",
454
- backgroundColor: "#ffffff",
455
- border: "1px solid #e2e8f0",
474
+ backgroundColor: "var(--ou-surface-primary, #ffffff)",
475
+ border: "1px solid var(--ou-border-default, #e2e8f0)",
456
476
  borderRadius: "6px",
457
477
  padding: "0.125rem 0.5rem",
458
478
  marginBottom: "0.5rem",
@@ -460,7 +480,7 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
460
480
  >
461
481
  <span
462
482
  style={{
463
- color: "#64748b",
483
+ color: "var(--ou-text-muted, #64748b)",
464
484
  fontSize: "0.6875rem",
465
485
  fontWeight: 500,
466
486
  fontFamily:
@@ -475,7 +495,7 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
475
495
  {/* Description */}
476
496
  <p
477
497
  style={{
478
- color: "#64748b",
498
+ color: "var(--ou-text-muted, #64748b)",
479
499
  fontSize: "0.75rem",
480
500
  lineHeight: "1.125rem",
481
501
  margin: 0,
@@ -504,7 +524,7 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
504
524
  props.data.metadata.outPorts.length === 1
505
525
  ? "center"
506
526
  : "space-between",
507
- backgroundColor: "#ffffff",
527
+ backgroundColor: "var(--ou-surface-primary, #ffffff)",
508
528
  borderRadius: "0 0 10px 10px",
509
529
  }}
510
530
  >
@@ -513,7 +533,7 @@ const Node: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
513
533
  <Tooltip key={i} text={port.description || ""}>
514
534
  <span
515
535
  style={{
516
- color: "#94a3b8",
536
+ color: "var(--ou-text-subtle, #94a3b8)",
517
537
  fontSize: "0.6875rem",
518
538
  fontWeight: 500,
519
539
  }}
@@ -34,8 +34,8 @@ const ComponentPortViewer: FunctionComponent<ComponentProps> = (
34
34
  gap: "0.625rem",
35
35
  padding: "0.5rem 0.75rem",
36
36
  borderRadius: "8px",
37
- backgroundColor: "#f8fafc",
38
- border: "1px solid #f1f5f9",
37
+ backgroundColor: "var(--ou-surface-secondary, #f8fafc)",
38
+ border: "1px solid var(--ou-border-subtle, #f1f5f9)",
39
39
  marginBottom: "0.375rem",
40
40
  }}
41
41
  >
@@ -44,7 +44,7 @@ const ComponentPortViewer: FunctionComponent<ComponentProps> = (
44
44
  width: "8px",
45
45
  height: "8px",
46
46
  borderRadius: "50%",
47
- backgroundColor: "#94a3b8",
47
+ backgroundColor: "var(--ou-text-subtle, #94a3b8)",
48
48
  flexShrink: 0,
49
49
  }}
50
50
  />
@@ -53,7 +53,7 @@ const ComponentPortViewer: FunctionComponent<ComponentProps> = (
53
53
  style={{
54
54
  fontSize: "0.8125rem",
55
55
  fontWeight: 500,
56
- color: "#334155",
56
+ color: "var(--ou-text-secondary, #334155)",
57
57
  margin: 0,
58
58
  lineHeight: "1.25rem",
59
59
  }}
@@ -61,7 +61,7 @@ const ComponentPortViewer: FunctionComponent<ComponentProps> = (
61
61
  {port.title}
62
62
  <span
63
63
  style={{
64
- color: "#94a3b8",
64
+ color: "var(--ou-text-subtle, #94a3b8)",
65
65
  fontWeight: 400,
66
66
  fontSize: "0.6875rem",
67
67
  marginLeft: "0.375rem",
@@ -76,7 +76,7 @@ const ComponentPortViewer: FunctionComponent<ComponentProps> = (
76
76
  <p
77
77
  style={{
78
78
  fontSize: "0.75rem",
79
- color: "#94a3b8",
79
+ color: "var(--ou-text-subtle, #94a3b8)",
80
80
  margin: 0,
81
81
  lineHeight: "1rem",
82
82
  }}
@@ -37,8 +37,8 @@ const ComponentReturnValueViewer: FunctionComponent<ComponentProps> = (
37
37
  gap: "0.625rem",
38
38
  padding: "0.5rem 0.75rem",
39
39
  borderRadius: "8px",
40
- backgroundColor: "#f8fafc",
41
- border: "1px solid #f1f5f9",
40
+ backgroundColor: "var(--ou-surface-secondary, #f8fafc)",
41
+ border: "1px solid var(--ou-border-subtle, #f1f5f9)",
42
42
  marginBottom: "0.375rem",
43
43
  }}
44
44
  >
@@ -47,7 +47,7 @@ const ComponentReturnValueViewer: FunctionComponent<ComponentProps> = (
47
47
  style={{
48
48
  fontSize: "0.8125rem",
49
49
  fontWeight: 500,
50
- color: "#334155",
50
+ color: "var(--ou-text-secondary, #334155)",
51
51
  margin: 0,
52
52
  lineHeight: "1.25rem",
53
53
  }}
@@ -55,7 +55,7 @@ const ComponentReturnValueViewer: FunctionComponent<ComponentProps> = (
55
55
  {returnValue.name}
56
56
  <span
57
57
  style={{
58
- color: "#94a3b8",
58
+ color: "var(--ou-text-subtle, #94a3b8)",
59
59
  fontWeight: 400,
60
60
  fontSize: "0.6875rem",
61
61
  marginLeft: "0.375rem",
@@ -70,7 +70,7 @@ const ComponentReturnValueViewer: FunctionComponent<ComponentProps> = (
70
70
  <p
71
71
  style={{
72
72
  fontSize: "0.75rem",
73
- color: "#94a3b8",
73
+ color: "var(--ou-text-subtle, #94a3b8)",
74
74
  margin: 0,
75
75
  lineHeight: "1rem",
76
76
  }}
@@ -83,12 +83,12 @@ const ComponentReturnValueViewer: FunctionComponent<ComponentProps> = (
83
83
  style={{
84
84
  fontSize: "0.6875rem",
85
85
  fontWeight: 500,
86
- color: "#6366f1",
87
- backgroundColor: "#eef2ff",
86
+ color: "var(--ou-link, #6366f1)",
87
+ backgroundColor: "var(--ou-accent-soft, #eef2ff)",
88
88
  padding: "0.125rem 0.5rem",
89
89
  borderRadius: "100px",
90
90
  whiteSpace: "nowrap",
91
- border: "1px solid #e0e7ff",
91
+ border: "1px solid var(--ou-accent-muted, #e0e7ff)",
92
92
  }}
93
93
  >
94
94
  {returnValue.type}
@@ -404,7 +404,8 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
404
404
  style={{
405
405
  width: "28px",
406
406
  height: "28px",
407
- backgroundColor: "#f1f5f9",
407
+ backgroundColor:
408
+ "var(--ou-surface-tertiary, #f1f5f9)",
408
409
  }}
409
410
  >
410
411
  <Icon
@@ -443,16 +444,16 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
443
444
  borderRadius: "10px",
444
445
  border: isSelected
445
446
  ? "2px solid #6366f1"
446
- : "1px solid #e2e8f0",
447
+ : "1px solid var(--ou-border-default, #e2e8f0)",
447
448
  backgroundColor: isSelected
448
- ? "#eef2ff"
449
- : "#ffffff",
449
+ ? "var(--ou-accent-soft, #eef2ff)"
450
+ : "var(--ou-surface-primary, #ffffff)",
450
451
  display: "flex",
451
452
  alignItems: "flex-start",
452
453
  gap: "0.75rem",
453
454
  boxShadow: isSelected
454
455
  ? "0 0 0 3px rgba(99, 102, 241, 0.1)"
455
- : "0 1px 2px 0 rgba(0, 0, 0, 0.03)",
456
+ : "var(--ou-card-shadow, 0 1px 2px 0 rgba(0, 0, 0, 0.03))",
456
457
  }}
457
458
  >
458
459
  {/* Icon */}
@@ -463,7 +464,7 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
463
464
  borderRadius: "8px",
464
465
  backgroundColor: isSelected
465
466
  ? "#6366f1"
466
- : "#f1f5f9",
467
+ : "var(--ou-surface-tertiary, #f1f5f9)",
467
468
  display: "flex",
468
469
  alignItems: "center",
469
470
  justifyContent: "center",
@@ -474,7 +475,9 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
474
475
  <Icon
475
476
  icon={componentMetadata.iconProp}
476
477
  style={{
477
- color: isSelected ? "#ffffff" : "#64748b",
478
+ color: isSelected
479
+ ? "#ffffff"
480
+ : "var(--ou-text-muted, #64748b)",
478
481
  width: "1rem",
479
482
  height: "1rem",
480
483
  }}
@@ -488,7 +491,9 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
488
491
  style={{
489
492
  fontSize: "0.8125rem",
490
493
  fontWeight: 600,
491
- color: isSelected ? "#4338ca" : "#1e293b",
494
+ color: isSelected
495
+ ? "var(--ou-accent-text, #4338ca)"
496
+ : "var(--ou-text-primary, #1e293b)",
492
497
  margin: 0,
493
498
  lineHeight: "1.25rem",
494
499
  }}
@@ -521,7 +526,9 @@ const ComponentsModal: FunctionComponent<ComponentProps> = (
521
526
  <p
522
527
  style={{
523
528
  fontSize: "0.75rem",
524
- color: isSelected ? "#6366f1" : "#94a3b8",
529
+ color: isSelected
530
+ ? "var(--ou-link, #6366f1)"
531
+ : "var(--ou-text-subtle, #94a3b8)",
525
532
  margin: 0,
526
533
  marginTop: "2px",
527
534
  lineHeight: "1rem",
@@ -71,8 +71,8 @@ const nodeTypes: NodeTypes = {
71
71
 
72
72
  const edgeStyle: React.CSSProperties = {
73
73
  strokeWidth: "2px",
74
- stroke: "#94a3b8",
75
- color: "#94a3b8",
74
+ stroke: "var(--ou-chart-tick, #94a3b8)",
75
+ color: "var(--ou-chart-tick, #94a3b8)",
76
76
  };
77
77
 
78
78
  const selectedEdgeStyle: React.CSSProperties = {
@@ -411,31 +411,33 @@ const Workflow: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
411
411
  minHeight: "600px",
412
412
  borderRadius: "8px",
413
413
  overflow: "hidden",
414
- border: "1px solid #e2e8f0",
414
+ border: "1px solid var(--ou-border-default, #e2e8f0)",
415
415
  }}
416
416
  >
417
417
  <style>
418
418
  {`
419
419
  .react-flow__minimap {
420
420
  border-radius: 8px !important;
421
- border: 1px solid #e2e8f0 !important;
421
+ border: 1px solid var(--ou-border-default, #e2e8f0) !important;
422
422
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07) !important;
423
423
  overflow: hidden !important;
424
- background: #ffffff !important;
424
+ background: var(--ou-surface-primary, #ffffff) !important;
425
425
  }
426
426
  .react-flow__controls {
427
427
  border-radius: 8px !important;
428
- border: 1px solid #e2e8f0 !important;
428
+ border: 1px solid var(--ou-border-default, #e2e8f0) !important;
429
429
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07) !important;
430
430
  overflow: hidden !important;
431
431
  }
432
432
  .react-flow__controls-button {
433
- border-bottom: 1px solid #f1f5f9 !important;
433
+ border-bottom: 1px solid var(--ou-border-subtle, #f1f5f9) !important;
434
+ background: var(--ou-surface-primary, #ffffff) !important;
435
+ color: var(--ou-text-secondary, #475569) !important;
434
436
  width: 32px !important;
435
437
  height: 32px !important;
436
438
  }
437
439
  .react-flow__controls-button:hover {
438
- background: #f8fafc !important;
440
+ background: var(--ou-surface-secondary, #f8fafc) !important;
439
441
  }
440
442
  .react-flow__controls-button svg {
441
443
  max-width: 14px !important;
@@ -507,9 +509,9 @@ const Workflow: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
507
509
  }
508
510
  return "#6366f1";
509
511
  }}
510
- maskColor="rgba(241, 245, 249, 0.7)"
512
+ maskColor="var(--ou-flow-mask, rgba(241, 245, 249, 0.7))"
511
513
  style={{
512
- backgroundColor: "#ffffff",
514
+ backgroundColor: "var(--ou-surface-primary, #ffffff)",
513
515
  }}
514
516
  />
515
517
  <Controls />
@@ -517,7 +519,7 @@ const Workflow: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
517
519
  variant={BackgroundVariant.Dots}
518
520
  gap={20}
519
521
  size={1}
520
- color="#cbd5e1"
522
+ color="var(--ou-chart-grid, #cbd5e1)"
521
523
  />
522
524
  </ReactFlow>
523
525