@mastra/playground-ui 58.0.0 → 59.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) hide show
  1. package/README.md +62 -0
  2. package/dist/{Badge-TD55_qZJ.js → Badge-Bzn8Z-_I.js} +2 -2
  3. package/dist/Badge-Bzn8Z-_I.js.map +1 -0
  4. package/dist/{Badge-BEeYtjmv.cjs → Badge-DFNxcz-r.cjs} +2 -2
  5. package/dist/Badge-DFNxcz-r.cjs.map +1 -0
  6. package/dist/{Header-BVnFQlzE.js → Header-hTHhO02b.js} +2 -2
  7. package/dist/{Header-BVnFQlzE.js.map → Header-hTHhO02b.js.map} +1 -1
  8. package/dist/{Header-CGjhJ0nQ.cjs → Header-y51Sfo3G.cjs} +2 -2
  9. package/dist/{Header-CGjhJ0nQ.cjs.map → Header-y51Sfo3G.cjs.map} +1 -1
  10. package/dist/{Txt-DTh3Pa_a.js → Txt-BP1SRHmL.js} +4 -10
  11. package/dist/Txt-BP1SRHmL.js.map +1 -0
  12. package/dist/{Txt-B4-2nLaI.cjs → Txt-DPmEpNbp.cjs} +4 -10
  13. package/dist/Txt-DPmEpNbp.cjs.map +1 -0
  14. package/dist/{ask-user-BPpgiE7k.cjs → ask-user-4pnmHbuC.cjs} +3 -3
  15. package/dist/{ask-user-BPpgiE7k.cjs.map → ask-user-4pnmHbuC.cjs.map} +1 -1
  16. package/dist/{ask-user-jDUt7hgT.js → ask-user-CFcQN_7m.js} +3 -3
  17. package/dist/{ask-user-jDUt7hgT.js.map → ask-user-CFcQN_7m.js.map} +1 -1
  18. package/dist/{chat-notification-CmdRGO_D.js → chat-notification-BI_WRUvG.js} +3 -3
  19. package/dist/{chat-notification-CmdRGO_D.js.map → chat-notification-BI_WRUvG.js.map} +1 -1
  20. package/dist/{chat-notification-DJykWtoj.cjs → chat-notification-Dc7jwULm.cjs} +3 -3
  21. package/dist/{chat-notification-DJykWtoj.cjs.map → chat-notification-Dc7jwULm.cjs.map} +1 -1
  22. package/dist/{chat-signal-xs3FkPts.cjs → chat-signal-BodewV33.cjs} +3 -3
  23. package/dist/{chat-signal-xs3FkPts.cjs.map → chat-signal-BodewV33.cjs.map} +1 -1
  24. package/dist/{chat-signal-Vg8pGXwH.js → chat-signal-D0zw80bU.js} +3 -3
  25. package/dist/{chat-signal-Vg8pGXwH.js.map → chat-signal-D0zw80bU.js.map} +1 -1
  26. package/dist/{combobox-BoSB-muq.cjs → combobox-B19HJqE-.cjs} +2 -2
  27. package/dist/{combobox-BoSB-muq.cjs.map → combobox-B19HJqE-.cjs.map} +1 -1
  28. package/dist/{combobox-Cd0JPUQW.js → combobox-D_kmwSKS.js} +2 -2
  29. package/dist/{combobox-Cd0JPUQW.js.map → combobox-D_kmwSKS.js.map} +1 -1
  30. package/dist/components/Avatar.cjs.js +1 -1
  31. package/dist/components/Avatar.es.js +1 -1
  32. package/dist/components/Badge.cjs.js +1 -1
  33. package/dist/components/Badge.es.js +1 -1
  34. package/dist/components/ClampedText.cjs.js +1 -1
  35. package/dist/components/ClampedText.es.js +1 -1
  36. package/dist/components/Combobox.cjs.js +1 -1
  37. package/dist/components/Combobox.es.js +1 -1
  38. package/dist/components/Comment.cjs.js +2 -2
  39. package/dist/components/Comment.es.js +2 -2
  40. package/dist/components/CompactNumber.cjs.js +24 -0
  41. package/dist/components/CompactNumber.cjs.js.map +1 -0
  42. package/dist/components/CompactNumber.d.ts +2 -0
  43. package/dist/components/CompactNumber.es.js +20 -0
  44. package/dist/components/CompactNumber.es.js.map +1 -0
  45. package/dist/components/DataCodeSection.cjs.js +1 -1
  46. package/dist/components/DataCodeSection.es.js +1 -1
  47. package/dist/components/DataList.cjs.js +8 -14
  48. package/dist/components/DataList.cjs.js.map +1 -1
  49. package/dist/components/DataList.es.js +8 -14
  50. package/dist/components/DataList.es.js.map +1 -1
  51. package/dist/components/DataPanel.cjs.js +1 -1
  52. package/dist/components/DataPanel.es.js +1 -1
  53. package/dist/components/DateRangeTimeline.cjs.js +1 -1
  54. package/dist/components/DateRangeTimeline.es.js +1 -1
  55. package/dist/components/DateTimePicker.cjs.js +1 -1
  56. package/dist/components/DateTimePicker.es.js +1 -1
  57. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  58. package/dist/components/DateTimeRangePicker.es.js +1 -1
  59. package/dist/components/Entity.cjs.js +1 -1
  60. package/dist/components/Entity.es.js +1 -1
  61. package/dist/components/EntityHeader.cjs.js +1 -1
  62. package/dist/components/EntityHeader.es.js +1 -1
  63. package/dist/components/Entry.cjs.js +1 -1
  64. package/dist/components/Entry.es.js +1 -1
  65. package/dist/components/EnvironmentVariablesEditor.cjs.js +3 -3
  66. package/dist/components/EnvironmentVariablesEditor.es.js +3 -3
  67. package/dist/components/FilterBar.cjs.js +1 -1
  68. package/dist/components/FilterBar.es.js +1 -1
  69. package/dist/components/FormFieldBlocks.cjs.js +4 -4
  70. package/dist/components/FormFieldBlocks.es.js +4 -4
  71. package/dist/components/Header.cjs.js +1 -1
  72. package/dist/components/Header.es.js +1 -1
  73. package/dist/components/InlineCode.cjs.js +10 -0
  74. package/dist/components/InlineCode.cjs.js.map +1 -0
  75. package/dist/components/InlineCode.d.ts +2 -0
  76. package/dist/components/InlineCode.es.js +2 -0
  77. package/dist/components/InlineCode.es.js.map +1 -0
  78. package/dist/components/ItemList.cjs.js +5 -17
  79. package/dist/components/ItemList.cjs.js.map +1 -1
  80. package/dist/components/ItemList.es.js +5 -17
  81. package/dist/components/ItemList.es.js.map +1 -1
  82. package/dist/components/JSONSchemaForm.cjs.js +2 -2
  83. package/dist/components/JSONSchemaForm.es.js +2 -2
  84. package/dist/components/ListSearch.cjs.js +1 -1
  85. package/dist/components/ListSearch.es.js +1 -1
  86. package/dist/components/LogsDataList.cjs.js +2 -2
  87. package/dist/components/LogsDataList.es.js +2 -2
  88. package/dist/components/Message.cjs.js +4 -5
  89. package/dist/components/Message.cjs.js.map +1 -1
  90. package/dist/components/Message.es.js +4 -5
  91. package/dist/components/Message.es.js.map +1 -1
  92. package/dist/components/MetricsCard.cjs.js +1 -1
  93. package/dist/components/MetricsCard.es.js +1 -1
  94. package/dist/components/MetricsCardGroup.cjs.js +2 -11
  95. package/dist/components/MetricsCardGroup.cjs.js.map +1 -1
  96. package/dist/components/MetricsCardGroup.es.js +2 -11
  97. package/dist/components/MetricsCardGroup.es.js.map +1 -1
  98. package/dist/components/MetricsKpiCard.cjs.js +1 -1
  99. package/dist/components/MetricsKpiCard.es.js +1 -1
  100. package/dist/components/MetricsLineChart.cjs.js +2 -1
  101. package/dist/components/MetricsLineChart.cjs.js.map +1 -1
  102. package/dist/components/MetricsLineChart.es.js +1 -1
  103. package/dist/components/PageHeader.cjs.js +1 -1
  104. package/dist/components/PageHeader.es.js +1 -1
  105. package/dist/components/PageLayout.cjs.js +1 -1
  106. package/dist/components/PageLayout.es.js +1 -1
  107. package/dist/components/PropertyFilter.cjs.js +1 -1
  108. package/dist/components/PropertyFilter.es.js +1 -1
  109. package/dist/components/RelativeTimestamp.cjs.js +119 -0
  110. package/dist/components/RelativeTimestamp.cjs.js.map +1 -0
  111. package/dist/components/RelativeTimestamp.d.ts +2 -0
  112. package/dist/components/RelativeTimestamp.es.js +115 -0
  113. package/dist/components/RelativeTimestamp.es.js.map +1 -0
  114. package/dist/components/Section.cjs.js +1 -1
  115. package/dist/components/Section.es.js +1 -1
  116. package/dist/components/SettingsRow.cjs.js +1 -1
  117. package/dist/components/SettingsRow.es.js +1 -1
  118. package/dist/components/SideDialog.cjs.js +1 -1
  119. package/dist/components/SideDialog.es.js +1 -1
  120. package/dist/components/StatusIndicators.cjs.js +21 -14
  121. package/dist/components/StatusIndicators.cjs.js.map +1 -1
  122. package/dist/components/StatusIndicators.es.js +21 -15
  123. package/dist/components/StatusIndicators.es.js.map +1 -1
  124. package/dist/components/Table.cjs.js +3 -21
  125. package/dist/components/Table.cjs.js.map +1 -1
  126. package/dist/components/Table.es.js +3 -21
  127. package/dist/components/Table.es.js.map +1 -1
  128. package/dist/components/ThreadList.cjs.js +1 -1
  129. package/dist/components/ThreadList.es.js +1 -1
  130. package/dist/components/Truncate.cjs.js +1 -1
  131. package/dist/components/Truncate.es.js +1 -1
  132. package/dist/components/Txt.cjs.js +1 -1
  133. package/dist/components/Txt.es.js +1 -1
  134. package/dist/components/Workflow.cjs.js +9 -13
  135. package/dist/components/Workflow.cjs.js.map +1 -1
  136. package/dist/components/Workflow.es.js +9 -13
  137. package/dist/components/Workflow.es.js.map +1 -1
  138. package/dist/components/ai/ask-user.cjs.js +1 -1
  139. package/dist/components/ai/ask-user.es.js +1 -1
  140. package/dist/components/ai/chat-event.cjs.js +3 -3
  141. package/dist/components/ai/chat-event.es.js +4 -4
  142. package/dist/components/ai/plan.cjs.js +3 -3
  143. package/dist/components/ai/plan.cjs.js.map +1 -1
  144. package/dist/components/ai/plan.es.js +3 -3
  145. package/dist/components/ai/plan.es.js.map +1 -1
  146. package/dist/components/ai/task-list.cjs.js +370 -55
  147. package/dist/components/ai/task-list.cjs.js.map +1 -1
  148. package/dist/components/ai/task-list.es.js +374 -58
  149. package/dist/components/ai/task-list.es.js.map +1 -1
  150. package/dist/components/ai/tool-call.cjs.js +7 -9
  151. package/dist/components/ai/tool-call.cjs.js.map +1 -1
  152. package/dist/components/ai/tool-call.es.js +8 -10
  153. package/dist/components/ai/tool-call.es.js.map +1 -1
  154. package/dist/{data-code-section-Cth9zVkj.js → data-code-section-BKrCkj90.js} +2 -2
  155. package/dist/{data-code-section-Cth9zVkj.js.map → data-code-section-BKrCkj90.js.map} +1 -1
  156. package/dist/{data-code-section-DE4AgaTU.cjs → data-code-section-C9z94ytx.cjs} +2 -2
  157. package/dist/{data-code-section-DE4AgaTU.cjs.map → data-code-section-C9z94ytx.cjs.map} +1 -1
  158. package/dist/{data-list-DisTjDHP.js → data-list-5-nRJbEO.js} +3 -3
  159. package/dist/{data-list-DisTjDHP.js.map → data-list-5-nRJbEO.js.map} +1 -1
  160. package/dist/{data-list-PwFpP_mo.cjs → data-list-RI8c32dk.cjs} +3 -3
  161. package/dist/{data-list-PwFpP_mo.cjs.map → data-list-RI8c32dk.cjs.map} +1 -1
  162. package/dist/{data-list-skeleton-DAfM8AjW.js → data-list-skeleton-BrSh9Y_3.js} +2 -2
  163. package/dist/{data-list-skeleton-DAfM8AjW.js.map → data-list-skeleton-BrSh9Y_3.js.map} +1 -1
  164. package/dist/{data-list-skeleton-CjwR0o3w.cjs → data-list-skeleton-CgbWqYky.cjs} +2 -2
  165. package/dist/{data-list-skeleton-CjwR0o3w.cjs.map → data-list-skeleton-CgbWqYky.cjs.map} +1 -1
  166. package/dist/{data-list-spacer-DEcgVGFM.cjs → data-list-spacer-1OqlC7WX.cjs} +2 -2
  167. package/dist/{data-list-spacer-DEcgVGFM.cjs.map → data-list-spacer-1OqlC7WX.cjs.map} +1 -1
  168. package/dist/{data-list-spacer-BmorAN0V.js → data-list-spacer-D3Rn1evn.js} +2 -2
  169. package/dist/{data-list-spacer-BmorAN0V.js.map → data-list-spacer-D3Rn1evn.js.map} +1 -1
  170. package/dist/{data-list-top-DpbOA3uw.js → data-list-top-B-AopfvE.js} +13 -21
  171. package/dist/data-list-top-B-AopfvE.js.map +1 -0
  172. package/dist/{data-list-top-WGUY167p.cjs → data-list-top-DFnudSA_.cjs} +13 -21
  173. package/dist/data-list-top-DFnudSA_.cjs.map +1 -0
  174. package/dist/{data-panel-BQVTKo86.js → data-panel-BWgExbHs.js} +2 -2
  175. package/dist/{data-panel-BQVTKo86.js.map → data-panel-BWgExbHs.js.map} +1 -1
  176. package/dist/{data-panel-XPXrhYJI.cjs → data-panel-C_BqhzeL.cjs} +2 -2
  177. package/dist/{data-panel-XPXrhYJI.cjs.map → data-panel-C_BqhzeL.cjs.map} +1 -1
  178. package/dist/{date-time-range-picker-C-t3Kdpk.js → date-time-range-picker-Bnviv7s-.js} +2 -2
  179. package/dist/{date-time-range-picker-C-t3Kdpk.js.map → date-time-range-picker-Bnviv7s-.js.map} +1 -1
  180. package/dist/{date-time-range-picker-BCzvSYx3.cjs → date-time-range-picker-sT5qAW-_.cjs} +2 -2
  181. package/dist/{date-time-range-picker-BCzvSYx3.cjs.map → date-time-range-picker-sT5qAW-_.cjs.map} +1 -1
  182. package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js +16 -0
  183. package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js.map +1 -0
  184. package/dist/domains/capabilities/hooks/use-feedback-available.d.ts +2 -0
  185. package/dist/domains/capabilities/hooks/use-feedback-available.es.js +12 -0
  186. package/dist/domains/capabilities/hooks/use-feedback-available.es.js.map +1 -0
  187. package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js +20 -0
  188. package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js.map +1 -0
  189. package/dist/domains/capabilities/hooks/use-observability-capabilities.d.ts +2 -0
  190. package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js +16 -0
  191. package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js.map +1 -0
  192. package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js +16 -0
  193. package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js.map +1 -0
  194. package/dist/domains/capabilities/hooks/use-trace-query-available.d.ts +2 -0
  195. package/dist/domains/capabilities/hooks/use-trace-query-available.es.js +12 -0
  196. package/dist/domains/capabilities/hooks/use-trace-query-available.es.js.map +1 -0
  197. package/dist/domains/capabilities/hooks.cjs.js +14 -0
  198. package/dist/domains/capabilities/hooks.cjs.js.map +1 -0
  199. package/dist/domains/capabilities/hooks.d.ts +2 -0
  200. package/dist/domains/capabilities/hooks.es.js +4 -0
  201. package/dist/domains/capabilities/hooks.es.js.map +1 -0
  202. package/dist/domains/capabilities.cjs.js +14 -0
  203. package/dist/domains/capabilities.cjs.js.map +1 -0
  204. package/dist/domains/capabilities.d.ts +2 -0
  205. package/dist/domains/capabilities.es.js +4 -0
  206. package/dist/domains/capabilities.es.js.map +1 -0
  207. package/dist/domains/chat/attachments/attachment-kind.es.js +1 -1
  208. package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
  209. package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
  210. package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
  211. package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
  212. package/dist/domains/chat/components/section-label.cjs.js +1 -1
  213. package/dist/domains/chat/components/section-label.es.js +1 -1
  214. package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
  215. package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
  216. package/dist/domains/chat/messages/reasoning-streaming-line.cjs.js +1 -1
  217. package/dist/domains/chat/messages/reasoning-streaming-line.es.js +1 -1
  218. package/dist/domains/chat/messages/reasoning.cjs.js +4 -3
  219. package/dist/domains/chat/messages/reasoning.cjs.js.map +1 -1
  220. package/dist/domains/chat/messages/reasoning.es.js +4 -3
  221. package/dist/domains/chat/messages/reasoning.es.js.map +1 -1
  222. package/dist/domains/chat/messages/renderers/message-text.cjs.js +1 -1
  223. package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
  224. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +2 -2
  225. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js.map +1 -1
  226. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +2 -2
  227. package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js.map +1 -1
  228. package/dist/domains/chat/messages/renderers/user-file-part-renderer.es.js +1 -1
  229. package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
  230. package/dist/domains/chat/messages/signal-badge.es.js +1 -1
  231. package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
  232. package/dist/domains/chat/messages/system-reminder-badge.cjs.js.map +1 -1
  233. package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
  234. package/dist/domains/chat/messages/system-reminder-badge.es.js.map +1 -1
  235. package/dist/domains/chat/messages/tripwire-notice.cjs.js +2 -2
  236. package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
  237. package/dist/domains/chat/messages/tripwire-notice.es.js +2 -2
  238. package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
  239. package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
  240. package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
  241. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +3 -3
  242. package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
  243. package/dist/domains/chat/tools/badges/code-mode-badge.es.js +3 -3
  244. package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
  245. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +6 -4
  246. package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js.map +1 -1
  247. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +6 -4
  248. package/dist/domains/chat/tools/badges/observation-marker-badge.es.js.map +1 -1
  249. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +11 -8
  250. package/dist/domains/chat/tools/badges/observation-renderer.cjs.js.map +1 -1
  251. package/dist/domains/chat/tools/badges/observation-renderer.es.js +11 -8
  252. package/dist/domains/chat/tools/badges/observation-renderer.es.js.map +1 -1
  253. package/dist/domains/logs/components/log-data-panel.cjs.js +3 -6
  254. package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -1
  255. package/dist/domains/logs/components/log-data-panel.es.js +3 -6
  256. package/dist/domains/logs/components/log-data-panel.es.js.map +1 -1
  257. package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
  258. package/dist/domains/logs/components/logs-list-view.es.js +2 -2
  259. package/dist/domains/logs/components/no-logs-info.cjs.js +3 -4
  260. package/dist/domains/logs/components/no-logs-info.cjs.js.map +1 -1
  261. package/dist/domains/logs/components/no-logs-info.es.js +3 -4
  262. package/dist/domains/logs/components/no-logs-info.es.js.map +1 -1
  263. package/dist/domains/memory/components/flame-graph.cjs.js +7 -5
  264. package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
  265. package/dist/domains/memory/components/flame-graph.es.js +8 -6
  266. package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
  267. package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
  268. package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
  269. package/dist/domains/memory/components/observation-detail-view.cjs.js +4 -5
  270. package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
  271. package/dist/domains/memory/components/observation-detail-view.es.js +4 -5
  272. package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
  273. package/dist/domains/memory/components/thread-context-progress.cjs.js +1 -1
  274. package/dist/domains/memory/components/thread-context-progress.cjs.js.map +1 -1
  275. package/dist/domains/memory/components/thread-context-progress.es.js +1 -1
  276. package/dist/domains/memory/components/thread-context-progress.es.js.map +1 -1
  277. package/dist/domains/memory/lib/timeline.cjs.js +0 -9
  278. package/dist/domains/memory/lib/timeline.cjs.js.map +1 -1
  279. package/dist/domains/memory/lib/timeline.es.js +1 -9
  280. package/dist/domains/memory/lib/timeline.es.js.map +1 -1
  281. package/dist/domains/metrics/components/bar-list.cjs.js +4 -4
  282. package/dist/domains/metrics/components/bar-list.cjs.js.map +1 -1
  283. package/dist/domains/metrics/components/bar-list.es.js +4 -4
  284. package/dist/domains/metrics/components/bar-list.es.js.map +1 -1
  285. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  286. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  287. package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
  288. package/dist/domains/metrics/components/kpi-card-view.cjs.js.map +1 -1
  289. package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
  290. package/dist/domains/metrics/components/kpi-card-view.es.js.map +1 -1
  291. package/dist/domains/metrics/components/latency-card-view.cjs.js +33 -24
  292. package/dist/domains/metrics/components/latency-card-view.cjs.js.map +1 -1
  293. package/dist/domains/metrics/components/latency-card-view.es.js +34 -25
  294. package/dist/domains/metrics/components/latency-card-view.es.js.map +1 -1
  295. package/dist/domains/metrics/components/memory-card-view.cjs.js +9 -8
  296. package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
  297. package/dist/domains/metrics/components/memory-card-view.es.js +8 -7
  298. package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
  299. package/dist/domains/metrics/components/metrics-utils.cjs.js +0 -15
  300. package/dist/domains/metrics/components/metrics-utils.cjs.js.map +1 -1
  301. package/dist/domains/metrics/components/metrics-utils.es.js +1 -14
  302. package/dist/domains/metrics/components/metrics-utils.es.js.map +1 -1
  303. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +6 -5
  304. package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js.map +1 -1
  305. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +4 -3
  306. package/dist/domains/metrics/components/model-usage-cost-card-view.es.js.map +1 -1
  307. package/dist/domains/metrics/components/scores-card-view.cjs.js +5 -5
  308. package/dist/domains/metrics/components/scores-card-view.cjs.js.map +1 -1
  309. package/dist/domains/metrics/components/scores-card-view.es.js +5 -5
  310. package/dist/domains/metrics/components/scores-card-view.es.js.map +1 -1
  311. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +7 -6
  312. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
  313. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +7 -6
  314. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
  315. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +13 -11
  316. package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
  317. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +13 -11
  318. package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
  319. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +7 -6
  320. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
  321. package/dist/domains/metrics/components/traces-volume-card-view.es.js +8 -7
  322. package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
  323. package/dist/domains/metrics/components.cjs.js +0 -2
  324. package/dist/domains/metrics/components.cjs.js.map +1 -1
  325. package/dist/domains/metrics/components.es.js +1 -1
  326. package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js +11 -11
  327. package/dist/domains/metrics/hooks/use-latency-metrics.cjs.js.map +1 -1
  328. package/dist/domains/metrics/hooks/use-latency-metrics.es.js +12 -11
  329. package/dist/domains/metrics/hooks/use-latency-metrics.es.js.map +1 -1
  330. package/dist/domains/metrics/hooks/use-metrics.cjs.js +3 -3
  331. package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
  332. package/dist/domains/metrics/hooks/use-metrics.es.js +3 -3
  333. package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
  334. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +5 -5
  335. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
  336. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +5 -5
  337. package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
  338. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js +6 -7
  339. package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js.map +1 -1
  340. package/dist/domains/metrics/hooks/use-scores-metrics.es.js +6 -7
  341. package/dist/domains/metrics/hooks/use-scores-metrics.es.js.map +1 -1
  342. package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js +4 -12
  343. package/dist/domains/metrics/hooks/use-token-usage-timeseries.cjs.js.map +1 -1
  344. package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js +4 -12
  345. package/dist/domains/metrics/hooks/use-token-usage-timeseries.es.js.map +1 -1
  346. package/dist/domains/metrics/hooks.cjs.js +3 -0
  347. package/dist/domains/metrics/hooks.cjs.js.map +1 -1
  348. package/dist/domains/metrics/hooks.es.js +1 -0
  349. package/dist/domains/metrics/hooks.es.js.map +1 -1
  350. package/dist/domains/metrics/metrics-interval.cjs.js +20 -0
  351. package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -0
  352. package/dist/domains/metrics/metrics-interval.d.ts +2 -0
  353. package/dist/domains/metrics/metrics-interval.es.js +15 -0
  354. package/dist/domains/metrics/metrics-interval.es.js.map +1 -0
  355. package/dist/domains/metrics.cjs.js +3 -2
  356. package/dist/domains/metrics.cjs.js.map +1 -1
  357. package/dist/domains/metrics.es.js +2 -1
  358. package/dist/domains/metrics.es.js.map +1 -1
  359. package/dist/domains/traces/components/no-traces-info.cjs.js +3 -4
  360. package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
  361. package/dist/domains/traces/components/no-traces-info.es.js +3 -4
  362. package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
  363. package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
  364. package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
  365. package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
  366. package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
  367. package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
  368. package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
  369. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -2
  370. package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
  371. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -2
  372. package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
  373. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
  374. package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
  375. package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
  376. package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
  377. package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
  378. package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
  379. package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
  380. package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
  381. package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
  382. package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
  383. package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
  384. package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
  385. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +3 -2
  386. package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
  387. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +3 -2
  388. package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
  389. package/dist/domains/traces/components/span-summary-description.cjs.js +6 -4
  390. package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -1
  391. package/dist/domains/traces/components/span-summary-description.es.js +7 -5
  392. package/dist/domains/traces/components/span-summary-description.es.js.map +1 -1
  393. package/dist/domains/traces/components/span-timeline-row.cjs.js +3 -4
  394. package/dist/domains/traces/components/span-timeline-row.cjs.js.map +1 -1
  395. package/dist/domains/traces/components/span-timeline-row.es.js +3 -4
  396. package/dist/domains/traces/components/span-timeline-row.es.js.map +1 -1
  397. package/dist/domains/traces/components/span-timing-hover-card.cjs.js +6 -11
  398. package/dist/domains/traces/components/span-timing-hover-card.cjs.js.map +1 -1
  399. package/dist/domains/traces/components/span-timing-hover-card.es.js +6 -11
  400. package/dist/domains/traces/components/span-timing-hover-card.es.js.map +1 -1
  401. package/dist/domains/traces/components/span-type-legend.cjs.js +1 -1
  402. package/dist/domains/traces/components/span-type-legend.es.js +1 -1
  403. package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
  404. package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
  405. package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
  406. package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
  407. package/dist/domains/traces/components/timeline-timing-col.cjs.js +3 -4
  408. package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
  409. package/dist/domains/traces/components/timeline-timing-col.es.js +3 -4
  410. package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
  411. package/dist/domains/traces/components/trace-columns-menu.cjs.js +21 -18
  412. package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
  413. package/dist/domains/traces/components/trace-columns-menu.es.js +21 -18
  414. package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
  415. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  416. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  417. package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
  418. package/dist/domains/traces/components/trace-id-button.es.js +1 -1
  419. package/dist/domains/traces/components/trace-span-timeline.cjs.js +10 -4
  420. package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
  421. package/dist/domains/traces/components/trace-span-timeline.es.js +10 -4
  422. package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
  423. package/dist/domains/traces/components/trace-span-tree.cjs.js +3 -4
  424. package/dist/domains/traces/components/trace-span-tree.cjs.js.map +1 -1
  425. package/dist/domains/traces/components/trace-span-tree.es.js +3 -4
  426. package/dist/domains/traces/components/trace-span-tree.es.js.map +1 -1
  427. package/dist/domains/traces/components/trace-summary-description.cjs.js +13 -10
  428. package/dist/domains/traces/components/trace-summary-description.cjs.js.map +1 -1
  429. package/dist/domains/traces/components/trace-summary-description.es.js +13 -10
  430. package/dist/domains/traces/components/trace-summary-description.es.js.map +1 -1
  431. package/dist/domains/traces/components/trace-time-range-chip.cjs.js +1 -1
  432. package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
  433. package/dist/domains/traces/components/traces-list-view.cjs.js +12 -10
  434. package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
  435. package/dist/domains/traces/components/traces-list-view.es.js +12 -10
  436. package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
  437. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
  438. package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
  439. package/dist/domains/traces/hooks/use-branch.cjs.js +0 -1
  440. package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
  441. package/dist/domains/traces/hooks/use-branch.es.js +0 -1
  442. package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
  443. package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js +0 -1
  444. package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js.map +1 -1
  445. package/dist/domains/traces/hooks/use-trace-light-spans.es.js +0 -1
  446. package/dist/domains/traces/hooks/use-trace-light-spans.es.js.map +1 -1
  447. package/dist/domains/traces/hooks/use-trace-query.cjs.js +63 -3
  448. package/dist/domains/traces/hooks/use-trace-query.cjs.js.map +1 -1
  449. package/dist/domains/traces/hooks/use-trace-query.es.js +61 -4
  450. package/dist/domains/traces/hooks/use-trace-query.es.js.map +1 -1
  451. package/dist/domains/traces/hooks/use-trace-search.cjs.js +0 -1
  452. package/dist/domains/traces/hooks/use-trace-search.cjs.js.map +1 -1
  453. package/dist/domains/traces/hooks/use-trace-search.es.js +0 -1
  454. package/dist/domains/traces/hooks/use-trace-search.es.js.map +1 -1
  455. package/dist/domains/traces/hooks/use-trace-spans.cjs.js +0 -1
  456. package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
  457. package/dist/domains/traces/hooks/use-trace-spans.es.js +0 -1
  458. package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
  459. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +42 -0
  460. package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -0
  461. package/dist/domains/traces/hooks/use-traces-list-source.d.ts +2 -0
  462. package/dist/domains/traces/hooks/use-traces-list-source.es.js +38 -0
  463. package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -0
  464. package/dist/domains/traces/hooks.cjs.js +2 -0
  465. package/dist/domains/traces/hooks.cjs.js.map +1 -1
  466. package/dist/domains/traces/hooks.es.js +1 -0
  467. package/dist/domains/traces/hooks.es.js.map +1 -1
  468. package/dist/domains/traces/trace-filters.cjs.js +10 -1
  469. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  470. package/dist/domains/traces/trace-filters.es.js +10 -1
  471. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  472. package/dist/domains/traces/utils/span-utils.cjs.js +4 -36
  473. package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
  474. package/dist/domains/traces/utils/span-utils.es.js +4 -32
  475. package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
  476. package/dist/domains/traces/utils.cjs.js +1 -1
  477. package/dist/domains/traces/utils.es.js +1 -1
  478. package/dist/domains/traces.cjs.js +3 -1
  479. package/dist/domains/traces.cjs.js.map +1 -1
  480. package/dist/domains/traces.es.js +2 -1
  481. package/dist/domains/traces.es.js.map +1 -1
  482. package/dist/ee/signals/components/entity-index-compact-grid.cjs.js +1 -1
  483. package/dist/ee/signals/components/entity-index-compact-grid.es.js +1 -1
  484. package/dist/ee/signals/components/entity-index-list.cjs.js +2 -2
  485. package/dist/ee/signals/components/entity-index-list.es.js +2 -2
  486. package/dist/ee/signals/components/entity-index-model.cjs.js +3 -2
  487. package/dist/ee/signals/components/entity-index-model.cjs.js.map +1 -1
  488. package/dist/ee/signals/components/entity-index-model.es.js +3 -2
  489. package/dist/ee/signals/components/entity-index-model.es.js.map +1 -1
  490. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -2
  491. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
  492. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +2 -2
  493. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +2 -2
  494. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
  495. package/dist/ee/signals/settings/trace-signal-settings.es.js +1 -1
  496. package/dist/ee/signals/signal-formatting.cjs.js +6 -34
  497. package/dist/ee/signals/signal-formatting.cjs.js.map +1 -1
  498. package/dist/ee/signals/signal-formatting.es.js +6 -34
  499. package/dist/ee/signals/signal-formatting.es.js.map +1 -1
  500. package/dist/ee/signals/snapshot-timeline-data.cjs.js +1 -1
  501. package/dist/ee/signals/snapshot-timeline-data.cjs.js.map +1 -1
  502. package/dist/ee/signals/snapshot-timeline-data.es.js +1 -1
  503. package/dist/ee/signals/snapshot-timeline-data.es.js.map +1 -1
  504. package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
  505. package/dist/ee/signals/view-mode-tab.es.js +1 -1
  506. package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
  507. package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
  508. package/dist/field-block-error-msg-Y0fi0HUC.js +22 -0
  509. package/dist/field-block-error-msg-Y0fi0HUC.js.map +1 -0
  510. package/dist/field-block-error-msg-oudJz2Hx.cjs +24 -0
  511. package/dist/field-block-error-msg-oudJz2Hx.cjs.map +1 -0
  512. package/dist/{field-error-id-DyWx33Fu.js → field-error-id-DD7OARLU.js} +2 -13
  513. package/dist/field-error-id-DD7OARLU.js.map +1 -0
  514. package/dist/{field-error-id-6EfqmQ4C.cjs → field-error-id-V_WejsRL.cjs} +4 -15
  515. package/dist/field-error-id-V_WejsRL.cjs.map +1 -0
  516. package/dist/hooks/use-elapsed-time.cjs.js +25 -0
  517. package/dist/hooks/use-elapsed-time.cjs.js.map +1 -0
  518. package/dist/hooks/use-elapsed-time.d.ts +2 -0
  519. package/dist/hooks/use-elapsed-time.es.js +21 -0
  520. package/dist/hooks/use-elapsed-time.es.js.map +1 -0
  521. package/dist/inline-code-BW6W121s.js +13 -0
  522. package/dist/inline-code-BW6W121s.js.map +1 -0
  523. package/dist/inline-code-CSwG-x8D.cjs +15 -0
  524. package/dist/inline-code-CSwG-x8D.cjs.map +1 -0
  525. package/dist/layout/tabbed-container.cjs.js +3 -3
  526. package/dist/layout/tabbed-container.es.js +3 -3
  527. package/dist/{list-search-S1mco9Bl.cjs → list-search-CsYQX8qR.cjs} +2 -2
  528. package/dist/{list-search-S1mco9Bl.cjs.map → list-search-CsYQX8qR.cjs.map} +1 -1
  529. package/dist/{list-search-FJ1O5F3S.js → list-search-D1FD8FCL.js} +2 -2
  530. package/dist/{list-search-FJ1O5F3S.js.map → list-search-D1FD8FCL.js.map} +1 -1
  531. package/dist/{logs-data-list-5BAeLU57.js → logs-data-list-BKE5vYZR.js} +4 -4
  532. package/dist/{logs-data-list-5BAeLU57.js.map → logs-data-list-BKE5vYZR.js.map} +1 -1
  533. package/dist/{logs-data-list-YL9yLKF3.cjs → logs-data-list-lJK0yGYj.cjs} +4 -4
  534. package/dist/{logs-data-list-YL9yLKF3.cjs.map → logs-data-list-lJK0yGYj.cjs.map} +1 -1
  535. package/dist/{metrics-card-Bzm6m1dy.js → metrics-card-C2RTi5Ew.js} +7 -7
  536. package/dist/metrics-card-C2RTi5Ew.js.map +1 -0
  537. package/dist/{metrics-card-DCCHIG-z.cjs → metrics-card-DzcVJTAN.cjs} +7 -7
  538. package/dist/metrics-card-DzcVJTAN.cjs.map +1 -0
  539. package/dist/{metrics-kpi-card-BrnFhFQm.js → metrics-kpi-card-BVCuXeDa.js} +21 -10
  540. package/dist/metrics-kpi-card-BVCuXeDa.js.map +1 -0
  541. package/dist/{metrics-kpi-card-Bhb4R4z0.cjs → metrics-kpi-card-DoIeHfv6.cjs} +21 -10
  542. package/dist/metrics-kpi-card-DoIeHfv6.cjs.map +1 -0
  543. package/dist/{metrics-line-chart-0FR3SYSt.cjs → metrics-line-chart-BNNRRxM8.cjs} +61 -25
  544. package/dist/metrics-line-chart-BNNRRxM8.cjs.map +1 -0
  545. package/dist/{metrics-line-chart-knlgw8bV.js → metrics-line-chart-CT_pqJtC.js} +62 -27
  546. package/dist/metrics-line-chart-CT_pqJtC.js.map +1 -0
  547. package/dist/new/layout/page-header.cjs.js +1 -1
  548. package/dist/new/layout/page-header.es.js +1 -1
  549. package/dist/new/settings.cjs.js +2 -2
  550. package/dist/new/settings.es.js +2 -2
  551. package/dist/{page-header-CyXAezlZ.js → page-header-BGyZw13s.js} +2 -2
  552. package/dist/page-header-BGyZw13s.js.map +1 -0
  553. package/dist/{page-header-Dk3s3XtC.cjs → page-header-CqvBk1wE.cjs} +2 -2
  554. package/dist/page-header-CqvBk1wE.cjs.map +1 -0
  555. package/dist/{schemes-C9EhSOkB.js → schemes-CGK3gQJ6.js} +2 -2
  556. package/dist/{schemes-C9EhSOkB.js.map → schemes-CGK3gQJ6.js.map} +1 -1
  557. package/dist/{search-field-block-fU3tStmB.js → search-field-block-Dj2KJyjQ.js} +2 -2
  558. package/dist/{search-field-block-fU3tStmB.js.map → search-field-block-Dj2KJyjQ.js.map} +1 -1
  559. package/dist/{search-field-block-7-ufp4uG.cjs → search-field-block-K_e_S9WY.cjs} +2 -2
  560. package/dist/{search-field-block-7-ufp4uG.cjs.map → search-field-block-K_e_S9WY.cjs.map} +1 -1
  561. package/dist/{section-B9OLuEq3.js → section-Bi0g7cn6.js} +2 -2
  562. package/dist/{section-B9OLuEq3.js.map → section-Bi0g7cn6.js.map} +1 -1
  563. package/dist/{section-CTihfzmc.cjs → section-p9vCSmPq.cjs} +2 -2
  564. package/dist/{section-CTihfzmc.cjs.map → section-p9vCSmPq.cjs.map} +1 -1
  565. package/dist/{select-field-block-BfiHq9t6.js → select-field-block-BF8v698d.js} +2 -2
  566. package/dist/{select-field-block-BfiHq9t6.js.map → select-field-block-BF8v698d.js.map} +1 -1
  567. package/dist/{select-field-block-DJo2cX9Y.cjs → select-field-block-CaGjpIKM.cjs} +2 -2
  568. package/dist/{select-field-block-DJo2cX9Y.cjs.map → select-field-block-CaGjpIKM.cjs.map} +1 -1
  569. package/dist/{settings-row-BoAuUUuH.cjs → settings-row-Cr8gaO5a.cjs} +14 -4
  570. package/dist/settings-row-Cr8gaO5a.cjs.map +1 -0
  571. package/dist/{settings-row-B2IekRyH.js → settings-row-Cr9DsBSX.js} +14 -4
  572. package/dist/settings-row-Cr9DsBSX.js.map +1 -0
  573. package/dist/{span-payload-primitives-Buq9V8nK.js → span-payload-primitives-Dmzm3mb2.js} +2 -2
  574. package/dist/{span-payload-primitives-Buq9V8nK.js.map → span-payload-primitives-Dmzm3mb2.js.map} +1 -1
  575. package/dist/{span-payload-primitives-CjlNH9C-.cjs → span-payload-primitives-Dq8WqqNm.cjs} +2 -2
  576. package/dist/{span-payload-primitives-CjlNH9C-.cjs.map → span-payload-primitives-Dq8WqqNm.cjs.map} +1 -1
  577. package/dist/src/domains/capabilities/hooks/index.d.ts +3 -0
  578. package/dist/src/domains/capabilities/hooks/use-feedback-available.d.ts +8 -0
  579. package/dist/src/domains/capabilities/hooks/use-observability-capabilities.d.ts +22 -0
  580. package/dist/src/domains/capabilities/hooks/use-trace-query-available.d.ts +8 -0
  581. package/dist/src/domains/capabilities/index.d.ts +1 -0
  582. package/dist/src/domains/chat/messages/reasoning.d.ts +3 -1
  583. package/dist/src/domains/chat/messages/renderers/reasoning-part-renderer.d.ts +3 -1
  584. package/dist/src/domains/chat/stories/reasoning.stories.d.ts +1 -1
  585. package/dist/src/domains/memory/lib/timeline.d.ts +0 -1
  586. package/dist/src/domains/metrics/components/index.d.ts +1 -1
  587. package/dist/src/domains/metrics/components/kpi-card-view.d.ts +2 -1
  588. package/dist/src/domains/metrics/components/latency-card-view.d.ts +4 -1
  589. package/dist/src/domains/metrics/components/metrics-utils.d.ts +0 -2
  590. package/dist/src/domains/metrics/hooks/index.d.ts +1 -0
  591. package/dist/src/domains/metrics/hooks/use-latency-metrics.d.ts +2 -2
  592. package/dist/src/domains/metrics/hooks/use-token-usage-timeseries.d.ts +2 -1
  593. package/dist/src/domains/metrics/metrics-interval.d.ts +7 -0
  594. package/dist/src/domains/traces/components/trace-columns-menu.d.ts +3 -1
  595. package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +1 -1
  596. package/dist/src/domains/traces/hooks/index.d.ts +1 -0
  597. package/dist/src/domains/traces/hooks/use-trace-query.d.ts +19 -2
  598. package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +46 -0
  599. package/dist/src/domains/traces/trace-filters.d.ts +6 -1
  600. package/dist/src/domains/traces/utils/index.d.ts +1 -1
  601. package/dist/src/domains/traces/utils/span-utils.d.ts +1 -6
  602. package/dist/src/ds/components/Card/Card.d.ts +2 -2
  603. package/dist/src/ds/components/CompactNumber/compact-number.d.ts +6 -0
  604. package/dist/src/ds/components/CompactNumber/compact-number.stories.d.ts +7 -0
  605. package/dist/src/ds/components/CompactNumber/index.d.ts +1 -0
  606. package/dist/src/ds/components/DataList/data-list-cells.d.ts +4 -3
  607. package/dist/src/ds/components/InlineCode/index.d.ts +1 -0
  608. package/dist/src/ds/components/InlineCode/inline-code.d.ts +3 -0
  609. package/dist/src/ds/components/InlineCode/inline-code.stories.d.ts +13 -0
  610. package/dist/src/ds/components/ItemList/item-list-date-cell.d.ts +3 -2
  611. package/dist/src/ds/components/MetricsCardGroup/metrics-card-group.d.ts +3 -8
  612. package/dist/src/ds/components/MetricsLineChart/index.d.ts +1 -0
  613. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart-legend.d.ts +6 -0
  614. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +6 -4
  615. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.stories.d.ts +1 -0
  616. package/dist/src/ds/components/RelativeTimestamp/index.d.ts +1 -0
  617. package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.d.ts +6 -0
  618. package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.stories.d.ts +7 -0
  619. package/dist/src/ds/components/StatusIndicators/status-dot-styles.d.ts +31 -2
  620. package/dist/src/ds/components/StatusIndicators/status-dot.stories.d.ts +3 -4
  621. package/dist/src/ds/components/StatusIndicators/status.d.ts +2 -3
  622. package/dist/src/ds/components/StatusIndicators/status.stories.d.ts +2 -1
  623. package/dist/src/ds/components/Txt/Txt.d.ts +5 -1
  624. package/dist/src/ds/components/ai/task-list/task-graph-node.d.ts +8 -0
  625. package/dist/src/ds/components/ai/task-list/task-graph.d.ts +8 -0
  626. package/dist/src/ds/components/ai/task-list/task-list.d.ts +4 -8
  627. package/dist/src/ds/components/ai/task-list/task-list.stories.d.ts +1 -1
  628. package/dist/src/ds/components/ai/task-list/use-focused-row-scroll.d.ts +12 -0
  629. package/dist/src/ds/new/layout/page-header/page-header.stories.d.ts +1 -0
  630. package/dist/src/ds/new/settings/settings-row.d.ts +3 -1
  631. package/dist/src/ds/new/settings/settings.stories.d.ts +1 -0
  632. package/dist/src/hooks/stories/state/use-elapsed-time.stories.d.ts +17 -0
  633. package/dist/src/hooks/use-elapsed-time.d.ts +2 -0
  634. package/dist/src/lib/cost.d.ts +6 -0
  635. package/dist/src/utils/cost.d.ts +1 -0
  636. package/dist/src/utils/date-format.d.ts +28 -0
  637. package/dist/src/utils/duration.d.ts +7 -1
  638. package/dist/src/utils/relative-time.d.ts +7 -0
  639. package/dist/style.css +329 -18
  640. package/dist/{text-field-block-DGIM1i3Z.js → text-field-block-BYPiO9h4.js} +2 -2
  641. package/dist/{text-field-block-DGIM1i3Z.js.map → text-field-block-BYPiO9h4.js.map} +1 -1
  642. package/dist/{text-field-block-DePCgDOh.cjs → text-field-block-CRh8sRXP.cjs} +2 -2
  643. package/dist/{text-field-block-DePCgDOh.cjs.map → text-field-block-CRh8sRXP.cjs.map} +1 -1
  644. package/dist/{tool-call-Bs-9Cah5.js → tool-call-CIeNEYpK.js} +2 -2
  645. package/dist/{tool-call-Bs-9Cah5.js.map → tool-call-CIeNEYpK.js.map} +1 -1
  646. package/dist/{tool-call-C0JeHe8Z.cjs → tool-call-CnEm3eE0.cjs} +2 -2
  647. package/dist/{tool-call-C0JeHe8Z.cjs.map → tool-call-CnEm3eE0.cjs.map} +1 -1
  648. package/dist/{traces-data-list-Dam8-XW-.cjs → traces-data-list-C5KZesk6.cjs} +5 -5
  649. package/dist/{traces-data-list-Dam8-XW-.cjs.map → traces-data-list-C5KZesk6.cjs.map} +1 -1
  650. package/dist/{traces-data-list-Dvi0s56v.js → traces-data-list-CdWW9J6z.js} +5 -5
  651. package/dist/{traces-data-list-Dvi0s56v.js.map → traces-data-list-CdWW9J6z.js.map} +1 -1
  652. package/dist/utils/cost.cjs.js +40 -0
  653. package/dist/utils/cost.cjs.js.map +1 -0
  654. package/dist/utils/cost.d.ts +2 -0
  655. package/dist/utils/cost.es.js +34 -0
  656. package/dist/utils/cost.es.js.map +1 -0
  657. package/dist/utils/date-format.cjs.js +99 -0
  658. package/dist/utils/date-format.cjs.js.map +1 -0
  659. package/dist/utils/date-format.d.ts +2 -0
  660. package/dist/utils/date-format.es.js +91 -0
  661. package/dist/utils/date-format.es.js.map +1 -0
  662. package/dist/utils/duration.cjs.js +19 -2
  663. package/dist/utils/duration.cjs.js.map +1 -1
  664. package/dist/utils/duration.es.js +18 -3
  665. package/dist/utils/duration.es.js.map +1 -1
  666. package/dist/utils/file.es.js +2 -2
  667. package/dist/utils/relative-time.cjs.js +12 -0
  668. package/dist/utils/relative-time.cjs.js.map +1 -0
  669. package/dist/utils/relative-time.d.ts +2 -0
  670. package/dist/utils/relative-time.es.js +8 -0
  671. package/dist/utils/relative-time.es.js.map +1 -0
  672. package/package.json +7 -7
  673. package/dist/Badge-BEeYtjmv.cjs.map +0 -1
  674. package/dist/Badge-TD55_qZJ.js.map +0 -1
  675. package/dist/Txt-B4-2nLaI.cjs.map +0 -1
  676. package/dist/Txt-DTh3Pa_a.js.map +0 -1
  677. package/dist/data-list-top-DpbOA3uw.js.map +0 -1
  678. package/dist/data-list-top-WGUY167p.cjs.map +0 -1
  679. package/dist/field-error-id-6EfqmQ4C.cjs.map +0 -1
  680. package/dist/field-error-id-DyWx33Fu.js.map +0 -1
  681. package/dist/metrics-card-Bzm6m1dy.js.map +0 -1
  682. package/dist/metrics-card-DCCHIG-z.cjs.map +0 -1
  683. package/dist/metrics-kpi-card-Bhb4R4z0.cjs.map +0 -1
  684. package/dist/metrics-kpi-card-BrnFhFQm.js.map +0 -1
  685. package/dist/metrics-line-chart-0FR3SYSt.cjs.map +0 -1
  686. package/dist/metrics-line-chart-knlgw8bV.js.map +0 -1
  687. package/dist/page-header-CyXAezlZ.js.map +0 -1
  688. package/dist/page-header-Dk3s3XtC.cjs.map +0 -1
  689. package/dist/settings-row-B2IekRyH.js.map +0 -1
  690. package/dist/settings-row-BoAuUUuH.cjs.map +0 -1
  691. package/dist/src/ds/components/Table/utils.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport { overlaySurfaceStyle } from '../../../ds/primitives/raised-surface';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport {\n getAreaRowYMax,\n isEventPoint,\n toActiveObservationData,\n toBufferedObservationData,\n toCombinedRowData,\n toContextData,\n toEventData,\n toMessageData,\n toSelectedT,\n} from './flame-graph-data';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-meta text-muted-foreground\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nexport function FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className={`${overlaySurfaceStyle} flex flex-col gap-0.5 rounded px-2 py-1.5 font-mono text-meta`}>\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">time</span>\n <span className=\"text-foreground\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">{entry.name}</span>\n <span className=\"text-foreground\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`${overlaySurfaceStyle} rounded px-2 py-1 font-mono text-meta`}>\n {time && <span className=\"text-foreground\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const yMax = getAreaRowYMax(data, dataKey, threshold);\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const combinedData = toCombinedRowData(areaData, areaDataKey, eventData);\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const t = toSelectedT(state?.activeLabel);\n if (t != null && onSelectT) onSelectT(t);\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) =>\n isEventPoint(props.payload) ? (\n <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />\n ) : (\n <></>\n )\n }\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border/50 pl-3\">\n <p className=\"text-meta text-muted-foreground\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n data-zoom-track=\"\"\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div\n data-zoom-part=\"before\"\n className=\"absolute inset-y-0 left-0 bg-background/60\"\n style={{ width: `${leftPercent}%` }}\n />\n <div\n data-zoom-part=\"band\"\n className=\"absolute inset-y-0 border-y border-border/30 bg-fill-subtle\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-part=\"after\"\n className=\"absolute inset-y-0 right-0 bg-background/60\"\n style={{ width: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-handle=\"left\"\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-foreground/50 hover:bg-foreground\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n data-zoom-handle=\"right\"\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-foreground/50 hover:bg-foreground\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pr-2 pb-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport { Txt } from '../../../ds/components/Txt';\nimport { overlaySurfaceStyle } from '../../../ds/primitives/raised-surface';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport {\n getAreaRowYMax,\n isEventPoint,\n toActiveObservationData,\n toBufferedObservationData,\n toCombinedRowData,\n toContextData,\n toEventData,\n toMessageData,\n toSelectedT,\n} from './flame-graph-data';\nimport { formatDate } from '@/utils/date-format';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 text-meta text-muted-foreground\">\n {ticks.map(t => (\n <Txt key={t} as=\"span\" variant=\"meta\" font=\"mono\">\n {formatDate(tToTimestamp(t, domain), 'date-time-seconds', { timeZone: 'UTC' })}\n </Txt>\n ))}\n </div>\n </div>\n );\n}\n\nexport function FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time =\n domain != null && t != null ? formatDate(tToTimestamp(t, domain), 'date-time-seconds', { timeZone: 'UTC' }) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className={`${overlaySurfaceStyle} flex flex-col gap-0.5 rounded px-2 py-1.5 text-meta tabular-nums`}>\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">time</span>\n <Txt as=\"span\" variant=\"meta\" font=\"mono\" tone=\"ink\">\n {time}\n </Txt>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">{entry.name}</span>\n <span className=\"text-foreground\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`${overlaySurfaceStyle} rounded px-2 py-1 text-meta`}>\n {time && (\n <Txt as=\"span\" variant=\"meta\" font=\"mono\" tone=\"ink\">\n {time}\n </Txt>\n )}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const yMax = getAreaRowYMax(data, dataKey, threshold);\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const combinedData = toCombinedRowData(areaData, areaDataKey, eventData);\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border/50 pl-3 text-meta text-muted-foreground\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const t = toSelectedT(state?.activeLabel);\n if (t != null && onSelectT) onSelectT(t);\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) =>\n isEventPoint(props.payload) ? (\n <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />\n ) : (\n <></>\n )\n }\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border/50 pl-3\">\n <p className=\"text-meta text-muted-foreground\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n data-zoom-track=\"\"\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div\n data-zoom-part=\"before\"\n className=\"absolute inset-y-0 left-0 bg-background/60\"\n style={{ width: `${leftPercent}%` }}\n />\n <div\n data-zoom-part=\"band\"\n className=\"absolute inset-y-0 border-y border-border/30 bg-fill-subtle\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-part=\"after\"\n className=\"absolute inset-y-0 right-0 bg-background/60\"\n style={{ width: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-handle=\"left\"\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-foreground/50 hover:bg-foreground\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n data-zoom-handle=\"right\"\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-foreground/50 hover:bg-foreground\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pr-2 pb-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
