@flanksource/clicky-ui 0.3.41 → 0.3.43

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 (487) hide show
  1. package/dist/ai.cjs +4 -0
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +4 -0
  4. package/dist/ai.js.map +1 -1
  5. package/dist/comments/CommentCard.cjs +3 -1
  6. package/dist/comments/CommentCard.cjs.map +1 -1
  7. package/dist/comments/CommentCard.d.ts.map +1 -1
  8. package/dist/comments/CommentCard.js +4 -2
  9. package/dist/comments/CommentCard.js.map +1 -1
  10. package/dist/comments/CommentCardParts.cjs +16 -0
  11. package/dist/comments/CommentCardParts.cjs.map +1 -1
  12. package/dist/comments/CommentCardParts.d.ts +4 -1
  13. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  14. package/dist/comments/CommentCardParts.js +16 -0
  15. package/dist/comments/CommentCardParts.js.map +1 -1
  16. package/dist/comments/comment-types.cjs.map +1 -1
  17. package/dist/comments/comment-types.d.ts +4 -0
  18. package/dist/comments/comment-types.d.ts.map +1 -1
  19. package/dist/comments/comment-types.js.map +1 -1
  20. package/dist/components/Combobox.cjs +54 -8
  21. package/dist/components/Combobox.cjs.map +1 -1
  22. package/dist/components/Combobox.d.ts.map +1 -1
  23. package/dist/components/Combobox.js +56 -10
  24. package/dist/components/Combobox.js.map +1 -1
  25. package/dist/components/ComboboxMenu.cjs +139 -113
  26. package/dist/components/ComboboxMenu.cjs.map +1 -1
  27. package/dist/components/ComboboxMenu.d.ts +3 -1
  28. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  29. package/dist/components/ComboboxMenu.js +139 -113
  30. package/dist/components/ComboboxMenu.js.map +1 -1
  31. package/dist/components/ComboboxMenuTrigger.cjs +87 -0
  32. package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
  33. package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
  34. package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
  35. package/dist/components/ComboboxMenuTrigger.js +87 -0
  36. package/dist/components/ComboboxMenuTrigger.js.map +1 -0
  37. package/dist/components/JsonSchemaForm.cjs +30 -7
  38. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  39. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  40. package/dist/components/JsonSchemaForm.js +30 -7
  41. package/dist/components/JsonSchemaForm.js.map +1 -1
  42. package/dist/components/SegmentedControl.cjs +20 -3
  43. package/dist/components/SegmentedControl.cjs.map +1 -1
  44. package/dist/components/SegmentedControl.d.ts +11 -0
  45. package/dist/components/SegmentedControl.d.ts.map +1 -1
  46. package/dist/components/SegmentedControl.js +21 -4
  47. package/dist/components/SegmentedControl.js.map +1 -1
  48. package/dist/components/combobox-types.d.ts +8 -0
  49. package/dist/components/combobox-types.d.ts.map +1 -1
  50. package/dist/components/json-schema-form-debug-badge.cjs +108 -0
  51. package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
  52. package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
  53. package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
  54. package/dist/components/json-schema-form-debug-badge.js +108 -0
  55. package/dist/components/json-schema-form-debug-badge.js.map +1 -0
  56. package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
  57. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
  58. package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
  59. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
  60. package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
  61. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
  62. package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
  63. package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
  64. package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
  65. package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
  66. package/dist/components/json-schema-form-debug-glyph.js +13 -0
  67. package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
  68. package/dist/components/json-schema-form-debug-groups.cjs +56 -0
  69. package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
  70. package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
  71. package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
  72. package/dist/components/json-schema-form-debug-groups.js +56 -0
  73. package/dist/components/json-schema-form-debug-groups.js.map +1 -0
  74. package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
  75. package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
  76. package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
  77. package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
  78. package/dist/components/json-schema-form-debug-keywords.js +159 -0
  79. package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
  80. package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
  81. package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
  82. package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
  83. package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
  84. package/dist/components/json-schema-form-debug-listeners.js +102 -0
  85. package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
  86. package/dist/components/json-schema-form-debug.cjs +31 -0
  87. package/dist/components/json-schema-form-debug.cjs.map +1 -0
  88. package/dist/components/json-schema-form-debug.d.ts +11 -0
  89. package/dist/components/json-schema-form-debug.d.ts.map +1 -0
  90. package/dist/components/json-schema-form-debug.js +31 -0
  91. package/dist/components/json-schema-form-debug.js.map +1 -0
  92. package/dist/components/json-schema-form-enum-choice.cjs +114 -0
  93. package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
  94. package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
  95. package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
  96. package/dist/components/json-schema-form-enum-choice.js +114 -0
  97. package/dist/components/json-schema-form-enum-choice.js.map +1 -0
  98. package/dist/components/json-schema-form-fields.cjs +3 -93
  99. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  100. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  101. package/dist/components/json-schema-form-fields.js +1 -91
  102. package/dist/components/json-schema-form-fields.js.map +1 -1
  103. package/dist/components/json-schema-form-listeners.cjs +7 -1
  104. package/dist/components/json-schema-form-listeners.cjs.map +1 -1
  105. package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-listeners.js +7 -1
  107. package/dist/components/json-schema-form-listeners.js.map +1 -1
  108. package/dist/components/json-schema-form-preferences.cjs +1 -0
  109. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  110. package/dist/components/json-schema-form-preferences.d.ts +1 -0
  111. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-preferences.js +1 -0
  113. package/dist/components/json-schema-form-preferences.js.map +1 -1
  114. package/dist/components/json-schema-form-render.cjs +21 -5
  115. package/dist/components/json-schema-form-render.cjs.map +1 -1
  116. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  117. package/dist/components/json-schema-form-render.js +21 -5
  118. package/dist/components/json-schema-form-render.js.map +1 -1
  119. package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
  120. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
  121. package/dist/components/json-schema-form-tone.cjs +12 -0
  122. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  123. package/dist/components/json-schema-form-tone.js +12 -0
  124. package/dist/components/json-schema-form-tone.js.map +1 -1
  125. package/dist/components/json-schema-form-types.d.ts +1 -0
  126. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  127. package/dist/data/GraphDiagram.cjs +125 -138
  128. package/dist/data/GraphDiagram.cjs.map +1 -1
  129. package/dist/data/GraphDiagram.d.ts +30 -23
  130. package/dist/data/GraphDiagram.d.ts.map +1 -1
  131. package/dist/data/GraphDiagram.js +128 -141
  132. package/dist/data/GraphDiagram.js.map +1 -1
  133. package/dist/data/GraphDiagramEdges.cjs +208 -0
  134. package/dist/data/GraphDiagramEdges.cjs.map +1 -0
  135. package/dist/data/GraphDiagramEdges.d.ts +40 -0
  136. package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
  137. package/dist/data/GraphDiagramEdges.js +208 -0
  138. package/dist/data/GraphDiagramEdges.js.map +1 -0
  139. package/dist/data/GraphDiagramNodes.cjs +142 -0
  140. package/dist/data/GraphDiagramNodes.cjs.map +1 -0
  141. package/dist/data/GraphDiagramNodes.d.ts +22 -0
  142. package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
  143. package/dist/data/GraphDiagramNodes.js +142 -0
  144. package/dist/data/GraphDiagramNodes.js.map +1 -0
  145. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
  146. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
  147. package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
  148. package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
  149. package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
  150. package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
  151. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  152. package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
  153. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  154. package/dist/data/ai/PromptRunEditor/index.js +38 -44
  155. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  156. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
  157. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  158. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
  159. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  160. package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
  161. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  162. package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
  163. package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
  164. package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
  165. package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
  166. package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
  167. package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
  168. package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
  169. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  170. package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
  171. package/dist/data/ai/SessionInspector.approvals.js +26 -2
  172. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  173. package/dist/data/ai/SessionInspector.summary.cjs +9 -3
  174. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  175. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
  176. package/dist/data/ai/SessionInspector.summary.js +9 -3
  177. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  178. package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
  179. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  180. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  181. package/dist/data/ai/SessionInspector.transcript.js +4 -0
  182. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  183. package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
  184. package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
  185. package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
  186. package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
  187. package/dist/data/ai/SessionViewer.approval-body.js +146 -0
  188. package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
  189. package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
  190. package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
  191. package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
  192. package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
  193. package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
  194. package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
  195. package/dist/data/ai/SessionViewer.cjs +57 -20
  196. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  197. package/dist/data/ai/SessionViewer.d.ts +13 -3
  198. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  199. package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
  200. package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
  201. package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
  202. package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
  203. package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
  204. package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
  205. package/dist/data/ai/SessionViewer.decision.cjs +21 -0
  206. package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
  207. package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
  208. package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
  209. package/dist/data/ai/SessionViewer.decision.js +21 -0
  210. package/dist/data/ai/SessionViewer.decision.js.map +1 -0
  211. package/dist/data/ai/SessionViewer.input.cjs +14 -0
  212. package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
  213. package/dist/data/ai/SessionViewer.input.d.ts +5 -0
  214. package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
  215. package/dist/data/ai/SessionViewer.input.js +14 -0
  216. package/dist/data/ai/SessionViewer.input.js.map +1 -1
  217. package/dist/data/ai/SessionViewer.js +58 -21
  218. package/dist/data/ai/SessionViewer.js.map +1 -1
  219. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  220. package/dist/data/ai/SessionViewer.model.d.ts +4 -0
  221. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  222. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  223. package/dist/data/ai/SessionViewer.rows.cjs +6 -3
  224. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  225. package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
  226. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  227. package/dist/data/ai/SessionViewer.rows.js +6 -3
  228. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  229. package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
  230. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  231. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  232. package/dist/data/ai/SessionViewer.tool-row.js +27 -235
  233. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  234. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  235. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  236. package/dist/data/ai/SessionViewerMenu.cjs +8 -2
  237. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  238. package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
  239. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  240. package/dist/data/ai/SessionViewerMenu.js +8 -2
  241. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  242. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
  243. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  244. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
  245. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  246. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
  247. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  248. package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
  249. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  250. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
  251. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  252. package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
  253. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  254. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
  255. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
  256. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  257. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
  258. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  259. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  260. package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
  261. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  262. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
  263. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  264. package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
  265. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  266. package/dist/data/ai/approval-request.cjs +75 -0
  267. package/dist/data/ai/approval-request.cjs.map +1 -0
  268. package/dist/data/ai/approval-request.d.ts +155 -0
  269. package/dist/data/ai/approval-request.d.ts.map +1 -0
  270. package/dist/data/ai/approval-request.js +75 -0
  271. package/dist/data/ai/approval-request.js.map +1 -0
  272. package/dist/data/ai/index.d.ts +3 -0
  273. package/dist/data/ai/index.d.ts.map +1 -1
  274. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
  275. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
  276. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
  277. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
  278. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
  279. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
  280. package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
  281. package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
  282. package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
  283. package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
  284. package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
  285. package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
  286. package/dist/data/ai/runtime-preset-menu/model.js +73 -0
  287. package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
  288. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
  289. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
  290. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
  291. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
  292. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
  293. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
  294. package/dist/data/ai/runtime-spec-fields.cjs +166 -0
  295. package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
  296. package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
  297. package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
  298. package/dist/data/ai/runtime-spec-fields.js +166 -0
  299. package/dist/data/ai/runtime-spec-fields.js.map +1 -0
  300. package/dist/data/ai/session-categories.cjs +4 -0
  301. package/dist/data/ai/session-categories.cjs.map +1 -1
  302. package/dist/data/ai/session-categories.d.ts +1 -0
  303. package/dist/data/ai/session-categories.d.ts.map +1 -1
  304. package/dist/data/ai/session-categories.js +4 -0
  305. package/dist/data/ai/session-categories.js.map +1 -1
  306. package/dist/data/ai/use-session-scroll.cjs +49 -21
  307. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  308. package/dist/data/ai/use-session-scroll.d.ts +2 -0
  309. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  310. package/dist/data/ai/use-session-scroll.js +49 -21
  311. package/dist/data/ai/use-session-scroll.js.map +1 -1
  312. package/dist/data/chat/Chat.runtime.cjs +1 -1
  313. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  314. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  315. package/dist/data/chat/Chat.runtime.js +1 -1
  316. package/dist/data/chat/Chat.runtime.js.map +1 -1
  317. package/dist/data/graph-columns-layout.cjs +216 -0
  318. package/dist/data/graph-columns-layout.cjs.map +1 -0
  319. package/dist/data/graph-columns-layout.d.ts +56 -0
  320. package/dist/data/graph-columns-layout.d.ts.map +1 -0
  321. package/dist/data/graph-columns-layout.js +216 -0
  322. package/dist/data/graph-columns-layout.js.map +1 -0
  323. package/dist/data/graph-diagram-model.cjs +73 -0
  324. package/dist/data/graph-diagram-model.cjs.map +1 -0
  325. package/dist/data/graph-diagram-model.d.ts +90 -0
  326. package/dist/data/graph-diagram-model.d.ts.map +1 -0
  327. package/dist/data/graph-diagram-model.js +73 -0
  328. package/dist/data/graph-diagram-model.js.map +1 -0
  329. package/dist/data/graph-edge-routing.cjs +235 -0
  330. package/dist/data/graph-edge-routing.cjs.map +1 -0
  331. package/dist/data/graph-edge-routing.d.ts +73 -0
  332. package/dist/data/graph-edge-routing.d.ts.map +1 -0
  333. package/dist/data/graph-edge-routing.js +235 -0
  334. package/dist/data/graph-edge-routing.js.map +1 -0
  335. package/dist/data/graph-layout.cjs +0 -82
  336. package/dist/data/graph-layout.cjs.map +1 -1
  337. package/dist/data/graph-layout.d.ts +1 -28
  338. package/dist/data/graph-layout.d.ts.map +1 -1
  339. package/dist/data/graph-layout.js +1 -83
  340. package/dist/data/graph-layout.js.map +1 -1
  341. package/dist/data/har/HarPanel.cjs +129 -33
  342. package/dist/data/har/HarPanel.cjs.map +1 -1
  343. package/dist/data/har/HarPanel.d.ts +13 -1
  344. package/dist/data/har/HarPanel.d.ts.map +1 -1
  345. package/dist/data/har/HarPanel.js +130 -34
  346. package/dist/data/har/HarPanel.js.map +1 -1
  347. package/dist/data/har/fixtures.d.ts +12 -0
  348. package/dist/data/har/fixtures.d.ts.map +1 -1
  349. package/dist/data/har/types.d.ts +12 -0
  350. package/dist/data/har/types.d.ts.map +1 -1
  351. package/dist/data/runtime/RuntimeBar.cjs +67 -84
  352. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  353. package/dist/data/runtime/RuntimeBar.d.ts +4 -5
  354. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  355. package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
  356. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
  357. package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
  358. package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
  359. package/dist/data/runtime/RuntimeBar.fields.js +170 -0
  360. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
  361. package/dist/data/runtime/RuntimeBar.js +70 -87
  362. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  363. package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
  364. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
  365. package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
  366. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
  367. package/dist/data/runtime/RuntimeBar.selection.js +56 -0
  368. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
  369. package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
  370. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  371. package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
  372. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  373. package/dist/data/runtime/RuntimeBarActions.js +10 -6
  374. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  375. package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
  376. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
  377. package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
  378. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
  379. package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
  380. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
  381. package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
  382. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
  383. package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
  384. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
  385. package/dist/data/runtime/RuntimeBarLayout.js +95 -0
  386. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
  387. package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
  388. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  389. package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
  390. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  391. package/dist/data/runtime/RuntimeBarSegment.js +25 -14
  392. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  393. package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
  394. package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
  395. package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
  396. package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
  397. package/dist/data/runtime/RuntimeLimitInput.js +41 -0
  398. package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
  399. package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
  400. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
  401. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
  402. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
  403. package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
  404. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
  405. package/dist/data/use-edge-focus.cjs +20 -0
  406. package/dist/data/use-edge-focus.cjs.map +1 -0
  407. package/dist/data/use-edge-focus.d.ts +23 -0
  408. package/dist/data/use-edge-focus.d.ts.map +1 -0
  409. package/dist/data/use-edge-focus.js +20 -0
  410. package/dist/data/use-edge-focus.js.map +1 -0
  411. package/dist/data/use-pan-zoom.cjs +159 -0
  412. package/dist/data/use-pan-zoom.cjs.map +1 -0
  413. package/dist/data/use-pan-zoom.d.ts +79 -0
  414. package/dist/data/use-pan-zoom.d.ts.map +1 -0
  415. package/dist/data/use-pan-zoom.js +159 -0
  416. package/dist/data/use-pan-zoom.js.map +1 -0
  417. package/dist/data/version-info.cjs +3 -3
  418. package/dist/data/version-info.js +3 -3
  419. package/dist/data.cjs +5 -1
  420. package/dist/data.cjs.map +1 -1
  421. package/dist/data.d.ts +4 -3
  422. package/dist/data.d.ts.map +1 -1
  423. package/dist/data.js +6 -2
  424. package/dist/data.js.map +1 -1
  425. package/dist/index.cjs +5 -1
  426. package/dist/index.cjs.map +1 -1
  427. package/dist/index.js +6 -2
  428. package/dist/index.js.map +1 -1
  429. package/dist/overlay/DropdownMenu.cjs +1 -0
  430. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  431. package/dist/overlay/DropdownMenu.d.ts +4 -0
  432. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  433. package/dist/overlay/DropdownMenu.js +1 -0
  434. package/dist/overlay/DropdownMenu.js.map +1 -1
  435. package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
  436. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  437. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  438. package/dist/overlay/DropdownMenuSubmenu.js +31 -15
  439. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  440. package/dist/profiles/fields/profileFieldFilterEditor.cjs +5 -2
  441. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  442. package/dist/profiles/fields/profileFieldFilterEditor.js +5 -2
  443. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  444. package/dist/profiles/fields/profileFieldIcons.cjs +2 -0
  445. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  446. package/dist/profiles/fields/profileFieldIcons.d.ts.map +1 -1
  447. package/dist/profiles/fields/profileFieldIcons.js +2 -0
  448. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  449. package/dist/profiles/wizard/profileWizardModel.cjs +1 -0
  450. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  451. package/dist/profiles/wizard/profileWizardModel.d.ts +3 -0
  452. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  453. package/dist/profiles/wizard/profileWizardModel.js +1 -0
  454. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  455. package/dist/rpc/OperationCatalog.cjs +3 -1
  456. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  457. package/dist/rpc/OperationCatalog.d.ts +3 -1
  458. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  459. package/dist/rpc/OperationCatalog.js +3 -1
  460. package/dist/rpc/OperationCatalog.js.map +1 -1
  461. package/dist/rpc/useOperationPages.cjs +6 -1
  462. package/dist/rpc/useOperationPages.cjs.map +1 -1
  463. package/dist/rpc/useOperationPages.d.ts +3 -1
  464. package/dist/rpc/useOperationPages.d.ts.map +1 -1
  465. package/dist/rpc/useOperationPages.js +6 -1
  466. package/dist/rpc/useOperationPages.js.map +1 -1
  467. package/dist/styles.css +1 -1
  468. package/package.json +1 -1
  469. package/schemas/json-schema-form.schema.json +5 -0
  470. package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
  471. package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
  472. package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
  473. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
  474. package/dist/data/runtime/RuntimeBarCombo.js +0 -423
  475. package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
  476. package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
  477. package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
  478. package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
  479. package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
  480. package/dist/data/runtime/RuntimeBarLimits.js +0 -262
  481. package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
  482. package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
  483. package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
  484. package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
  485. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
  486. package/dist/data/runtime/RuntimeBarSegments.js +0 -346
  487. package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
