@mastra/playground-ui 58.1.0-alpha.0 → 59.0.0

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 (594) hide show
  1. package/README.md +62 -0
  2. package/dist/{Header-BVnFQlzE.js → Header-hTHhO02b.js} +2 -2
  3. package/dist/{Header-BVnFQlzE.js.map → Header-hTHhO02b.js.map} +1 -1
  4. package/dist/{Header-CGjhJ0nQ.cjs → Header-y51Sfo3G.cjs} +2 -2
  5. package/dist/{Header-CGjhJ0nQ.cjs.map → Header-y51Sfo3G.cjs.map} +1 -1
  6. package/dist/{Txt-DTh3Pa_a.js → Txt-BP1SRHmL.js} +4 -10
  7. package/dist/Txt-BP1SRHmL.js.map +1 -0
  8. package/dist/{Txt-B4-2nLaI.cjs → Txt-DPmEpNbp.cjs} +4 -10
  9. package/dist/Txt-DPmEpNbp.cjs.map +1 -0
  10. package/dist/{ask-user-pPTuoPKI.cjs → ask-user-4pnmHbuC.cjs} +2 -2
  11. package/dist/{ask-user-pPTuoPKI.cjs.map → ask-user-4pnmHbuC.cjs.map} +1 -1
  12. package/dist/{ask-user-DtF4a9Vr.js → ask-user-CFcQN_7m.js} +2 -2
  13. package/dist/{ask-user-DtF4a9Vr.js.map → ask-user-CFcQN_7m.js.map} +1 -1
  14. package/dist/{chat-notification-C4P2InUX.js → chat-notification-BI_WRUvG.js} +2 -2
  15. package/dist/{chat-notification-C4P2InUX.js.map → chat-notification-BI_WRUvG.js.map} +1 -1
  16. package/dist/{chat-notification-HP18KxlS.cjs → chat-notification-Dc7jwULm.cjs} +2 -2
  17. package/dist/{chat-notification-HP18KxlS.cjs.map → chat-notification-Dc7jwULm.cjs.map} +1 -1
  18. package/dist/{chat-signal-BP9RN6Rh.cjs → chat-signal-BodewV33.cjs} +3 -3
  19. package/dist/{chat-signal-BP9RN6Rh.cjs.map → chat-signal-BodewV33.cjs.map} +1 -1
  20. package/dist/{chat-signal-CQnmFp3V.js → chat-signal-D0zw80bU.js} +3 -3
  21. package/dist/{chat-signal-CQnmFp3V.js.map → chat-signal-D0zw80bU.js.map} +1 -1
  22. package/dist/{combobox-BoSB-muq.cjs → combobox-B19HJqE-.cjs} +2 -2
  23. package/dist/{combobox-BoSB-muq.cjs.map → combobox-B19HJqE-.cjs.map} +1 -1
  24. package/dist/{combobox-Cd0JPUQW.js → combobox-D_kmwSKS.js} +2 -2
  25. package/dist/{combobox-Cd0JPUQW.js.map → combobox-D_kmwSKS.js.map} +1 -1
  26. package/dist/components/Avatar.cjs.js +1 -1
  27. package/dist/components/Avatar.es.js +1 -1
  28. package/dist/components/ClampedText.cjs.js +1 -1
  29. package/dist/components/ClampedText.es.js +1 -1
  30. package/dist/components/Combobox.cjs.js +1 -1
  31. package/dist/components/Combobox.es.js +1 -1
  32. package/dist/components/Comment.cjs.js +2 -2
  33. package/dist/components/Comment.es.js +2 -2
  34. package/dist/components/CompactNumber.cjs.js +24 -0
  35. package/dist/components/CompactNumber.cjs.js.map +1 -0
  36. package/dist/components/CompactNumber.d.ts +2 -0
  37. package/dist/components/CompactNumber.es.js +20 -0
  38. package/dist/components/CompactNumber.es.js.map +1 -0
  39. package/dist/components/DataCodeSection.cjs.js +1 -1
  40. package/dist/components/DataCodeSection.es.js +1 -1
  41. package/dist/components/DataList.cjs.js +8 -14
  42. package/dist/components/DataList.cjs.js.map +1 -1
  43. package/dist/components/DataList.es.js +8 -14
  44. package/dist/components/DataList.es.js.map +1 -1
  45. package/dist/components/DataPanel.cjs.js +1 -1
  46. package/dist/components/DataPanel.es.js +1 -1
  47. package/dist/components/DateRangeTimeline.cjs.js +1 -1
  48. package/dist/components/DateRangeTimeline.es.js +1 -1
  49. package/dist/components/DateTimePicker.cjs.js +1 -1
  50. package/dist/components/DateTimePicker.es.js +1 -1
  51. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  52. package/dist/components/DateTimeRangePicker.es.js +1 -1
  53. package/dist/components/Entity.cjs.js +1 -1
  54. package/dist/components/Entity.es.js +1 -1
  55. package/dist/components/EntityHeader.cjs.js +1 -1
  56. package/dist/components/EntityHeader.es.js +1 -1
  57. package/dist/components/Entry.cjs.js +1 -1
  58. package/dist/components/Entry.es.js +1 -1
  59. package/dist/components/EnvironmentVariablesEditor.cjs.js +3 -3
  60. package/dist/components/EnvironmentVariablesEditor.es.js +3 -3
  61. package/dist/components/FilterBar.cjs.js +1 -1
  62. package/dist/components/FilterBar.es.js +1 -1
  63. package/dist/components/FormFieldBlocks.cjs.js +4 -4
  64. package/dist/components/FormFieldBlocks.es.js +4 -4
  65. package/dist/components/Header.cjs.js +1 -1
  66. package/dist/components/Header.es.js +1 -1
  67. package/dist/components/InlineCode.cjs.js +10 -0
  68. package/dist/components/InlineCode.cjs.js.map +1 -0
  69. package/dist/components/InlineCode.d.ts +2 -0
  70. package/dist/components/InlineCode.es.js +2 -0
  71. package/dist/components/InlineCode.es.js.map +1 -0
  72. package/dist/components/ItemList.cjs.js +4 -16
  73. package/dist/components/ItemList.cjs.js.map +1 -1
  74. package/dist/components/ItemList.es.js +4 -16
  75. package/dist/components/ItemList.es.js.map +1 -1
  76. package/dist/components/JSONSchemaForm.cjs.js +2 -2
  77. package/dist/components/JSONSchemaForm.es.js +2 -2
  78. package/dist/components/ListSearch.cjs.js +1 -1
  79. package/dist/components/ListSearch.es.js +1 -1
  80. package/dist/components/LogsDataList.cjs.js +2 -2
  81. package/dist/components/LogsDataList.es.js +2 -2
  82. package/dist/components/Message.cjs.js +4 -5
  83. package/dist/components/Message.cjs.js.map +1 -1
  84. package/dist/components/Message.es.js +4 -5
  85. package/dist/components/Message.es.js.map +1 -1
  86. package/dist/components/PageLayout.cjs.js +1 -1
  87. package/dist/components/PageLayout.es.js +1 -1
  88. package/dist/components/PropertyFilter.cjs.js +1 -1
  89. package/dist/components/PropertyFilter.es.js +1 -1
  90. package/dist/components/RelativeTimestamp.cjs.js +119 -0
  91. package/dist/components/RelativeTimestamp.cjs.js.map +1 -0
  92. package/dist/components/RelativeTimestamp.d.ts +2 -0
  93. package/dist/components/RelativeTimestamp.es.js +115 -0
  94. package/dist/components/RelativeTimestamp.es.js.map +1 -0
  95. package/dist/components/Section.cjs.js +1 -1
  96. package/dist/components/Section.es.js +1 -1
  97. package/dist/components/SettingsRow.cjs.js +1 -1
  98. package/dist/components/SettingsRow.es.js +1 -1
  99. package/dist/components/SideDialog.cjs.js +1 -1
  100. package/dist/components/SideDialog.es.js +1 -1
  101. package/dist/components/StatusIndicators.cjs.js +21 -14
  102. package/dist/components/StatusIndicators.cjs.js.map +1 -1
  103. package/dist/components/StatusIndicators.es.js +21 -15
  104. package/dist/components/StatusIndicators.es.js.map +1 -1
  105. package/dist/components/Table.cjs.js +3 -21
  106. package/dist/components/Table.cjs.js.map +1 -1
  107. package/dist/components/Table.es.js +3 -21
  108. package/dist/components/Table.es.js.map +1 -1
  109. package/dist/components/ThreadList.cjs.js +1 -1
  110. package/dist/components/ThreadList.es.js +1 -1
  111. package/dist/components/Truncate.cjs.js +1 -1
  112. package/dist/components/Truncate.es.js +1 -1
  113. package/dist/components/Txt.cjs.js +1 -1
  114. package/dist/components/Txt.es.js +1 -1
  115. package/dist/components/Workflow.cjs.js +8 -12
  116. package/dist/components/Workflow.cjs.js.map +1 -1
  117. package/dist/components/Workflow.es.js +8 -12
  118. package/dist/components/Workflow.es.js.map +1 -1
  119. package/dist/components/ai/ask-user.cjs.js +1 -1
  120. package/dist/components/ai/ask-user.es.js +1 -1
  121. package/dist/components/ai/chat-event.cjs.js +3 -3
  122. package/dist/components/ai/chat-event.es.js +4 -4
  123. package/dist/components/ai/plan.cjs.js +2 -2
  124. package/dist/components/ai/plan.cjs.js.map +1 -1
  125. package/dist/components/ai/plan.es.js +2 -2
  126. package/dist/components/ai/plan.es.js.map +1 -1
  127. package/dist/components/ai/tool-call.cjs.js +7 -9
  128. package/dist/components/ai/tool-call.cjs.js.map +1 -1
  129. package/dist/components/ai/tool-call.es.js +8 -10
  130. package/dist/components/ai/tool-call.es.js.map +1 -1
  131. package/dist/{data-code-section-Cth9zVkj.js → data-code-section-BKrCkj90.js} +2 -2
  132. package/dist/{data-code-section-Cth9zVkj.js.map → data-code-section-BKrCkj90.js.map} +1 -1
  133. package/dist/{data-code-section-DE4AgaTU.cjs → data-code-section-C9z94ytx.cjs} +2 -2
  134. package/dist/{data-code-section-DE4AgaTU.cjs.map → data-code-section-C9z94ytx.cjs.map} +1 -1
  135. package/dist/{data-list-DisTjDHP.js → data-list-5-nRJbEO.js} +3 -3
  136. package/dist/{data-list-DisTjDHP.js.map → data-list-5-nRJbEO.js.map} +1 -1
  137. package/dist/{data-list-PwFpP_mo.cjs → data-list-RI8c32dk.cjs} +3 -3
  138. package/dist/{data-list-PwFpP_mo.cjs.map → data-list-RI8c32dk.cjs.map} +1 -1
  139. package/dist/{data-list-skeleton-DAfM8AjW.js → data-list-skeleton-BrSh9Y_3.js} +2 -2
  140. package/dist/{data-list-skeleton-DAfM8AjW.js.map → data-list-skeleton-BrSh9Y_3.js.map} +1 -1
  141. package/dist/{data-list-skeleton-CjwR0o3w.cjs → data-list-skeleton-CgbWqYky.cjs} +2 -2
  142. package/dist/{data-list-skeleton-CjwR0o3w.cjs.map → data-list-skeleton-CgbWqYky.cjs.map} +1 -1
  143. package/dist/{data-list-spacer-DEcgVGFM.cjs → data-list-spacer-1OqlC7WX.cjs} +2 -2
  144. package/dist/{data-list-spacer-DEcgVGFM.cjs.map → data-list-spacer-1OqlC7WX.cjs.map} +1 -1
  145. package/dist/{data-list-spacer-BmorAN0V.js → data-list-spacer-D3Rn1evn.js} +2 -2
  146. package/dist/{data-list-spacer-BmorAN0V.js.map → data-list-spacer-D3Rn1evn.js.map} +1 -1
  147. package/dist/{data-list-top-DpbOA3uw.js → data-list-top-B-AopfvE.js} +13 -21
  148. package/dist/data-list-top-B-AopfvE.js.map +1 -0
  149. package/dist/{data-list-top-WGUY167p.cjs → data-list-top-DFnudSA_.cjs} +13 -21
  150. package/dist/data-list-top-DFnudSA_.cjs.map +1 -0
  151. package/dist/{data-panel-BQVTKo86.js → data-panel-BWgExbHs.js} +2 -2
  152. package/dist/{data-panel-BQVTKo86.js.map → data-panel-BWgExbHs.js.map} +1 -1
  153. package/dist/{data-panel-XPXrhYJI.cjs → data-panel-C_BqhzeL.cjs} +2 -2
  154. package/dist/{data-panel-XPXrhYJI.cjs.map → data-panel-C_BqhzeL.cjs.map} +1 -1
  155. package/dist/{date-time-range-picker-C-t3Kdpk.js → date-time-range-picker-Bnviv7s-.js} +2 -2
  156. package/dist/{date-time-range-picker-C-t3Kdpk.js.map → date-time-range-picker-Bnviv7s-.js.map} +1 -1
  157. package/dist/{date-time-range-picker-BCzvSYx3.cjs → date-time-range-picker-sT5qAW-_.cjs} +2 -2
  158. package/dist/{date-time-range-picker-BCzvSYx3.cjs.map → date-time-range-picker-sT5qAW-_.cjs.map} +1 -1
  159. package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js +16 -0
  160. package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js.map +1 -0
  161. package/dist/domains/capabilities/hooks/use-feedback-available.d.ts +2 -0
  162. package/dist/domains/capabilities/hooks/use-feedback-available.es.js +12 -0
  163. package/dist/domains/capabilities/hooks/use-feedback-available.es.js.map +1 -0
  164. package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js +20 -0
  165. package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js.map +1 -0
  166. package/dist/domains/capabilities/hooks/use-observability-capabilities.d.ts +2 -0
  167. package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js +16 -0
  168. package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js.map +1 -0
  169. package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js +16 -0
  170. package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js.map +1 -0
  171. package/dist/domains/capabilities/hooks/use-trace-query-available.d.ts +2 -0
  172. package/dist/domains/capabilities/hooks/use-trace-query-available.es.js +12 -0
  173. package/dist/domains/capabilities/hooks/use-trace-query-available.es.js.map +1 -0
  174. package/dist/domains/capabilities/hooks.cjs.js +14 -0
  175. package/dist/domains/capabilities/hooks.cjs.js.map +1 -0
  176. package/dist/domains/capabilities/hooks.d.ts +2 -0
  177. package/dist/domains/capabilities/hooks.es.js +4 -0
  178. package/dist/domains/capabilities/hooks.es.js.map +1 -0
  179. package/dist/domains/capabilities.cjs.js +14 -0
  180. package/dist/domains/capabilities.cjs.js.map +1 -0
  181. package/dist/domains/capabilities.d.ts +2 -0
  182. package/dist/domains/capabilities.es.js +4 -0
  183. package/dist/domains/capabilities.es.js.map +1 -0
  184. package/dist/domains/chat/attachments/attachment-kind.es.js +1 -1
  185. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  186. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  187. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
  188. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
  189. package/dist/domains/chat/components/section-label.cjs.js +1 -1
  190. package/dist/domains/chat/components/section-label.es.js +1 -1
  191. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  192. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  193. package/dist/domains/chat/messages/reasoning-streaming-line.cjs.js +1 -1
  194. package/dist/domains/chat/messages/reasoning-streaming-line.es.js +1 -1
  195. package/dist/domains/chat/messages/reasoning.cjs.js +4 -3
  196. package/dist/domains/chat/messages/reasoning.cjs.js.map +1 -1
  197. package/dist/domains/chat/messages/reasoning.es.js +4 -3
  198. package/dist/domains/chat/messages/reasoning.es.js.map +1 -1
  199. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +2 -2
  200. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js.map +1 -1
  201. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +2 -2
  202. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js.map +1 -1
  203. package/dist/domains/chat/messages/renderers/user-file-part-renderer.es.js +1 -1
  204. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  205. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  206. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  207. package/dist/domains/chat/messages/system-reminder-badge.cjs.js.map +1 -1
  208. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  209. package/dist/domains/chat/messages/system-reminder-badge.es.js.map +1 -1
  210. package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
  211. package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
  212. package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
  213. package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
  214. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  215. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  216. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +3 -3
  217. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
  218. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +3 -3
  219. package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
  220. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +5 -3
  221. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js.map +1 -1
  222. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +5 -3
  223. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js.map +1 -1
  224. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +11 -8
  225. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js.map +1 -1
  226. package/dist/domains/chat/tools/badges/observation-renderer.es.js +11 -8
  227. package/dist/domains/chat/tools/badges/observation-renderer.es.js.map +1 -1
  228. package/dist/domains/logs/components/log-data-panel.cjs.js +3 -6
  229. package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -1
  230. package/dist/domains/logs/components/log-data-panel.es.js +3 -6
  231. package/dist/domains/logs/components/log-data-panel.es.js.map +1 -1
  232. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  233. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  234. package/dist/domains/logs/components/no-logs-info.cjs.js +3 -4
  235. package/dist/domains/logs/components/no-logs-info.cjs.js.map +1 -1
  236. package/dist/domains/logs/components/no-logs-info.es.js +3 -4
  237. package/dist/domains/logs/components/no-logs-info.es.js.map +1 -1
  238. package/dist/domains/memory/components/flame-graph.cjs.js +7 -5
  239. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  240. package/dist/domains/memory/components/flame-graph.es.js +8 -6
  241. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  242. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  243. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  244. package/dist/domains/memory/components/observation-detail-view.cjs.js +4 -5
  245. package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
  246. package/dist/domains/memory/components/observation-detail-view.es.js +4 -5
  247. package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
  248. package/dist/domains/memory/components/thread-context-progress.cjs.js +1 -1
  249. package/dist/domains/memory/components/thread-context-progress.cjs.js.map +1 -1
  250. package/dist/domains/memory/components/thread-context-progress.es.js +1 -1
  251. package/dist/domains/memory/components/thread-context-progress.es.js.map +1 -1
  252. package/dist/domains/memory/lib/timeline.cjs.js +0 -9
  253. package/dist/domains/memory/lib/timeline.cjs.js.map +1 -1
  254. package/dist/domains/memory/lib/timeline.es.js +1 -9
  255. package/dist/domains/memory/lib/timeline.es.js.map +1 -1
  256. package/dist/domains/metrics/components/bar-list.cjs.js +4 -4
  257. package/dist/domains/metrics/components/bar-list.cjs.js.map +1 -1
  258. package/dist/domains/metrics/components/bar-list.es.js +4 -4
  259. package/dist/domains/metrics/components/bar-list.es.js.map +1 -1
  260. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  261. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  262. package/dist/domains/metrics/components/kpi-card-view.cjs.js.map +1 -1
  263. package/dist/domains/metrics/components/kpi-card-view.es.js.map +1 -1
  264. package/dist/domains/metrics/components/memory-card-view.cjs.js +6 -5
  265. package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
  266. package/dist/domains/metrics/components/memory-card-view.es.js +5 -4
  267. package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
  268. package/dist/domains/metrics/components/metrics-utils.cjs.js +0 -15
  269. package/dist/domains/metrics/components/metrics-utils.cjs.js.map +1 -1
  270. package/dist/domains/metrics/components/metrics-utils.es.js +1 -14
  271. package/dist/domains/metrics/components/metrics-utils.es.js.map +1 -1
  272. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +5 -4
  273. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js.map +1 -1
  274. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +3 -2
  275. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js.map +1 -1
  276. package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
  277. package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
  278. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +4 -3
  279. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
  280. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +4 -3
  281. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
  282. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +3 -2
  283. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
  284. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +3 -2
  285. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
  286. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +3 -2
  287. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
  288. package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -3
  289. package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
  290. package/dist/domains/metrics/components.cjs.js +0 -2
  291. package/dist/domains/metrics/components.cjs.js.map +1 -1
  292. package/dist/domains/metrics/components.es.js +1 -1
  293. package/dist/domains/metrics/hooks/use-metrics.cjs.js +3 -3
  294. package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
  295. package/dist/domains/metrics/hooks/use-metrics.es.js +3 -3
  296. package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
  297. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +5 -5
  298. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
  299. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +5 -5
  300. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
  301. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js +6 -7
  302. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js.map +1 -1
  303. package/dist/domains/metrics/hooks/use-scores-metrics.es.js +6 -7
  304. package/dist/domains/metrics/hooks/use-scores-metrics.es.js.map +1 -1
  305. package/dist/domains/metrics/metrics-interval.cjs.js +4 -2
  306. package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -1
  307. package/dist/domains/metrics/metrics-interval.es.js +4 -2
  308. package/dist/domains/metrics/metrics-interval.es.js.map +1 -1
  309. package/dist/domains/metrics.cjs.js +0 -2
  310. package/dist/domains/metrics.cjs.js.map +1 -1
  311. package/dist/domains/metrics.es.js +1 -1
  312. package/dist/domains/traces/components/no-traces-info.cjs.js +3 -4
  313. package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
  314. package/dist/domains/traces/components/no-traces-info.es.js +3 -4
  315. package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
  316. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  317. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  318. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  319. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  320. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  321. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  322. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -2
  323. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  324. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -2
  325. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  326. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
  327. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  328. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
  329. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  330. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  331. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  332. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  333. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  334. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  335. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  336. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
  337. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
  338. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +3 -2
  339. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
  340. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +3 -2
  341. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
  342. package/dist/domains/traces/components/span-summary-description.cjs.js +6 -4
  343. package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -1
  344. package/dist/domains/traces/components/span-summary-description.es.js +7 -5
  345. package/dist/domains/traces/components/span-summary-description.es.js.map +1 -1
  346. package/dist/domains/traces/components/span-timeline-row.cjs.js +3 -4
  347. package/dist/domains/traces/components/span-timeline-row.cjs.js.map +1 -1
  348. package/dist/domains/traces/components/span-timeline-row.es.js +3 -4
  349. package/dist/domains/traces/components/span-timeline-row.es.js.map +1 -1
  350. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +6 -11
  351. package/dist/domains/traces/components/span-timing-hover-card.cjs.js.map +1 -1
  352. package/dist/domains/traces/components/span-timing-hover-card.es.js +6 -11
  353. package/dist/domains/traces/components/span-timing-hover-card.es.js.map +1 -1
  354. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  355. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  356. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
  357. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
  358. package/dist/domains/traces/components/timeline-timing-col.cjs.js +3 -4
  359. package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
  360. package/dist/domains/traces/components/timeline-timing-col.es.js +3 -4
  361. package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
  362. package/dist/domains/traces/components/trace-columns-menu.cjs.js +21 -18
  363. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  364. package/dist/domains/traces/components/trace-columns-menu.es.js +21 -18
  365. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  366. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  367. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  368. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  369. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  370. package/dist/domains/traces/components/trace-span-timeline.cjs.js +10 -4
  371. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  372. package/dist/domains/traces/components/trace-span-timeline.es.js +10 -4
  373. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  374. package/dist/domains/traces/components/trace-span-tree.cjs.js +3 -4
  375. package/dist/domains/traces/components/trace-span-tree.cjs.js.map +1 -1
  376. package/dist/domains/traces/components/trace-span-tree.es.js +3 -4
  377. package/dist/domains/traces/components/trace-span-tree.es.js.map +1 -1
  378. package/dist/domains/traces/components/trace-summary-description.cjs.js +13 -10
  379. package/dist/domains/traces/components/trace-summary-description.cjs.js.map +1 -1
  380. package/dist/domains/traces/components/trace-summary-description.es.js +13 -10
  381. package/dist/domains/traces/components/trace-summary-description.es.js.map +1 -1
  382. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +1 -1
  383. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  384. package/dist/domains/traces/components/traces-list-view.cjs.js +12 -10
  385. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  386. package/dist/domains/traces/components/traces-list-view.es.js +12 -10
  387. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  388. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  389. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  390. package/dist/domains/traces/hooks/use-branch.cjs.js +0 -1
  391. package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
  392. package/dist/domains/traces/hooks/use-branch.es.js +0 -1
  393. package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
  394. package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js +0 -1
  395. package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js.map +1 -1
  396. package/dist/domains/traces/hooks/use-trace-light-spans.es.js +0 -1
  397. package/dist/domains/traces/hooks/use-trace-light-spans.es.js.map +1 -1
  398. package/dist/domains/traces/hooks/use-trace-query.cjs.js +63 -3
  399. package/dist/domains/traces/hooks/use-trace-query.cjs.js.map +1 -1
  400. package/dist/domains/traces/hooks/use-trace-query.es.js +61 -4
  401. package/dist/domains/traces/hooks/use-trace-query.es.js.map +1 -1
  402. package/dist/domains/traces/hooks/use-trace-search.cjs.js +0 -1
  403. package/dist/domains/traces/hooks/use-trace-search.cjs.js.map +1 -1
  404. package/dist/domains/traces/hooks/use-trace-search.es.js +0 -1
  405. package/dist/domains/traces/hooks/use-trace-search.es.js.map +1 -1
  406. package/dist/domains/traces/hooks/use-trace-spans.cjs.js +0 -1
  407. package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
  408. package/dist/domains/traces/hooks/use-trace-spans.es.js +0 -1
  409. package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
  410. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +42 -0
  411. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -0
  412. package/dist/domains/traces/hooks/use-traces-list-source.d.ts +2 -0
  413. package/dist/domains/traces/hooks/use-traces-list-source.es.js +38 -0
  414. package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -0
  415. package/dist/domains/traces/hooks.cjs.js +2 -0
  416. package/dist/domains/traces/hooks.cjs.js.map +1 -1
  417. package/dist/domains/traces/hooks.es.js +1 -0
  418. package/dist/domains/traces/hooks.es.js.map +1 -1
  419. package/dist/domains/traces/trace-filters.cjs.js +10 -1
  420. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  421. package/dist/domains/traces/trace-filters.es.js +10 -1
  422. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  423. package/dist/domains/traces/utils/span-utils.cjs.js +4 -36
  424. package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
  425. package/dist/domains/traces/utils/span-utils.es.js +4 -32
  426. package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
  427. package/dist/domains/traces/utils.cjs.js +1 -1
  428. package/dist/domains/traces/utils.es.js +1 -1
  429. package/dist/domains/traces.cjs.js +3 -1
  430. package/dist/domains/traces.cjs.js.map +1 -1
  431. package/dist/domains/traces.es.js +2 -1
  432. package/dist/domains/traces.es.js.map +1 -1
  433. package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
  434. package/dist/ee/signals/components/entity-index-list.es.js +1 -1
  435. package/dist/ee/signals/components/entity-index-model.cjs.js +3 -2
  436. package/dist/ee/signals/components/entity-index-model.cjs.js.map +1 -1
  437. package/dist/ee/signals/components/entity-index-model.es.js +3 -2
  438. package/dist/ee/signals/components/entity-index-model.es.js.map +1 -1
  439. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -2
  440. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
  441. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +2 -2
  442. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +2 -2
  443. package/dist/ee/signals/signal-formatting.cjs.js +6 -34
  444. package/dist/ee/signals/signal-formatting.cjs.js.map +1 -1
  445. package/dist/ee/signals/signal-formatting.es.js +6 -34
  446. package/dist/ee/signals/signal-formatting.es.js.map +1 -1
  447. package/dist/ee/signals/snapshot-timeline-data.cjs.js +1 -1
  448. package/dist/ee/signals/snapshot-timeline-data.cjs.js.map +1 -1
  449. package/dist/ee/signals/snapshot-timeline-data.es.js +1 -1
  450. package/dist/ee/signals/snapshot-timeline-data.es.js.map +1 -1
  451. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  452. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  453. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  454. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  455. package/dist/field-block-error-msg-Y0fi0HUC.js +22 -0
  456. package/dist/field-block-error-msg-Y0fi0HUC.js.map +1 -0
  457. package/dist/field-block-error-msg-oudJz2Hx.cjs +24 -0
  458. package/dist/field-block-error-msg-oudJz2Hx.cjs.map +1 -0
  459. package/dist/{field-error-id-DyWx33Fu.js → field-error-id-DD7OARLU.js} +2 -13
  460. package/dist/field-error-id-DD7OARLU.js.map +1 -0
  461. package/dist/{field-error-id-6EfqmQ4C.cjs → field-error-id-V_WejsRL.cjs} +4 -15
  462. package/dist/field-error-id-V_WejsRL.cjs.map +1 -0
  463. package/dist/hooks/use-elapsed-time.cjs.js +25 -0
  464. package/dist/hooks/use-elapsed-time.cjs.js.map +1 -0
  465. package/dist/hooks/use-elapsed-time.d.ts +2 -0
  466. package/dist/hooks/use-elapsed-time.es.js +21 -0
  467. package/dist/hooks/use-elapsed-time.es.js.map +1 -0
  468. package/dist/inline-code-BW6W121s.js +13 -0
  469. package/dist/inline-code-BW6W121s.js.map +1 -0
  470. package/dist/inline-code-CSwG-x8D.cjs +15 -0
  471. package/dist/inline-code-CSwG-x8D.cjs.map +1 -0
  472. package/dist/layout/tabbed-container.cjs.js +3 -3
  473. package/dist/layout/tabbed-container.es.js +3 -3
  474. package/dist/{list-search-S1mco9Bl.cjs → list-search-CsYQX8qR.cjs} +2 -2
  475. package/dist/{list-search-S1mco9Bl.cjs.map → list-search-CsYQX8qR.cjs.map} +1 -1
  476. package/dist/{list-search-FJ1O5F3S.js → list-search-D1FD8FCL.js} +2 -2
  477. package/dist/{list-search-FJ1O5F3S.js.map → list-search-D1FD8FCL.js.map} +1 -1
  478. package/dist/{logs-data-list-CgDcNIvS.js → logs-data-list-BKE5vYZR.js} +3 -3
  479. package/dist/{logs-data-list-CgDcNIvS.js.map → logs-data-list-BKE5vYZR.js.map} +1 -1
  480. package/dist/{logs-data-list-BHvJOeec.cjs → logs-data-list-lJK0yGYj.cjs} +3 -3
  481. package/dist/{logs-data-list-BHvJOeec.cjs.map → logs-data-list-lJK0yGYj.cjs.map} +1 -1
  482. package/dist/new/settings.cjs.js +2 -2
  483. package/dist/new/settings.es.js +2 -2
  484. package/dist/{schemes-C9EhSOkB.js → schemes-CGK3gQJ6.js} +2 -2
  485. package/dist/{schemes-C9EhSOkB.js.map → schemes-CGK3gQJ6.js.map} +1 -1
  486. package/dist/{search-field-block-fU3tStmB.js → search-field-block-Dj2KJyjQ.js} +2 -2
  487. package/dist/{search-field-block-fU3tStmB.js.map → search-field-block-Dj2KJyjQ.js.map} +1 -1
  488. package/dist/{search-field-block-7-ufp4uG.cjs → search-field-block-K_e_S9WY.cjs} +2 -2
  489. package/dist/{search-field-block-7-ufp4uG.cjs.map → search-field-block-K_e_S9WY.cjs.map} +1 -1
  490. package/dist/{section-B9OLuEq3.js → section-Bi0g7cn6.js} +2 -2
  491. package/dist/{section-B9OLuEq3.js.map → section-Bi0g7cn6.js.map} +1 -1
  492. package/dist/{section-CTihfzmc.cjs → section-p9vCSmPq.cjs} +2 -2
  493. package/dist/{section-CTihfzmc.cjs.map → section-p9vCSmPq.cjs.map} +1 -1
  494. package/dist/{select-field-block-BfiHq9t6.js → select-field-block-BF8v698d.js} +2 -2
  495. package/dist/{select-field-block-BfiHq9t6.js.map → select-field-block-BF8v698d.js.map} +1 -1
  496. package/dist/{select-field-block-DJo2cX9Y.cjs → select-field-block-CaGjpIKM.cjs} +2 -2
  497. package/dist/{select-field-block-DJo2cX9Y.cjs.map → select-field-block-CaGjpIKM.cjs.map} +1 -1
  498. package/dist/{settings-row-BoAuUUuH.cjs → settings-row-Cr8gaO5a.cjs} +14 -4
  499. package/dist/settings-row-Cr8gaO5a.cjs.map +1 -0
  500. package/dist/{settings-row-B2IekRyH.js → settings-row-Cr9DsBSX.js} +14 -4
  501. package/dist/settings-row-Cr9DsBSX.js.map +1 -0
  502. package/dist/{span-payload-primitives-Buq9V8nK.js → span-payload-primitives-Dmzm3mb2.js} +2 -2
  503. package/dist/{span-payload-primitives-Buq9V8nK.js.map → span-payload-primitives-Dmzm3mb2.js.map} +1 -1
  504. package/dist/{span-payload-primitives-CjlNH9C-.cjs → span-payload-primitives-Dq8WqqNm.cjs} +2 -2
  505. package/dist/{span-payload-primitives-CjlNH9C-.cjs.map → span-payload-primitives-Dq8WqqNm.cjs.map} +1 -1
  506. package/dist/src/domains/capabilities/hooks/index.d.ts +3 -0
  507. package/dist/src/domains/capabilities/hooks/use-feedback-available.d.ts +8 -0
  508. package/dist/src/domains/capabilities/hooks/use-observability-capabilities.d.ts +22 -0
  509. package/dist/src/domains/capabilities/hooks/use-trace-query-available.d.ts +8 -0
  510. package/dist/src/domains/capabilities/index.d.ts +1 -0
  511. package/dist/src/domains/chat/messages/reasoning.d.ts +3 -1
  512. package/dist/src/domains/chat/messages/renderers/reasoning-part-renderer.d.ts +3 -1
  513. package/dist/src/domains/chat/stories/reasoning.stories.d.ts +1 -1
  514. package/dist/src/domains/memory/lib/timeline.d.ts +0 -1
  515. package/dist/src/domains/metrics/components/index.d.ts +1 -1
  516. package/dist/src/domains/metrics/components/kpi-card-view.d.ts +2 -1
  517. package/dist/src/domains/metrics/components/metrics-utils.d.ts +0 -2
  518. package/dist/src/domains/traces/components/trace-columns-menu.d.ts +3 -1
  519. package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +1 -1
  520. package/dist/src/domains/traces/hooks/index.d.ts +1 -0
  521. package/dist/src/domains/traces/hooks/use-trace-query.d.ts +19 -2
  522. package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +46 -0
  523. package/dist/src/domains/traces/trace-filters.d.ts +6 -1
  524. package/dist/src/domains/traces/utils/index.d.ts +1 -1
  525. package/dist/src/domains/traces/utils/span-utils.d.ts +1 -6
  526. package/dist/src/ds/components/Card/Card.d.ts +2 -2
  527. package/dist/src/ds/components/CompactNumber/compact-number.d.ts +6 -0
  528. package/dist/src/ds/components/CompactNumber/compact-number.stories.d.ts +7 -0
  529. package/dist/src/ds/components/CompactNumber/index.d.ts +1 -0
  530. package/dist/src/ds/components/DataList/data-list-cells.d.ts +4 -3
  531. package/dist/src/ds/components/InlineCode/index.d.ts +1 -0
  532. package/dist/src/ds/components/InlineCode/inline-code.d.ts +3 -0
  533. package/dist/src/ds/components/InlineCode/inline-code.stories.d.ts +13 -0
  534. package/dist/src/ds/components/ItemList/item-list-date-cell.d.ts +3 -2
  535. package/dist/src/ds/components/RelativeTimestamp/index.d.ts +1 -0
  536. package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.d.ts +6 -0
  537. package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.stories.d.ts +7 -0
  538. package/dist/src/ds/components/StatusIndicators/status-dot-styles.d.ts +31 -2
  539. package/dist/src/ds/components/StatusIndicators/status-dot.stories.d.ts +3 -4
  540. package/dist/src/ds/components/StatusIndicators/status.d.ts +2 -3
  541. package/dist/src/ds/components/StatusIndicators/status.stories.d.ts +2 -1
  542. package/dist/src/ds/components/Txt/Txt.d.ts +5 -1
  543. package/dist/src/ds/new/settings/settings-row.d.ts +3 -1
  544. package/dist/src/ds/new/settings/settings.stories.d.ts +1 -0
  545. package/dist/src/hooks/stories/state/use-elapsed-time.stories.d.ts +17 -0
  546. package/dist/src/hooks/use-elapsed-time.d.ts +2 -0
  547. package/dist/src/lib/cost.d.ts +6 -0
  548. package/dist/src/utils/cost.d.ts +1 -0
  549. package/dist/src/utils/date-format.d.ts +28 -0
  550. package/dist/src/utils/duration.d.ts +7 -1
  551. package/dist/src/utils/relative-time.d.ts +7 -0
  552. package/dist/style.css +25 -4
  553. package/dist/{text-field-block-DGIM1i3Z.js → text-field-block-BYPiO9h4.js} +2 -2
  554. package/dist/{text-field-block-DGIM1i3Z.js.map → text-field-block-BYPiO9h4.js.map} +1 -1
  555. package/dist/{text-field-block-DePCgDOh.cjs → text-field-block-CRh8sRXP.cjs} +2 -2
  556. package/dist/{text-field-block-DePCgDOh.cjs.map → text-field-block-CRh8sRXP.cjs.map} +1 -1
  557. package/dist/{tool-call-Bs-9Cah5.js → tool-call-CIeNEYpK.js} +2 -2
  558. package/dist/{tool-call-Bs-9Cah5.js.map → tool-call-CIeNEYpK.js.map} +1 -1
  559. package/dist/{tool-call-C0JeHe8Z.cjs → tool-call-CnEm3eE0.cjs} +2 -2
  560. package/dist/{tool-call-C0JeHe8Z.cjs.map → tool-call-CnEm3eE0.cjs.map} +1 -1
  561. package/dist/{traces-data-list-D3k50j4n.cjs → traces-data-list-C5KZesk6.cjs} +4 -4
  562. package/dist/{traces-data-list-D3k50j4n.cjs.map → traces-data-list-C5KZesk6.cjs.map} +1 -1
  563. package/dist/{traces-data-list-B5MkMMBi.js → traces-data-list-CdWW9J6z.js} +4 -4
  564. package/dist/{traces-data-list-B5MkMMBi.js.map → traces-data-list-CdWW9J6z.js.map} +1 -1
  565. package/dist/utils/cost.cjs.js +40 -0
  566. package/dist/utils/cost.cjs.js.map +1 -0
  567. package/dist/utils/cost.d.ts +2 -0
  568. package/dist/utils/cost.es.js +34 -0
  569. package/dist/utils/cost.es.js.map +1 -0
  570. package/dist/utils/date-format.cjs.js +99 -0
  571. package/dist/utils/date-format.cjs.js.map +1 -0
  572. package/dist/utils/date-format.d.ts +2 -0
  573. package/dist/utils/date-format.es.js +91 -0
  574. package/dist/utils/date-format.es.js.map +1 -0
  575. package/dist/utils/duration.cjs.js +19 -2
  576. package/dist/utils/duration.cjs.js.map +1 -1
  577. package/dist/utils/duration.es.js +18 -3
  578. package/dist/utils/duration.es.js.map +1 -1
  579. package/dist/utils/file.es.js +2 -2
  580. package/dist/utils/relative-time.cjs.js +12 -0
  581. package/dist/utils/relative-time.cjs.js.map +1 -0
  582. package/dist/utils/relative-time.d.ts +2 -0
  583. package/dist/utils/relative-time.es.js +8 -0
  584. package/dist/utils/relative-time.es.js.map +1 -0
  585. package/package.json +8 -8
  586. package/dist/Txt-B4-2nLaI.cjs.map +0 -1
  587. package/dist/Txt-DTh3Pa_a.js.map +0 -1
  588. package/dist/data-list-top-DpbOA3uw.js.map +0 -1
  589. package/dist/data-list-top-WGUY167p.cjs.map +0 -1
  590. package/dist/field-error-id-6EfqmQ4C.cjs.map +0 -1
  591. package/dist/field-error-id-DyWx33Fu.js.map +0 -1
  592. package/dist/settings-row-B2IekRyH.js.map +0 -1
  593. package/dist/settings-row-BoAuUUuH.cjs.map +0 -1
  594. package/dist/src/ds/components/Table/utils.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"bar-list.es.js","sources":["../../../../src/domains/metrics/components/bar-list.tsx"],"sourcesContent":["import { Tooltip, TooltipContent, TooltipTrigger } from '../../../ds/components/Tooltip';\nimport { CHART_COLORS } from './metrics-utils';\n\nexport function BarListContent({\n data,\n maxVal,\n fmt,\n color,\n valueLabel,\n legend,\n}: {\n data: Array<{ name: string; value: number }>;\n maxVal: number;\n fmt: (v: number) => string;\n color: string;\n valueLabel?: string;\n legend?: Array<{ color: string; label: string }>;\n}) {\n const sorted = [...data].sort((a, b) => b.value - a.value);\n return (\n <div>\n <div className=\"mb-2 flex items-center gap-3\">\n <div className=\"flex flex-1 items-center gap-4\">\n {legend?.map(l => (\n <div key={l.label} className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: l.color }} />\n <span className=\"text-caption text-placeholder\">{l.label}</span>\n </div>\n ))}\n </div>\n {valueLabel && <span className=\"shrink-0 text-caption text-placeholder\">{valueLabel}</span>}\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const pct = Math.min(Math.max(maxVal > 0 ? (d.value / maxVal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative h-7 flex-1\">\n <div\n className=\"absolute inset-y-0 left-0 rounded\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n <span className=\"absolute inset-y-0 left-2 flex items-center text-caption whitespace-nowrap text-white\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 font-mono text-caption text-foreground tabular-nums\">{fmt(d.value)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function StackedRunsBars({ data }: { data: Array<{ name: string; completed: number; errors: number }> }) {\n const sorted = [...data].sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n const maxTotal = Math.max(...sorted.map(d => d.completed + d.errors));\n return (\n <div>\n <div className=\"mb-2 flex items-center gap-3\">\n <div className=\"flex flex-1 items-center gap-4\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.blue }} />\n <span className=\"text-caption text-placeholder\">Completed</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.red }} />\n <span className=\"text-caption text-placeholder\">Errors</span>\n </div>\n </div>\n <span className=\"shrink-0 text-caption text-placeholder\">Total (Success)</span>\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const total = d.completed + d.errors;\n const successPct = total > 0 ? ((d.completed / total) * 100).toFixed(1) : '0.0';\n const completedWidth = Math.min(Math.max(maxTotal > 0 ? (d.completed / maxTotal) * 100 : 0, 0), 100);\n const errorsWidth = Math.min(Math.max(maxTotal > 0 ? (d.errors / maxTotal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative h-7 flex-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.completed.toLocaleString()} completed`}\n tabIndex={0}\n className=\"absolute inset-y-0 left-0 cursor-default rounded-l\"\n style={{ width: `${completedWidth}%`, backgroundColor: CHART_COLORS.blue }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.completed.toLocaleString()} completed\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.errors.toLocaleString()} errors`}\n tabIndex={0}\n className=\"absolute inset-y-0 cursor-default rounded-r\"\n style={{\n left: `${completedWidth}%`,\n width: `${errorsWidth}%`,\n backgroundColor: CHART_COLORS.red,\n }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.errors.toLocaleString()} errors\n </TooltipContent>\n </Tooltip>\n <span className=\"pointer-events-none absolute inset-y-0 left-2 flex items-center text-caption whitespace-nowrap text-white\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 font-mono text-caption text-foreground tabular-nums\">\n {total.toLocaleString()} ({successPct}%)\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bar-list.es.js","sources":["../../../../src/domains/metrics/components/bar-list.tsx"],"sourcesContent":["import { Tooltip, TooltipContent, TooltipTrigger } from '../../../ds/components/Tooltip';\nimport { CHART_COLORS } from './metrics-utils';\n\nexport function BarListContent({\n data,\n maxVal,\n fmt,\n color,\n valueLabel,\n legend,\n}: {\n data: Array<{ name: string; value: number }>;\n maxVal: number;\n fmt: (v: number) => string;\n color: string;\n valueLabel?: string;\n legend?: Array<{ color: string; label: string }>;\n}) {\n const sorted = [...data].sort((a, b) => b.value - a.value);\n return (\n <div>\n <div className=\"mb-2 flex items-center gap-3\">\n <div className=\"flex flex-1 items-center gap-4\">\n {legend?.map(l => (\n <div key={l.label} className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: l.color }} />\n <span className=\"text-caption text-placeholder\">{l.label}</span>\n </div>\n ))}\n </div>\n {valueLabel && <span className=\"shrink-0 text-caption text-placeholder\">{valueLabel}</span>}\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const pct = Math.min(Math.max(maxVal > 0 ? (d.value / maxVal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative h-7 flex-1\">\n <div\n className=\"absolute inset-y-0 left-0 rounded\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n <span className=\"absolute inset-y-0 left-2 flex items-center text-caption whitespace-nowrap text-white\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-caption text-foreground tabular-nums\">{fmt(d.value)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function StackedRunsBars({ data }: { data: Array<{ name: string; completed: number; errors: number }> }) {\n const sorted = [...data].sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n const maxTotal = Math.max(...sorted.map(d => d.completed + d.errors));\n return (\n <div>\n <div className=\"mb-2 flex items-center gap-3\">\n <div className=\"flex flex-1 items-center gap-4\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.blue }} />\n <span className=\"text-caption text-placeholder\">Completed</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.red }} />\n <span className=\"text-caption text-placeholder\">Errors</span>\n </div>\n </div>\n <span className=\"shrink-0 text-caption text-placeholder\">Total (Success)</span>\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const total = d.completed + d.errors;\n const successPct = total > 0 ? ((d.completed / total) * 100).toFixed(1) : '0.0';\n const completedWidth = Math.min(Math.max(maxTotal > 0 ? (d.completed / maxTotal) * 100 : 0, 0), 100);\n const errorsWidth = Math.min(Math.max(maxTotal > 0 ? (d.errors / maxTotal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative h-7 flex-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.completed.toLocaleString()} completed`}\n tabIndex={0}\n className=\"absolute inset-y-0 left-0 cursor-default rounded-l\"\n style={{ width: `${completedWidth}%`, backgroundColor: CHART_COLORS.blue }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\">{d.completed.toLocaleString()} completed</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.errors.toLocaleString()} errors`}\n tabIndex={0}\n className=\"absolute inset-y-0 cursor-default rounded-r\"\n style={{\n left: `${completedWidth}%`,\n width: `${errorsWidth}%`,\n backgroundColor: CHART_COLORS.red,\n }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\">{d.errors.toLocaleString()} errors</TooltipContent>\n </Tooltip>\n <span className=\"pointer-events-none absolute inset-y-0 left-2 flex items-center text-caption whitespace-nowrap text-white\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-caption text-foreground tabular-nums\">\n {total.toLocaleString()} ({successPct}%)\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const React = require('react');
7
- const dateTimeRangePicker = require('../../../date-time-range-picker-BCzvSYx3.cjs');
7
+ const dateTimeRangePicker = require('../../../date-time-range-picker-sT5qAW-_.cjs');
8
8
  const domains_metrics_hooks_useMetrics = require('../hooks/use-metrics.cjs.js');
9
9
 
10
10
  const METRICS_PRESETS = [
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useRef } from 'react';
3
- import { D as DateTimeRangePicker } from '../../../date-time-range-picker-C-t3Kdpk.js';
3
+ import { D as DateTimeRangePicker } from '../../../date-time-range-picker-Bnviv7s-.js';
4
4
  import { useMetrics } from '../hooks/use-metrics.es.js';
5
5
 
6
6
  const METRICS_PRESETS = [
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/kpi-card-view.tsx"],"sourcesContent":["import { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: string | null;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n /** Treat a decrease as a good change (e.g. cost, latency). */\n lowerIsBetter?: boolean;\n}\n\nexport function KpiCardView({\n label,\n value,\n prevValue,\n changePct,\n isLoading,\n isError,\n lowerIsBetter,\n}: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.ValueRow>\n {hasData ? <MetricsKpiCard.Value>{value}</MetricsKpiCard.Value> : null}\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null && changePct !== 0 ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} lowerIsBetter={lowerIsBetter} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard.ValueRow>\n </MetricsKpiCard>\n );\n}\n"],"names":["MetricsKpiCard","jsx","jsxs"],"mappings":";;;;;;;AAaO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAU,KAAA,IAAS,IAAA;AACzB,EAAA,uCACGA,6BAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7BE,eAAA,CAACF,6BAAA,CAAe,QAAA,EAAf,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAUC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAsB,iBAAM,CAAA,GAA0B,IAAA;AAAA,MACjE,OAAA,mBACCC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAqB,CAAA,GACpB,SAAA,mBACFC,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAuB,CAAA,GACtB,OAAA,GACF,aAAa,IAAA,IAAQ,SAAA,KAAc,CAAA,mBACjCC,cAAA,CAACD,6BAAA,CAAe,MAAA,EAAf,EAAsB,SAAA,EAAsB,WAAsB,aAAA,EAA8B,CAAA,mBAEjGC,cAAA,CAACD,6BAAA,CAAe,UAAf,EAAwB,CAAA,mBAG3BC,cAAA,CAACD,6BAAA,CAAe,QAAf,EAAsB;AAAA,KAAA,EAE3B;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"kpi-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/kpi-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: ReactNode;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n /** Treat a decrease as a good change (e.g. cost, latency). */\n lowerIsBetter?: boolean;\n}\n\nexport function KpiCardView({\n label,\n value,\n prevValue,\n changePct,\n isLoading,\n isError,\n lowerIsBetter,\n}: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.ValueRow>\n {hasData ? <MetricsKpiCard.Value>{value}</MetricsKpiCard.Value> : null}\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null && changePct !== 0 ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} lowerIsBetter={lowerIsBetter} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard.ValueRow>\n </MetricsKpiCard>\n );\n}\n"],"names":["MetricsKpiCard","jsx","jsxs"],"mappings":";;;;;;;AAcO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAU,KAAA,IAAS,IAAA;AACzB,EAAA,uCACGA,6BAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7BE,eAAA,CAACF,6BAAA,CAAe,QAAA,EAAf,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAUC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAsB,iBAAM,CAAA,GAA0B,IAAA;AAAA,MACjE,OAAA,mBACCC,cAAA,CAACD,6BAAA,CAAe,KAAA,EAAf,EAAqB,CAAA,GACpB,SAAA,mBACFC,cAAA,CAACD,6BAAA,CAAe,OAAA,EAAf,EAAuB,CAAA,GACtB,OAAA,GACF,aAAa,IAAA,IAAQ,SAAA,KAAc,CAAA,mBACjCC,cAAA,CAACD,6BAAA,CAAe,MAAA,EAAf,EAAsB,SAAA,EAAsB,WAAsB,aAAA,EAA8B,CAAA,mBAEjGC,cAAA,CAACD,6BAAA,CAAe,UAAf,EAAwB,CAAA,mBAG3BC,cAAA,CAACD,6BAAA,CAAe,QAAf,EAAsB;AAAA,KAAA,EAE3B;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-card-view.es.js","sources":["../../../../src/domains/metrics/components/kpi-card-view.tsx"],"sourcesContent":["import { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: string | null;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n /** Treat a decrease as a good change (e.g. cost, latency). */\n lowerIsBetter?: boolean;\n}\n\nexport function KpiCardView({\n label,\n value,\n prevValue,\n changePct,\n isLoading,\n isError,\n lowerIsBetter,\n}: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.ValueRow>\n {hasData ? <MetricsKpiCard.Value>{value}</MetricsKpiCard.Value> : null}\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null && changePct !== 0 ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} lowerIsBetter={lowerIsBetter} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard.ValueRow>\n </MetricsKpiCard>\n );\n}\n"],"names":[],"mappings":";;;AAaO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAU,KAAA,IAAS,IAAA;AACzB,EAAA,4BACG,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7B,IAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAU,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAsB,iBAAM,CAAA,GAA0B,IAAA;AAAA,MACjE,OAAA,mBACC,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,CAAA,GACpB,SAAA,mBACF,GAAA,CAAC,cAAA,CAAe,OAAA,EAAf,EAAuB,CAAA,GACtB,OAAA,GACF,aAAa,IAAA,IAAQ,SAAA,KAAc,CAAA,mBACjC,GAAA,CAAC,cAAA,CAAe,MAAA,EAAf,EAAsB,SAAA,EAAsB,WAAsB,aAAA,EAA8B,CAAA,mBAEjG,GAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,CAAA,mBAG3B,GAAA,CAAC,cAAA,CAAe,QAAf,EAAsB;AAAA,KAAA,EAE3B;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"kpi-card-view.es.js","sources":["../../../../src/domains/metrics/components/kpi-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: ReactNode;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n /** Treat a decrease as a good change (e.g. cost, latency). */\n lowerIsBetter?: boolean;\n}\n\nexport function KpiCardView({\n label,\n value,\n prevValue,\n changePct,\n isLoading,\n isError,\n lowerIsBetter,\n}: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.ValueRow>\n {hasData ? <MetricsKpiCard.Value>{value}</MetricsKpiCard.Value> : null}\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null && changePct !== 0 ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} lowerIsBetter={lowerIsBetter} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard.ValueRow>\n </MetricsKpiCard>\n );\n}\n"],"names":[],"mappings":";;;AAcO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAU,KAAA,IAAS,IAAA;AACzB,EAAA,4BACG,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7B,IAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,mBAAU,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAsB,iBAAM,CAAA,GAA0B,IAAA;AAAA,MACjE,OAAA,mBACC,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,CAAA,GACpB,SAAA,mBACF,GAAA,CAAC,cAAA,CAAe,OAAA,EAAf,EAAuB,CAAA,GACtB,OAAA,GACF,aAAa,IAAA,IAAQ,SAAA,KAAc,CAAA,mBACjC,GAAA,CAAC,cAAA,CAAe,MAAA,EAAf,EAAsB,SAAA,EAAsB,WAAsB,aAAA,EAA8B,CAAA,mBAEjG,GAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,CAAA,mBAG3B,GAAA,CAAC,cAAA,CAAe,QAAf,EAAsB;AAAA,KAAA,EAE3B;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -4,12 +4,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const React = require('react');
7
- const dataList = require('../../../data-list-PwFpP_mo.cjs');
7
+ const dataList = require('../../../data-list-RI8c32dk.cjs');
8
8
  const metricsCard = require('../../../metrics-card-DzcVJTAN.cjs');