7
7
  const React = require('react');
8
8
  const Button = require('../../../Button-BAMnPqos.cjs');
9
9
  const skeleton = require('../../../skeleton-cXUjPrq9.cjs');
10
- const Txt = require('../../../Txt-B4-2nLaI.cjs');
10
+ const Txt = require('../../../Txt-DPmEpNbp.cjs');
11
11
  const icons_MemoryIcon = require('../../../icons/MemoryIcon.cjs.js');
12
12
  const domains_memory_lib_extractMarkers = require('../lib/extract-markers.cjs.js');
13
13
  const domains_memory_lib_replaySelection = require('../lib/replay-selection.cjs.js');
@@ -3,7 +3,7 @@ import { ArrowLeftIcon } from 'lucide-react';
3
3
  import { useState, useMemo, useEffect } from 'react';
4
4
  import { B as Button } from '../../../Button-B8nF87ai.js';
5
5
  import { S as Skeleton } from '../../../skeleton-BsRAXyh5.js';
6
- import { T as Txt } from '../../../Txt-DTh3Pa_a.js';
6
+ import { T as Txt } from '../../../Txt-BP1SRHmL.js';
7
7
  import { MemoryIcon } from '../../../icons/MemoryIcon.es.js';
8
8
  import { extractOmMarkers } from '../lib/extract-markers.es.js';