@@ -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 last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\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 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 showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\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=\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:max-w-[85%] @min-[48rem]/session-viewer:gap-density-3\">\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n You\n </div>\n <div className=\"whitespace-pre-wrap break-words rounded-lg bg-accent px-density-3 py-density-2 text-right text-base font-medium leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : 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","UiUserCircle","UiSparkles","UiBrain","UiWarningTriangle","ToolBody","Markdown"],"mappings":";;;;;;;;;;;;;;;;;;AAwBO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAUG;AACD,MAAI,MAAM,SAAS,QAAQ;AACzB,WACEA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AAEA,QAAM,SAAS,YAAY,KAAK;AAChC,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAiB,MAAM;AAAA,MACvB,WAAU;AAAA,MAET,UAAA;AAAA,QAAA,CAAC,QACAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGdA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,2BAAc,OAAO,IAAI,EAAE;AAAA,YAAA;AAAA,YAG7B,yCAACC,KAAAA,MAAA,EAAK,MAAM,OAAO,MAAM,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/CH,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAD,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA,cACE,MAAM,SAAS,cAAc,yDAAqB,SAAS;AAAA,cAE7D;AAAA,YAAA;AAAA,UAAA;AAAA,UAED,mBAAmBA,2BAAAA,IAACK,yCAAA,EAAc,MAAA,CAAc;AAAA,UAChD,WAAW,MAAM,QAAQ,yCACvBC,0BAAAA,eAAA,EAAc,KAAK,MAAM,IAAA,CAAK;AAAA,QAAA,EAAA,CAEnC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAUG;AACD,QAAM,CAAC,MAAM,OAAO,IAAIC,MAAAA,SAAS,KAAK;AACtC,QAAM,SAASC,oBAAAA,iBAAiB,MAAM;AACtC,QAAM,QAAQ,MAAM;AACpB,QAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,SAAS,CAAC,KAAK;AACvD,QAAM,QAAQ,UAAU,MAAM,KAAK;AACnC,QAAM,gBAAgB,EAAE,GAAG,MAAA;AAC3B,SAAO,cAAc;AACrB,SAAO,cAAc;AACrB,SAAO,cAAc;AACrB,gBAAc,UAAU;AACxB,QAAM,iBAAiBC,sBAAAA,iBAAiB,MAAM,WAAW,MAAM,SAAS;AAExE,SACER,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,oBAAiB;AAAA,MACjB,WAAU;AAAA,MAET,UAAA;AAAA,QAAA,CAAC,QACAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGdA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,2BAAc,OAAO,IAAI,EAAE;AAAA,YAAA;AAAA,YAG7B,yCAACC,KAAAA,MAAA,EAAK,MAAM,OAAO,MAAM,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/CH,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,cACpD,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,cACxC,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAAA,gBACrDA,2BAAAA;AAAAA,kBAACI,KAAAA;AAAAA,kBAAA;AAAA,oBACC,MAAMM,cAAAA;AAAAA,oBACN,WAAWR,MAAAA;AAAAA,sBACT;AAAA,sBACA,QAAQ;AAAA,oBAAA;AAAA,kBACV;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAED,mBACCF,2BAAAA;AAAAA,YAACK,0BAAAA;AAAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACN,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAG/C,QACCL,2BAAAA,IAAC,MAAA,EAAG,WAAU,6DACX,gBAAM,OAAO,IAAI,CAAC,OAAO,UACxBA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC;AAAA,cACA,MAAM,UAAU,MAAM,OAAO,SAAS;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,YAPK,MAAM;AAAA,UAAA,CASd,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,WAAU;AAAA,MAEV,UAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+HACb,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,UAAAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,+DAA8D,UAAA,OAE7E;AAAA,UACAA,2BAAAA,IAAC,OAAA,EAAI,WAAU,0JACZ,UAAA,MAAM,OAAOA,2BAAAA,IAACW,gBAAAA,iBAAA,EAAgB,MAAM,MAAM,KAAA,CAAM,IAAK,MAAM,MAC9D;AAAA,UACC,mBAAmBX,2BAAAA,IAACK,0BAAAA,eAAA,EAAc,OAAc,OAAM,SAAQ;AAAA,UAC9D,WAAW,MAAM,QAAQ,UACxBL,2BAAAA,IAACM,0BAAAA,iBAAc,KAAK,MAAM,KAAK,OAAM,QAAA,CAAQ;AAAA,QAAA,GAEjD;AAAA,QACAN,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACAC,aAAAA,cAAc,MAAM;AAAA,YAAA;AAAA,YAGtB,UAAAH,2BAAAA,IAACI,WAAA,EAAK,MAAMQ,aAAAA,cAAc,WAAU,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAaA,SAAS,gBAAgB,OAAkC;AACzD,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK,QAAQ;AACX,YAAM,SAASJ,oBAAAA,iBAAiB,MAAM,QAAQ,EAAE;AAChD,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,aAAa,OAAO,eAAe;AAAA,MAAA;AAAA,IAEvC;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAMI,aAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,WAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMA,WAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,QAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEjB,KAAK;AACH,aAAO;AAAA,QACL,MAAMC,kBAAAA;AAAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,EACf;AAEN;AAEA,SAAS,YAAY,OAAkC;AACrD,QAAM,OAAO,gBAAgB,KAAK;AAClC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,MAAM,QAAQ,KAAK;AAAA,IACzB,MAAM,MAAM,QAAQ,KAAK;AAAA,EAAA;AAE7B;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,MAAI,MAAM,SAAS;AACjB,WACEf,2BAAAA;AAAAA,MAACgB,sBAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAGN,MAAI,MAAM,SAAS,WAAY,QAAOhB,2BAAAA,IAAC,gBAAa,OAAc;AAClE,MAAI,MAAM,SAAS,QAAS,QAAOA,2BAAAA,IAAC,aAAU,OAAc;AAC5D,MAAI,MAAM,SAAS,SAAU,QAAOA,2BAAAA,IAAC,cAAW,OAAc;AAC9D,SAAOA,2BAAAA,IAAC,aAAA,EAAY,OAAc,OAAO,aAAA,CAAc;AACzD;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,4BACZ,UAAA;AAAA,IAAA;AAAA,IACDA,2BAAAA,KAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,MAAA,MAAM,QAAQD,+BAACW,gBAAAA,iBAAA,EAAgB,MAAM,MAAM,MAAM;AAAA,MACjD,MAAM,QAAQX,+BAACiB,SAAAA,UAAA,EAAS,MAAM,MAAM,KAAA,CAAM;AAAA,IAAA,EAAA,CAC7C;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,WAAW,EAAE,SAAkC;;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIV,MAAAA,SAAS,KAAK;AACtC,QAAM,YAAU,WAAM,SAAN,mBAAY,MAAM,MAAM,GAAG,OAAM;AACjD,SACEN,2BAAAA,KAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,IAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,QACxC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,wCAAuC,UAAA,UAAM;AAAA,UAC7DA,2BAAAA,IAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,SAAQ;AAAA,UACnDA,2BAAAA;AAAAA,YAACI,KAAAA;AAAAA,YAAA;AAAA,cACC,MAAMM,cAAAA;AAAAA,cACN,WAAWR,MAAAA;AAAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAED,QACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,iGACZ,UAAA,MAAM,QAAQA,2BAAAA,IAACiB,SAAAA,UAAA,EAAS,MAAM,MAAM,KAAA,CAAM,EAAA,CAC7C;AAAA,EAAA,GAEJ;AAEJ;AAGA,SAAS,aAAa,EAAE,SAAkC;AACxD,QAAM,CAAC,MAAM,OAAO,IAAIV,MAAAA,SAAS,KAAK;AACtC,SACEP,2BAAAA,IAAC,OAAA,EAAI,WAAU,aACb,UAAAC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,MACxC,WAAU;AAAA,MAEV,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWE,MAAAA;AAAAA,cACT;AAAA,cACA,OAAO,oCAAoC;AAAA,YAAA;AAAA,YAG5C,UAAA,MAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAETF,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAMM,cAAAA;AAAAA,YACN,WAAWR,MAAAA;AAAAA,cACT;AAAA,cACA,QAAQ;AAAA,YAAA;AAAA,UACV;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS,UAAU,EAAE,SAAkC;AACrD,SACEF,2BAAAA,IAAC,OAAA,EAAI,WAAU,4MACZ,gBAAM,MACT;AAEJ;;;"}
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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"}
@@ -2,8 +2,9 @@ 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, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
5
+ export declare function SessionRow({ event, initialPrompt, last, defaultExpanded, showRowMetadata, showRaw, renderMessageBadge, onPendingToolDecision, }: {
6
6
  event: SessionEvent;
7
+ initialPrompt?: boolean;
7
8
  last: boolean;
8
9
  defaultExpanded: boolean;
9
10
  showRowMetadata?: boolean;
@@ -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,IAAI,EACJ,eAAe,EACf,eAAuB,EACvB,OAAe,EACf,kBAAkB,EAClB,qBAAqB,GACtB,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,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,+BAgDA;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;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"}
@@ -16,6 +16,7 @@ import { UiBrain } from "../../icons/components/UiBrain.js";
16
16
  import { UiSparkles } from "../../icons/components/UiSparkles.js";
17
17
  function SessionRow({
18
18
  event,
19
+ initialPrompt = false,
19
20
  last,
20
21
  defaultExpanded,
21
22
  showRowMetadata = false,
@@ -28,6 +29,7 @@ function SessionRow({
28
29
  UserRow,
29
30
  {
30
31
  event,
32
+ initialPrompt,
31
33
  showRowMetadata,
32
34
  showRaw
33
35
  }
@@ -170,6 +172,7 @@ function WaitGroupRow({
170
172
  }
171
173
  function UserRow({
172
174
  event,
175
+ initialPrompt,
173
176
  showRowMetadata,
174
177
  showRaw
175
178
  }) {
@@ -178,10 +181,10 @@ function UserRow({
178
181
  {
179
182
  "data-event-kind": "user",
180
183
  className: "relative flex justify-end pb-density-4 last:pb-0",
181
- children: /* @__PURE__ */ jsxs("div", { className: "flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:max-w-[85%] @min-[48rem]/session-viewer:gap-density-3", children: [
184
+ children: /* @__PURE__ */ jsxs("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%]"), children: [
182
185
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
183
- /* @__PURE__ */ jsx("div", { className: "mb-0.5 text-right text-xs font-medium text-muted-foreground", children: "You" }),
184
- /* @__PURE__ */ jsx("div", { className: "whitespace-pre-wrap break-words rounded-lg bg-accent px-density-3 py-density-2 text-right text-base font-medium leading-relaxed text-accent-foreground", children: event.file ? /* @__PURE__ */ jsx(MessageFilePart, { part: event.file }) : event.text }),
186
+ /* @__PURE__ */ jsx("div", { className: "mb-0.5 text-right text-xs font-medium text-muted-foreground", children: initialPrompt ? "Initial prompt" : "You" }),
187
+ /* @__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 }) }),
185
188
  showRowMetadata && /* @__PURE__ */ jsx(EventMetadata, { event, align: "right" }),
186
189
  showRaw && event.raw !== void 0 && /* @__PURE__ */ jsx(RawEventBlock, { raw: event.raw, align: "right" })
187
190
  ] }),
@@ -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 last,\n defaultExpanded,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n onPendingToolDecision,\n}: {\n event: SessionEvent;\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 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 showRowMetadata,\n showRaw,\n}: {\n event: SessionEvent;\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=\"flex max-w-full items-start gap-density-2 @min-[48rem]/session-viewer:max-w-[85%] @min-[48rem]/session-viewer:gap-density-3\">\n <div className=\"min-w-0\">\n <div className=\"mb-0.5 text-right text-xs font-medium text-muted-foreground\">\n You\n </div>\n <div className=\"whitespace-pre-wrap break-words rounded-lg bg-accent px-density-3 py-density-2 text-right text-base font-medium leading-relaxed text-accent-foreground\">\n {event.file ? <MessageFilePart part={event.file} /> : 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\";\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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"}
@@ -2,17 +2,16 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const button = require("../../components/button.cjs");
6
5
  const utils = require("../../lib/utils.cjs");
7
6
  const CodeBlock = require("../CodeBlock.cjs");
8
7
  const Icon = require("../Icon.cjs");
9
8
  const SessionViewer_input = require("./SessionViewer.input.cjs");
10
9
  const SessionViewer_rowMetadata = require("./SessionViewer.row-metadata.cjs");
11
10
  const SessionViewer_toolDetails = require("./SessionViewer.tool-details.cjs");
11
+ const approvalRequest = require("./approval-request.cjs");
12
+ const SessionViewer_approvalBody = require("./SessionViewer.approval-body.cjs");
13
+ const SessionViewer_decisionControls = require("./SessionViewer.decision-controls.cjs");
12
14
  const UiChevronDown = require("../../icons/components/UiChevronDown.cjs");
13
- const UiCheck = require("../../icons/components/UiCheck.cjs");
14
- const UiCancel = require("../../icons/components/UiCancel.cjs");
15
- const UiComment = require("../../icons/components/UiComment.cjs");
16
15
  function ToolBody({
17
16
  event,
18
17
  visual,
@@ -26,7 +25,7 @@ function ToolBody({
26
25
  );
27
26
  const command = SessionViewer_input.shellCommand(event.tool ?? "", event.toolInput);
28
27
  const [open, setOpen] = react.useState(defaultExpanded);
29
- if (event.tool === "AskUserQuestion") {
28
+ if (event.tool === "AskUserQuestion" || event.approvalKind === "question") {
30
29
  return /* @__PURE__ */ jsxRuntime.jsx(
31
30
  QuestionToolBody,
32
31
  {
@@ -36,6 +35,22 @@ function ToolBody({
36
35
  }
37
36
  );
38
37
  }
38
+ if (event.pending && approvalRequest.hasApprovalBody(event.approvalRequest)) {
39
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "not-prose", children: [
40
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
41
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 font-medium text-foreground", children: visual.label }),
42
+ /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_rowMetadata.ApprovalBadge, { event })
43
+ ] }),
44
+ /* @__PURE__ */ jsxRuntime.jsx(
45
+ SessionViewer_approvalBody.TypedApprovalBody,
46
+ {
47
+ event,
48
+ request: event.approvalRequest,
49
+ onDecision: onPendingToolDecision
50
+ }
51
+ )
52
+ ] });
53
+ }
39
54
  if (command !== void 0) {
40
55
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "not-prose", children: [
41
56
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-1.5", children: [
@@ -64,9 +79,10 @@ function ToolBody({
64
79
  ] }),
65
80
  open && event.toolResponse !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1.5", children: /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolDetails.ResponseBlock, { response: event.toolResponse }) }),
66
81
  event.pending && onPendingToolDecision && /* @__PURE__ */ jsxRuntime.jsx(
67
- PendingDecisionControls,
82
+ SessionViewer_decisionControls.PendingDecisionControls,
68
83
  {
69
84
  event,
85
+ request: event.approvalRequest,
70
86
  onDecision: onPendingToolDecision
71
87
  }
72
88
  )
@@ -124,9 +140,10 @@ function ToolBody({
124
140
  event.toolResponse !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolDetails.ResponseBlock, { response: event.toolResponse })
125
141
  ] }),
126
142
  event.pending && onPendingToolDecision && /* @__PURE__ */ jsxRuntime.jsx(
127
- PendingDecisionControls,
143
+ SessionViewer_decisionControls.PendingDecisionControls,
128
144
  {
129
145
  event,
146
+ request: event.approvalRequest,
130
147
  onDecision: onPendingToolDecision
131
148
  }
132
149
  )
@@ -137,7 +154,9 @@ function QuestionToolBody({
137
154
  visual,
138
155
  onDecision
139
156
  }) {
140
- const questions = SessionViewer_input.questionsFromToolInput(event.toolInput);
157
+ var _a;
158
+ const typedQuestions = (_a = event.approvalRequest) == null ? void 0 : _a.questions;
159
+ const questions = (typedQuestions == null ? void 0 : typedQuestions.length) ? SessionViewer_input.questionsFromApproval(typedQuestions) : SessionViewer_input.questionsFromToolInput(event.toolInput);
141
160
  const summary = SessionViewer_input.summarizeToolInput(
142
161
  event.tool ?? "",
143
162
  event.toolInput,
@@ -169,9 +188,10 @@ function QuestionToolBody({
169
188
  /* @__PURE__ */ jsxRuntime.jsx(SessionViewer_toolDetails.ResponseBlock, { response: event.toolResponse })
170
189
  ] }),
171
190
  event.pending && onDecision && /* @__PURE__ */ jsxRuntime.jsx(
172
- QuestionDecisionControls,
191
+ SessionViewer_decisionControls.QuestionDecisionControls,
173
192
  {
174
193
  event,
194
+ request: event.approvalRequest,
175
195
  questions,
176
196
  onDecision
177
197
  }
@@ -179,233 +199,5 @@ function QuestionToolBody({
179
199
  ] })
180
200
  ] });
181
201
  }
182
- function PendingDecisionControls({
183
- event,
184
- onDecision
185
- }) {
186
- const [comment, setComment] = react.useState("");
187
- const [busy, setBusy] = react.useState(false);
188
- const [error, setError] = react.useState("");
189
- const decide = async (allow, message) => {
190
- setBusy(true);
191
- setError("");
192
- try {
193
- await onDecision({ event, allow, ...message ? { message } : {} });
194
- } catch (cause) {
195
- setError(cause instanceof Error ? cause.message : String(cause));
196
- } finally {
197
- setBusy(false);
198
- }
199
- };
200
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-density-3", children: [
201
- /* @__PURE__ */ jsxRuntime.jsx(
202
- "textarea",
203
- {
204
- "aria-label": "Decision comment",
205
- value: comment,
206
- onChange: (event2) => setComment(event2.target.value),
207
- placeholder: "Optional rejection feedback",
208
- className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
209
- }
210
- ),
211
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
212
- /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { size: "sm", loading: busy, onClick: () => decide(true), children: [
213
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck }),
214
- "Allow"
215
- ] }),
216
- /* @__PURE__ */ jsxRuntime.jsxs(
217
- button.Button,
218
- {
219
- size: "sm",
220
- variant: "outline",
221
- disabled: busy,
222
- onClick: () => decide(false),
223
- children: [
224
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCancel.UiCancel }),
225
- "Reject"
226
- ]
227
- }
228
- ),
229
- /* @__PURE__ */ jsxRuntime.jsxs(
230
- button.Button,
231
- {
232
- size: "sm",
233
- variant: "outline",
234
- disabled: busy || !comment.trim(),
235
- onClick: () => decide(false, comment.trim()),
236
- children: [
237
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiComment.UiComment }),
238
- "Reject with comment"
239
- ]
240
- }
241
- )
242
- ] }),
243
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "text-xs text-rose-600", children: error })
244
- ] });
245
- }
246
- function QuestionDecisionControls({
247
- event,
248
- questions,
249
- onDecision
250
- }) {
251
- const [answers, setAnswers] = react.useState({});
252
- const [details, setDetails] = react.useState({});
253
- const [comment, setComment] = react.useState("");
254
- const [busy, setBusy] = react.useState(false);
255
- const [error, setError] = react.useState("");
256
- const answerFor = (question) => {
257
- var _a;
258
- const selected = answers[question.id];
259
- const other = (_a = details[question.id]) == null ? void 0 : _a.trim();
260
- if (question.options.length && question.isOther && other) {
261
- return question.multiSelect ? [...Array.isArray(selected) ? selected : [], other] : other;
262
- }
263
- return selected ?? "";
264
- };
265
- const canSend = questions.length > 0 && questions.every((question) => {
266
- const answer = answerFor(question);
267
- return Array.isArray(answer) ? answer.length > 0 && answer.every((value) => value.trim() !== "") : answer.trim() !== "";
268
- });
269
- const decide = async (allow, message) => {
270
- setBusy(true);
271
- setError("");
272
- try {
273
- await onDecision({
274
- event,
275
- allow,
276
- ...allow ? { answers: Object.fromEntries(questions.map((question) => [question.id, answerFor(question)])) } : {},
277
- ...message ? { message } : {}
278
- });
279
- } catch (cause) {
280
- setError(cause instanceof Error ? cause.message : String(cause));
281
- } finally {
282
- setBusy(false);
283
- }
284
- };
285
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 rounded-md border border-sky-500/25 bg-sky-500/5 p-density-3", children: [
286
- questions.map((question) => /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "space-y-1.5", children: [
287
- /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "text-sm font-medium text-foreground", children: question.text }),
288
- question.options.map(
289
- (option) => {
290
- var _a;
291
- return question.multiSelect ? /* @__PURE__ */ jsxRuntime.jsxs(
292
- "label",
293
- {
294
- className: "flex items-start gap-2 text-sm",
295
- children: [
296
- /* @__PURE__ */ jsxRuntime.jsx(
297
- "input",
298
- {
299
- type: "checkbox",
300
- checked: Array.isArray(answers[question.id]) && answers[question.id].includes(option.value),
301
- onChange: (event2) => setAnswers((current) => {
302
- const selected = Array.isArray(current[question.id]) ? current[question.id] : [];
303
- return {
304
- ...current,
305
- [question.id]: event2.target.checked ? [...selected, option.value] : selected.filter((value) => value !== option.value)
306
- };
307
- })
308
- }
309
- ),
310
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
311
- option.label,
312
- option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-muted-foreground", children: option.description })
313
- ] })
314
- ]
315
- },
316
- option.value
317
- ) : /* @__PURE__ */ jsxRuntime.jsxs(
318
- "label",
319
- {
320
- className: "flex items-start gap-2 text-sm",
321
- children: [
322
- /* @__PURE__ */ jsxRuntime.jsx(
323
- "input",
324
- {
325
- type: "radio",
326
- name: `question-${event.id}-${question.id}`,
327
- value: option.value,
328
- checked: answers[question.id] === option.value && !((_a = details[question.id]) == null ? void 0 : _a.trim()),
329
- onChange: () => {
330
- setDetails((current) => ({ ...current, [question.id]: "" }));
331
- setAnswers((current) => ({
332
- ...current,
333
- [question.id]: option.value
334
- }));
335
- }
336
- }
337
- ),
338
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
339
- option.label,
340
- option.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-muted-foreground", children: option.description })
341
- ] })
342
- ]
343
- },
344
- option.value
345
- );
346
- }
347
- ),
348
- (!question.options.length || question.isOther) && /* @__PURE__ */ jsxRuntime.jsx(
349
- "textarea",
350
- {
351
- "aria-label": `${question.text} ${question.options.length ? "other answer" : "answer"}`,
352
- value: question.options.length ? details[question.id] ?? "" : typeof answers[question.id] === "string" ? answers[question.id] : "",
353
- onChange: (event2) => question.options.length ? setDetails((current) => ({
354
- ...current,
355
- [question.id]: event2.target.value
356
- })) : setAnswers((current) => ({
357
- ...current,
358
- [question.id]: event2.target.value
359
- })),
360
- placeholder: question.options.length ? "Other answer" : "Your answer",
361
- className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
362
- }
363
- )
364
- ] }, question.id)),
365
- /* @__PURE__ */ jsxRuntime.jsx(
366
- "textarea",
367
- {
368
- "aria-label": "Rejection comment",
369
- value: comment,
370
- onChange: (event2) => setComment(event2.target.value),
371
- placeholder: "Optional rejection feedback",
372
- className: "min-h-16 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm"
373
- }
374
- ),
375
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap gap-2", children: [
376
- /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { size: "sm", loading: busy, disabled: !canSend, onClick: () => decide(true), children: [
377
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck }),
378
- "Send answer"
379
- ] }),
380
- /* @__PURE__ */ jsxRuntime.jsxs(
381
- button.Button,
382
- {
383
- size: "sm",
384
- variant: "outline",
385
- disabled: busy,
386
- onClick: () => decide(false),
387
- children: [
388
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCancel.UiCancel }),
389
- "Reject"
390
- ]
391
- }
392
- ),
393
- /* @__PURE__ */ jsxRuntime.jsxs(
394
- button.Button,
395
- {
396
- size: "sm",
397
- variant: "outline",
398
- disabled: busy || !comment.trim(),
399
- onClick: () => decide(false, comment.trim()),
400
- children: [
401
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiComment.UiComment }),
402
- "Reject with comment"
403
- ]
404
- }
405
- )
406
- ] }),
407
- error && /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "text-xs text-rose-600", children: error })
408
- ] });
409
- }
410
202
  exports.ToolBody = ToolBody;
411
203
  //# sourceMappingURL=SessionViewer.tool-row.cjs.map