9
9
  const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
10
10
  const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
11
11
  const tabsTab = require('../../../tabs-tab-DFmRMdi3.cjs');
12
12
  const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
13
+ const utils_cost = require('../../../utils/cost.cjs.js');
13
14
 
14
15
  function isMemoryTab(value) {
15
16
  return value === "threads" || value === "resources";
@@ -70,8 +71,8 @@ function MemoryCardView({
70
71
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, { className: "text-caption", children: shortId(row.threadId) }),
71
72
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.resourceId ? shortId(row.resourceId) : "—" }),
72
73
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.runs.toLocaleString() }),
73
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? domains_metrics_components_metricsUtils.formatCompact(row.tokens) : "—" }),
74
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cost != null ? domains_metrics_components_metricsUtils.formatCost(row.cost, row.costUnit) : "—" })
74
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? utils_cost.formatCompactNumber(row.tokens) : "—" }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cost != null ? utils_cost.formatCost(row.cost, row.costUnit) : "—" })
75
76
  ] });
76
77
  return href ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowLink, { to: href, LinkComponent, children: rowCells }, row.key) : /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowStatic, { children: rowCells }, row.key);
77
78
  })
@@ -88,8 +89,8 @@ function MemoryCardView({
88
89
  const rowCells = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
89
90
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowHeaderCell, { className: "text-caption", children: shortId(row.resourceId) }),
90
91
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.threadCount.toLocaleString() }),
91
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? domains_metrics_components_metricsUtils.formatCompact(row.tokens) : "—" }),
92
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cost != null ? domains_metrics_components_metricsUtils.formatCost(row.cost, row.costUnit) : "—" })
92
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.tokens > 0 ? utils_cost.formatCompactNumber(row.tokens) : "—" }),
93
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cost != null ? utils_cost.formatCost(row.cost, row.costUnit) : "—" })
93
94
  ] });
