@flanksource/clicky-ui 0.3.44 → 0.3.45

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 (471) hide show
  1. package/README.md +2 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/CodeBlock.cjs +3 -2
  16. package/dist/data/CodeBlock.cjs.map +1 -1
  17. package/dist/data/CodeBlock.d.ts +3 -1
  18. package/dist/data/CodeBlock.d.ts.map +1 -1
  19. package/dist/data/CodeBlock.js +3 -2
  20. package/dist/data/CodeBlock.js.map +1 -1
  21. package/dist/data/GraphDiagram.cjs +18 -6
  22. package/dist/data/GraphDiagram.cjs.map +1 -1
  23. package/dist/data/GraphDiagram.d.ts +9 -1
  24. package/dist/data/GraphDiagram.d.ts.map +1 -1
  25. package/dist/data/GraphDiagram.js +18 -6
  26. package/dist/data/GraphDiagram.js.map +1 -1
  27. package/dist/data/GraphDiagramNodes.cjs +38 -29
  28. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  29. package/dist/data/GraphDiagramNodes.d.ts +8 -2
  30. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  31. package/dist/data/GraphDiagramNodes.js +38 -29
  32. package/dist/data/GraphDiagramNodes.js.map +1 -1
  33. package/dist/data/JsonView.cjs +118 -49
  34. package/dist/data/JsonView.cjs.map +1 -1
  35. package/dist/data/JsonView.d.ts +13 -10
  36. package/dist/data/JsonView.d.ts.map +1 -1
  37. package/dist/data/JsonView.js +118 -49
  38. package/dist/data/JsonView.js.map +1 -1
  39. package/dist/data/MarkdownEditor.cjs +2 -2
  40. package/dist/data/MarkdownEditor.cjs.map +1 -1
  41. package/dist/data/MarkdownEditor.js +2 -2
  42. package/dist/data/MarkdownEditor.js.map +1 -1
  43. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  44. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  45. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  46. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  47. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  48. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  49. package/dist/data/ai/ChatButton.cjs +2 -0
  50. package/dist/data/ai/ChatButton.cjs.map +1 -1
  51. package/dist/data/ai/ChatButton.d.ts +1 -1
  52. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  53. package/dist/data/ai/ChatButton.js +2 -0
  54. package/dist/data/ai/ChatButton.js.map +1 -1
  55. package/dist/data/ai/ChatFab.cjs +5 -1
  56. package/dist/data/ai/ChatFab.cjs.map +1 -1
  57. package/dist/data/ai/ChatFab.d.ts +5 -1
  58. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  59. package/dist/data/ai/ChatFab.js +5 -1
  60. package/dist/data/ai/ChatFab.js.map +1 -1
  61. package/dist/data/ai/ChatWindow.cjs +2 -8
  62. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  63. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  64. package/dist/data/ai/ChatWindow.js +2 -8
  65. package/dist/data/ai/ChatWindow.js.map +1 -1
  66. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  67. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  68. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  69. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  70. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  71. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  72. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  73. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  74. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  75. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  76. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  77. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  78. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  79. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  80. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  81. package/dist/data/ai/SessionViewer.cjs +13 -4
  82. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  83. package/dist/data/ai/SessionViewer.d.ts +5 -1
  84. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  85. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  86. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  87. package/dist/data/ai/SessionViewer.header.js +1 -1
  88. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  89. package/dist/data/ai/SessionViewer.js +13 -4
  90. package/dist/data/ai/SessionViewer.js.map +1 -1
  91. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  92. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  94. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  95. package/dist/data/ai/SessionViewer.model.js +2 -0
  96. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  98. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  100. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  101. package/dist/data/ai/SessionViewer.rows.js +41 -27
  102. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  103. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  104. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  105. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  106. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  107. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  108. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  109. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  110. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  111. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  112. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  113. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  114. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  115. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  116. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  117. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  119. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  121. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  123. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  125. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  127. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  128. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  129. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  130. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  131. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  132. package/dist/data/ai/SessionViewerMenu.js +18 -1
  133. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  134. package/dist/data/ai/ToolPreferences.cjs +149 -143
  135. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  136. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  137. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  138. package/dist/data/ai/ToolPreferences.js +151 -146
  139. package/dist/data/ai/ToolPreferences.js.map +1 -1
  140. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  141. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  142. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  143. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  144. package/dist/data/ai/ToolPreferences.model.js +15 -11
  145. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  146. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  147. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  148. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  149. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  150. package/dist/data/ai/ToolPreferencesList.js +2 -1
  151. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  152. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  153. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  154. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  155. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  156. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  157. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  158. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  159. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  160. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  161. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  162. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  163. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  164. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  165. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  166. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  167. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  168. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  169. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  170. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  171. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  172. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  173. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  174. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  175. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  176. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  177. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  178. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  179. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  180. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  181. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  182. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  183. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  184. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  185. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  186. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  187. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  188. package/dist/data/ai/index.d.ts +2 -2
  189. package/dist/data/ai/index.d.ts.map +1 -1
  190. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  191. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  192. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  193. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  194. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  195. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  196. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  197. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  198. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  199. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  200. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  201. package/dist/data/ai/use-session-token-sizing.js +73 -0
  202. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  203. package/dist/data/call-graph/CallGraph.cjs +250 -0
  204. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  205. package/dist/data/call-graph/CallGraph.d.ts +69 -0
  206. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  207. package/dist/data/call-graph/CallGraph.js +250 -0
  208. package/dist/data/call-graph/CallGraph.js.map +1 -0
  209. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  210. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  211. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  212. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  213. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  214. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  215. package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
  216. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  217. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  218. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  219. package/dist/data/call-graph/CallGraphMembers.js +50 -0
  220. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  221. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  222. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  223. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  224. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  225. package/dist/data/call-graph/CallGraphParts.js +204 -0
  226. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  227. package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
  228. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  229. package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
  230. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  231. package/dist/data/call-graph/CallGraphToolbar.js +186 -0
  232. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  233. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  234. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  235. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  236. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  237. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  238. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  239. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  240. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  241. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  242. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  243. package/dist/data/call-graph/call-graph-labels.js +96 -0
  244. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  245. package/dist/data/call-graph/call-graph-model.cjs +161 -0
  246. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  247. package/dist/data/call-graph/call-graph-model.d.ts +102 -0
  248. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  249. package/dist/data/call-graph/call-graph-model.js +161 -0
  250. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  251. package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
  252. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  253. package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
  254. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  255. package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
  256. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  257. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  258. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  259. package/dist/data/call-graph/index.d.ts +7 -0
  260. package/dist/data/call-graph/index.d.ts.map +1 -0
  261. package/dist/data/call-graph/types.cjs +5 -0
  262. package/dist/data/call-graph/types.cjs.map +1 -0
  263. package/dist/data/call-graph/types.d.ts +135 -0
  264. package/dist/data/call-graph/types.d.ts.map +1 -0
  265. package/dist/data/call-graph/types.js +5 -0
  266. package/dist/data/call-graph/types.js.map +1 -0
  267. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  268. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  269. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  270. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  271. package/dist/data/call-graph/use-call-graph.js +93 -0
  272. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  273. package/dist/data/chat/Chat.cjs +39 -15
  274. package/dist/data/chat/Chat.cjs.map +1 -1
  275. package/dist/data/chat/Chat.d.ts.map +1 -1
  276. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  277. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  278. package/dist/data/chat/Chat.fixtures.js +2 -2
  279. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  280. package/dist/data/chat/Chat.js +40 -16
  281. package/dist/data/chat/Chat.js.map +1 -1
  282. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  283. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  284. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  285. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  286. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  287. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  288. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  289. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  290. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  291. package/dist/data/chat/ContextMeter.bar.js +5 -8
  292. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  293. package/dist/data/chat/ContextMeter.cjs +18 -19
  294. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  295. package/dist/data/chat/ContextMeter.d.ts +1 -1
  296. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  297. package/dist/data/chat/ContextMeter.js +18 -19
  298. package/dist/data/chat/ContextMeter.js.map +1 -1
  299. package/dist/data/chat/Conversation.cjs +2 -1
  300. package/dist/data/chat/Conversation.cjs.map +1 -1
  301. package/dist/data/chat/Conversation.d.ts +4 -1
  302. package/dist/data/chat/Conversation.d.ts.map +1 -1
  303. package/dist/data/chat/Conversation.js +2 -1
  304. package/dist/data/chat/Conversation.js.map +1 -1
  305. package/dist/data/chat/Message.cjs +39 -12
  306. package/dist/data/chat/Message.cjs.map +1 -1
  307. package/dist/data/chat/Message.d.ts +1 -1
  308. package/dist/data/chat/Message.d.ts.map +1 -1
  309. package/dist/data/chat/Message.js +40 -13
  310. package/dist/data/chat/Message.js.map +1 -1
  311. package/dist/data/chat/ToolCall.cjs +60 -5
  312. package/dist/data/chat/ToolCall.cjs.map +1 -1
  313. package/dist/data/chat/ToolCall.d.ts +7 -2
  314. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  315. package/dist/data/chat/ToolCall.js +60 -5
  316. package/dist/data/chat/ToolCall.js.map +1 -1
  317. package/dist/data/chat/approval.cjs.map +1 -1
  318. package/dist/data/chat/approval.d.ts +2 -2
  319. package/dist/data/chat/approval.d.ts.map +1 -1
  320. package/dist/data/chat/approval.js.map +1 -1
  321. package/dist/data/chat/tool-policy.cjs +59 -2
  322. package/dist/data/chat/tool-policy.cjs.map +1 -1
  323. package/dist/data/chat/tool-policy.d.ts +9 -0
  324. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  325. package/dist/data/chat/tool-policy.js +59 -2
  326. package/dist/data/chat/tool-policy.js.map +1 -1
  327. package/dist/data/chat/types.cjs +6 -0
  328. package/dist/data/chat/types.cjs.map +1 -1
  329. package/dist/data/chat/types.d.ts +13 -4
  330. package/dist/data/chat/types.d.ts.map +1 -1
  331. package/dist/data/chat/types.js +7 -1
  332. package/dist/data/chat/types.js.map +1 -1
  333. package/dist/data/chat/usage-snapshot.cjs +11 -6
  334. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  335. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  336. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  337. package/dist/data/chat/usage-snapshot.js +11 -6
  338. package/dist/data/chat/usage-snapshot.js.map +1 -1
  339. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  340. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  341. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  342. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  343. package/dist/data/graph-columns-layout.cjs +26 -10
  344. package/dist/data/graph-columns-layout.cjs.map +1 -1
  345. package/dist/data/graph-columns-layout.d.ts +8 -0
  346. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  347. package/dist/data/graph-columns-layout.js +26 -10
  348. package/dist/data/graph-columns-layout.js.map +1 -1
  349. package/dist/data/graph-diagram-model.cjs.map +1 -1
  350. package/dist/data/graph-diagram-model.d.ts +5 -0
  351. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  352. package/dist/data/graph-diagram-model.js.map +1 -1
  353. package/dist/data/graph-edge-routing.cjs +9 -3
  354. package/dist/data/graph-edge-routing.cjs.map +1 -1
  355. package/dist/data/graph-edge-routing.d.ts +2 -0
  356. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  357. package/dist/data/graph-edge-routing.js +9 -3
  358. package/dist/data/graph-edge-routing.js.map +1 -1
  359. package/dist/data/json-view/JsonSource.cjs +84 -0
  360. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  361. package/dist/data/json-view/JsonSource.d.ts +7 -0
  362. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  363. package/dist/data/json-view/JsonSource.js +84 -0
  364. package/dist/data/json-view/JsonSource.js.map +1 -0
  365. package/dist/data/json-view/parse-prefix.cjs +132 -0
  366. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  367. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  368. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  369. package/dist/data/json-view/parse-prefix.js +132 -0
  370. package/dist/data/json-view/parse-prefix.js.map +1 -0
  371. package/dist/data/json-view/parse-source.cjs +62 -0
  372. package/dist/data/json-view/parse-source.cjs.map +1 -0
  373. package/dist/data/json-view/parse-source.d.ts +16 -0
  374. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  375. package/dist/data/json-view/parse-source.js +62 -0
  376. package/dist/data/json-view/parse-source.js.map +1 -0
  377. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  378. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  379. package/dist/data/json-view/types.d.ts +14 -0
  380. package/dist/data/json-view/types.d.ts.map +1 -0
  381. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  382. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  383. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  384. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  385. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  386. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  387. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  388. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  389. package/dist/data/runtime/RuntimeBar.js +2 -5
  390. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  391. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  392. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  393. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  394. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  395. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  396. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  397. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  398. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  399. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  400. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  401. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  402. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  403. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  404. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  405. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  406. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  407. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  408. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  409. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  410. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  411. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  412. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  413. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  414. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  415. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  416. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  417. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  418. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  419. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  420. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  421. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  422. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  423. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  424. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  425. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  426. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  427. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  428. package/dist/data/use-pan-zoom.cjs +23 -10
  429. package/dist/data/use-pan-zoom.cjs.map +1 -1
  430. package/dist/data/use-pan-zoom.d.ts +16 -2
  431. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  432. package/dist/data/use-pan-zoom.js +23 -10
  433. package/dist/data/use-pan-zoom.js.map +1 -1
  434. package/dist/data/version-info.cjs +3 -3
  435. package/dist/data/version-info.js +3 -3
  436. package/dist/data.cjs +26 -2
  437. package/dist/data.cjs.map +1 -1
  438. package/dist/data.d.ts +1 -0
  439. package/dist/data.d.ts.map +1 -1
  440. package/dist/data.js +24 -0
  441. package/dist/data.js.map +1 -1
  442. package/dist/index.cjs +28 -4
  443. package/dist/index.cjs.map +1 -1
  444. package/dist/index.js +24 -0
  445. package/dist/index.js.map +1 -1
  446. package/dist/layout/Workspace.cjs +13 -4
  447. package/dist/layout/Workspace.cjs.map +1 -1
  448. package/dist/layout/Workspace.d.ts +7 -2
  449. package/dist/layout/Workspace.d.ts.map +1 -1
  450. package/dist/layout/Workspace.js +13 -4
  451. package/dist/layout/Workspace.js.map +1 -1
  452. package/dist/lib/permission-strategies.cjs +71 -11
  453. package/dist/lib/permission-strategies.cjs.map +1 -1
  454. package/dist/lib/permission-strategies.d.ts +3 -0
  455. package/dist/lib/permission-strategies.d.ts.map +1 -1
  456. package/dist/lib/permission-strategies.js +71 -11
  457. package/dist/lib/permission-strategies.js.map +1 -1
  458. package/dist/styles.css +1 -1
  459. package/package.json +5 -3
  460. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  461. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  462. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  463. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  464. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  465. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  466. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  467. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  468. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  469. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  470. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  471. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -11,6 +11,8 @@ const SessionViewer_rowTime = require("./SessionViewer.row-time.cjs");