9
9
  import { getObservationTimestampMs, findRecordIdAtOrBefore } from '../lib/replay-selection.es.js';
@@ -8,17 +8,16 @@ const checkbox = require('../../../checkbox-CI8JtZKS.cjs');
8
8
  const codeDiff = require('../../../code-diff-CG8veSa-.cjs');
9
9
  const EmptyState = require('../../../EmptyState-2XQgeju6.cjs');
10
10
  const skeleton = require('../../../skeleton-cXUjPrq9.cjs');
11
+ const Txt = require('../../../Txt-DPmEpNbp.cjs');
11
12
  const utils_cn = require('../../../cn-DG0X1KEP.cjs');
13
+ const utils_dateFormat = require('../../../utils/date-format.cjs.js');
12
14
 
13
15
  function formatObservationTime(time) {
14
16
  if (!time) return null;
15
17
  const match = time.match(/^(\d{1,2}):(\d{2})$/);
16
18
  if (!match) return time;
17
19
  const [, hours, minutes] = match;
18
- const hour = Number(hours);
19
- const suffix = hour >= 12 ? "PM" : "AM";
20
- const normalizedHour = hour % 12 || 12;
21
- return `${normalizedHour}:${minutes} ${suffix}`;
20
+ return utils_dateFormat.formatDate(new Date(2e3, 0, 1, Number(hours), Number(minutes)), "time") ?? time;
22
21
  }
