@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":"observation-renderer.cjs.js","sources":["../../../../../src/domains/chat/tools/badges/observation-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { cn } from '@/utils/cn';\n\n// Priority emoji to color mapping\n// P1 (🔴) = highest priority = purple theme\n// P2 (🟡) = medium priority = blue theme\n// P3 (🟢) = lower priority = green theme\nconst PRIORITY_COLORS = {\n '🔴': 'text-foreground',\n '🟡': 'text-foreground',\n '🟢': 'text-foreground',\n} as const;\n\n// Dark backgrounds for all priorities\nconst PRIORITY_BG = {\n '🔴': 'bg-purple-500/15',\n '🟡': 'bg-blue-500/15',\n '🟢': 'bg-green-500/15',\n} as const;\n\n// Full color left border accent\nconst PRIORITY_BORDER = {\n '🔴': 'border-l-purple-500',\n '🟡': 'border-l-blue-500',\n '🟢': 'border-l-green-500',\n} as const;\n\ntype Priority = keyof typeof PRIORITY_COLORS;\n\ninterface ParsedObservation {\n priority: Priority | null;\n time: string | null;\n content: string;\n children: ParsedObservation[];\n isNested: boolean;\n}\n\ninterface ParsedDateBlock {\n date: string;\n relativeTime?: string; // e.g., \"(3 days ago)\"\n observations: ParsedObservation[];\n}\n\ninterface ParsedThread {\n threadId: string;\n dateBlocks: ParsedDateBlock[];\n}\n\ninterface ParsedObservations {\n threads: ParsedThread[];\n currentTask?: string;\n suggestedResponse?: string;\n}\n\n/**\n * Parse a single observation line\n */\nfunction parseObservationLine(line: string, isNested: boolean = false): ParsedObservation | null {\n // Match: * 🔴 (14:30) Content or * -> nested content\n const trimmed = line.trim();\n\n if (!trimmed) return null;\n\n // Check for nested arrow format: * -> content\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const content = trimmed.replace(/^\\*?\\s*->\\s*/, '');\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for indented dash list item: - content (used as sub-items)\n if (isNested && trimmed.startsWith('-')) {\n const content = trimmed.replace(/^-\\s*/, '');\n if (!content) return null;\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for standard format: * 🔴 (14:30) Content\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n\n if (match) {\n const [, priority, time, content] = match;\n return {\n priority: (priority as Priority) || null,\n time: time || null,\n content: (content ?? '').trim(),\n children: [],\n isNested,\n };\n }\n\n // Fallback for lines that don't match the pattern\n if (trimmed.startsWith('*')) {\n return {\n priority: null,\n time: null,\n content: trimmed.replace(/^\\*\\s*/, ''),\n children: [],\n isNested,\n };\n }\n\n return null;\n}\n\n/**\n * Parse the raw observations string into structured data\n */\nfunction parseObservations(raw: string): ParsedObservations {\n const result: ParsedObservations = {\n threads: [],\n };\n\n // Extract current-task if present\n const currentTaskMatch = raw.match(/<current-task>\\s*([\\s\\S]*?)\\s*<\\/current-task>/);\n if (currentTaskMatch) {\n result.currentTask = (currentTaskMatch[1] ?? '').trim();\n }\n\n // Extract suggested-response if present\n const suggestedMatch = raw.match(/<suggested-response>\\s*([\\s\\S]*?)\\s*<\\/suggested-response>/);\n if (suggestedMatch) {\n result.suggestedResponse = (suggestedMatch[1] ?? '').trim();\n }\n\n // Extract observations content\n const observationsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const observationsContent = observationsMatch?.[1] ?? raw;\n\n // Split by thread headers if present\n const threadSections = observationsContent.split(/(?=Thread [a-f0-9]+:)/i);\n\n for (const section of threadSections) {\n const trimmedSection = section.trim();\n if (!trimmedSection) continue;\n\n // Check for thread header\n const threadMatch = trimmedSection.match(/^Thread ([a-f0-9]+):/i);\n const threadId = threadMatch?.[1] ?? 'default';\n const content = threadMatch ? trimmedSection.replace(/^Thread [a-f0-9]+:\\s*/i, '') : trimmedSection;\n\n const thread: ParsedThread = {\n threadId,\n dateBlocks: [],\n };\n\n // Split by date headers\n const lines = content.split('\\n');\n let currentDateBlock: ParsedDateBlock | null = null;\n let lastObservation: ParsedObservation | null = null;\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Check for date header: \"Date: Dec 4, 2025\" or \"Date: Dec 4, 2025 (3 days ago)\"\n const dateMatch = trimmedLine.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n currentDateBlock = {\n date: (dateMatch[1] ?? '').trim(),\n relativeTime: dateMatch[2]?.trim(),\n observations: [],\n };\n lastObservation = null;\n continue;\n }\n\n // Check indentation for nested observations\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch?.[1]?.length ?? 0;\n const isNested =\n indent >= 2 && (trimmedLine.startsWith('* ->') || trimmedLine.startsWith('->') || trimmedLine.startsWith('-'));\n\n const observation = parseObservationLine(trimmedLine, isNested);\n\n if (observation) {\n if (!currentDateBlock) {\n // Create a default date block if none exists\n currentDateBlock = {\n date: 'Recent',\n observations: [],\n };\n }\n\n if (observation.isNested && lastObservation) {\n // Add as child of last observation\n lastObservation.children.push(observation);\n } else {\n currentDateBlock.observations.push(observation);\n lastObservation = observation;\n }\n }\n }\n\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n\n if (thread.dateBlocks.length > 0) {\n result.threads.push(thread);\n }\n }\n\n return result;\n}\n\n/**\n * Render a single observation\n */\nfunction ObservationItem({\n observation,\n useInheritedTextColor,\n}: {\n observation: ParsedObservation;\n useInheritedTextColor?: boolean;\n}) {\n // When useInheritedTextColor is true, don't apply priority colors - inherit from parent\n const priorityColor = useInheritedTextColor\n ? ''\n : observation.priority\n ? PRIORITY_COLORS[observation.priority]\n : 'text-muted-foreground';\n const bgColor = useInheritedTextColor ? '' : observation.priority ? PRIORITY_BG[observation.priority] : '';\n\n // Get a subtle left border color based on priority (using blue shades for visual hierarchy)\n const borderColor = observation.priority ? PRIORITY_BORDER[observation.priority] : 'border-l-transparent';\n\n return (\n <div className={cn('py-0.5', observation.isNested && 'ml-4 border-l border-border/50 pl-2')}>\n <div\n className={cn(\n 'flex items-start gap-1.5 text-caption',\n bgColor && 'rounded px-1.5 py-0.5',\n bgColor,\n !observation.isNested && observation.priority && `border-l-2 ${borderColor} pl-1.5`,\n )}\n >\n {observation.isNested && (\n <span className={cn('shrink-0', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>→</span>\n )}\n <span className=\"flex-1 [&_code]:rounded [&_code]:bg-black/10 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-meta\">\n <MarkdownRenderer className={priorityColor}>{observation.content}</MarkdownRenderer>\n </span>\n {observation.time && (\n <span\n className={cn(\n 'ml-2 shrink-0 font-mono text-meta',\n useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground',\n )}\n >\n {observation.time}\n </span>\n )}\n </div>\n {observation.children.length > 0 && (\n <div className=\"mt-0.5\">\n {observation.children.map((child, i) => (\n <ObservationItem key={i} observation={child} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Render a date block\n */\nfunction DateBlock({ block, useInheritedTextColor }: { block: ParsedDateBlock; useInheritedTextColor?: boolean }) {\n return (\n <div className=\"mb-2\">\n <div\n className={cn(\n 'sticky top-0 mb-1 flex items-center gap-2 py-1 backdrop-blur-sm',\n useInheritedTextColor ? 'bg-transparent' : 'bg-background/95',\n )}\n >\n <span className={cn('text-column', useInheritedTextColor ? 'opacity-80' : 'text-foreground')}>\n {block.date}\n </span>\n {block.relativeTime && (\n <span className={cn('text-meta', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>\n ({block.relativeTime})\n </span>\n )}\n </div>\n <div className=\"space-y-0\">\n {block.observations.map((obs, i) => (\n <ObservationItem key={i} observation={obs} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Render a thread section\n */\nfunction ThreadSection({\n thread,\n showThreadId,\n useInheritedTextColor,\n}: {\n thread: ParsedThread;\n showThreadId: boolean;\n useInheritedTextColor?: boolean;\n}) {\n return (\n <div className=\"mb-3\">\n {showThreadId && thread.threadId !== 'default' && (\n <div\n className={cn(\n 'mb-1 inline-block rounded px-1 py-0.5 font-mono text-meta',\n useInheritedTextColor ? 'bg-current/10 opacity-60' : 'bg-muted/50 text-muted-foreground',\n )}\n >\n Thread {thread.threadId}\n </div>\n )}\n {thread.dateBlocks.map((block, i) => (\n <DateBlock key={i} block={block} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n );\n}\n\nexport interface ObservationRendererProps {\n observations: string;\n className?: string;\n maxHeight?: string;\n showCurrentTask?: boolean;\n showSuggestedResponse?: boolean;\n /** If true, observations inherit text color from parent instead of using priority colors */\n useInheritedTextColor?: boolean;\n}\n\n/**\n * Renders raw observation text with proper formatting\n */\nexport function ObservationRenderer({\n observations,\n className,\n maxHeight,\n showCurrentTask = false,\n showSuggestedResponse = false,\n useInheritedTextColor = false,\n}: ObservationRendererProps) {\n const parsed = useMemo(() => parseObservations(observations), [observations]);\n\n const hasMultipleThreads =\n parsed.threads.length > 1 || (parsed.threads.length === 1 && parsed.threads[0]?.threadId !== 'default');\n\n if (parsed.threads.length === 0 && !parsed.currentTask && !parsed.suggestedResponse) {\n return <div className={cn('text-caption text-muted-foreground italic', className)}>No observations</div>;\n }\n\n return (\n <div className={cn('overflow-hidden text-body', className)}>\n <div\n className={cn('wrap-break-word', maxHeight && 'overflow-y-auto pr-1')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {parsed.threads.map((thread, i) => (\n <ThreadSection\n key={thread.threadId + i}\n thread={thread}\n showThreadId={hasMultipleThreads}\n useInheritedTextColor={useInheritedTextColor}\n />\n ))}\n </div>\n\n {showCurrentTask && parsed.currentTask && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Current Task</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground\">{parsed.currentTask}</div>\n </div>\n )}\n\n {showSuggestedResponse && parsed.suggestedResponse && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Suggested Response</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground/80 italic\">{parsed.suggestedResponse}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default ObservationRenderer;\n"],"names":["jsxs","cn","jsx","MarkdownRenderer","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"observation-renderer.cjs.js","sources":["../../../../../src/domains/chat/tools/badges/observation-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/utils/cn';\n\n// Priority emoji to color mapping\n// P1 (🔴) = highest priority = purple theme\n// P2 (🟡) = medium priority = blue theme\n// P3 (🟢) = lower priority = green theme\nconst PRIORITY_COLORS = {\n '🔴': 'text-foreground',\n '🟡': 'text-foreground',\n '🟢': 'text-foreground',\n} as const;\n\n// Dark backgrounds for all priorities\nconst PRIORITY_BG = {\n '🔴': 'bg-purple-500/15',\n '🟡': 'bg-blue-500/15',\n '🟢': 'bg-green-500/15',\n} as const;\n\n// Full color left border accent\nconst PRIORITY_BORDER = {\n '🔴': 'border-l-purple-500',\n '🟡': 'border-l-blue-500',\n '🟢': 'border-l-green-500',\n} as const;\n\ntype Priority = keyof typeof PRIORITY_COLORS;\n\ninterface ParsedObservation {\n priority: Priority | null;\n time: string | null;\n content: string;\n children: ParsedObservation[];\n isNested: boolean;\n}\n\ninterface ParsedDateBlock {\n date: string;\n relativeTime?: string; // e.g., \"(3 days ago)\"\n observations: ParsedObservation[];\n}\n\ninterface ParsedThread {\n threadId: string;\n dateBlocks: ParsedDateBlock[];\n}\n\ninterface ParsedObservations {\n threads: ParsedThread[];\n currentTask?: string;\n suggestedResponse?: string;\n}\n\n/**\n * Parse a single observation line\n */\nfunction parseObservationLine(line: string, isNested: boolean = false): ParsedObservation | null {\n // Match: * 🔴 (14:30) Content or * -> nested content\n const trimmed = line.trim();\n\n if (!trimmed) return null;\n\n // Check for nested arrow format: * -> content\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const content = trimmed.replace(/^\\*?\\s*->\\s*/, '');\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for indented dash list item: - content (used as sub-items)\n if (isNested && trimmed.startsWith('-')) {\n const content = trimmed.replace(/^-\\s*/, '');\n if (!content) return null;\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for standard format: * 🔴 (14:30) Content\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n\n if (match) {\n const [, priority, time, content] = match;\n return {\n priority: (priority as Priority) || null,\n time: time || null,\n content: (content ?? '').trim(),\n children: [],\n isNested,\n };\n }\n\n // Fallback for lines that don't match the pattern\n if (trimmed.startsWith('*')) {\n return {\n priority: null,\n time: null,\n content: trimmed.replace(/^\\*\\s*/, ''),\n children: [],\n isNested,\n };\n }\n\n return null;\n}\n\n/**\n * Parse the raw observations string into structured data\n */\nfunction parseObservations(raw: string): ParsedObservations {\n const result: ParsedObservations = {\n threads: [],\n };\n\n // Extract current-task if present\n const currentTaskMatch = raw.match(/<current-task>\\s*([\\s\\S]*?)\\s*<\\/current-task>/);\n if (currentTaskMatch) {\n result.currentTask = (currentTaskMatch[1] ?? '').trim();\n }\n\n // Extract suggested-response if present\n const suggestedMatch = raw.match(/<suggested-response>\\s*([\\s\\S]*?)\\s*<\\/suggested-response>/);\n if (suggestedMatch) {\n result.suggestedResponse = (suggestedMatch[1] ?? '').trim();\n }\n\n // Extract observations content\n const observationsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const observationsContent = observationsMatch?.[1] ?? raw;\n\n // Split by thread headers if present\n const threadSections = observationsContent.split(/(?=Thread [a-f0-9]+:)/i);\n\n for (const section of threadSections) {\n const trimmedSection = section.trim();\n if (!trimmedSection) continue;\n\n // Check for thread header\n const threadMatch = trimmedSection.match(/^Thread ([a-f0-9]+):/i);\n const threadId = threadMatch?.[1] ?? 'default';\n const content = threadMatch ? trimmedSection.replace(/^Thread [a-f0-9]+:\\s*/i, '') : trimmedSection;\n\n const thread: ParsedThread = {\n threadId,\n dateBlocks: [],\n };\n\n // Split by date headers\n const lines = content.split('\\n');\n let currentDateBlock: ParsedDateBlock | null = null;\n let lastObservation: ParsedObservation | null = null;\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Check for date header: \"Date: Dec 4, 2025\" or \"Date: Dec 4, 2025 (3 days ago)\"\n const dateMatch = trimmedLine.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n currentDateBlock = {\n date: (dateMatch[1] ?? '').trim(),\n relativeTime: dateMatch[2]?.trim(),\n observations: [],\n };\n lastObservation = null;\n continue;\n }\n\n // Check indentation for nested observations\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch?.[1]?.length ?? 0;\n const isNested =\n indent >= 2 && (trimmedLine.startsWith('* ->') || trimmedLine.startsWith('->') || trimmedLine.startsWith('-'));\n\n const observation = parseObservationLine(trimmedLine, isNested);\n\n if (observation) {\n if (!currentDateBlock) {\n // Create a default date block if none exists\n currentDateBlock = {\n date: 'Recent',\n observations: [],\n };\n }\n\n if (observation.isNested && lastObservation) {\n // Add as child of last observation\n lastObservation.children.push(observation);\n } else {\n currentDateBlock.observations.push(observation);\n lastObservation = observation;\n }\n }\n }\n\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n\n if (thread.dateBlocks.length > 0) {\n result.threads.push(thread);\n }\n }\n\n return result;\n}\n\n/**\n * Render a single observation\n */\nfunction ObservationItem({\n observation,\n useInheritedTextColor,\n}: {\n observation: ParsedObservation;\n useInheritedTextColor?: boolean;\n}) {\n // When useInheritedTextColor is true, don't apply priority colors - inherit from parent\n const priorityColor = useInheritedTextColor\n ? ''\n : observation.priority\n ? PRIORITY_COLORS[observation.priority]\n : 'text-muted-foreground';\n const bgColor = useInheritedTextColor ? '' : observation.priority ? PRIORITY_BG[observation.priority] : '';\n\n // Get a subtle left border color based on priority (using blue shades for visual hierarchy)\n const borderColor = observation.priority ? PRIORITY_BORDER[observation.priority] : 'border-l-transparent';\n\n return (\n <div className={cn('py-0.5', observation.isNested && 'ml-4 border-l border-border/50 pl-2')}>\n <div\n className={cn(\n 'flex items-start gap-1.5 text-caption',\n bgColor && 'rounded px-1.5 py-0.5',\n bgColor,\n !observation.isNested && observation.priority && `border-l-2 ${borderColor} pl-1.5`,\n )}\n >\n {observation.isNested && (\n <span className={cn('shrink-0', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>→</span>\n )}\n <span className=\"flex-1 [&_code]:rounded [&_code]:bg-black/10 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-meta\">\n <MarkdownRenderer className={priorityColor}>{observation.content}</MarkdownRenderer>\n </span>\n {observation.time && (\n <Txt\n as=\"span\"\n variant=\"meta\"\n font=\"mono\"\n tone={useInheritedTextColor ? undefined : 'muted'}\n className={cn('ml-2 shrink-0', useInheritedTextColor && 'opacity-60')}\n >\n {observation.time}\n </Txt>\n )}\n </div>\n {observation.children.length > 0 && (\n <div className=\"mt-0.5\">\n {observation.children.map((child, i) => (\n <ObservationItem key={i} observation={child} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Render a date block\n */\nfunction DateBlock({ block, useInheritedTextColor }: { block: ParsedDateBlock; useInheritedTextColor?: boolean }) {\n return (\n <div className=\"mb-2\">\n <div\n className={cn(\n 'sticky top-0 mb-1 flex items-center gap-2 py-1 backdrop-blur-sm',\n useInheritedTextColor ? 'bg-transparent' : 'bg-background/95',\n )}\n >\n <span className={cn('text-column', useInheritedTextColor ? 'opacity-80' : 'text-foreground')}>\n {block.date}\n </span>\n {block.relativeTime && (\n <span className={cn('text-meta', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>\n ({block.relativeTime})\n </span>\n )}\n </div>\n <div className=\"space-y-0\">\n {block.observations.map((obs, i) => (\n <ObservationItem key={i} observation={obs} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Render a thread section\n */\nfunction ThreadSection({\n thread,\n showThreadId,\n useInheritedTextColor,\n}: {\n thread: ParsedThread;\n showThreadId: boolean;\n useInheritedTextColor?: boolean;\n}) {\n return (\n <div className=\"mb-3\">\n {showThreadId && thread.threadId !== 'default' && (\n <div\n className={cn(\n 'mb-1 inline-block rounded px-1 py-0.5 text-meta',\n useInheritedTextColor ? 'bg-current/10 opacity-60' : 'bg-muted/50 text-muted-foreground',\n )}\n >\n Thread{' '}\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {thread.threadId}\n </Txt>\n </div>\n )}\n {thread.dateBlocks.map((block, i) => (\n <DateBlock key={i} block={block} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n );\n}\n\nexport interface ObservationRendererProps {\n observations: string;\n className?: string;\n maxHeight?: string;\n showCurrentTask?: boolean;\n showSuggestedResponse?: boolean;\n /** If true, observations inherit text color from parent instead of using priority colors */\n useInheritedTextColor?: boolean;\n}\n\n/**\n * Renders raw observation text with proper formatting\n */\nexport function ObservationRenderer({\n observations,\n className,\n maxHeight,\n showCurrentTask = false,\n showSuggestedResponse = false,\n useInheritedTextColor = false,\n}: ObservationRendererProps) {\n const parsed = useMemo(() => parseObservations(observations), [observations]);\n\n const hasMultipleThreads =\n parsed.threads.length > 1 || (parsed.threads.length === 1 && parsed.threads[0]?.threadId !== 'default');\n\n if (parsed.threads.length === 0 && !parsed.currentTask && !parsed.suggestedResponse) {\n return <div className={cn('text-caption text-muted-foreground italic', className)}>No observations</div>;\n }\n\n return (\n <div className={cn('overflow-hidden text-body', className)}>\n <div\n className={cn('wrap-break-word', maxHeight && 'overflow-y-auto pr-1')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {parsed.threads.map((thread, i) => (\n <ThreadSection\n key={thread.threadId + i}\n thread={thread}\n showThreadId={hasMultipleThreads}\n useInheritedTextColor={useInheritedTextColor}\n />\n ))}\n </div>\n\n {showCurrentTask && parsed.currentTask && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Current Task</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground\">{parsed.currentTask}</div>\n </div>\n )}\n\n {showSuggestedResponse && parsed.suggestedResponse && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Suggested Response</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground/80 italic\">{parsed.suggestedResponse}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default ObservationRenderer;\n"],"names":["jsxs","cn","jsx","MarkdownRenderer","Txt","useMemo"],"mappings":";;;;;;;;;;AAWA,MAAM,eAAA,GAAkB;AAAA,EACtB,IAAA,EAAM,iBAAA;AAAA,EACN,IAAA,EAAM,iBAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGA,MAAM,WAAA,GAAc;AAAA,EAClB,IAAA,EAAM,kBAAA;AAAA,EACN,IAAA,EAAM,gBAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGA,MAAM,eAAA,GAAkB;AAAA,EACtB,IAAA,EAAM,qBAAA;AAAA,EACN,IAAA,EAAM,mBAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAgCA,SAAS,oBAAA,CAAqB,IAAA,EAAc,QAAA,GAAoB,KAAA,EAAiC;AAE/F,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAGrB,EAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1D,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,IAAA;AAAA,MACN,OAAA;AAAA,MACA,UAAU,EAAC;AAAA,MACX,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,IAAY,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACvC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,IAAA;AAAA,MACN,OAAA;AAAA,MACA,UAAU,EAAC;AAAA,MACX,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,sDAAsD,CAAA;AAElF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,GAAG,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,GAAI,KAAA;AACpC,IAAA,OAAO;AAAA,MACL,UAAW,QAAA,IAAyB,IAAA;AAAA,MACpC,MAAM,IAAA,IAAQ,IAAA;AAAA,MACd,OAAA,EAAA,CAAU,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AAAA,MAC9B,UAAU,EAAC;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,MACrC,UAAU,EAAC;AAAA,MACX;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,kBAAkB,GAAA,EAAiC;AAC1D,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,SAAS;AAAC,GACZ;AAGA,EAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,KAAA,CAAM,gDAAgD,CAAA;AACnF,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAA,CAAO,WAAA,GAAA,CAAe,gBAAA,CAAiB,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,EACxD;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,KAAA,CAAM,4DAA4D,CAAA;AAC7F,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAA,CAAO,iBAAA,GAAA,CAAqB,cAAA,CAAe,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,EAC5D;AAGA,EAAA,MAAM,iBAAA,GAAoB,GAAA,CAAI,KAAA,CAAM,gDAAgD,CAAA;AACpF,EAAA,MAAM,mBAAA,GAAsB,iBAAA,GAAoB,CAAC,CAAA,IAAK,GAAA;AAGtD,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,KAAA,CAAM,wBAAwB,CAAA;AAEzE,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AACpC,IAAA,IAAI,CAAC,cAAA,EAAgB;AAGrB,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,KAAA,CAAM,uBAAuB,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,CAAC,CAAA,IAAK,SAAA;AACrC,IAAA,MAAM,UAAU,WAAA,GAAc,cAAA,CAAe,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA,GAAI,cAAA;AAErF,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,QAAA;AAAA,MACA,YAAY;AAAC,KACf;AAGA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,IAAI,gBAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI,eAAA,GAA4C,IAAA;AAEhD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAG9B,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,oCAAoC,CAAA;AACxE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,MAAA,CAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,QACzC;AACA,QAAA,gBAAA,GAAmB;AAAA,UACjB,IAAA,EAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AAAA,UAChC,YAAA,EAAc,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA,EAAK;AAAA,UACjC,cAAc;AAAC,SACjB;AACA,QAAA,eAAA,GAAkB,IAAA;AAClB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,WAAA,GAAc,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA;AAC3C,MAAA,MAAM,QAAA,GACJ,MAAA,IAAU,CAAA,KAAM,WAAA,CAAY,UAAA,CAAW,MAAM,CAAA,IAAK,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA,IAAK,WAAA,CAAY,WAAW,GAAG,CAAA,CAAA;AAE9G,MAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,WAAA,EAAa,QAAQ,CAAA;AAE9D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,UAAA,gBAAA,GAAmB;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN,cAAc;AAAC,WACjB;AAAA,QACF;AAEA,QAAA,IAAI,WAAA,CAAY,YAAY,eAAA,EAAiB;AAE3C,UAAA,eAAA,CAAgB,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,gBAAA,CAAiB,YAAA,CAAa,KAAK,WAAW,CAAA;AAC9C,UAAA,eAAA,GAAkB,WAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAA,CAAO,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAA,CAAgB;AAAA,EACvB,WAAA;AAAA,EACA;AACF,CAAA,EAGG;AAED,EAAA,MAAM,aAAA,GAAgB,wBAClB,EAAA,GACA,WAAA,CAAY,WACV,eAAA,CAAgB,WAAA,CAAY,QAAQ,CAAA,GACpC,uBAAA;AACN,EAAA,MAAM,OAAA,GAAU,wBAAwB,EAAA,GAAK,WAAA,CAAY,WAAW,WAAA,CAAY,WAAA,CAAY,QAAQ,CAAA,GAAI,EAAA;AAGxG,EAAA,MAAM,cAAc,WAAA,CAAY,QAAA,GAAW,eAAA,CAAgB,WAAA,CAAY,QAAQ,CAAA,GAAI,sBAAA;AAEnF,EAAA,uBACEA,eAAA,CAAC,SAAI,SAAA,EAAWC,WAAA,CAAG,UAAU,WAAA,CAAY,QAAA,IAAY,qCAAqC,CAAA,EACxF,QAAA,EAAA;AAAA,oBAAAD,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,WAAA;AAAA,UACT,uCAAA;AAAA,UACA,OAAA,IAAW,uBAAA;AAAA,UACX,OAAA;AAAA,UACA,CAAC,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,QAAA,IAAY,cAAc,WAAW,CAAA,OAAA;AAAA,SAC5E;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,QAAA,oBACXC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWD,WAAA,CAAG,YAAY,qBAAA,GAAwB,YAAA,GAAe,uBAAuB,CAAA,EAAG,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BAEpGC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+FAAA,EACd,QAAA,kBAAAA,cAAA,CAACC,qCAAiB,SAAA,EAAW,aAAA,EAAgB,QAAA,EAAA,WAAA,CAAY,OAAA,EAAQ,CAAA,EACnE,CAAA;AAAA,UACC,YAAY,IAAA,oBACXD,cAAA;AAAA,YAACE,OAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,MAAA;AAAA,cACH,OAAA,EAAQ,MAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,IAAA,EAAM,wBAAwB,MAAA,GAAY,OAAA;AAAA,cAC1C,SAAA,EAAWH,WAAA,CAAG,eAAA,EAAiB,qBAAA,IAAyB,YAAY,CAAA;AAAA,cAEnE,QAAA,EAAA,WAAA,CAAY;AAAA;AAAA;AACf;AAAA;AAAA,KAEJ;AAAA,IACC,WAAA,CAAY,SAAS,MAAA,GAAS,CAAA,mCAC5B,KAAA,EAAA,EAAI,SAAA,EAAU,UACZ,QAAA,EAAA,WAAA,CAAY,QAAA,CAAS,IAAI,CAAC,KAAA,EAAO,sBAChCC,cAAA,CAAC,eAAA,EAAA,EAAwB,aAAa,KAAA,EAAO,qBAAA,EAAA,EAAvB,CAAqE,CAC5F,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAKA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,qBAAA,EAAsB,EAAgE;AAChH,EAAA,uBACEF,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,WAAA;AAAA,UACT,iEAAA;AAAA,UACA,wBAAwB,gBAAA,GAAmB;AAAA,SAC7C;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,WAAWD,WAAA,CAAG,aAAA,EAAe,wBAAwB,YAAA,GAAe,iBAAiB,CAAA,EACxF,QAAA,EAAA,KAAA,CAAM,IAAA,EACT,CAAA;AAAA,UACC,KAAA,CAAM,YAAA,oBACLD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,YAAG,WAAA,EAAa,qBAAA,GAAwB,YAAA,GAAe,uBAAuB,CAAA,EAAG,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAC9F,KAAA,CAAM,YAAA;AAAA,YAAa;AAAA,WAAA,EACvB;AAAA;AAAA;AAAA,KAEJ;AAAA,mCACC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,KAAA,CAAM,aAAa,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,oCAC3B,eAAA,EAAA,EAAwB,WAAA,EAAa,KAAK,qBAAA,EAAA,EAArB,CAAmE,CAC1F,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAKA,SAAS,aAAA,CAAc;AAAA,EACrB,MAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,IAAgB,MAAA,CAAO,aAAa,SAAA,oBACnCA,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,WAAA;AAAA,UACT,iDAAA;AAAA,UACA,wBAAwB,0BAAA,GAA6B;AAAA,SACvD;AAAA,QACD,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACQ,GAAA;AAAA,0BACPC,cAAA,CAACE,WAAI,EAAA,EAAG,MAAA,EAAO,SAAQ,MAAA,EAAO,IAAA,EAAK,MAAA,EAChC,QAAA,EAAA,MAAA,CAAO,QAAA,EACV;AAAA;AAAA;AAAA,KACF;AAAA,IAED,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAC7BF,cAAA,CAAC,SAAA,EAAA,EAAkB,KAAA,EAAc,qBAAA,EAAA,EAAjB,CAA+D,CAChF;AAAA,GAAA,EACH,CAAA;AAEJ;AAeO,SAAS,mBAAA,CAAoB;AAAA,EAClC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,qBAAA,GAAwB,KAAA;AAAA,EACxB,qBAAA,GAAwB;AAC1B,CAAA,EAA6B;AAC3B,EAAA,MAAM,MAAA,GAASG,cAAQ,MAAM,iBAAA,CAAkB,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAE5E,EAAA,MAAM,kBAAA,GACJ,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAG,QAAA,KAAa,SAAA;AAE/F,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,MAAA,CAAO,iBAAA,EAAmB;AACnF,IAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWJ,YAAG,2CAAA,EAA6C,SAAS,GAAG,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,EACpG;AAEA,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWA,WAAA,CAAG,2BAAA,EAA6B,SAAS,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWD,WAAA,CAAG,iBAAA,EAAmB,SAAA,IAAa,sBAAsB,CAAA;AAAA,QACpE,KAAA,EAAO,SAAA,GAAY,EAAE,SAAA,EAAU,GAAI,MAAA;AAAA,QAElC,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,CAAA,qBAC3BC,cAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YAEC,MAAA;AAAA,YACA,YAAA,EAAc,kBAAA;AAAA,YACd;AAAA,WAAA;AAAA,UAHK,OAAO,QAAA,GAAW;AAAA,SAK1B;AAAA;AAAA,KACH;AAAA,IAEC,mBAAmB,MAAA,CAAO,WAAA,oBACzBF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,sBAC1FA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAoD,iBAAO,WAAA,EAAY;AAAA,KAAA,EACxF,CAAA;AAAA,IAGD,yBAAyB,MAAA,CAAO,iBAAA,oBAC/BF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,EAAA;AAAA,sBAAAE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,sBAChGA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EAA8D,iBAAO,iBAAA,EAAkB;AAAA,KAAA,EACxG;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;;"}
@@ -1,6 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useMemo } from 'react';
3
3
  import { M as MarkdownRenderer } from '../../../../markdown-renderer-Ces7VyRK.js';