94
95
  return href ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowLink, { to: href, LinkComponent, children: rowCells }, row.key) : /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowStatic, { children: rowCells }, row.key);
95
96
  })
@@ -1 +1 @@
1
- {"version":3,"file":"memory-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\" className=\"pt-3\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\" className=\"pt-3\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["useState","MetricsCard","jsxs","jsx","Tabs","TabList","Tab","TabContent","DataList","METRICS_DATA_LIST_PROPS","Fragment","formatCompact","formatCost"],"mappings":"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"}
1
+ {"version":3,"file":"memory-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { METRICS_DATA_LIST_PROPS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\" className=\"pt-3\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.tokens > 0 ? formatCompactNumber(row.tokens) : '—'}\n </DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\" className=\"pt-3\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.tokens > 0 ? formatCompactNumber(row.tokens) : '—'}\n </DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["useState","MetricsCard","jsxs","jsx","Tabs","TabList","Tab","TabContent","DataList","METRICS_DATA_LIST_PROPS","Fragment","formatCompactNumber","formatCost"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useState } from 'react';
3
- import { D as DataList } from '../../../data-list-DisTjDHP.js';
3
+ import { D as DataList } from '../../../data-list-5-nRJbEO.js';
4
4
  import { M as MetricsCard } from '../../../metrics-card-C2RTi5Ew.js';
5
5
  import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
6
6
  import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
7
7
  import { T as Tab } from '../../../tabs-tab-DluwCnDF.js';
8
- import { METRICS_DATA_LIST_PROPS, formatCompact, formatCost } from './metrics-utils.es.js';
8
+ import { METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
9
+ import { formatCompactNumber, formatCost } from '../../../utils/cost.es.js';
9
10
 
10
11
  function isMemoryTab(value) {
11
12
  return value === "threads" || value === "resources";
@@ -66,7 +67,7 @@ function MemoryCardView({
66
67
  /* @__PURE__ */ jsx(DataList.RowHeaderCell, { className: "text-caption", children: shortId(row.threadId) }),
67
68
  /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.resourceId ? shortId(row.resourceId) : "—" }),
68
69
  /* @__PURE__ */ jsx(DataList.NumberCell, { highlight: true, children: row.runs.toLocaleString() }),
69
- /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.tokens > 0 ? formatCompact(row.tokens) : "—" }),
70
+ /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.tokens > 0 ? formatCompactNumber(row.tokens) : "—" }),
70
71
  /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.cost != null ? formatCost(row.cost, row.costUnit) : "—" })