11
11
  const SessionViewer_toolRow = require("./SessionViewer.tool-row.cjs");
12
12
  const Markdown = require("../Markdown.cjs");
13
13
  const MessageFilePart = require("../chat/MessageFilePart.cjs");
14
+ const SessionViewer_toolCost = require("./SessionViewer.tool-cost.cjs");
15
+ const SessionViewer_tokens = require("./SessionViewer.tokens.cjs");
14
16
  const UiChevronDown = require("../../icons/components/UiChevronDown.cjs");
15
17
  const UiUserCircle = require("../../icons/components/UiUserCircle.cjs");
16
18
  const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
@@ -22,6 +24,7 @@ function SessionRow({
22
24
  last,
23
25
  defaultExpanded,
24
26
  showRowMetadata = false,
27
+ showEstimatedToolCost = false,
25
28
  showRaw = false,
26
29
  renderMessageBadge,
27
30
  onPendingToolDecision
@@ -69,10 +72,12 @@ function SessionRow({
69
72
  visual,
70
73
  defaultExpanded,
71
74
  messageBadge: event.kind === "assistant" ? renderMessageBadge == null ? void 0 : renderMessageBadge(event) : void 0,
72
- onPendingToolDecision
75
+ onPendingToolDecision,
76
+ showEstimatedToolCost
73
77
  }
74
78
  ),
75
79
  showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.EventMetadata, { event }),
80
+ /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_tokens.SessionRowTokens, { event }),
76
81
  showRaw && event.raw !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.RawEventBlock, { raw: event.raw })