4
+ import { T as Txt } from '../../../../Txt-BP1SRHmL.js';
4
5
  import { c as cn } from '../../../../cn-65Adrsfj.js';
5
6
 
6
7
  const PRIORITY_COLORS = {
@@ -156,12 +157,13 @@ function ObservationItem({
156
157
  observation.isNested && /* @__PURE__ */ jsx("span", { className: cn("shrink-0", useInheritedTextColor ? "opacity-60" : "text-muted-foreground"), children: "→" }),
157
158
  /* @__PURE__ */ jsx("span", { className: "flex-1 [&_code]:rounded [&_code]:bg-black/10 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-meta", children: /* @__PURE__ */ jsx(MarkdownRenderer, { className: priorityColor, children: observation.content }) }),
158
159
  observation.time && /* @__PURE__ */ jsx(
159
- "span",
160
+ Txt,
160
161
  {
161
- className: cn(
162
- "ml-2 shrink-0 font-mono text-meta",
163
- useInheritedTextColor ? "opacity-60" : "text-muted-foreground"
164
- ),
162
+ as: "span",
163
+ variant: "meta",
164
+ font: "mono",
165
+ tone: useInheritedTextColor ? void 0 : "muted",
166
+ className: cn("ml-2 shrink-0", useInheritedTextColor && "opacity-60"),
165
167
  children: observation.time
166
168
  }
167
169
  )
@@ -203,12 +205,13 @@ function ThreadSection({
203
205
  "div",
204
206
  {
205
207
  className: cn(
206
- "mb-1 inline-block rounded px-1 py-0.5 font-mono text-meta",
208
+ "mb-1 inline-block rounded px-1 py-0.5 text-meta",
207
209
  useInheritedTextColor ? "bg-current/10 opacity-60" : "bg-muted/50 text-muted-foreground"
208
210
  ),
209
211
  children: [
210
- "Thread ",
211
- thread.threadId
212
+ "Thread",
213
+ " ",
214
+ /* @__PURE__ */ jsx(Txt, { as: "span", variant: "meta", font: "mono", children: thread.threadId })
212
215
  ]
213
216
  }
214
217
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"observation-renderer.es.js","sources":["../../../../../src/domains/chat/tools/badges/observation-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { cn } from '@/utils/cn';\n\n// Priority emoji to color mapping\n// P1 (🔴) = highest priority = purple theme\n// P2 (🟡) = medium priority = blue theme\n// P3 (🟢) = lower priority = green theme\nconst PRIORITY_COLORS = {\n '🔴': 'text-foreground',\n '🟡': 'text-foreground',\n '🟢': 'text-foreground',\n} as const;\n\n// Dark backgrounds for all priorities\nconst PRIORITY_BG = {\n '🔴': 'bg-purple-500/15',\n '🟡': 'bg-blue-500/15',\n '🟢': 'bg-green-500/15',\n} as const;\n\n// Full color left border accent\nconst PRIORITY_BORDER = {\n '🔴': 'border-l-purple-500',\n '🟡': 'border-l-blue-500',\n '🟢': 'border-l-green-500',\n} as const;\n\ntype Priority = keyof typeof PRIORITY_COLORS;\n\ninterface ParsedObservation {\n priority: Priority | null;\n time: string | null;\n content: string;\n children: ParsedObservation[];\n isNested: boolean;\n}\n\ninterface ParsedDateBlock {\n date: string;\n relativeTime?: string; // e.g., \"(3 days ago)\"\n observations: ParsedObservation[];\n}\n\ninterface ParsedThread {\n threadId: string;\n dateBlocks: ParsedDateBlock[];\n}\n\ninterface ParsedObservations {\n threads: ParsedThread[];\n currentTask?: string;\n suggestedResponse?: string;\n}\n\n/**\n * Parse a single observation line\n */\nfunction parseObservationLine(line: string, isNested: boolean = false): ParsedObservation | null {\n // Match: * 🔴 (14:30) Content or * -> nested content\n const trimmed = line.trim();\n\n if (!trimmed) return null;\n\n // Check for nested arrow format: * -> content\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const content = trimmed.replace(/^\\*?\\s*->\\s*/, '');\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for indented dash list item: - content (used as sub-items)\n if (isNested && trimmed.startsWith('-')) {\n const content = trimmed.replace(/^-\\s*/, '');\n if (!content) return null;\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for standard format: * 🔴 (14:30) Content\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n\n if (match) {\n const [, priority, time, content] = match;\n return {\n priority: (priority as Priority) || null,\n time: time || null,\n content: (content ?? '').trim(),\n children: [],\n isNested,\n };\n }\n\n // Fallback for lines that don't match the pattern\n if (trimmed.startsWith('*')) {\n return {\n priority: null,\n time: null,\n content: trimmed.replace(/^\\*\\s*/, ''),\n children: [],\n isNested,\n };\n }\n\n return null;\n}\n\n/**\n * Parse the raw observations string into structured data\n */\nfunction parseObservations(raw: string): ParsedObservations {\n const result: ParsedObservations = {\n threads: [],\n };\n\n // Extract current-task if present\n const currentTaskMatch = raw.match(/<current-task>\\s*([\\s\\S]*?)\\s*<\\/current-task>/);\n if (currentTaskMatch) {\n result.currentTask = (currentTaskMatch[1] ?? '').trim();\n }\n\n // Extract suggested-response if present\n const suggestedMatch = raw.match(/<suggested-response>\\s*([\\s\\S]*?)\\s*<\\/suggested-response>/);\n if (suggestedMatch) {\n result.suggestedResponse = (suggestedMatch[1] ?? '').trim();\n }\n\n // Extract observations content\n const observationsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const observationsContent = observationsMatch?.[1] ?? raw;\n\n // Split by thread headers if present\n const threadSections = observationsContent.split(/(?=Thread [a-f0-9]+:)/i);\n\n for (const section of threadSections) {\n const trimmedSection = section.trim();\n if (!trimmedSection) continue;\n\n // Check for thread header\n const threadMatch = trimmedSection.match(/^Thread ([a-f0-9]+):/i);\n const threadId = threadMatch?.[1] ?? 'default';\n const content = threadMatch ? trimmedSection.replace(/^Thread [a-f0-9]+:\\s*/i, '') : trimmedSection;\n\n const thread: ParsedThread = {\n threadId,\n dateBlocks: [],\n };\n\n // Split by date headers\n const lines = content.split('\\n');\n let currentDateBlock: ParsedDateBlock | null = null;\n let lastObservation: ParsedObservation | null = null;\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Check for date header: \"Date: Dec 4, 2025\" or \"Date: Dec 4, 2025 (3 days ago)\"\n const dateMatch = trimmedLine.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n currentDateBlock = {\n date: (dateMatch[1] ?? '').trim(),\n relativeTime: dateMatch[2]?.trim(),\n observations: [],\n };\n lastObservation = null;\n continue;\n }\n\n // Check indentation for nested observations\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch?.[1]?.length ?? 0;\n const isNested =\n indent >= 2 && (trimmedLine.startsWith('* ->') || trimmedLine.startsWith('->') || trimmedLine.startsWith('-'));\n\n const observation = parseObservationLine(trimmedLine, isNested);\n\n if (observation) {\n if (!currentDateBlock) {\n // Create a default date block if none exists\n currentDateBlock = {\n date: 'Recent',\n observations: [],\n };\n }\n\n if (observation.isNested && lastObservation) {\n // Add as child of last observation\n lastObservation.children.push(observation);\n } else {\n currentDateBlock.observations.push(observation);\n lastObservation = observation;\n }\n }\n }\n\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n\n if (thread.dateBlocks.length > 0) {\n result.threads.push(thread);\n }\n }\n\n return result;\n}\n\n/**\n * Render a single observation\n */\nfunction ObservationItem({\n observation,\n useInheritedTextColor,\n}: {\n observation: ParsedObservation;\n useInheritedTextColor?: boolean;\n}) {\n // When useInheritedTextColor is true, don't apply priority colors - inherit from parent\n const priorityColor = useInheritedTextColor\n ? ''\n : observation.priority\n ? PRIORITY_COLORS[observation.priority]\n : 'text-muted-foreground';\n const bgColor = useInheritedTextColor ? '' : observation.priority ? PRIORITY_BG[observation.priority] : '';\n\n // Get a subtle left border color based on priority (using blue shades for visual hierarchy)\n const borderColor = observation.priority ? PRIORITY_BORDER[observation.priority] : 'border-l-transparent';\n\n return (\n <div className={cn('py-0.5', observation.isNested && 'ml-4 border-l border-border/50 pl-2')}>\n <div\n className={cn(\n 'flex items-start gap-1.5 text-caption',\n bgColor && 'rounded px-1.5 py-0.5',\n bgColor,\n !observation.isNested && observation.priority && `border-l-2 ${borderColor} pl-1.5`,\n )}\n >\n {observation.isNested && (\n <span className={cn('shrink-0', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>→</span>\n )}\n <span className=\"flex-1 [&_code]:rounded [&_code]:bg-black/10 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-meta\">\n <MarkdownRenderer className={priorityColor}>{observation.content}</MarkdownRenderer>\n </span>\n {observation.time && (\n <span\n className={cn(\n 'ml-2 shrink-0 font-mono text-meta',\n useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground',\n )}\n >\n {observation.time}\n </span>\n )}\n </div>\n {observation.children.length > 0 && (\n <div className=\"mt-0.5\">\n {observation.children.map((child, i) => (\n <ObservationItem key={i} observation={child} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Render a date block\n */\nfunction DateBlock({ block, useInheritedTextColor }: { block: ParsedDateBlock; useInheritedTextColor?: boolean }) {\n return (\n <div className=\"mb-2\">\n <div\n className={cn(\n 'sticky top-0 mb-1 flex items-center gap-2 py-1 backdrop-blur-sm',\n useInheritedTextColor ? 'bg-transparent' : 'bg-background/95',\n )}\n >\n <span className={cn('text-column', useInheritedTextColor ? 'opacity-80' : 'text-foreground')}>\n {block.date}\n </span>\n {block.relativeTime && (\n <span className={cn('text-meta', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>\n ({block.relativeTime})\n </span>\n )}\n </div>\n <div className=\"space-y-0\">\n {block.observations.map((obs, i) => (\n <ObservationItem key={i} observation={obs} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Render a thread section\n */\nfunction ThreadSection({\n thread,\n showThreadId,\n useInheritedTextColor,\n}: {\n thread: ParsedThread;\n showThreadId: boolean;\n useInheritedTextColor?: boolean;\n}) {\n return (\n <div className=\"mb-3\">\n {showThreadId && thread.threadId !== 'default' && (\n <div\n className={cn(\n 'mb-1 inline-block rounded px-1 py-0.5 font-mono text-meta',\n useInheritedTextColor ? 'bg-current/10 opacity-60' : 'bg-muted/50 text-muted-foreground',\n )}\n >\n Thread {thread.threadId}\n </div>\n )}\n {thread.dateBlocks.map((block, i) => (\n <DateBlock key={i} block={block} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n );\n}\n\nexport interface ObservationRendererProps {\n observations: string;\n className?: string;\n maxHeight?: string;\n showCurrentTask?: boolean;\n showSuggestedResponse?: boolean;\n /** If true, observations inherit text color from parent instead of using priority colors */\n useInheritedTextColor?: boolean;\n}\n\n/**\n * Renders raw observation text with proper formatting\n */\nexport function ObservationRenderer({\n observations,\n className,\n maxHeight,\n showCurrentTask = false,\n showSuggestedResponse = false,\n useInheritedTextColor = false,\n}: ObservationRendererProps) {\n const parsed = useMemo(() => parseObservations(observations), [observations]);\n\n const hasMultipleThreads =\n parsed.threads.length > 1 || (parsed.threads.length === 1 && parsed.threads[0]?.threadId !== 'default');\n\n if (parsed.threads.length === 0 && !parsed.currentTask && !parsed.suggestedResponse) {\n return <div className={cn('text-caption text-muted-foreground italic', className)}>No observations</div>;\n }\n\n return (\n <div className={cn('overflow-hidden text-body', className)}>\n <div\n className={cn('wrap-break-word', maxHeight && 'overflow-y-auto pr-1')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {parsed.threads.map((thread, i) => (\n <ThreadSection\n key={thread.threadId + i}\n thread={thread}\n showThreadId={hasMultipleThreads}\n useInheritedTextColor={useInheritedTextColor}\n />\n ))}\n </div>\n\n {showCurrentTask && parsed.currentTask && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Current Task</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground\">{parsed.currentTask}</div>\n </div>\n )}\n\n {showSuggestedResponse && parsed.suggestedResponse && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Suggested Response</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground/80 italic\">{parsed.suggestedResponse}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default ObservationRenderer;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observation-renderer.es.js","sources":["../../../../../src/domains/chat/tools/badges/observation-renderer.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\nimport { MarkdownRenderer } from '@/ds/components/MarkdownRenderer';\nimport { Txt } from '@/ds/components/Txt/Txt';\nimport { cn } from '@/utils/cn';\n\n// Priority emoji to color mapping\n// P1 (🔴) = highest priority = purple theme\n// P2 (🟡) = medium priority = blue theme\n// P3 (🟢) = lower priority = green theme\nconst PRIORITY_COLORS = {\n '🔴': 'text-foreground',\n '🟡': 'text-foreground',\n '🟢': 'text-foreground',\n} as const;\n\n// Dark backgrounds for all priorities\nconst PRIORITY_BG = {\n '🔴': 'bg-purple-500/15',\n '🟡': 'bg-blue-500/15',\n '🟢': 'bg-green-500/15',\n} as const;\n\n// Full color left border accent\nconst PRIORITY_BORDER = {\n '🔴': 'border-l-purple-500',\n '🟡': 'border-l-blue-500',\n '🟢': 'border-l-green-500',\n} as const;\n\ntype Priority = keyof typeof PRIORITY_COLORS;\n\ninterface ParsedObservation {\n priority: Priority | null;\n time: string | null;\n content: string;\n children: ParsedObservation[];\n isNested: boolean;\n}\n\ninterface ParsedDateBlock {\n date: string;\n relativeTime?: string; // e.g., \"(3 days ago)\"\n observations: ParsedObservation[];\n}\n\ninterface ParsedThread {\n threadId: string;\n dateBlocks: ParsedDateBlock[];\n}\n\ninterface ParsedObservations {\n threads: ParsedThread[];\n currentTask?: string;\n suggestedResponse?: string;\n}\n\n/**\n * Parse a single observation line\n */\nfunction parseObservationLine(line: string, isNested: boolean = false): ParsedObservation | null {\n // Match: * 🔴 (14:30) Content or * -> nested content\n const trimmed = line.trim();\n\n if (!trimmed) return null;\n\n // Check for nested arrow format: * -> content\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const content = trimmed.replace(/^\\*?\\s*->\\s*/, '');\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for indented dash list item: - content (used as sub-items)\n if (isNested && trimmed.startsWith('-')) {\n const content = trimmed.replace(/^-\\s*/, '');\n if (!content) return null;\n return {\n priority: null,\n time: null,\n content,\n children: [],\n isNested: true,\n };\n }\n\n // Check for standard format: * 🔴 (14:30) Content\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n\n if (match) {\n const [, priority, time, content] = match;\n return {\n priority: (priority as Priority) || null,\n time: time || null,\n content: (content ?? '').trim(),\n children: [],\n isNested,\n };\n }\n\n // Fallback for lines that don't match the pattern\n if (trimmed.startsWith('*')) {\n return {\n priority: null,\n time: null,\n content: trimmed.replace(/^\\*\\s*/, ''),\n children: [],\n isNested,\n };\n }\n\n return null;\n}\n\n/**\n * Parse the raw observations string into structured data\n */\nfunction parseObservations(raw: string): ParsedObservations {\n const result: ParsedObservations = {\n threads: [],\n };\n\n // Extract current-task if present\n const currentTaskMatch = raw.match(/<current-task>\\s*([\\s\\S]*?)\\s*<\\/current-task>/);\n if (currentTaskMatch) {\n result.currentTask = (currentTaskMatch[1] ?? '').trim();\n }\n\n // Extract suggested-response if present\n const suggestedMatch = raw.match(/<suggested-response>\\s*([\\s\\S]*?)\\s*<\\/suggested-response>/);\n if (suggestedMatch) {\n result.suggestedResponse = (suggestedMatch[1] ?? '').trim();\n }\n\n // Extract observations content\n const observationsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const observationsContent = observationsMatch?.[1] ?? raw;\n\n // Split by thread headers if present\n const threadSections = observationsContent.split(/(?=Thread [a-f0-9]+:)/i);\n\n for (const section of threadSections) {\n const trimmedSection = section.trim();\n if (!trimmedSection) continue;\n\n // Check for thread header\n const threadMatch = trimmedSection.match(/^Thread ([a-f0-9]+):/i);\n const threadId = threadMatch?.[1] ?? 'default';\n const content = threadMatch ? trimmedSection.replace(/^Thread [a-f0-9]+:\\s*/i, '') : trimmedSection;\n\n const thread: ParsedThread = {\n threadId,\n dateBlocks: [],\n };\n\n // Split by date headers\n const lines = content.split('\\n');\n let currentDateBlock: ParsedDateBlock | null = null;\n let lastObservation: ParsedObservation | null = null;\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n // Check for date header: \"Date: Dec 4, 2025\" or \"Date: Dec 4, 2025 (3 days ago)\"\n const dateMatch = trimmedLine.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n currentDateBlock = {\n date: (dateMatch[1] ?? '').trim(),\n relativeTime: dateMatch[2]?.trim(),\n observations: [],\n };\n lastObservation = null;\n continue;\n }\n\n // Check indentation for nested observations\n const indentMatch = line.match(/^(\\s*)/);\n const indent = indentMatch?.[1]?.length ?? 0;\n const isNested =\n indent >= 2 && (trimmedLine.startsWith('* ->') || trimmedLine.startsWith('->') || trimmedLine.startsWith('-'));\n\n const observation = parseObservationLine(trimmedLine, isNested);\n\n if (observation) {\n if (!currentDateBlock) {\n // Create a default date block if none exists\n currentDateBlock = {\n date: 'Recent',\n observations: [],\n };\n }\n\n if (observation.isNested && lastObservation) {\n // Add as child of last observation\n lastObservation.children.push(observation);\n } else {\n currentDateBlock.observations.push(observation);\n lastObservation = observation;\n }\n }\n }\n\n if (currentDateBlock) {\n thread.dateBlocks.push(currentDateBlock);\n }\n\n if (thread.dateBlocks.length > 0) {\n result.threads.push(thread);\n }\n }\n\n return result;\n}\n\n/**\n * Render a single observation\n */\nfunction ObservationItem({\n observation,\n useInheritedTextColor,\n}: {\n observation: ParsedObservation;\n useInheritedTextColor?: boolean;\n}) {\n // When useInheritedTextColor is true, don't apply priority colors - inherit from parent\n const priorityColor = useInheritedTextColor\n ? ''\n : observation.priority\n ? PRIORITY_COLORS[observation.priority]\n : 'text-muted-foreground';\n const bgColor = useInheritedTextColor ? '' : observation.priority ? PRIORITY_BG[observation.priority] : '';\n\n // Get a subtle left border color based on priority (using blue shades for visual hierarchy)\n const borderColor = observation.priority ? PRIORITY_BORDER[observation.priority] : 'border-l-transparent';\n\n return (\n <div className={cn('py-0.5', observation.isNested && 'ml-4 border-l border-border/50 pl-2')}>\n <div\n className={cn(\n 'flex items-start gap-1.5 text-caption',\n bgColor && 'rounded px-1.5 py-0.5',\n bgColor,\n !observation.isNested && observation.priority && `border-l-2 ${borderColor} pl-1.5`,\n )}\n >\n {observation.isNested && (\n <span className={cn('shrink-0', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>→</span>\n )}\n <span className=\"flex-1 [&_code]:rounded [&_code]:bg-black/10 [&_code]:px-1 [&_code]:py-0.5 [&_code]:text-meta\">\n <MarkdownRenderer className={priorityColor}>{observation.content}</MarkdownRenderer>\n </span>\n {observation.time && (\n <Txt\n as=\"span\"\n variant=\"meta\"\n font=\"mono\"\n tone={useInheritedTextColor ? undefined : 'muted'}\n className={cn('ml-2 shrink-0', useInheritedTextColor && 'opacity-60')}\n >\n {observation.time}\n </Txt>\n )}\n </div>\n {observation.children.length > 0 && (\n <div className=\"mt-0.5\">\n {observation.children.map((child, i) => (\n <ObservationItem key={i} observation={child} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Render a date block\n */\nfunction DateBlock({ block, useInheritedTextColor }: { block: ParsedDateBlock; useInheritedTextColor?: boolean }) {\n return (\n <div className=\"mb-2\">\n <div\n className={cn(\n 'sticky top-0 mb-1 flex items-center gap-2 py-1 backdrop-blur-sm',\n useInheritedTextColor ? 'bg-transparent' : 'bg-background/95',\n )}\n >\n <span className={cn('text-column', useInheritedTextColor ? 'opacity-80' : 'text-foreground')}>\n {block.date}\n </span>\n {block.relativeTime && (\n <span className={cn('text-meta', useInheritedTextColor ? 'opacity-60' : 'text-muted-foreground')}>\n ({block.relativeTime})\n </span>\n )}\n </div>\n <div className=\"space-y-0\">\n {block.observations.map((obs, i) => (\n <ObservationItem key={i} observation={obs} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Render a thread section\n */\nfunction ThreadSection({\n thread,\n showThreadId,\n useInheritedTextColor,\n}: {\n thread: ParsedThread;\n showThreadId: boolean;\n useInheritedTextColor?: boolean;\n}) {\n return (\n <div className=\"mb-3\">\n {showThreadId && thread.threadId !== 'default' && (\n <div\n className={cn(\n 'mb-1 inline-block rounded px-1 py-0.5 text-meta',\n useInheritedTextColor ? 'bg-current/10 opacity-60' : 'bg-muted/50 text-muted-foreground',\n )}\n >\n Thread{' '}\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {thread.threadId}\n </Txt>\n </div>\n )}\n {thread.dateBlocks.map((block, i) => (\n <DateBlock key={i} block={block} useInheritedTextColor={useInheritedTextColor} />\n ))}\n </div>\n );\n}\n\nexport interface ObservationRendererProps {\n observations: string;\n className?: string;\n maxHeight?: string;\n showCurrentTask?: boolean;\n showSuggestedResponse?: boolean;\n /** If true, observations inherit text color from parent instead of using priority colors */\n useInheritedTextColor?: boolean;\n}\n\n/**\n * Renders raw observation text with proper formatting\n */\nexport function ObservationRenderer({\n observations,\n className,\n maxHeight,\n showCurrentTask = false,\n showSuggestedResponse = false,\n useInheritedTextColor = false,\n}: ObservationRendererProps) {\n const parsed = useMemo(() => parseObservations(observations), [observations]);\n\n const hasMultipleThreads =\n parsed.threads.length > 1 || (parsed.threads.length === 1 && parsed.threads[0]?.threadId !== 'default');\n\n if (parsed.threads.length === 0 && !parsed.currentTask && !parsed.suggestedResponse) {\n return <div className={cn('text-caption text-muted-foreground italic', className)}>No observations</div>;\n }\n\n return (\n <div className={cn('overflow-hidden text-body', className)}>\n <div\n className={cn('wrap-break-word', maxHeight && 'overflow-y-auto pr-1')}\n style={maxHeight ? { maxHeight } : undefined}\n >\n {parsed.threads.map((thread, i) => (\n <ThreadSection\n key={thread.threadId + i}\n thread={thread}\n showThreadId={hasMultipleThreads}\n useInheritedTextColor={useInheritedTextColor}\n />\n ))}\n </div>\n\n {showCurrentTask && parsed.currentTask && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Current Task</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground\">{parsed.currentTask}</div>\n </div>\n )}\n\n {showSuggestedResponse && parsed.suggestedResponse && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <div className=\"mb-1 text-meta tracking-wide text-muted-foreground uppercase\">Suggested Response</div>\n <div className=\"text-caption whitespace-pre-wrap text-foreground/80 italic\">{parsed.suggestedResponse}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport default ObservationRenderer;\n"],"names":[],"mappings":"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"}
@@ -3,18 +3,15 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
- const dateFns = require('date-fns');
7
6
  const lucideReact = require('lucide-react');
8
7
  const React = require('react');
9
8
  const Button = require('../../../Button-BAMnPqos.cjs');
10
9
  const buttonsGroup = require('../../../buttons-group-CoZP3lJt.cjs');
11
10
  const copyButton = require('../../../copy-button-D2MTGxq_.cjs');
12
11
  const dataKeysAndValues = require('../../../data-keys-and-values-CMJ9zHKm.cjs');
13
- const dataPanel = require('../../../data-panel-XPXrhYJI.cjs');
12
+ const dataPanel = require('../../../data-panel-C_BqhzeL.cjs');
13
+ const utils_dateFormat = require('../../../utils/date-format.cjs.js');
14
14
 
15
- function toDate(value) {
16
- return value instanceof Date ? value : new Date(value);
17
- }
18
15
  function LogDataPanel({
19
16
  log,
20
17
  onClose,
@@ -24,7 +21,7 @@ function LogDataPanel({
24
21
  onNext,
25
22
  depth
26
23
  }) {
27
- const formattedDate = log ? dateFns.format(toDate(log.timestamp), "MMM dd, HH:mm:ss.SSS") : "";
24
+ const formattedDate = log ? utils_dateFormat.formatTimestampPrecise(log.timestamp) ?? "" : "";
28
25
  return /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel, { open: !!log, onClose, title: log ? `Log ${formattedDate}` : "Log", depth, children: log && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
29
26
  /* @__PURE__ */ jsxRuntime.jsxs(dataPanel.DataPanel.Header, { children: [
30
27
  /* @__PURE__ */ jsxRuntime.jsx(dataPanel.DataPanel.CloseButton, { onClick: onClose }),
@@ -1 +1 @@
1
- {"version":3,"file":"log-data-panel.cjs.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? format(toDate(log.timestamp), 'MMM dd, HH:mm:ss.SSS') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["format","jsx","DataPanel","jsxs","Fragment","DataKeysAndValues","ButtonsGroup","Button","ArrowRightIcon","CopyButton"],"mappings":"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"}
1
+ {"version":3,"file":"log-data-panel.cjs.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? (formatTimestampPrecise(log.timestamp) ?? '') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["formatTimestampPrecise","jsx","DataPanel","jsxs","Fragment","DataKeysAndValues","ButtonsGroup","Button","ArrowRightIcon","CopyButton"],"mappings":"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"}
@@ -1,16 +1,13 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { format } from 'date-fns';
3
2
  import { ArrowRightIcon } from 'lucide-react';
4
3
  import { Fragment as Fragment$1 } from 'react';
5
4
  import { B as Button } from '../../../Button-B8nF87ai.js';
6
5
  import { B as ButtonsGroup } from '../../../buttons-group-DsZgrZBZ.js';
7
6
  import { C as CopyButton } from '../../../copy-button-DcZ1mdw4.js';
8
7
  import { D as DataKeysAndValues } from '../../../data-keys-and-values-BTYDB-K2.js';
9
- import { D as DataPanel } from '../../../data-panel-BQVTKo86.js';
8
+ import { D as DataPanel } from '../../../data-panel-BWgExbHs.js';
9
+ import { formatTimestampPrecise } from '../../../utils/date-format.es.js';
10
10
 
11
- function toDate(value) {
12
- return value instanceof Date ? value : new Date(value);
13
- }
14
11
  function LogDataPanel({
15
12
  log,
16
13
  onClose,
@@ -20,7 +17,7 @@ function LogDataPanel({
20
17
  onNext,
21
18
  depth
22
19
  }) {
23
- const formattedDate = log ? format(toDate(log.timestamp), "MMM dd, HH:mm:ss.SSS") : "";
20
+ const formattedDate = log ? formatTimestampPrecise(log.timestamp) ?? "" : "";
24
21
  return /* @__PURE__ */ jsx(DataPanel, { open: !!log, onClose, title: log ? `Log ${formattedDate}` : "Log", depth, children: log && /* @__PURE__ */ jsxs(Fragment, { children: [
25
22
  /* @__PURE__ */ jsxs(DataPanel.Header, { children: [
26
23
  /* @__PURE__ */ jsx(DataPanel.CloseButton, { onClick: onClose }),
@@ -1 +1 @@
1
- {"version":3,"file":"log-data-panel.es.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? format(toDate(log.timestamp), 'MMM dd, HH:mm:ss.SSS') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"log-data-panel.es.js","sources":["../../../../src/domains/logs/components/log-data-panel.tsx"],"sourcesContent":["import { ArrowRightIcon } from 'lucide-react';\nimport { Fragment } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { formatTimestampPrecise } from '@/utils/date-format';\n\nexport interface LogDataPanelProps {\n /** Always mount the panel and pass `undefined` to close it, so the drawer can animate out. */\n log?: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n depth?: 1 | 2 | 3;\n}\n\nexport function LogDataPanel({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n depth,\n}: LogDataPanelProps) {\n const formattedDate = log ? (formatTimestampPrecise(log.timestamp) ?? '') : '';\n\n return (\n <DataPanel open={!!log} onClose={onClose} title={log ? `Log ${formattedDate}` : 'Log'} depth={depth}>\n {log && (\n <>\n <DataPanel.Header>\n <DataPanel.CloseButton onClick={onClose} />\n <DataPanel.Heading>Log · {formattedDate}</DataPanel.Heading>\n <DataPanel.HeaderActions>\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Go to previous log\"\n nextLabel=\"Go to next log\"\n />\n </DataPanel.HeaderActions>\n </DataPanel.Header>\n\n <DataPanel.Content>\n <div className=\"grid gap-6 p-2\">\n <DataKeysAndValues>\n {log.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityType}</DataKeysAndValues.Value>\n </>\n )}\n {log.entityName && (\n <>\n <DataKeysAndValues.Key>Entity Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.entityName}</DataKeysAndValues.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <DataKeysAndValues.Key>Service</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.serviceName}</DataKeysAndValues.Value>\n </>\n )}\n {log.environment && (\n <>\n <DataKeysAndValues.Key>Environment</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.environment}</DataKeysAndValues.Value>\n </>\n )}\n {log.source && (\n <>\n <DataKeysAndValues.Key>Source</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{log.source}</DataKeysAndValues.Value>\n </>\n )}\n {log.metadata &&\n Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <DataKeysAndValues.Key>{key}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{String(value)}</DataKeysAndValues.Value>\n </Fragment>\n ))}\n </DataKeysAndValues>\n\n <DataPanel.CodeSection title=\"Message\" codeStr={log.message} simplified />\n\n {(log.traceId || log.spanId) && (\n <div className=\"grid gap-2\">\n {log.traceId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n icon={<ArrowRightIcon />}\n onClick={() => log.traceId && onTraceClick?.(log.traceId)}\n >\n <span>Trace</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId} tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup className=\"w-full min-w-0\">\n <Button\n className=\"min-w-0 flex-1 justify-between overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && log.spanId && onSpanClick?.(log.traceId, log.spanId)}\n icon={<ArrowRightIcon />}\n >\n <span>Span</span>\n <span className=\"ml-auto min-w-0 truncate text-caption text-placeholder\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId} tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} />\n )}\n </div>\n </DataPanel.Content>\n </>\n )}\n </DataPanel>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
@@ -5,9 +5,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const reactVirtual = require('@tanstack/react-virtual');
7
7
  const React = require('react');
8
- const dataListSkeleton = require('../../../data-list-skeleton-CjwR0o3w.cjs');
8
+ const dataListSkeleton = require('../../../data-list-skeleton-CgbWqYky.cjs');
9
9
  const useDataListKeyboard = require('../../../use-data-list-keyboard-DF3tLe10.cjs');
10
- const logsDataList = require('../../../logs-data-list-BHvJOeec.cjs');
10
+ const logsDataList = require('../../../logs-data-list-lJK0yGYj.cjs');
11
11
 
12
12
  const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
13
13
  const ROW_HEIGHT = 36;
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useVirtualizer } from '@tanstack/react-virtual';
3
3
  import { useRef, useEffect } from 'react';
4
- import { D as DataListSkeleton } from '../../../data-list-skeleton-DAfM8AjW.js';
4
+ import { D as DataListSkeleton } from '../../../data-list-skeleton-BrSh9Y_3.js';
5
5
  import { u as useDataListKeyboard } from '../../../use-data-list-keyboard-DFQr4t38.js';
6
- import { L as LogsDataList } from '../../../logs-data-list-CgDcNIvS.js';
6
+ import { L as LogsDataList } from '../../../logs-data-list-BKE5vYZR.js';
7
7
 
8
8
  const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
9
9
  const ROW_HEIGHT = 36;
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
- const dateFns = require('date-fns');
7
6
  const lucideReact = require('lucide-react');
8
7
  const Button = require('../../../Button-BAMnPqos.cjs');
9
8
  const EmptyState = require('../../../EmptyState-2XQgeju6.cjs');
9
+ const utils_dateFormat = require('../../../utils/date-format.cjs.js');
10
10
 
11
11
  const PRESET_LABELS = {
12
12
  "last-24h": "the last 24 hours",
@@ -15,7 +15,6 @@ const PRESET_LABELS = {
15
15
  "last-14d": "the last 14 days",
16
16
  "last-30d": "the last 30 days"
17
17
  };
18
- const DATE_FORMAT = "MMM d, yyyy HH:mm";
19
18
  const LEVEL_TIP = "Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.";
20
19
  function describeRange({ datePreset, dateFrom, dateTo }) {
21
20
  if (datePreset && datePreset !== "all" && datePreset !== "custom") {
@@ -26,13 +25,13 @@ function describeRange({ datePreset, dateFrom, dateTo }) {
26
25
  }
27
26
  if (dateFrom && dateTo) {
28
27
  return {
29
- title: `No logs between ${dateFns.format(dateFrom, DATE_FORMAT)} and ${dateFns.format(dateTo, DATE_FORMAT)}`,
28
+ title: `No logs between ${utils_dateFormat.formatDate(dateFrom, "date-time")} and ${utils_dateFormat.formatDate(dateTo, "date-time")}`,
30
29
  description: LEVEL_TIP
31
30
  };
32
31
  }
33
32
  if (dateFrom) {
34
33
  return {
35
- title: `No logs since ${dateFns.format(dateFrom, DATE_FORMAT)}`,
34
+ title: `No logs since ${utils_dateFormat.formatDate(dateFrom, "date-time")}`,
36
35
  description: LEVEL_TIP
37
36
  };
38
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"no-logs-info.cjs.js","sources":["../../../../src/domains/logs/components/no-logs-info.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${format(dateFrom, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <EmptyState\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n render={\n <a href=\"https://mastra.ai/en/docs/observability/logging\" target=\"_blank\" rel=\"noopener noreferrer\" />\n }\n icon={<ExternalLinkIcon />}\n >\n Logging Documentation\n </Button>\n }\n variant=\"fill\"\n />\n );\n};\n"],"names":["format","jsx","EmptyState","Button","ExternalLinkIcon"],"mappings":";;;;;;;;;;AAMA,MAAM,aAAA,GAA2E;AAAA,EAC/E,UAAA,EAAY,mBAAA;AAAA,EACZ,SAAA,EAAW,iBAAA;AAAA,EACX,SAAA,EAAW,iBAAA;AAAA,EACX,UAAA,EAAY,kBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAQA,MAAM,WAAA,GAAc,mBAAA;AAEpB,MAAM,SAAA,GAAY,oGAAA;AAElB,SAAS,aAAA,CAAc,EAAE,UAAA,EAAY,QAAA,EAAU,QAAO,EAA4D;AAChH,EAAA,IAAI,UAAA,IAAc,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,QAAA,EAAU;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,YAAA,EAAe,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,MAC/C,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,gBAAA,EAAmBA,cAAA,CAAO,QAAA,EAAU,WAAW,CAAC,CAAA,KAAA,EAAQA,cAAA,CAAO,MAAA,EAAQ,WAAW,CAAC,CAAA,CAAA;AAAA,MAC1F,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,cAAA,EAAiBA,cAAA,CAAO,QAAA,EAAU,WAAW,CAAC,CAAA,CAAA;AAAA,MACrD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AACF;AAEO,MAAM,UAAA,GAAa,CAAC,EAAE,UAAA,EAAY,UAAU,MAAA,EAAO,GAAqB,EAAC,KAAM;AACpF,EAAA,MAAM,EAAE,OAAO,WAAA,EAAY,GAAI,cAAc,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC7E,EAAA,uBACEC,cAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,KAAA;AAAA,MACX,eAAA,EAAiB,WAAA;AAAA,MACjB,UAAA,kBACED,cAAA;AAAA,QAACE,aAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,MAAA,iCACG,GAAA,EAAA,EAAE,IAAA,EAAK,mDAAkD,MAAA,EAAO,QAAA,EAAS,KAAI,qBAAA,EAAsB,CAAA;AAAA,UAEtG,IAAA,iCAAOC,4BAAA,EAAA,EAAiB,CAAA;AAAA,UACzB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAEF,OAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;;;;"}
1
+ {"version":3,"file":"no-logs-info.cjs.js","sources":["../../../../src/domains/logs/components/no-logs-info.tsx"],"sourcesContent":["import { ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { formatDate } from '@/utils/date-format';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${formatDate(dateFrom, 'date-time')} and ${formatDate(dateTo, 'date-time')}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${formatDate(dateFrom, 'date-time')}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <EmptyState\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n render={\n <a href=\"https://mastra.ai/en/docs/observability/logging\" target=\"_blank\" rel=\"noopener noreferrer\" />\n }\n icon={<ExternalLinkIcon />}\n >\n Logging Documentation\n </Button>\n }\n variant=\"fill\"\n />\n );\n};\n"],"names":["formatDate","jsx","EmptyState","Button","ExternalLinkIcon"],"mappings":";;;;;;;;;;AAMA,MAAM,aAAA,GAA2E;AAAA,EAC/E,UAAA,EAAY,mBAAA;AAAA,EACZ,SAAA,EAAW,iBAAA;AAAA,EACX,SAAA,EAAW,iBAAA;AAAA,EACX,UAAA,EAAY,kBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAQA,MAAM,SAAA,GAAY,oGAAA;AAElB,SAAS,aAAA,CAAc,EAAE,UAAA,EAAY,QAAA,EAAU,QAAO,EAA4D;AAChH,EAAA,IAAI,UAAA,IAAc,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,QAAA,EAAU;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,YAAA,EAAe,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,MAC/C,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,gBAAA,EAAmBA,2BAAA,CAAW,QAAA,EAAU,WAAW,CAAC,CAAA,KAAA,EAAQA,2BAAA,CAAW,MAAA,EAAQ,WAAW,CAAC,CAAA,CAAA;AAAA,MAClG,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,cAAA,EAAiBA,2BAAA,CAAW,QAAA,EAAU,WAAW,CAAC,CAAA,CAAA;AAAA,MACzD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AACF;AAEO,MAAM,UAAA,GAAa,CAAC,EAAE,UAAA,EAAY,UAAU,MAAA,EAAO,GAAqB,EAAC,KAAM;AACpF,EAAA,MAAM,EAAE,OAAO,WAAA,EAAY,GAAI,cAAc,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC7E,EAAA,uBACEC,cAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,KAAA;AAAA,MACX,eAAA,EAAiB,WAAA;AAAA,MACjB,UAAA,kBACED,cAAA;AAAA,QAACE,aAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,MAAA,iCACG,GAAA,EAAA,EAAE,IAAA,EAAK,mDAAkD,MAAA,EAAO,QAAA,EAAS,KAAI,qBAAA,EAAsB,CAAA;AAAA,UAEtG,IAAA,iCAAOC,4BAAA,EAAA,EAAiB,CAAA;AAAA,UACzB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAEF,OAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { format } from 'date-fns';
3
2
  import { ExternalLinkIcon } from 'lucide-react';
4
3
  import { B as Button } from '../../../Button-B8nF87ai.js';
5
4
  import { E as EmptyState } from '../../../EmptyState-Bc4nJ9QH.js';
5
+ import { formatDate } from '../../../utils/date-format.es.js';
6
6
 
7
7
  const PRESET_LABELS = {
8
8
  "last-24h": "the last 24 hours",
@@ -11,7 +11,6 @@ const PRESET_LABELS = {
11
11
  "last-14d": "the last 14 days",
12
12
  "last-30d": "the last 30 days"
13
13
  };
14
- const DATE_FORMAT = "MMM d, yyyy HH:mm";
15
14
  const LEVEL_TIP = "Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.";
16
15
  function describeRange({ datePreset, dateFrom, dateTo }) {
17
16
  if (datePreset && datePreset !== "all" && datePreset !== "custom") {
@@ -22,13 +21,13 @@ function describeRange({ datePreset, dateFrom, dateTo }) {
22
21
  }
23
22
  if (dateFrom && dateTo) {
24
23
  return {
25
- title: `No logs between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,
24
+ title: `No logs between ${formatDate(dateFrom, "date-time")} and ${formatDate(dateTo, "date-time")}`,
26
25
  description: LEVEL_TIP
27
26
  };
28
27
  }
29
28
  if (dateFrom) {
30
29
  return {
31
- title: `No logs since ${format(dateFrom, DATE_FORMAT)}`,
30
+ title: `No logs since ${formatDate(dateFrom, "date-time")}`,
32
31
  description: LEVEL_TIP
33
32
  };
34
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"no-logs-info.es.js","sources":["../../../../src/domains/logs/components/no-logs-info.tsx"],"sourcesContent":["import { format } from 'date-fns';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${format(dateFrom, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <EmptyState\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n render={\n <a href=\"https://mastra.ai/en/docs/observability/logging\" target=\"_blank\" rel=\"noopener noreferrer\" />\n }\n icon={<ExternalLinkIcon />}\n >\n Logging Documentation\n </Button>\n }\n variant=\"fill\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAMA,MAAM,aAAA,GAA2E;AAAA,EAC/E,UAAA,EAAY,mBAAA;AAAA,EACZ,SAAA,EAAW,iBAAA;AAAA,EACX,SAAA,EAAW,iBAAA;AAAA,EACX,UAAA,EAAY,kBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAQA,MAAM,WAAA,GAAc,mBAAA;AAEpB,MAAM,SAAA,GAAY,oGAAA;AAElB,SAAS,aAAA,CAAc,EAAE,UAAA,EAAY,QAAA,EAAU,QAAO,EAA4D;AAChH,EAAA,IAAI,UAAA,IAAc,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,QAAA,EAAU;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,YAAA,EAAe,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,MAC/C,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAA,EAAU,WAAW,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,WAAW,CAAC,CAAA,CAAA;AAAA,MAC1F,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,cAAA,EAAiB,MAAA,CAAO,QAAA,EAAU,WAAW,CAAC,CAAA,CAAA;AAAA,MACrD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AACF;AAEO,MAAM,UAAA,GAAa,CAAC,EAAE,UAAA,EAAY,UAAU,MAAA,EAAO,GAAqB,EAAC,KAAM;AACpF,EAAA,MAAM,EAAE,OAAO,WAAA,EAAY,GAAI,cAAc,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,KAAA;AAAA,MACX,eAAA,EAAiB,WAAA;AAAA,MACjB,UAAA,kBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,MAAA,sBACG,GAAA,EAAA,EAAE,IAAA,EAAK,mDAAkD,MAAA,EAAO,QAAA,EAAS,KAAI,qBAAA,EAAsB,CAAA;AAAA,UAEtG,IAAA,sBAAO,gBAAA,EAAA,EAAiB,CAAA;AAAA,UACzB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAEF,OAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;;;;"}
1
+ {"version":3,"file":"no-logs-info.es.js","sources":["../../../../src/domains/logs/components/no-logs-info.tsx"],"sourcesContent":["import { ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { formatDate } from '@/utils/date-format';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${formatDate(dateFrom, 'date-time')} and ${formatDate(dateTo, 'date-time')}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${formatDate(dateFrom, 'date-time')}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <EmptyState\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n render={\n <a href=\"https://mastra.ai/en/docs/observability/logging\" target=\"_blank\" rel=\"noopener noreferrer\" />\n }\n icon={<ExternalLinkIcon />}\n >\n Logging Documentation\n </Button>\n }\n variant=\"fill\"\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAMA,MAAM,aAAA,GAA2E;AAAA,EAC/E,UAAA,EAAY,mBAAA;AAAA,EACZ,SAAA,EAAW,iBAAA;AAAA,EACX,SAAA,EAAW,iBAAA;AAAA,EACX,UAAA,EAAY,kBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAQA,MAAM,SAAA,GAAY,oGAAA;AAElB,SAAS,aAAA,CAAc,EAAE,UAAA,EAAY,QAAA,EAAU,QAAO,EAA4D;AAChH,EAAA,IAAI,UAAA,IAAc,UAAA,KAAe,KAAA,IAAS,UAAA,KAAe,QAAA,EAAU;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,YAAA,EAAe,aAAA,CAAc,UAAU,CAAC,CAAA,CAAA;AAAA,MAC/C,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,gBAAA,EAAmB,UAAA,CAAW,QAAA,EAAU,WAAW,CAAC,CAAA,KAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,WAAW,CAAC,CAAA,CAAA;AAAA,MAClG,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA,cAAA,EAAiB,UAAA,CAAW,QAAA,EAAU,WAAW,CAAC,CAAA,CAAA;AAAA,MACzD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AACF;AAEO,MAAM,UAAA,GAAa,CAAC,EAAE,UAAA,EAAY,UAAU,MAAA,EAAO,GAAqB,EAAC,KAAM;AACpF,EAAA,MAAM,EAAE,OAAO,WAAA,EAAY,GAAI,cAAc,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC7E,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,KAAA;AAAA,MACX,eAAA,EAAiB,WAAA;AAAA,MACjB,UAAA,kBACE,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,OAAA;AAAA,UACR,MAAA,sBACG,GAAA,EAAA,EAAE,IAAA,EAAK,mDAAkD,MAAA,EAAO,QAAA,EAAS,KAAI,qBAAA,EAAsB,CAAA;AAAA,UAEtG,IAAA,sBAAO,gBAAA,EAAA,EAAiB,CAAA;AAAA,UACzB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,MAEF,OAAA,EAAQ;AAAA;AAAA,GACV;AAEJ;;;;"}