71
72
  ] });
72
73
  return href ? /* @__PURE__ */ jsx(DataList.RowLink, { to: href, LinkComponent, children: rowCells }, row.key) : /* @__PURE__ */ jsx(DataList.RowStatic, { children: rowCells }, row.key);
@@ -84,7 +85,7 @@ function MemoryCardView({
84
85
  const rowCells = /* @__PURE__ */ jsxs(Fragment, { children: [
85
86
  /* @__PURE__ */ jsx(DataList.RowHeaderCell, { className: "text-caption", children: shortId(row.resourceId) }),
86
87
  /* @__PURE__ */ jsx(DataList.NumberCell, { highlight: true, children: row.threadCount.toLocaleString() }),
87
- /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.tokens > 0 ? formatCompact(row.tokens) : "—" }),
88
+ /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.tokens > 0 ? formatCompactNumber(row.tokens) : "—" }),
88
89
  /* @__PURE__ */ jsx(DataList.NumberCell, { children: row.cost != null ? formatCost(row.cost, row.costUnit) : "—" })
89
90
  ] });
90
91
  return href ? /* @__PURE__ */ jsx(DataList.RowLink, { to: href, LinkComponent, children: rowCells }, row.key) : /* @__PURE__ */ jsx(DataList.RowStatic, { children: rowCells }, row.key);