77
82
  ] })
78
83
  ]
@@ -84,6 +89,7 @@ function WaitGroupRow({
84
89
  last,
85
90
  defaultExpanded,
86
91
  showRowMetadata = false,
92
+ showEstimatedToolCost = false,
87
93
  showRaw = false,
88
94
  renderMessageBadge,
89
95
  onPendingToolDecision
@@ -124,29 +130,32 @@ function WaitGroupRow({
124
130
  }
125
131
  ),
126
132
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 pt-px", children: [
127
- /* @__PURE__ */ jsxRuntime.jsxs(
128
- "button",
129
- {
130
- type: "button",
131
- "aria-expanded": open,
132
- "aria-label": `${open ? "Collapse" : "Expand"} ${label}`,
133
- onClick: () => setOpen((value) => !value),
134
- className: "flex w-full items-center gap-1.5 text-left hover:text-foreground",
135
- children: [
136
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-foreground", children: label }),
137
- /* @__PURE__ */ jsxRuntime.jsx(
138
- Icon.Icon,
139
- {
140
- icon: UiChevronDown.UiChevronDown,
141
- className: utils.cn(
142
- "ml-auto size-3 shrink-0 text-muted-foreground transition-transform",
143
- open && "rotate-180"
144
- )
145
- }
146
- )
147
- ]
148
- }
149
- ),
133
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-tool-header": true, className: "flex items-center gap-1.5", children: [
134
+ /* @__PURE__ */ jsxRuntime.jsxs(
135
+ "button",
136
+ {
137
+ type: "button",
138
+ "aria-expanded": open,
139
+ "aria-label": `${open ? "Collapse" : "Expand"} ${label}`,
140
+ onClick: () => setOpen((value) => !value),
141
+ className: "flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground",
142
+ children: [
143
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-foreground", children: label }),
144
+ /* @__PURE__ */ jsxRuntime.jsx(
145
+ Icon.Icon,
146
+ {
147
+ icon: UiChevronDown.UiChevronDown,
148
+ className: utils.cn(
149
+ "ml-auto size-3 shrink-0 text-muted-foreground transition-transform",
150
+ open && "rotate-180"
151
+ )
152
+ }
153
+ )
154
+ ]
155
+ }
156
+ ),
157
+ showEstimatedToolCost && !open && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolCost.EstimatedToolCost, { events: group.events })
158
+ ] }),
150
159
  showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(
151
160
  SessionViewer_rowMetadata.EventMetadata,
152
161
  {
@@ -161,12 +170,14 @@ function WaitGroupRow({
161
170
  last: index === group.events.length - 1,
162
171
  defaultExpanded,
163
172
  showRowMetadata,
173
+ showEstimatedToolCost,
164
174
  showRaw,
165
175
  renderMessageBadge,
166
176
  onPendingToolDecision
167
177
  },
168
178
  event.id
169
- )) })
179
+ )) }),
180
+ open && showEstimatedToolCost && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolCost.EstimatedToolCost, { events: group.events, detailed: true })
170
181
  ] })