23
22
  function getPriorityFromEmoji(emoji) {
24
23
  if (emoji === "🔴") return "high";
@@ -156,7 +155,7 @@ function ObservationItems({ items, nested = false }) {
156
155
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: nested ? "space-y-2 border-l border-border pl-4" : "space-y-3", children: items.map((item, i) => {
157
156
  const styles = priorityClasses(item.priority, nested);
158
157
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
159
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-12 shrink-0 pt-2 text-right", children: item.time && /* @__PURE__ */ jsxRuntime.jsx("span", { className: `font-mono text-meta ${styles.time}`, children: formatObservationTime(item.time) }) }),
158
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-12 shrink-0 pt-2 text-right", children: item.time && /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "meta", font: "mono", className: styles.time, children: formatObservationTime(item.time) }) }),
160
159
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn("min-w-0 flex-1 rounded-md border px-3 py-2", styles.card), children: [
161
160
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: utils_cn.cn("text-body break-words whitespace-pre-wrap", styles.text), children: item.text }),
162
161
  item.children.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsxRuntime.jsx(ObservationItems, { items: item.children, nested: true }) })
@@ -1 +1 @@
1
- {"version":3,"file":"observation-detail-view.cjs.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n const hour = Number(hours);\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const normalizedHour = hour % 12 || 12;\n return `${normalizedHour}:${minutes} ${suffix}`;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-foreground',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-foreground',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1]?.length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <span className={`font-mono text-meta ${styles.time}`}>{formatObservationTime(item.time)}</span>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('text-body break-words whitespace-pre-wrap', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"text-caption text-muted-foreground italic\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"flex w-50 min-w-45 flex-col overflow-hidden border-l border-border\">\n <div className=\"border-b border-border px-4 py-2\">\n <p className=\"text-body text-foreground\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5 text-caption\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"text-caption text-muted-foreground italic\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n"],"names":["jsx","jsxs","cn","useMemo","useState","useEffect","Skeleton","EmptyState","Checkbox","CodeDiff"],"mappings":"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"}
1
+ {"version":3,"file":"observation-detail-view.cjs.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Txt } from '../../../ds/components/Txt';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\nimport { formatDate } from '@/utils/date-format';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n return formatDate(new Date(2000, 0, 1, Number(hours), Number(minutes)), 'time') ?? time;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-foreground',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-foreground',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1]?.length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <Txt as=\"span\" variant=\"meta\" font=\"mono\" className={styles.time}>\n {formatObservationTime(item.time)}\n </Txt>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('text-body break-words whitespace-pre-wrap', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"text-caption text-muted-foreground italic\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"flex w-50 min-w-45 flex-col overflow-hidden border-l border-border\">\n <div className=\"border-b border-border px-4 py-2\">\n <p className=\"text-body text-foreground\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5 text-caption\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"text-caption text-muted-foreground italic\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n"],"names":["formatDate","jsx","jsxs","Txt","cn","useMemo","useState","useEffect","Skeleton","EmptyState","Checkbox","CodeDiff"],"mappings":"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"}
@@ -4,17 +4,16 @@ import { C as Checkbox } from '../../../checkbox-CQedzgsi.js';
4
4
  import { C as CodeDiff } from '../../../code-diff-Hao35skN.js';
5
5
  import { E as EmptyState } from '../../../EmptyState-Bc4nJ9QH.js';
6
6
  import { S as Skeleton } from '../../../skeleton-BsRAXyh5.js';
7
+ import { T as Txt } from '../../../Txt-BP1SRHmL.js';
7
8
  import { c as cn } from '../../../cn-65Adrsfj.js';
9
+ import { formatDate } from '../../../utils/date-format.es.js';
8
10
 
9
11
  function formatObservationTime(time) {
10
12
  if (!time) return null;
11
13
  const match = time.match(/^(\d{1,2}):(\d{2})$/);
12
14
  if (!match) return time;
13
15
  const [, hours, minutes] = match;
14
- const hour = Number(hours);
15
- const suffix = hour >= 12 ? "PM" : "AM";
16
- const normalizedHour = hour % 12 || 12;
17
- return `${normalizedHour}:${minutes} ${suffix}`;
16
+ return formatDate(new Date(2e3, 0, 1, Number(hours), Number(minutes)), "time") ?? time;
18
17
  }
19
18
  function getPriorityFromEmoji(emoji) {
20
19
  if (emoji === "🔴") return "high";
@@ -152,7 +151,7 @@ function ObservationItems({ items, nested = false }) {
152
151
  return /* @__PURE__ */ jsx("div", { className: nested ? "space-y-2 border-l border-border pl-4" : "space-y-3", children: items.map((item, i) => {
153
152
  const styles = priorityClasses(item.priority, nested);
154
153
  return /* @__PURE__ */ jsx("div", { className: "space-y-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
155
- /* @__PURE__ */ jsx("div", { className: "w-12 shrink-0 pt-2 text-right", children: item.time && /* @__PURE__ */ jsx("span", { className: `font-mono text-meta ${styles.time}`, children: formatObservationTime(item.time) }) }),
154
+ /* @__PURE__ */ jsx("div", { className: "w-12 shrink-0 pt-2 text-right", children: item.time && /* @__PURE__ */ jsx(Txt, { as: "span", variant: "meta", font: "mono", className: styles.time, children: formatObservationTime(item.time) }) }),
156
155
  /* @__PURE__ */ jsxs("div", { className: cn("min-w-0 flex-1 rounded-md border px-3 py-2", styles.card), children: [
157
156
  /* @__PURE__ */ jsx("p", { className: cn("text-body break-words whitespace-pre-wrap", styles.text), children: item.text }),
158
157
  item.children.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-3", children: /* @__PURE__ */ jsx(ObservationItems, { items: item.children, nested: true }) })
@@ -1 +1 @@
1
- {"version":3,"file":"observation-detail-view.es.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n const hour = Number(hours);\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const normalizedHour = hour % 12 || 12;\n return `${normalizedHour}:${minutes} ${suffix}`;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-foreground',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-foreground',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1]?.length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <span className={`font-mono text-meta ${styles.time}`}>{formatObservationTime(item.time)}</span>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('text-body break-words whitespace-pre-wrap', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"text-caption text-muted-foreground italic\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"flex w-50 min-w-45 flex-col overflow-hidden border-l border-border\">\n <div className=\"border-b border-border px-4 py-2\">\n <p className=\"text-body text-foreground\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5 text-caption\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"text-caption text-muted-foreground italic\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observation-detail-view.es.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Txt } from '../../../ds/components/Txt';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\nimport { formatDate } from '@/utils/date-format';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n return formatDate(new Date(2000, 0, 1, Number(hours), Number(minutes)), 'time') ?? time;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-foreground',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-foreground',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1]?.length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <Txt as=\"span\" variant=\"meta\" font=\"mono\" className={styles.time}>\n {formatObservationTime(item.time)}\n </Txt>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('text-body break-words whitespace-pre-wrap', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"text-caption text-muted-foreground italic\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"flex w-50 min-w-45 flex-col overflow-hidden border-l border-border\">\n <div className=\"border-b border-border px-4 py-2\">\n <p className=\"text-body text-foreground\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5 text-caption\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"text-caption text-muted-foreground italic\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ function ProgressBar({
14
14
  }) {
15
15
  const percent = Math.max(0, Math.min(100, value / max * 100));
16
16
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils_cn.cn("min-w-0 flex-1", tones.toneClass[tone]), children: [
17
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 font-mono text-meta text-muted-foreground", children: [
17
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 text-meta text-muted-foreground", children: [
18
18
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tracking-wide text-foreground uppercase", children: label }),
19
19
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground tabular-nums", children: [
20
20
  tones.formatCompactTokens(value),
@@ -1 +1 @@
1
- {"version":3,"file":"thread-context-progress.cjs.js","sources":["../../../../src/domains/memory/components/thread-context-progress.tsx"],"sourcesContent":["import { formatCompactTokens } from '@/ds/components/TokenBudget/format-tokens';\nimport { toneClass } from '@/ds/components/TokenBudget/tones';\nimport type { TokenBudgetTone } from '@/ds/components/TokenBudget/tones';\nimport { cn } from '@/lib/utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: TokenBudgetTone;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn('min-w-0 flex-1', toneClass[tone])}>\n <div className=\"mb-1 flex items-center justify-between gap-2 font-mono text-meta text-muted-foreground\">\n <span className=\"tracking-wide text-foreground uppercase\">{label}</span>\n <span className=\"text-muted-foreground tabular-nums\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className=\"h-full rounded-full bg-current/80\" style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null && messageThreshold > 0;\n const showMemory = memoryTokens != null && memoryThreshold != null && memoryThreshold > 0;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"messages\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["jsxs","cn","toneClass","jsx","formatCompactTokens"],"mappings":";;;;;;;;AAcA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAE9D,EAAA,uBACEA,eAAA,CAAC,SAAI,SAAA,EAAWC,WAAA,CAAG,kBAAkBC,eAAA,CAAU,IAAI,CAAC,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACjEH,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,QAAAI,yBAAA,CAAoB,KAAK,CAAA;AAAA,QAAE,GAAA;AAAA,QAAEA,0BAAoB,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EACzD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,IAAO,CAAA,EACtF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,YAAA,GAAe,aAAA,IAAiB,IAAA,IAAQ,gBAAA,IAAoB,QAAQ,gBAAA,GAAmB,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,IAAA,IAAQ,eAAA,IAAmB,QAAQ,eAAA,GAAkB,CAAA;AAExF,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAAH,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,mBACCG,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,eAAe,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,UAAA,EAAW,CAAA,GACzF,IAAA;AAAA,IACH,UAAA,mBACCA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,GAAA,EAAK,eAAA,EAAiB,IAAA,EAAK,QAAA,EAAS,CAAA,GACxF;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"thread-context-progress.cjs.js","sources":["../../../../src/domains/memory/components/thread-context-progress.tsx"],"sourcesContent":["import { formatCompactTokens } from '@/ds/components/TokenBudget/format-tokens';\nimport { toneClass } from '@/ds/components/TokenBudget/tones';\nimport type { TokenBudgetTone } from '@/ds/components/TokenBudget/tones';\nimport { cn } from '@/lib/utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: TokenBudgetTone;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn('min-w-0 flex-1', toneClass[tone])}>\n <div className=\"mb-1 flex items-center justify-between gap-2 text-meta text-muted-foreground\">\n <span className=\"tracking-wide text-foreground uppercase\">{label}</span>\n <span className=\"text-muted-foreground tabular-nums\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className=\"h-full rounded-full bg-current/80\" style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null && messageThreshold > 0;\n const showMemory = memoryTokens != null && memoryThreshold != null && memoryThreshold > 0;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"messages\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["jsxs","cn","toneClass","jsx","formatCompactTokens"],"mappings":";;;;;;;;AAcA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAE9D,EAAA,uBACEA,eAAA,CAAC,SAAI,SAAA,EAAWC,WAAA,CAAG,kBAAkBC,eAAA,CAAU,IAAI,CAAC,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8EAAA,EACb,QAAA,EAAA;AAAA,sBAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACjEH,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,QAAAI,yBAAA,CAAoB,KAAK,CAAA;AAAA,QAAE,GAAA;AAAA,QAAEA,0BAAoB,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EACzD;AAAA,KAAA,EACF,CAAA;AAAA,oBACAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,IAAO,CAAA,EACtF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,YAAA,GAAe,aAAA,IAAiB,IAAA,IAAQ,gBAAA,IAAoB,QAAQ,gBAAA,GAAmB,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,IAAA,IAAQ,eAAA,IAAmB,QAAQ,eAAA,GAAkB,CAAA;AAExF,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,sCACG,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAAH,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,mBACCG,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,eAAe,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,UAAA,EAAW,CAAA,GACzF,IAAA;AAAA,IACH,UAAA,mBACCA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,GAAA,EAAK,eAAA,EAAiB,IAAA,EAAK,QAAA,EAAS,CAAA,GACxF;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -10,7 +10,7 @@ function ProgressBar({
10
10
  }) {
11
11
  const percent = Math.max(0, Math.min(100, value / max * 100));
12
12
  return /* @__PURE__ */ jsxs("div", { className: cn("min-w-0 flex-1", toneClass[tone]), children: [
13
- /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 font-mono text-meta text-muted-foreground", children: [
13
+ /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-center justify-between gap-2 text-meta text-muted-foreground", children: [
14
14
  /* @__PURE__ */ jsx("span", { className: "tracking-wide text-foreground uppercase", children: label }),
15
15
  /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground tabular-nums", children: [
16
16
  formatCompactTokens(value),
@@ -1 +1 @@
1
- {"version":3,"file":"thread-context-progress.es.js","sources":["../../../../src/domains/memory/components/thread-context-progress.tsx"],"sourcesContent":["import { formatCompactTokens } from '@/ds/components/TokenBudget/format-tokens';\nimport { toneClass } from '@/ds/components/TokenBudget/tones';\nimport type { TokenBudgetTone } from '@/ds/components/TokenBudget/tones';\nimport { cn } from '@/lib/utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: TokenBudgetTone;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn('min-w-0 flex-1', toneClass[tone])}>\n <div className=\"mb-1 flex items-center justify-between gap-2 font-mono text-meta text-muted-foreground\">\n <span className=\"tracking-wide text-foreground uppercase\">{label}</span>\n <span className=\"text-muted-foreground tabular-nums\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className=\"h-full rounded-full bg-current/80\" style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null && messageThreshold > 0;\n const showMemory = memoryTokens != null && memoryThreshold != null && memoryThreshold > 0;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"messages\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAcA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAE9D,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,kBAAkB,SAAA,CAAU,IAAI,CAAC,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wFAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACjE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,oBAAoB,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EACzD;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,IAAO,CAAA,EACtF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,YAAA,GAAe,aAAA,IAAiB,IAAA,IAAQ,gBAAA,IAAoB,QAAQ,gBAAA,GAAmB,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,IAAA,IAAQ,eAAA,IAAmB,QAAQ,eAAA,GAAkB,CAAA;AAExF,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,mBACC,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,eAAe,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,UAAA,EAAW,CAAA,GACzF,IAAA;AAAA,IACH,UAAA,mBACC,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,GAAA,EAAK,eAAA,EAAiB,IAAA,EAAK,QAAA,EAAS,CAAA,GACxF;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"thread-context-progress.es.js","sources":["../../../../src/domains/memory/components/thread-context-progress.tsx"],"sourcesContent":["import { formatCompactTokens } from '@/ds/components/TokenBudget/format-tokens';\nimport { toneClass } from '@/ds/components/TokenBudget/tones';\nimport type { TokenBudgetTone } from '@/ds/components/TokenBudget/tones';\nimport { cn } from '@/lib/utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: TokenBudgetTone;\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n\n return (\n <div className={cn('min-w-0 flex-1', toneClass[tone])}>\n <div className=\"mb-1 flex items-center justify-between gap-2 text-meta text-muted-foreground\">\n <span className=\"tracking-wide text-foreground uppercase\">{label}</span>\n <span className=\"text-muted-foreground tabular-nums\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className=\"h-full rounded-full bg-current/80\" style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null && messageThreshold > 0;\n const showMemory = memoryTokens != null && memoryThreshold != null && memoryThreshold > 0;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"messages\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAcA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAE9D,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,kBAAkB,SAAA,CAAU,IAAI,CAAC,CAAA,EAClD,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8EAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACjE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,oBAAoB,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EACzD;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EAAoC,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,IAAO,CAAA,EACtF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,YAAA,GAAe,aAAA,IAAiB,IAAA,IAAQ,gBAAA,IAAoB,QAAQ,gBAAA,GAAmB,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,IAAA,IAAQ,eAAA,IAAmB,QAAQ,eAAA,GAAkB,CAAA;AAExF,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,YAAA,mBACC,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,KAAA,EAAO,eAAe,GAAA,EAAK,gBAAA,EAAkB,IAAA,EAAK,UAAA,EAAW,CAAA,GACzF,IAAA;AAAA,IACH,UAAA,mBACC,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,GAAA,EAAK,eAAA,EAAiB,IAAA,EAAK,QAAA,EAAS,CAAA,GACxF;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;;;;"}