@@ -1 +1 @@
1
- {"version":3,"file":"memory-card-view.es.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\" className=\"pt-3\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\" className=\"pt-3\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-card-view.es.js","sources":["../../../../src/domains/metrics/components/memory-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { METRICS_DATA_LIST_PROPS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\" className=\"pt-3\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.tokens > 0 ? formatCompactNumber(row.tokens) : '—'}\n </DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\" className=\"pt-3\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.tokens > 0 ? formatCompactNumber(row.tokens) : '—'}\n </DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -2,19 +2,6 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const compactNumberFormatter = new Intl.NumberFormat("en-US", {
6
- notation: "compact",
7
- maximumSignificantDigits: 3
8
- });
9
- function formatCompact(n) {
10
- return compactNumberFormatter.format(n).replace("K", "k");
11
- }
12
- function formatCost(value, unit) {
13
- if (unit?.toLowerCase() === "usd" || !unit) {
14
- return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;
15
- }
16
- return `${value.toFixed(4)} ${unit}`;
17
- }
18
5
  const METRICS_DATA_LIST_PROPS = {
19
6
  className: "max-h-80",
20
7
  mask: { left: false }
@@ -32,6 +19,4 @@ const CHART_COLORS = {
32
19
 
33
20
  exports.CHART_COLORS = CHART_COLORS;
34
21
  exports.METRICS_DATA_LIST_PROPS = METRICS_DATA_LIST_PROPS;
35
- exports.formatCompact = formatCompact;
36
- exports.formatCost = formatCost;
37
22
  //# sourceMappingURL=metrics-utils.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-utils.cjs.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nconst compactNumberFormatter = new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumSignificantDigits: 3,\n});\n\nexport function formatCompact(n: number): string {\n return compactNumberFormatter.format(n).replace('K', 'k');\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n} satisfies Pick<DataListRootProps, 'className' | 'mask'>;\n\nexport const CHART_COLORS = {\n green: 'var(--chart-green)',\n orange: 'var(--chart-orange)',\n pink: 'var(--chart-pink)',\n purple: 'var(--chart-purple)',\n blue: 'var(--chart-blue)',\n blueDark: 'var(--chart-blue-deep)',\n red: 'var(--chart-red)',\n yellow: 'var(--chart-yellow)',\n} as const;\n"],"names":[],"mappings":";;;;AAEA,MAAM,sBAAA,GAAyB,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,EAC5D,QAAA,EAAU,SAAA;AAAA,EACV,wBAAA,EAA0B;AAC5B,CAAC,CAAA;AAEM,SAAS,cAAc,CAAA,EAAmB;AAC/C,EAAA,OAAO,uBAAuB,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC1D;AAEO,SAAS,UAAA,CAAW,OAAe,IAAA,EAA8B;AACtE,EAAA,IAAI,IAAA,EAAM,WAAA,EAAY,KAAM,KAAA,IAAS,CAAC,IAAA,EAAM;AAC1C,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,GAAQ,IAAA,IAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,IAAI,IAAI,CAAA,CAAA;AACpC;AAEO,MAAM,uBAAA,GAA0B;AAAA,EACrC,SAAA,EAAW,UAAA;AAAA,EACX,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA;AAChB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,oBAAA;AAAA,EACP,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,wBAAA;AAAA,EACV,GAAA,EAAK,kBAAA;AAAA,EACL,MAAA,EAAQ;AACV;;;;;;;"}
1
+ {"version":3,"file":"metrics-utils.cjs.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n} satisfies Pick<DataListRootProps, 'className' | 'mask'>;\n\nexport const CHART_COLORS = {\n green: 'var(--chart-green)',\n orange: 'var(--chart-orange)',\n pink: 'var(--chart-pink)',\n purple: 'var(--chart-purple)',\n blue: 'var(--chart-blue)',\n blueDark: 'var(--chart-blue-deep)',\n red: 'var(--chart-red)',\n yellow: 'var(--chart-yellow)',\n} as const;\n"],"names":[],"mappings":";;;;AAEO,MAAM,uBAAA,GAA0B;AAAA,EACrC,SAAA,EAAW,UAAA;AAAA,EACX,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA;AAChB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,oBAAA;AAAA,EACP,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,wBAAA;AAAA,EACV,GAAA,EAAK,kBAAA;AAAA,EACL,MAAA,EAAQ;AACV;;;;;"}
@@ -1,16 +1,3 @@
1
- const compactNumberFormatter = new Intl.NumberFormat("en-US", {
2
- notation: "compact",
3
- maximumSignificantDigits: 3
4
- });
5
- function formatCompact(n) {
6
- return compactNumberFormatter.format(n).replace("K", "k");
7
- }
8
- function formatCost(value, unit) {
9
- if (unit?.toLowerCase() === "usd" || !unit) {
10
- return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;
11
- }
12
- return `${value.toFixed(4)} ${unit}`;
13
- }
14
1
  const METRICS_DATA_LIST_PROPS = {
15
2
  className: "max-h-80",
16
3
  mask: { left: false }
@@ -26,5 +13,5 @@ const CHART_COLORS = {
26
13
  yellow: "var(--chart-yellow)"
27
14
  };
28
15
 
29
- export { CHART_COLORS, METRICS_DATA_LIST_PROPS, formatCompact, formatCost };
16
+ export { CHART_COLORS, METRICS_DATA_LIST_PROPS };
30
17
  //# sourceMappingURL=metrics-utils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-utils.es.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nconst compactNumberFormatter = new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumSignificantDigits: 3,\n});\n\nexport function formatCompact(n: number): string {\n return compactNumberFormatter.format(n).replace('K', 'k');\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n} satisfies Pick<DataListRootProps, 'className' | 'mask'>;\n\nexport const CHART_COLORS = {\n green: 'var(--chart-green)',\n orange: 'var(--chart-orange)',\n pink: 'var(--chart-pink)',\n purple: 'var(--chart-purple)',\n blue: 'var(--chart-blue)',\n blueDark: 'var(--chart-blue-deep)',\n red: 'var(--chart-red)',\n yellow: 'var(--chart-yellow)',\n} as const;\n"],"names":[],"mappings":"AAEA,MAAM,sBAAA,GAAyB,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS;AAAA,EAC5D,QAAA,EAAU,SAAA;AAAA,EACV,wBAAA,EAA0B;AAC5B,CAAC,CAAA;AAEM,SAAS,cAAc,CAAA,EAAmB;AAC/C,EAAA,OAAO,uBAAuB,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC1D;AAEO,SAAS,UAAA,CAAW,OAAe,IAAA,EAA8B;AACtE,EAAA,IAAI,IAAA,EAAM,WAAA,EAAY,KAAM,KAAA,IAAS,CAAC,IAAA,EAAM;AAC1C,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,GAAQ,IAAA,IAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,EAC5E;AACA,EAAA,OAAO,GAAG,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,IAAI,IAAI,CAAA,CAAA;AACpC;AAEO,MAAM,uBAAA,GAA0B;AAAA,EACrC,SAAA,EAAW,UAAA;AAAA,EACX,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA;AAChB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,oBAAA;AAAA,EACP,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,wBAAA;AAAA,EACV,GAAA,EAAK,kBAAA;AAAA,EACL,MAAA,EAAQ;AACV;;;;"}
1
+ {"version":3,"file":"metrics-utils.es.js","sources":["../../../../src/domains/metrics/components/metrics-utils.ts"],"sourcesContent":["import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n} satisfies Pick<DataListRootProps, 'className' | 'mask'>;\n\nexport const CHART_COLORS = {\n green: 'var(--chart-green)',\n orange: 'var(--chart-orange)',\n pink: 'var(--chart-pink)',\n purple: 'var(--chart-purple)',\n blue: 'var(--chart-blue)',\n blueDark: 'var(--chart-blue-deep)',\n red: 'var(--chart-red)',\n yellow: 'var(--chart-yellow)',\n} as const;\n"],"names":[],"mappings":"AAEO,MAAM,uBAAA,GAA0B;AAAA,EACrC,SAAA,EAAW,UAAA;AAAA,EACX,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA;AAChB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,KAAA,EAAO,oBAAA;AAAA,EACP,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,wBAAA;AAAA,EACV,GAAA,EAAK,kBAAA;AAAA,EACL,MAAA,EAAQ;AACV;;;;"}
@@ -3,9 +3,10 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
- const dataList = require('../../../data-list-PwFpP_mo.cjs');
6
+ const dataList = require('../../../data-list-RI8c32dk.cjs');
7
7
  const metricsCard = require('../../../metrics-card-DzcVJTAN.cjs');
8
8
  const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
9
+ const utils_cost = require('../../../utils/cost.cjs.js');
9
10
 
10
11
  function ModelUsageCostCardView({
11
12
  rows,
@@ -29,9 +30,9 @@ function ModelUsageCostCardView({
29
30
  }
30
31
  let value;
31
32
  if (units.size === 0) {
32
- value = totalCost > 0 ? domains_metrics_components_metricsUtils.formatCost(totalCost) : "—";
33
+ value = totalCost > 0 ? utils_cost.formatCost(totalCost) : "—";
33
34
  } else if (units.size === 1) {
34
- value = totalCost > 0 ? domains_metrics_components_metricsUtils.formatCost(totalCost, [...units][0]) : "—";
35
+ value = totalCost > 0 ? utils_cost.formatCost(totalCost, [...units][0]) : "—";
35
36
  } else {
36
37
  value = "Mixed";
37
38
  }
@@ -56,7 +57,7 @@ function ModelUsageCostCardView({
56
57
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.output }),
57
58
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cacheRead }),
58
59
  /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { children: row.cacheWrite }),
59
- /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.cost != null ? domains_metrics_components_metricsUtils.formatCost(row.cost, row.costUnit) : "—" })
60
+ /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.NumberCell, { highlight: true, children: row.cost != null ? utils_cost.formatCost(row.cost, row.costUnit) : "—" })
60
61
  ] });