171
182
  ]
172
183
  }
@@ -188,6 +199,7 @@ function UserRow({
188
199
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-0.5 text-right text-xs font-medium text-muted-foreground", children: initialPrompt ? "Initial prompt" : "You" }),
189
200
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground", children: event.file ? /* @__PURE__ */ jsxRuntime.jsx(MessageFilePart.MessageFilePart, { part: event.file }) : event.text && /* @__PURE__ */ jsxRuntime.jsx(Markdown.Markdown, { text: event.text }) }),
190
201
  showRowMetadata && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.EventMetadata, { event, align: "right" }),
202
+ /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_tokens.SessionRowTokens, { event }),
191
203
  showRaw && event.raw !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.RawEventBlock, { raw: event.raw, align: "right" })
192
204
  ] }),
193
205
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -265,7 +277,8 @@ function EventBody({
265
277
  visual,
266
278
  defaultExpanded,
267
279
  messageBadge,
268
- onPendingToolDecision
280
+ onPendingToolDecision,
281
+ showEstimatedToolCost
269
282
  }) {
270
283
  if (event.kind === "tool")
271
284
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -274,7 +287,8 @@ function EventBody({
274
287
  event,
275
288
  visual,
276
289
  defaultExpanded,
277
- onPendingToolDecision
290
+ onPendingToolDecision,
291
+ showEstimatedToolCost
278
292
  }
279
293
  );
280
294
  if (event.kind === "thinking") return /* @__PURE__ */ jsxRuntime.jsx(ThinkingBody, { event });
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.rows.cjs","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":["jsx","jsxs","cn","SESSION_TONES","Icon","EventMetadata","RawEventBlock","useState","getSessionAction","formatEventRange","UiChevronDown","MessageFilePart","Markdown","UiUserCircle","UiSparkles","UiBrain","UiWarningTriangle","ToolBody"],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.rows.cjs","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\nimport { EstimatedToolCost } from \"./SessionViewer.tool-cost\";\nimport { SessionRowTokens } from \"./SessionViewer.tokens\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <div data-tool-header className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showEstimatedToolCost && !open && <EstimatedToolCost events={group.events} />}\n </div>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showEstimatedToolCost={showEstimatedToolCost}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n {open && showEstimatedToolCost && <EstimatedToolCost events={group.events} detailed />}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n showEstimatedToolCost,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n showEstimatedToolCost: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":["jsx","jsxs","cn","SESSION_TONES","Icon","EventMetadata","SessionRowTokens","RawEventBlock","useState","getSessionAction","formatEventRange","UiChevronDown","EstimatedToolCost","MessageFilePart","Markdown","UiUserCircle","UiSparkles","UiBrain","UiWarningTriangle","ToolBody"],"mappings":"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"}
@@ -2,21 +2,23 @@ import { ReactNode } from 'react';
2
2
  import { SessionEvent } from './SessionViewer.model.js';
3
3
  import { SessionEventGroup } from './SessionViewer.grouping.js';
4
4
  import { SessionToolDecision } from './SessionViewer.js';
5
- export declare function SessionRow({ event, initialPrompt, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
5
+ export declare function SessionRow({ event, initialPrompt, last, defaultExpanded, showRowMetadata, showEstimatedToolCost, showRaw, renderMessageBadge, onPendingToolDecision, }: {
6
6
  event: SessionEvent;
7
7
  initialPrompt?: boolean;
8
8
  last: boolean;
9
9
  defaultExpanded: boolean;
10
10
  showRowMetadata?: boolean;
11
+ showEstimatedToolCost?: boolean;
11
12
  showRaw?: boolean;
12
13
  renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;
13
14
  onPendingToolDecision?: ((decision: SessionToolDecision) => Promise<void> | void) | undefined;
14
15
  }): import("react").JSX.Element;
15
- export declare function WaitGroupRow({ group, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
16
+ export declare function WaitGroupRow({ group, last, defaultExpanded, showRowMetadata, showEstimatedToolCost, showRaw, renderMessageBadge, onPendingToolDecision, }: {
16
17
  group: SessionEventGroup;
17
18
  last: boolean;
18
19
  defaultExpanded: boolean;
19
20
  showRowMetadata?: boolean;
21
+ showEstimatedToolCost?: boolean;
20
22
  showRaw?: boolean;
21
23
  renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;
22
24
  onPendingToolDecision?: ((decision: SessionToolDecision) => Promise<void> | void) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.rows.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAUjD,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAI3D,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,aAAqB,EACrB,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BAiDA;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BA2EA"}
1
+ {"version":3,"file":"SessionViewer.rows.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAUjD,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3D,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,aAAqB,EACrB,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,qBAA6B,EAC7B,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BAmDA;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,qBAA6B,EAC7B,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,qBAAqB,CAAC,EACpB,CAAC,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GACzD,SAAS,CAAC;CACb,+BAgFA"}
@@ -9,6 +9,8 @@ import { formatEventRange } from "./SessionViewer.row-time.js";
9
9
  import { ToolBody } from "./SessionViewer.tool-row.js";
10
10
  import { Markdown } from "../Markdown.js";
11
11
  import { MessageFilePart } from "../chat/MessageFilePart.js";
12
+ import { EstimatedToolCost } from "./SessionViewer.tool-cost.js";
13
+ import { SessionRowTokens } from "./SessionViewer.tokens.js";
12
14
  import { UiChevronDown } from "../../icons/components/UiChevronDown.js";
13
15
  import { UiUserCircle } from "../../icons/components/UiUserCircle.js";
14
16
  import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
@@ -20,6 +22,7 @@ function SessionRow({
20
22
  last,
21
23
  defaultExpanded,
22
24
  showRowMetadata = false,
25
+ showEstimatedToolCost = false,
23
26
  showRaw = false,
24
27
  renderMessageBadge,
25
28
  onPendingToolDecision
@@ -67,10 +70,12 @@ function SessionRow({
67
70
  visual,
68
71
  defaultExpanded,
69
72
  messageBadge: event.kind === "assistant" ? renderMessageBadge == null ? void 0 : renderMessageBadge(event) : void 0,
70
- onPendingToolDecision
73
+ onPendingToolDecision,
74
+ showEstimatedToolCost
71
75
  }
72
76
  ),
73
77
  showRowMetadata && /* @__PURE__ */ jsx(EventMetadata, { event }),
78
+ /* @__PURE__ */ jsx(SessionRowTokens, { event }),
74
79
  showRaw && event.raw !== void 0 && /* @__PURE__ */ jsx(RawEventBlock, { raw: event.raw })
75
80
  ] })
76
81
  ]
@@ -82,6 +87,7 @@ function WaitGroupRow({
82
87
  last,
83
88
  defaultExpanded,
84
89
  showRowMetadata = false,
90
+ showEstimatedToolCost = false,
85
91
  showRaw = false,
86
92
  renderMessageBadge,
87
93
  onPendingToolDecision
@@ -122,29 +128,32 @@ function WaitGroupRow({
122
128
  }
123
129
  ),
124
130
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 pt-px", children: [
125
- /* @__PURE__ */ jsxs(
126
- "button",
127
- {
128
- type: "button",
129
- "aria-expanded": open,
130
- "aria-label": `${open ? "Collapse" : "Expand"} ${label}`,
131
- onClick: () => setOpen((value) => !value),
132
- className: "flex w-full items-center gap-1.5 text-left hover:text-foreground",
133
- children: [
134
- /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: label }),
135
- /* @__PURE__ */ jsx(
136
- Icon,
137
- {
138
- icon: UiChevronDown,
139
- className: cn(
140
- "ml-auto size-3 shrink-0 text-muted-foreground transition-transform",
141
- open && "rotate-180"
142
- )
143
- }
144
- )
145
- ]
146
- }
147
- ),
131
+ /* @__PURE__ */ jsxs("div", { "data-tool-header": true, className: "flex items-center gap-1.5", children: [
132
+ /* @__PURE__ */ jsxs(
133
+ "button",
134
+ {
135
+ type: "button",
136
+ "aria-expanded": open,
137
+ "aria-label": `${open ? "Collapse" : "Expand"} ${label}`,
138
+ onClick: () => setOpen((value) => !value),
139
+ className: "flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground",
140
+ children: [
141
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: label }),
142
+ /* @__PURE__ */ jsx(
143
+ Icon,
144
+ {
145
+ icon: UiChevronDown,
146
+ className: cn(
147
+ "ml-auto size-3 shrink-0 text-muted-foreground transition-transform",
148
+ open && "rotate-180"
149
+ )
150
+ }
151
+ )
152
+ ]
153
+ }
154
+ ),
155
+ showEstimatedToolCost && !open && /* @__PURE__ */ jsx(EstimatedToolCost, { events: group.events })
156
+ ] }),
148
157
  showRowMetadata && /* @__PURE__ */ jsx(
149
158
  EventMetadata,
150
159
  {
@@ -159,12 +168,14 @@ function WaitGroupRow({
159
168
  last: index === group.events.length - 1,
160
169
  defaultExpanded,
161
170
  showRowMetadata,
171
+ showEstimatedToolCost,
162
172
  showRaw,
163
173
  renderMessageBadge,
164
174
  onPendingToolDecision
165
175
  },
166
176
  event.id
167
- )) })
177
+ )) }),
178
+ open && showEstimatedToolCost && /* @__PURE__ */ jsx(EstimatedToolCost, { events: group.events, detailed: true })
168
179
  ] })
169
180
  ]
170
181
  }
@@ -186,6 +197,7 @@ function UserRow({
186
197
  /* @__PURE__ */ jsx("div", { className: "mb-0.5 text-right text-xs font-medium text-muted-foreground", children: initialPrompt ? "Initial prompt" : "You" }),
187
198
  /* @__PURE__ */ jsx("div", { className: "min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground", children: event.file ? /* @__PURE__ */ jsx(MessageFilePart, { part: event.file }) : event.text && /* @__PURE__ */ jsx(Markdown, { text: event.text }) }),
188
199
  showRowMetadata && /* @__PURE__ */ jsx(EventMetadata, { event, align: "right" }),
200
+ /* @__PURE__ */ jsx(SessionRowTokens, { event }),
189
201
  showRaw && event.raw !== void 0 && /* @__PURE__ */ jsx(RawEventBlock, { raw: event.raw, align: "right" })
190
202
  ] }),