61
62
  return href ? /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowLink, { to: href, LinkComponent, children: rowCells }, row.model) : /* @__PURE__ */ jsxRuntime.jsx(dataList.DataList.RowStatic, { children: rowCells }, row.model);
62
63
  })
@@ -1 +1 @@
1
- {"version":3,"file":"model-usage-cost-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/model-usage-cost-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">{row.model}</DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["MetricsCard","jsxs","jsx","formatCost","DataList","METRICS_DATA_LIST_PROPS","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"model-usage-cost-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/model-usage-cost-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { METRICS_DATA_LIST_PROPS } from './metrics-utils';\nimport { formatCost } from '@/lib/cost';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">{row.model}</DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["MetricsCard","jsxs","jsx","formatCost","DataList","METRICS_DATA_LIST_PROPS","Fragment"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { D as DataList } from '../../../data-list-DisTjDHP.js';
2
+ import { D as DataList } from '../../../data-list-5-nRJbEO.js';
3
3
  import { M as MetricsCard } from '../../../metrics-card-C2RTi5Ew.js';
4
- import { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
4
+ import { METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
5
+ import { formatCost } from '../../../utils/cost.es.js';
5
6
 
6
7
  function ModelUsageCostCardView({
7
8
  rows,
@@ -1 +1 @@
1
- {"version":3,"file":"model-usage-cost-card-view.es.js","sources":["../../../../src/domains/metrics/components/model-usage-cost-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">{row.model}</DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-usage-cost-card-view.es.js","sources":["../../../../src/domains/metrics/components/model-usage-cost-card-view.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { METRICS_DATA_LIST_PROPS } from './metrics-utils';\nimport { formatCost } from '@/lib/cost';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell className=\"text-caption\">{row.model}</DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const React = require('react');
7
- const dataList = require('../../../data-list-PwFpP_mo.cjs');
7
+ const dataList = require('../../../data-list-RI8c32dk.cjs');
8
8
  const metricsCard = require('../../../metrics-card-DzcVJTAN.cjs');
9
9
  const metricsLineChart = require('../../../metrics-line-chart-BNNRRxM8.cjs');
10
10
  const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useMemo } from 'react';
3
- import { D as DataList } from '../../../data-list-DisTjDHP.js';
3
+ import { D as DataList } from '../../../data-list-5-nRJbEO.js';
4
4
  import { M as MetricsCard } from '../../../metrics-card-C2RTi5Ew.js';
5
5
  import { M as MetricsLineChart } from '../../../metrics-line-chart-CT_pqJtC.js';
6
6
  import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';