191
203
  /* @__PURE__ */ jsx(
@@ -263,7 +275,8 @@ function EventBody({
263
275
  visual,
264
276
  defaultExpanded,
265
277
  messageBadge,
266
- onPendingToolDecision
278
+ onPendingToolDecision,
279
+ showEstimatedToolCost
267
280
  }) {
268
281
  if (event.kind === "tool")
269
282
  return /* @__PURE__ */ jsx(
@@ -272,7 +285,8 @@ function EventBody({
272
285
  event,
273
286
  visual,
274
287
  defaultExpanded,
275
- onPendingToolDecision
288
+ onPendingToolDecision,
289
+ showEstimatedToolCost
276
290
  }
277
291
  );
278
292
  if (event.kind === "thinking") return /* @__PURE__ */ jsx(ThinkingBody, { event });
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.rows.js","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.rows.js","sources":["../../../src/data/ai/SessionViewer.rows.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBrain,\n UiChevronDown,\n UiSparkles,\n UiUserCircle,\n UiWarningTriangle,\n} from \"../../icons\";\nimport {\n getSessionAction,\n type SessionEvent,\n type SessionTone,\n} from \"./SessionViewer.model\";\nimport { SESSION_TONES } from \"./session-tones\";\nimport type { SessionEventGroup } from \"./SessionViewer.grouping\";\nimport { EventMetadata, RawEventBlock } from \"./SessionViewer.row-metadata\";\nimport { formatEventRange } from \"./SessionViewer.row-time\";\nimport { ToolBody } from \"./SessionViewer.tool-row\";\nimport type { SessionToolDecision } from \"./SessionViewer\";\nimport { Markdown } from \"../Markdown\";\nimport { MessageFilePart } from \"../chat/MessageFilePart\";\nimport { EstimatedToolCost } from \"./SessionViewer.tool-cost\";\nimport { SessionRowTokens } from \"./SessionViewer.tokens\";\n\nexport function SessionRow({\n event,\n initialPrompt = false,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\n initialPrompt?: boolean;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"user\") {\n return (\n <UserRow\n event={event}\n initialPrompt={initialPrompt}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n />\n );\n }\n\n const visual = eventVisual(event);\n return (\n <li\n data-event-kind={event.kind}\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <EventBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n messageBadge={\n event.kind === \"assistant\" ? renderMessageBadge?.(event) : undefined\n }\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n {showRowMetadata && <EventMetadata event={event} />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} />\n )}\n </div>\n </li>\n );\n}\n\nexport function WaitGroupRow({\n group,\n last,\n defaultExpanded,\n showRowMetadata = false,\n showEstimatedToolCost = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n group: SessionEventGroup;\n last: boolean;\n defaultExpanded: boolean;\n showRowMetadata?: boolean;\n showEstimatedToolCost?: boolean;\n showRaw?: boolean;\n renderMessageBadge?: ((event: SessionEvent) => ReactNode) | undefined;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const visual = getSessionAction(\"Wait\");\n const first = group.representative;\n const final = group.events[group.events.length - 1] ?? first;\n const label = `Wait × ${group.count}`;\n const metadataEvent = { ...first };\n delete metadataEvent.timestamp;\n delete metadataEvent.toolState;\n delete metadataEvent.approval;\n metadataEvent.pending = false;\n const timestampLabel = formatEventRange(first.timestamp, final.timestamp);\n\n return (\n <li\n data-event-kind=\"tool\"\n data-event-group=\"wait\"\n className=\"relative flex gap-density-2 pb-density-3 last:pb-0 @min-[48rem]/session-viewer:gap-density-3 @min-[48rem]/session-viewer:pb-density-4\"\n >\n {!last && (\n <span\n aria-hidden\n className=\"absolute bottom-0 left-[10px] top-[22px] w-px bg-border\"\n />\n )}\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES[visual.tone].disc,\n )}\n >\n <Icon icon={visual.icon} className=\"h-3 w-3\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-px\">\n <div data-tool-header className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n aria-expanded={open}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={() => setOpen((value) => !value)}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"font-medium text-foreground\">{label}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"ml-auto size-3 shrink-0 text-muted-foreground transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {showEstimatedToolCost && !open && <EstimatedToolCost events={group.events} />}\n </div>\n {showRowMetadata && (\n <EventMetadata\n event={metadataEvent}\n {...(timestampLabel ? { timestampLabel } : {})}\n />\n )}\n {open && (\n <ol className=\"relative mt-density-3 border-l border-border pl-density-3\">\n {group.events.map((event, index) => (\n <SessionRow\n key={event.id}\n event={event}\n last={index === group.events.length - 1}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showEstimatedToolCost={showEstimatedToolCost}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ))}\n </ol>\n )}\n {open && showEstimatedToolCost && <EstimatedToolCost events={group.events} detailed />}\n </div>\n </li>\n );\n}\n\nfunction UserRow({\n event,\n initialPrompt,\n showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\n initialPrompt: boolean;\n showRowMetadata: boolean;\n showRaw: boolean;\n}) {\n return (\n <li\n data-event-kind=\"user\"\n className=\"relative flex justify-end pb-density-4 last:pb-0\"\n >\n <div className={cn(\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:gap-density-3\", !initialPrompt && \"@min-[48rem]/session-viewer:max-w-[85%]\")}>\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n {initialPrompt ? \"Initial prompt\" : \"You\"}\n </div>\n <div className=\"min-w-0 break-words rounded-lg bg-accent px-density-3 py-density-2 text-left text-sm leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : event.text && <Markdown text={event.text} />}\n </div>\n {showRowMetadata && <EventMetadata event={event} align=\"right\" />}\n <SessionRowTokens event={event} />\n {showRaw && event.raw !== undefined && (\n <RawEventBlock raw={event.raw} align=\"right\" />\n )}\n </div>\n <span\n className={cn(\n \"relative z-[1] flex h-[21px] w-[21px] shrink-0 items-center justify-center rounded-full\",\n SESSION_TONES.slate.disc,\n )}\n >\n <Icon icon={UiUserCircle} className=\"h-3 w-3\" />\n </span>\n </div>\n </li>\n );\n}\n\ninterface EventVisual {\n icon: StaticIconComponent;\n tone: SessionTone;\n label: string;\n summaryOnly: boolean;\n}\n\n// Base visuals per event kind. A row's `icon`/`tone` fields (set for a\n// `verified`/`verify_failed` system row — see SessionViewer.model.ts) override\n// these defaults; eventVisual applies that override uniformly below rather\n// than special-casing it inside the switch.\nfunction baseEventVisual(event: SessionEvent): EventVisual {\n switch (event.kind) {\n case \"tool\": {\n const action = getSessionAction(event.tool ?? \"\");\n return {\n icon: action.icon,\n tone: action.tone,\n label: action.label,\n summaryOnly: action.summaryOnly ?? false,\n };\n }\n case \"user\":\n return {\n icon: UiUserCircle,\n tone: \"slate\",\n label: \"User\",\n summaryOnly: false,\n };\n case \"system\":\n return {\n icon: UiSparkles,\n tone: \"slate\",\n label: \"System\",\n summaryOnly: false,\n };\n case \"assistant\":\n return {\n icon: UiSparkles,\n tone: \"indigo\",\n label: \"Assistant\",\n summaryOnly: false,\n };\n case \"thinking\":\n return {\n icon: UiBrain,\n tone: \"slate\",\n label: \"Thinking\",\n summaryOnly: false,\n };\n case \"error\":\n return {\n icon: UiWarningTriangle,\n tone: \"rose\",\n label: \"Error\",\n summaryOnly: false,\n };\n }\n}\n\nfunction eventVisual(event: SessionEvent): EventVisual {\n const base = baseEventVisual(event);\n return {\n ...base,\n icon: event.icon ?? base.icon,\n tone: event.tone ?? base.tone,\n };\n}\n\nfunction EventBody({\n event,\n visual,\n defaultExpanded,\n messageBadge,\n onPendingToolDecision,\n showEstimatedToolCost,\n}: {\n event: SessionEvent;\n visual: EventVisual;\n defaultExpanded: boolean;\n showEstimatedToolCost: boolean;\n messageBadge?: ReactNode;\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}) {\n if (event.kind === \"tool\")\n return (\n <ToolBody\n event={event}\n visual={visual}\n defaultExpanded={defaultExpanded}\n onPendingToolDecision={onPendingToolDecision}\n showEstimatedToolCost={showEstimatedToolCost}\n />\n );\n if (event.kind === \"thinking\") return <ThinkingBody event={event} />;\n if (event.kind === \"error\") return <ErrorBody event={event} />;\n if (event.kind === \"system\") return <SystemBody event={event} />;\n return <MessageBody event={event} badge={messageBadge} />;\n}\n\nfunction MessageBody({\n event,\n badge,\n}: {\n event: SessionEvent;\n badge?: ReactNode;\n}) {\n return (\n <div className=\"flex items-start gap-1.5\">\n {badge}\n <div className=\"min-w-0 whitespace-pre-wrap break-words text-sm font-medium leading-relaxed text-foreground\">\n {event.file && <MessageFilePart part={event.file} />}\n {event.text && <Markdown text={event.text} />}\n </div>\n </div>\n );\n}\n\nfunction SystemBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n const preview = event.text?.split(\"\\n\", 1)[0] ?? \"System instructions\";\n return (\n <div className=\"not-prose text-xs text-muted-foreground\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left hover:text-foreground\"\n >\n <span className=\"shrink-0 font-medium text-foreground\">System</span>\n <span className=\"min-w-0 flex-1 truncate\">{preview}</span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n {open && (\n <div className=\"mt-1.5 whitespace-pre-wrap break-words bg-muted/20 px-density-3 py-density-2 leading-relaxed\">\n {event.text && <Markdown text={event.text} />}\n </div>\n )}\n </div>\n );\n}\n\n// Reasoning shows its text directly — truncated to one line, click to expand.\nfunction ThinkingBody({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"not-prose\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"flex w-full items-start gap-1.5 text-left text-xs italic leading-relaxed text-muted-foreground hover:text-foreground\"\n >\n <span\n className={cn(\n \"min-w-0 flex-1\",\n open ? \"whitespace-pre-wrap break-words\" : \"truncate\",\n )}\n >\n {event.text}\n </span>\n <Icon\n icon={UiChevronDown}\n className={cn(\n \"mt-0.5 size-3 shrink-0 transition-transform\",\n open && \"rotate-180\",\n )}\n />\n </button>\n </div>\n );\n}\n\nfunction ErrorBody({ event }: { event: SessionEvent }) {\n return (\n <div className=\"rounded-md border border-rose-200 bg-rose-50 px-density-3 py-1.5 text-xs text-rose-700 [[data-theme=dark]_&]:border-rose-500/30 [[data-theme=dark]_&]:bg-rose-500/10 [[data-theme=dark]_&]:text-rose-300\">\n {event.text}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
6
+ const useSessionTokenSizing = require("./use-session-token-sizing.cjs");
7
+ const tokens = require("../../lib/tokens.cjs");
8
+ const UiDotsVertical = require("../../icons/components/UiDotsVertical.cjs");
9
+ function SessionRowTokens({ event }) {
10
+ var _a;
11
+ const sizing = react.useContext(useSessionTokenSizing.SessionTokenContext);
12
+ if (!sizing || event.pending) return null;
13
+ const row = sizing.state(event);
14
+ const size = row == null ? void 0 : row.size;
15
+ const title = size ? `${size.source} · ${size.model}. Input ${size.usage.inputTokens ?? 0}, output ${size.usage.outputTokens ?? 0}, reasoning ${size.usage.reasoningTokens ?? 0}. ${size.coverage.framingIncluded ? "Provider framing included. " : ""}Excluded: ${((_a = size.coverage.excluded) == null ? void 0 : _a.join("; ")) || "none"}. Content footprint; not historical billed usage.` : void 0;
16
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1 text-xs text-muted-foreground", "data-row-tokens": event.id, children: [
17
+ size && /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-label": "Calculated row footprint", title, children: [
18
+ "Footprint ",
19
+ size.source === "local-estimate" || size.source === "provider-estimate" ? "~" : "",
20
+ tokens.compactTokens(size.totalTokens),
21
+ " tokens · ",
22
+ size.costUSD !== void 0 ? `~${tokens.formatCost(size.costUSD)}` : "price unavailable",
23
+ size.coverage.partial ? " · partial" : ""
24
+ ] }),
25
+ (row == null ? void 0 : row.pending) && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", children: "Calculating tokens/cost…" }),
26
+ (row == null ? void 0 : row.error) && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "alert", className: "text-destructive", children: row.error }),
27
+ !event.estimatedCost && /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu.DropdownMenu, { icon: UiDotsVertical.UiDotsVertical, hideChevron: true, variant: "ghost", size: "icon", title: `Row options ${event.id}`, menuLabel: `Row options ${event.id}`, items: [{
28
+ label: "Calculate tokens/cost",
29
+ disabled: Boolean(row == null ? void 0 : row.pending),
30
+ onSelect: () => sizing.calculate([event.id], "provider")
31
+ }] })
32
+ ] });
33
+ }
34
+ exports.SessionRowTokens = SessionRowTokens;
35
+ //# sourceMappingURL=SessionViewer.tokens.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionViewer.tokens.cjs","sources":["../../../src/data/ai/SessionViewer.tokens.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { UiDotsVertical } from \"../../icons\";\nimport type { SessionEvent } from \"./SessionViewer.model\";\nimport { SessionTokenContext } from \"./use-session-token-sizing\";\nimport { compactTokens, formatCost } from \"./session-cost\";\n\nexport function SessionRowTokens({ event }: { event: SessionEvent }) {\n const sizing = useContext(SessionTokenContext);\n if (!sizing || event.pending) return null;\n const row = sizing.state(event);\n const size = row?.size;\n const title = size ? `${size.source} · ${size.model}. Input ${size.usage.inputTokens ?? 0}, output ${size.usage.outputTokens ?? 0}, reasoning ${size.usage.reasoningTokens ?? 0}. ${size.coverage.framingIncluded ? \"Provider framing included. \" : \"\"}Excluded: ${size.coverage.excluded?.join(\"; \") || \"none\"}. Content footprint; not historical billed usage.` : undefined;\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1 text-xs text-muted-foreground\" data-row-tokens={event.id}>\n {size && <span aria-label=\"Calculated row footprint\" title={title}>Footprint {size.source === \"local-estimate\" || size.source === \"provider-estimate\" ? \"~\" : \"\"}{compactTokens(size.totalTokens)} tokens · {size.costUSD !== undefined ? `~${formatCost(size.costUSD)}` : \"price unavailable\"}{size.coverage.partial ? \" · partial\" : \"\"}</span>}\n {row?.pending && <span role=\"status\">Calculating tokens/cost…</span>}\n {row?.error && <span role=\"alert\" className=\"text-destructive\">{row.error}</span>}\n {!event.estimatedCost && (\n <DropdownMenu icon={UiDotsVertical} hideChevron variant=\"ghost\" size=\"icon\" title={`Row options ${event.id}`} menuLabel={`Row options ${event.id}`} items={[{\n label: \"Calculate tokens/cost\", disabled: Boolean(row?.pending),\n onSelect: () => sizing.calculate([event.id], \"provider\"),\n }]} />\n )}\n </div>\n );\n}\n"],"names":["useContext","SessionTokenContext","jsxs","compactTokens","formatCost","jsx","DropdownMenu","UiDotsVertical"],"mappings":";;;;;;;;AAOO,SAAS,iBAAiB,EAAE,SAAkC;;AACnE,QAAM,SAASA,MAAAA,WAAWC,yCAAmB;AAC7C,MAAI,CAAC,UAAU,MAAM,QAAS,QAAO;AACrC,QAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,QAAM,OAAO,2BAAK;AAClB,QAAM,QAAQ,OAAO,GAAG,KAAK,MAAM,MAAM,KAAK,KAAK,WAAW,KAAK,MAAM,eAAe,CAAC,YAAY,KAAK,MAAM,gBAAgB,CAAC,eAAe,KAAK,MAAM,mBAAmB,CAAC,KAAK,KAAK,SAAS,kBAAkB,gCAAgC,EAAE,eAAa,UAAK,SAAS,aAAd,mBAAwB,KAAK,UAAS,MAAM,sDAAsD;AACrW,yCACG,OAAA,EAAI,WAAU,2EAA0E,mBAAiB,MAAM,IAC7G,UAAA;AAAA,IAAA,QAAQC,2BAAAA,KAAC,QAAA,EAAK,cAAW,4BAA2B,OAAc,UAAA;AAAA,MAAA;AAAA,MAAW,KAAK,WAAW,oBAAoB,KAAK,WAAW,sBAAsB,MAAM;AAAA,MAAIC,OAAAA,cAAc,KAAK,WAAW;AAAA,MAAE;AAAA,MAAW,KAAK,YAAY,SAAY,IAAIC,OAAAA,WAAW,KAAK,OAAO,CAAC,KAAK;AAAA,MAAqB,KAAK,SAAS,UAAU,eAAe;AAAA,IAAA,GAAG;AAAA,KACzU,2BAAK,YAAWC,2BAAAA,IAAC,QAAA,EAAK,MAAK,UAAS,UAAA,4BAAwB;AAAA,KAC5D,2BAAK,UAASA,+BAAC,QAAA,EAAK,MAAK,SAAQ,WAAU,oBAAoB,UAAA,IAAI,MAAA,CAAM;AAAA,IACzE,CAAC,MAAM,iBACNA,2BAAAA,IAACC,aAAAA,cAAA,EAAa,MAAMC,eAAAA,gBAAgB,aAAW,MAAC,SAAQ,SAAQ,MAAK,QAAO,OAAO,eAAe,MAAM,EAAE,IAAI,WAAW,eAAe,MAAM,EAAE,IAAI,OAAO,CAAC;AAAA,MAC1J,OAAO;AAAA,MAAyB,UAAU,QAAQ,2BAAK,OAAO;AAAA,MAC9D,UAAU,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,GAAG,UAAU;AAAA,IAAA,CACxD,EAAA,CAAG;AAAA,EAAA,GAER;AAEJ;;"}
@@ -0,0 +1,5 @@
1
+ import { SessionEvent } from './SessionViewer.model.js';
2
+ export declare function SessionRowTokens({ event }: {
3
+ event: SessionEvent;
4
+ }): import("react").JSX.Element | null;
5
+ //# sourceMappingURL=SessionViewer.tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionViewer.tokens.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.tokens.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,sCAmBlE"}
@@ -0,0 +1,35 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useContext } from "react";
3
+ import { DropdownMenu } from "../../overlay/DropdownMenu.js";
4
+ import { SessionTokenContext } from "./use-session-token-sizing.js";
5
+ import { compactTokens, formatCost } from "../../lib/tokens.js";
6
+ import { UiDotsVertical } from "../../icons/components/UiDotsVertical.js";
7
+ function SessionRowTokens({ event }) {
8
+ var _a;
9
+ const sizing = useContext(SessionTokenContext);
10
+ if (!sizing || event.pending) return null;
11
+ const row = sizing.state(event);
12
+ const size = row == null ? void 0 : row.size;
13
+ const title = size ? `${size.source} · ${size.model}. Input ${size.usage.inputTokens ?? 0}, output ${size.usage.outputTokens ?? 0}, reasoning ${size.usage.reasoningTokens ?? 0}. ${size.coverage.framingIncluded ? "Provider framing included. " : ""}Excluded: ${((_a = size.coverage.excluded) == null ? void 0 : _a.join("; ")) || "none"}. Content footprint; not historical billed usage.` : void 0;
14
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1 text-xs text-muted-foreground", "data-row-tokens": event.id, children: [
15
+ size && /* @__PURE__ */ jsxs("span", { "aria-label": "Calculated row footprint", title, children: [
16
+ "Footprint ",
17
+ size.source === "local-estimate" || size.source === "provider-estimate" ? "~" : "",
18
+ compactTokens(size.totalTokens),
19
+ " tokens · ",
20
+ size.costUSD !== void 0 ? `~${formatCost(size.costUSD)}` : "price unavailable",
21
+ size.coverage.partial ? " · partial" : ""
22
+ ] }),
23
+ (row == null ? void 0 : row.pending) && /* @__PURE__ */ jsx("span", { role: "status", children: "Calculating tokens/cost…" }),
24
+ (row == null ? void 0 : row.error) && /* @__PURE__ */ jsx("span", { role: "alert", className: "text-destructive", children: row.error }),
25
+ !event.estimatedCost && /* @__PURE__ */ jsx(DropdownMenu, { icon: UiDotsVertical, hideChevron: true, variant: "ghost", size: "icon", title: `Row options ${event.id}`, menuLabel: `Row options ${event.id}`, items: [{
26
+ label: "Calculate tokens/cost",
27
+ disabled: Boolean(row == null ? void 0 : row.pending),
28
+ onSelect: () => sizing.calculate([event.id], "provider")
29
+ }] })
30
+ ] });
31
+ }
32
+ export {
33
+ SessionRowTokens
34
+ };
35
+ //# sourceMappingURL=SessionViewer.tokens.js.map