@flanksource/clicky-ui 0.3.46 → 0.3.48

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 (474) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +49 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/comments/CommentSidePanel.cjs +10 -4
  8. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  9. package/dist/comments/CommentSidePanel.d.ts +2 -0
  10. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  11. package/dist/comments/CommentSidePanel.js +10 -4
  12. package/dist/comments/CommentSidePanel.js.map +1 -1
  13. package/dist/comments/CommentThread.cjs +2 -0
  14. package/dist/comments/CommentThread.cjs.map +1 -1
  15. package/dist/comments/CommentThread.d.ts +2 -1
  16. package/dist/comments/CommentThread.d.ts.map +1 -1
  17. package/dist/comments/CommentThread.js +2 -0
  18. package/dist/comments/CommentThread.js.map +1 -1
  19. package/dist/comments/CommentThreadList.cjs +3 -0
  20. package/dist/comments/CommentThreadList.cjs.map +1 -1
  21. package/dist/comments/CommentThreadList.d.ts +3 -1
  22. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  23. package/dist/comments/CommentThreadList.js +3 -0
  24. package/dist/comments/CommentThreadList.js.map +1 -1
  25. package/dist/components/ErrorWrapper.cjs +2 -3
  26. package/dist/components/ErrorWrapper.cjs.map +1 -1
  27. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  28. package/dist/components/ErrorWrapper.js +3 -4
  29. package/dist/components/ErrorWrapper.js.map +1 -1
  30. package/dist/data/Clicky.cjs +3 -0
  31. package/dist/data/Clicky.cjs.map +1 -1
  32. package/dist/data/Clicky.js +3 -0
  33. package/dist/data/Clicky.js.map +1 -1
  34. package/dist/data/CodeLine.cjs +4 -2
  35. package/dist/data/CodeLine.cjs.map +1 -1
  36. package/dist/data/CodeLine.d.ts.map +1 -1
  37. package/dist/data/CodeLine.js +4 -2
  38. package/dist/data/CodeLine.js.map +1 -1
  39. package/dist/data/FilterPill.cjs +15 -2
  40. package/dist/data/FilterPill.cjs.map +1 -1
  41. package/dist/data/FilterPill.d.ts +1 -1
  42. package/dist/data/FilterPill.d.ts.map +1 -1
  43. package/dist/data/FilterPill.js +15 -2
  44. package/dist/data/FilterPill.js.map +1 -1
  45. package/dist/data/LogViewer.cjs +27 -8
  46. package/dist/data/LogViewer.cjs.map +1 -1
  47. package/dist/data/LogViewer.d.ts +11 -3
  48. package/dist/data/LogViewer.d.ts.map +1 -1
  49. package/dist/data/LogViewer.js +27 -8
  50. package/dist/data/LogViewer.js.map +1 -1
  51. package/dist/data/Properties.cjs +2 -15
  52. package/dist/data/Properties.cjs.map +1 -1
  53. package/dist/data/Properties.d.ts +4 -0
  54. package/dist/data/Properties.d.ts.map +1 -1
  55. package/dist/data/Properties.js +2 -15
  56. package/dist/data/Properties.js.map +1 -1
  57. package/dist/data/PropertyValue.cjs +37 -0
  58. package/dist/data/PropertyValue.cjs.map +1 -0
  59. package/dist/data/PropertyValue.d.ts +6 -0
  60. package/dist/data/PropertyValue.d.ts.map +1 -0
  61. package/dist/data/PropertyValue.js +37 -0
  62. package/dist/data/PropertyValue.js.map +1 -0
  63. package/dist/data/SymbolBadge.cjs +61 -0
  64. package/dist/data/SymbolBadge.cjs.map +1 -0
  65. package/dist/data/SymbolBadge.d.ts +21 -0
  66. package/dist/data/SymbolBadge.d.ts.map +1 -0
  67. package/dist/data/SymbolBadge.js +61 -0
  68. package/dist/data/SymbolBadge.js.map +1 -0
  69. package/dist/data/Tree.cjs +4 -3
  70. package/dist/data/Tree.cjs.map +1 -1
  71. package/dist/data/Tree.d.ts +3 -1
  72. package/dist/data/Tree.d.ts.map +1 -1
  73. package/dist/data/Tree.js +4 -3
  74. package/dist/data/Tree.js.map +1 -1
  75. package/dist/data/ai/ChatFab.cjs +1 -1
  76. package/dist/data/ai/ChatFab.cjs.map +1 -1
  77. package/dist/data/ai/ChatFab.js +1 -1
  78. package/dist/data/ai/ChatFab.js.map +1 -1
  79. package/dist/data/ai/ChatWindow.cjs +106 -171
  80. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  81. package/dist/data/ai/ChatWindow.d.ts +6 -2
  82. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  83. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  84. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  85. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  86. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  87. package/dist/data/ai/ChatWindow.header.js +104 -0
  88. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  89. package/dist/data/ai/ChatWindow.js +107 -172
  90. package/dist/data/ai/ChatWindow.js.map +1 -1
  91. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  92. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  93. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  94. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  95. package/dist/data/ai/ChatWindow.placement.js +95 -0
  96. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  97. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  98. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  99. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  100. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  101. package/dist/data/ai/SessionChatComposer.js +3 -1
  102. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  103. package/dist/data/ai/SessionInspector.cjs +68 -72
  104. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  105. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  106. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  107. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  108. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  109. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  110. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  111. package/dist/data/ai/SessionInspector.d.ts +6 -1
  112. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  113. package/dist/data/ai/SessionInspector.js +69 -73
  114. package/dist/data/ai/SessionInspector.js.map +1 -1
  115. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  116. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  117. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  118. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  119. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  120. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  121. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  122. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  123. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  125. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  127. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  129. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote.js +86 -18
  131. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  133. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  135. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  136. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  137. package/dist/data/ai/SessionTail.cjs +63 -0
  138. package/dist/data/ai/SessionTail.cjs.map +1 -0
  139. package/dist/data/ai/SessionTail.d.ts +14 -0
  140. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  141. package/dist/data/ai/SessionTail.js +63 -0
  142. package/dist/data/ai/SessionTail.js.map +1 -0
  143. package/dist/data/ai/SessionViewer.cjs +10 -3
  144. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.d.ts +7 -1
  146. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.js +10 -3
  148. package/dist/data/ai/SessionViewer.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/index.d.ts +4 -3
  152. package/dist/data/ai/index.d.ts.map +1 -1
  153. package/dist/data/ai/use-session-scroll.cjs +30 -6
  154. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  155. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  156. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  157. package/dist/data/ai/use-session-scroll.js +30 -6
  158. package/dist/data/ai/use-session-scroll.js.map +1 -1
  159. package/dist/data/chat/Chat.cjs +1 -1
  160. package/dist/data/chat/Chat.cjs.map +1 -1
  161. package/dist/data/chat/Chat.js +1 -1
  162. package/dist/data/chat/Chat.js.map +1 -1
  163. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  164. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  165. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  166. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  167. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  168. package/dist/data/chat/PromptInput.cjs +4 -2
  169. package/dist/data/chat/PromptInput.cjs.map +1 -1
  170. package/dist/data/chat/PromptInput.d.ts +5 -1
  171. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  172. package/dist/data/chat/PromptInput.js +4 -2
  173. package/dist/data/chat/PromptInput.js.map +1 -1
  174. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  175. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  176. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  177. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  178. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  179. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  180. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  181. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  182. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  183. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  184. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  185. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  186. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  187. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  188. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  189. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  190. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  191. package/dist/data/har/HarPanel.cjs +3 -1
  192. package/dist/data/har/HarPanel.cjs.map +1 -1
  193. package/dist/data/har/HarPanel.d.ts +4 -1
  194. package/dist/data/har/HarPanel.d.ts.map +1 -1
  195. package/dist/data/har/HarPanel.js +3 -1
  196. package/dist/data/har/HarPanel.js.map +1 -1
  197. package/dist/data/test-runner/Expectation.cjs +57 -0
  198. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  199. package/dist/data/test-runner/Expectation.d.ts +19 -0
  200. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  201. package/dist/data/test-runner/Expectation.js +57 -0
  202. package/dist/data/test-runner/Expectation.js.map +1 -0
  203. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  204. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  205. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  206. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  207. package/dist/data/test-runner/MarkIcons.js +38 -0
  208. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  209. package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
  210. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  211. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  212. package/dist/data/test-runner/TestDetailPanel.js +101 -55
  213. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  214. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  215. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  216. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  217. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  218. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  219. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  220. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  221. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  222. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  223. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  224. package/dist/data/test-runner/TestFilterBar.js +89 -95
  225. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  226. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  227. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  228. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  229. package/dist/data/test-runner/TestRunSummary.js +35 -21
  230. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  231. package/dist/data/test-runner/TestRunner.cjs +58 -30
  232. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  233. package/dist/data/test-runner/TestRunner.d.ts +6 -3
  234. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  235. package/dist/data/test-runner/TestRunner.js +58 -30
  236. package/dist/data/test-runner/TestRunner.js.map +1 -1
  237. package/dist/data/test-runner/TestTree.cjs +5 -2
  238. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  239. package/dist/data/test-runner/TestTree.d.ts +5 -2
  240. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  241. package/dist/data/test-runner/TestTree.js +5 -2
  242. package/dist/data/test-runner/TestTree.js.map +1 -1
  243. package/dist/data/test-runner/TestTreeNode.cjs +28 -19
  244. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  245. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  246. package/dist/data/test-runner/TestTreeNode.js +29 -20
  247. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  248. package/dist/data/test-runner/adapter.cjs +15 -0
  249. package/dist/data/test-runner/adapter.cjs.map +1 -1
  250. package/dist/data/test-runner/adapter.d.ts +27 -7
  251. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  252. package/dist/data/test-runner/adapter.js +15 -0
  253. package/dist/data/test-runner/adapter.js.map +1 -1
  254. package/dist/data/test-runner/context.cjs.map +1 -1
  255. package/dist/data/test-runner/context.d.ts +2 -0
  256. package/dist/data/test-runner/context.d.ts.map +1 -1
  257. package/dist/data/test-runner/context.js.map +1 -1
  258. package/dist/data/test-runner/copy.cjs +114 -0
  259. package/dist/data/test-runner/copy.cjs.map +1 -0
  260. package/dist/data/test-runner/copy.d.ts +47 -0
  261. package/dist/data/test-runner/copy.d.ts.map +1 -0
  262. package/dist/data/test-runner/copy.js +114 -0
  263. package/dist/data/test-runner/copy.js.map +1 -0
  264. package/dist/data/test-runner/index.d.ts +6 -3
  265. package/dist/data/test-runner/index.d.ts.map +1 -1
  266. package/dist/data/test-runner/marks.cjs +184 -0
  267. package/dist/data/test-runner/marks.cjs.map +1 -0
  268. package/dist/data/test-runner/marks.d.ts +40 -0
  269. package/dist/data/test-runner/marks.d.ts.map +1 -0
  270. package/dist/data/test-runner/marks.js +184 -0
  271. package/dist/data/test-runner/marks.js.map +1 -0
  272. package/dist/data/test-runner/status.cjs +27 -44
  273. package/dist/data/test-runner/status.cjs.map +1 -1
  274. package/dist/data/test-runner/status.d.ts +12 -3
  275. package/dist/data/test-runner/status.d.ts.map +1 -1
  276. package/dist/data/test-runner/status.js +27 -44
  277. package/dist/data/test-runner/status.js.map +1 -1
  278. package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
  279. package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
  280. package/dist/data/traces/TraceHarView.d.ts +13 -0
  281. package/dist/data/traces/TraceHarView.d.ts.map +1 -0
  282. package/dist/data/traces/cast.d.ts +9 -0
  283. package/dist/data/traces/cast.d.ts.map +1 -0
  284. package/dist/data/traces/fixtures.d.ts +8 -0
  285. package/dist/data/traces/fixtures.d.ts.map +1 -0
  286. package/dist/data/traces/har-adapter.d.ts +13 -0
  287. package/dist/data/traces/har-adapter.d.ts.map +1 -0
  288. package/dist/data/traces/terminal-screen.d.ts +45 -0
  289. package/dist/data/traces/terminal-screen.d.ts.map +1 -0
  290. package/dist/data/traces/terminal-timeline.d.ts +26 -0
  291. package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
  292. package/dist/data/traces/types.d.ts +141 -0
  293. package/dist/data/traces/types.d.ts.map +1 -0
  294. package/dist/data/verification/VerificationResults.cjs +4 -0
  295. package/dist/data/verification/VerificationResults.cjs.map +1 -1
  296. package/dist/data/verification/VerificationResults.d.ts +3 -1
  297. package/dist/data/verification/VerificationResults.d.ts.map +1 -1
  298. package/dist/data/verification/VerificationResults.js +4 -0
  299. package/dist/data/verification/VerificationResults.js.map +1 -1
  300. package/dist/data/verification/adapterViews.cjs +28 -44
  301. package/dist/data/verification/adapterViews.cjs.map +1 -1
  302. package/dist/data/verification/adapterViews.d.ts +4 -1
  303. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  304. package/dist/data/verification/adapterViews.js +28 -44
  305. package/dist/data/verification/adapterViews.js.map +1 -1
  306. package/dist/data/verification/adapters.cjs +163 -8
  307. package/dist/data/verification/adapters.cjs.map +1 -1
  308. package/dist/data/verification/adapters.d.ts +7 -1
  309. package/dist/data/verification/adapters.d.ts.map +1 -1
  310. package/dist/data/verification/adapters.js +163 -8
  311. package/dist/data/verification/adapters.js.map +1 -1
  312. package/dist/data/verification/index.d.ts +4 -2
  313. package/dist/data/verification/index.d.ts.map +1 -1
  314. package/dist/data/verification/stepKind.cjs +217 -0
  315. package/dist/data/verification/stepKind.cjs.map +1 -0
  316. package/dist/data/verification/stepKind.d.ts +87 -0
  317. package/dist/data/verification/stepKind.d.ts.map +1 -0
  318. package/dist/data/verification/stepKind.js +217 -0
  319. package/dist/data/verification/stepKind.js.map +1 -0
  320. package/dist/data/verification/stepKindViews.cjs +111 -0
  321. package/dist/data/verification/stepKindViews.cjs.map +1 -0
  322. package/dist/data/verification/stepKindViews.d.ts +18 -0
  323. package/dist/data/verification/stepKindViews.d.ts.map +1 -0
  324. package/dist/data/verification/stepKindViews.js +111 -0
  325. package/dist/data/verification/stepKindViews.js.map +1 -0
  326. package/dist/data/verification/verifyReportTests.cjs +1 -0
  327. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  328. package/dist/data/verification/verifyReportTests.d.ts +2 -1
  329. package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
  330. package/dist/data/verification/verifyReportTests.js +1 -0
  331. package/dist/data/verification/verifyReportTests.js.map +1 -1
  332. package/dist/data/version-info.cjs +3 -3
  333. package/dist/data/version-info.js +3 -3
  334. package/dist/data.cjs +58 -3
  335. package/dist/data.cjs.map +1 -1
  336. package/dist/data.d.ts +3 -0
  337. package/dist/data.d.ts.map +1 -1
  338. package/dist/data.js +60 -5
  339. package/dist/data.js.map +1 -1
  340. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  341. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  342. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  343. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  344. package/dist/icons/components/UiLogoEslint.js +10 -0
  345. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  346. package/dist/icons/components/UiLogoGo.cjs +10 -0
  347. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  348. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  349. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  350. package/dist/icons/components/UiLogoGo.js +10 -0
  351. package/dist/icons/components/UiLogoGo.js.map +1 -0
  352. package/dist/icons/components/UiLogoJest.cjs +10 -0
  353. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  354. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  355. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  356. package/dist/icons/components/UiLogoJest.js +10 -0
  357. package/dist/icons/components/UiLogoJest.js.map +1 -0
  358. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  359. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  360. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  361. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  362. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  363. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  364. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  365. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  366. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  367. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  368. package/dist/icons/components/UiLogoOxc.js +10 -0
  369. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  370. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  371. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  372. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  373. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  374. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  375. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  376. package/dist/icons/components/UiLogoPython.cjs +10 -0
  377. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  378. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  379. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  380. package/dist/icons/components/UiLogoPython.js +10 -0
  381. package/dist/icons/components/UiLogoPython.js.map +1 -0
  382. package/dist/icons/components/UiLogoReact.cjs +10 -0
  383. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  384. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  385. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  386. package/dist/icons/components/UiLogoReact.js +10 -0
  387. package/dist/icons/components/UiLogoReact.js.map +1 -0
  388. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  389. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  390. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  391. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  392. package/dist/icons/components/UiLogoRuff.js +10 -0
  393. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  394. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  395. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  396. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  397. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  398. package/dist/icons/components/UiLogoTypescript.js +10 -0
  399. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  400. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  401. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  402. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  403. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  404. package/dist/icons/components/UiLogoVitest.js +10 -0
  405. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  406. package/dist/icons/index.d.ts +11 -0
  407. package/dist/icons/index.d.ts.map +1 -1
  408. package/dist/icons/registry.cjs +22 -0
  409. package/dist/icons/registry.cjs.map +1 -1
  410. package/dist/icons/registry.d.ts.map +1 -1
  411. package/dist/icons/registry.js +22 -0
  412. package/dist/icons/registry.js.map +1 -1
  413. package/dist/icons.cjs +22 -0
  414. package/dist/icons.cjs.map +1 -1
  415. package/dist/icons.js +22 -0
  416. package/dist/icons.js.map +1 -1
  417. package/dist/index.cjs +60 -3
  418. package/dist/index.cjs.map +1 -1
  419. package/dist/index.js +62 -5
  420. package/dist/index.js.map +1 -1
  421. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  422. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  423. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  424. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  425. package/dist/rpc/FilterForm.cjs +9 -0
  426. package/dist/rpc/FilterForm.cjs.map +1 -1
  427. package/dist/rpc/FilterForm.d.ts +5 -1
  428. package/dist/rpc/FilterForm.d.ts.map +1 -1
  429. package/dist/rpc/FilterForm.js +9 -0
  430. package/dist/rpc/FilterForm.js.map +1 -1
  431. package/dist/rpc/InlineError.cjs +12 -43
  432. package/dist/rpc/InlineError.cjs.map +1 -1
  433. package/dist/rpc/InlineError.d.ts.map +1 -1
  434. package/dist/rpc/InlineError.js +13 -44
  435. package/dist/rpc/InlineError.js.map +1 -1
  436. package/dist/rpc/OperationArgsForm.cjs +153 -0
  437. package/dist/rpc/OperationArgsForm.cjs.map +1 -0
  438. package/dist/rpc/OperationArgsForm.d.ts +16 -0
  439. package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
  440. package/dist/rpc/OperationArgsForm.js +153 -0
  441. package/dist/rpc/OperationArgsForm.js.map +1 -0
  442. package/dist/rpc/OperationScheduleDialog.cjs +119 -22
  443. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  444. package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
  445. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  446. package/dist/rpc/OperationScheduleDialog.js +120 -23
  447. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  448. package/dist/rpc/OperationSchedules.cjs +17 -2
  449. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  450. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  451. package/dist/rpc/OperationSchedules.js +17 -2
  452. package/dist/rpc/OperationSchedules.js.map +1 -1
  453. package/dist/rpc/operation-schedule-model.cjs +2 -7
  454. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  455. package/dist/rpc/operation-schedule-model.d.ts +0 -2
  456. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  457. package/dist/rpc/operation-schedule-model.js +2 -7
  458. package/dist/rpc/operation-schedule-model.js.map +1 -1
  459. package/dist/rpc/operation-schedule-types.d.ts +12 -1
  460. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  461. package/dist/rpc.cjs +2 -0
  462. package/dist/rpc.cjs.map +1 -1
  463. package/dist/rpc.d.ts +1 -0
  464. package/dist/rpc.d.ts.map +1 -1
  465. package/dist/rpc.js +2 -0
  466. package/dist/rpc.js.map +1 -1
  467. package/dist/styles.css +1 -1
  468. package/package.json +1 -1
  469. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  470. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  471. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  472. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  473. package/dist/data/test-runner/frameworkIcon.js +0 -27
  474. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ import { ComponentProps, ReactNode } from 'react';
2
+ import { ThreadSource } from './ThreadPicker.js';
3
+ import { ToolPreferences } from './ToolPreferences.js';
4
+ export type ChatWindowHeaderProps = {
5
+ /** Below the mobile breakpoint: a back button replaces drag, maximize and close. */
6
+ mobile: boolean;
7
+ title: ReactNode;
8
+ threadId: string | null;
9
+ maximized: boolean;
10
+ threadsSource: ThreadSource | undefined;
11
+ sessionsApi: string | null;
12
+ /** Bumped when a turn settles so the picker re-reads the conversation name. */
13
+ titleRefresh: number;
14
+ headerExtras: ReactNode;
15
+ toolPreferences: ComponentProps<typeof ToolPreferences>;
16
+ hasMessages: boolean;
17
+ forkDisabled: boolean;
18
+ onSelectThread: (threadId: string) => void;
19
+ onNewThread: () => void;
20
+ onFork: () => void;
21
+ onNewWindow: () => void;
22
+ onMaximize: () => void;
23
+ onClose: () => void;
24
+ };
25
+ /** The chat window's drag-handle header: thread switcher (or title), host
26
+ * extras, tool/runtime preferences, fork, new window, and — off mobile —
27
+ * maximize and close. */
28
+ export declare function ChatWindowHeader({ mobile, title, threadId, maximized, threadsSource, sessionsApi, titleRefresh, headerExtras, toolPreferences, hasMessages, forkDisabled, onSelectThread, onNewThread, onFork, onNewWindow, onMaximize, onClose, }: ChatWindowHeaderProps): import("react").JSX.Element;
29
+ //# sourceMappingURL=ChatWindow.header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatWindow.header.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG;IAClC,oFAAoF;IACpF,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,SAAS,CAAC;IACxB,eAAe,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC;IACxD,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF;;0BAE0B;AAC1B,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,MAAM,EACN,WAAW,EACX,UAAU,EACV,OAAO,GACR,EAAE,qBAAqB,+BA6EvB"}
@@ -0,0 +1,104 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { Button } from "../../components/button.js";
4
+ import { Icon } from "../Icon.js";
5
+ import { ThreadPicker } from "./ThreadPicker.js";
6
+ import { ToolPreferences } from "./ToolPreferences.js";
7
+ import { UiArrowLeft } from "../../icons/components/UiArrowLeft.js";
8
+ import { UiGitBranch } from "../../icons/components/UiGitBranch.js";
9
+ import { UiAdd } from "../../icons/components/UiAdd.js";
10
+ import { UiFullscreen } from "../../icons/components/UiFullscreen.js";
11
+ import { UiClose } from "../../icons/components/UiClose.js";
12
+ function ChatWindowHeader({
13
+ mobile,
14
+ title,
15
+ threadId,
16
+ maximized,
17
+ threadsSource,
18
+ sessionsApi,
19
+ titleRefresh,
20
+ headerExtras,
21
+ toolPreferences,
22
+ hasMessages,
23
+ forkDisabled,
24
+ onSelectThread,
25
+ onNewThread,
26
+ onFork,
27
+ onNewWindow,
28
+ onMaximize,
29
+ onClose
30
+ }) {
31
+ return /* @__PURE__ */ jsxs(
32
+ "div",
33
+ {
34
+ className: cn(
35
+ "flex items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5",
36
+ !mobile && "chat-drag-handle cursor-move"
37
+ ),
38
+ children: [
39
+ mobile && /* @__PURE__ */ jsx(
40
+ Button,
41
+ {
42
+ variant: "ghost",
43
+ size: "icon",
44
+ title: "Back",
45
+ "aria-label": "Back",
46
+ onClick: onClose,
47
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiArrowLeft, className: "size-4" })
48
+ }
49
+ ),
50
+ threadsSource != null || sessionsApi !== null ? /* @__PURE__ */ jsx(
51
+ ThreadPicker,
52
+ {
53
+ threadId,
54
+ onSelect: onSelectThread,
55
+ onNew: onNewThread,
56
+ refreshToken: titleRefresh,
57
+ ...threadsSource ? { source: threadsSource } : sessionsApi !== null ? { api: sessionsApi } : {}
58
+ }
59
+ ) : /* @__PURE__ */ jsx("span", { className: "px-1 text-sm font-medium", children: title }),
60
+ /* @__PURE__ */ jsx("div", { className: "flex-1" }),
61
+ headerExtras,
62
+ /* @__PURE__ */ jsx(ToolPreferences, { ...toolPreferences }),
63
+ sessionsApi && /* @__PURE__ */ jsx(
64
+ Button,
65
+ {
66
+ variant: "ghost",
67
+ size: "icon",
68
+ title: hasMessages ? "Fork conversation into a new window" : "Send a message before forking this conversation",
69
+ disabled: forkDisabled,
70
+ onClick: onFork,
71
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiGitBranch, className: "size-4" })
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsx(
75
+ Button,
76
+ {
77
+ variant: "ghost",
78
+ size: "icon",
79
+ title: "New window",
80
+ onClick: onNewWindow,
81
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "size-4" })
82
+ }
83
+ ),
84
+ !mobile && /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ /* @__PURE__ */ jsx(
86
+ Button,
87
+ {
88
+ variant: "ghost",
89
+ size: "icon",
90
+ title: maximized ? "Restore" : "Maximize",
91
+ onClick: onMaximize,
92
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiFullscreen, className: "size-4" })
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", title: "Close", onClick: onClose, children: /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "size-4" }) })
96
+ ] })
97
+ ]
98
+ }
99
+ );
100
+ }
101
+ export {
102
+ ChatWindowHeader
103
+ };
104
+ //# sourceMappingURL=ChatWindow.header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatWindow.header.js","sources":["../../../src/data/ai/ChatWindow.header.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport {\n UiAdd,\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiGitBranch,\n} from \"../../icons\";\nimport { ThreadPicker, type ThreadSource } from \"./ThreadPicker\";\nimport { ToolPreferences } from \"./ToolPreferences\";\n\nexport type ChatWindowHeaderProps = {\n /** Below the mobile breakpoint: a back button replaces drag, maximize and close. */\n mobile: boolean;\n title: ReactNode;\n threadId: string | null;\n maximized: boolean;\n threadsSource: ThreadSource | undefined;\n sessionsApi: string | null;\n /** Bumped when a turn settles so the picker re-reads the conversation name. */\n titleRefresh: number;\n headerExtras: ReactNode;\n toolPreferences: ComponentProps<typeof ToolPreferences>;\n hasMessages: boolean;\n forkDisabled: boolean;\n onSelectThread: (threadId: string) => void;\n onNewThread: () => void;\n onFork: () => void;\n onNewWindow: () => void;\n onMaximize: () => void;\n onClose: () => void;\n};\n\n/** The chat window's drag-handle header: thread switcher (or title), host\n * extras, tool/runtime preferences, fork, new window, and — off mobile —\n * maximize and close. */\nexport function ChatWindowHeader({\n mobile,\n title,\n threadId,\n maximized,\n threadsSource,\n sessionsApi,\n titleRefresh,\n headerExtras,\n toolPreferences,\n hasMessages,\n forkDisabled,\n onSelectThread,\n onNewThread,\n onFork,\n onNewWindow,\n onMaximize,\n onClose,\n}: ChatWindowHeaderProps) {\n return (\n <div\n className={cn(\n \"flex items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5\",\n !mobile && \"chat-drag-handle cursor-move\",\n )}\n >\n {mobile && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Back\"\n aria-label=\"Back\"\n onClick={onClose}\n >\n <Icon icon={UiArrowLeft} className=\"size-4\" />\n </Button>\n )}\n {threadsSource != null || sessionsApi !== null ? (\n <ThreadPicker\n threadId={threadId}\n onSelect={onSelectThread}\n onNew={onNewThread}\n refreshToken={titleRefresh}\n {...(threadsSource\n ? { source: threadsSource }\n : sessionsApi !== null\n ? { api: sessionsApi }\n : {})}\n />\n ) : (\n <span className=\"px-1 text-sm font-medium\">{title}</span>\n )}\n <div className=\"flex-1\" />\n {headerExtras}\n <ToolPreferences {...toolPreferences} />\n {sessionsApi && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={\n hasMessages\n ? \"Fork conversation into a new window\"\n : \"Send a message before forking this conversation\"\n }\n disabled={forkDisabled}\n onClick={onFork}\n >\n <Icon icon={UiGitBranch} className=\"size-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"New window\"\n onClick={onNewWindow}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n {!mobile && (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={maximized ? \"Restore\" : \"Maximize\"}\n onClick={onMaximize}\n >\n <Icon icon={UiFullscreen} className=\"size-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" title=\"Close\" onClick={onClose}>\n <Icon icon={UiClose} className=\"size-4\" />\n </Button>\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAuCO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,CAAC,UAAU;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAA,UACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,cAAW;AAAA,YACX,SAAS;AAAA,YAET,UAAA,oBAAC,MAAA,EAAK,MAAM,aAAa,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAG/C,iBAAiB,QAAQ,gBAAgB,OACxC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,YACP,cAAc;AAAA,YACb,GAAI,gBACD,EAAE,QAAQ,cAAA,IACV,gBAAgB,OACd,EAAE,KAAK,gBACP,CAAA;AAAA,UAAC;AAAA,QAAA,IAGT,oBAAC,QAAA,EAAK,WAAU,4BAA4B,UAAA,OAAM;AAAA,QAEpD,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,QACvB;AAAA,QACD,oBAAC,iBAAA,EAAiB,GAAG,iBAAiB;AAAA,QACrC,eACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OACE,cACI,wCACA;AAAA,YAEN,UAAU;AAAA,YACV,SAAS;AAAA,YAET,UAAA,oBAAC,MAAA,EAAK,MAAM,aAAa,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAGhD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAAS;AAAA,YAET,UAAA,oBAAC,MAAA,EAAK,MAAM,OAAO,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,QAEvC,CAAC,UACA,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAO,YAAY,YAAY;AAAA,cAC/B,SAAS;AAAA,cAET,UAAA,oBAAC,MAAA,EAAK,MAAM,cAAc,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,8BAE9C,QAAA,EAAO,SAAQ,SAAQ,MAAK,QAAO,OAAM,SAAQ,SAAS,SACzD,8BAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAS,EAAA,CAC1C;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -1,14 +1,12 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useRef, useEffect, useMemo, useCallback } from "react";
3
3
  import { cn } from "../../lib/utils.js";
4
- import { Button } from "../../components/button.js";
5
- import { Icon } from "../Icon.js";
4
+ import { useMediaQuery } from "../../hooks/use-media-query.js";
6
5
  import { Chat } from "../chat/Chat.js";
7
6
  import { forkChatSession } from "../chat/approval.js";
8
7
  import { useChatWindowManager } from "./chat-window-context.js";
9
- import { ThreadPicker } from "./ThreadPicker.js";
8
+ import { ChatWindowHeader } from "./ChatWindow.header.js";
10
9
  import { ContextBadges } from "./ContextBadges.js";
11
- import { ToolPreferences } from "./ToolPreferences.js";
12
10
  import { chatWindowRequestBody } from "./ChatWindowRequestBody.js";
13
11
  import { loadChatPreferences, saveChatPreferences } from "./ChatWindow.preferences.js";
14
12
  import { useChatWindowRuntime } from "./ChatWindow.runtime.js";
@@ -17,19 +15,8 @@ import { normalizeToolCatalog } from "./ChatWindow.tool-catalog.js";
17
15
  import { effectiveToolPolicies, withUserRule } from "./ToolPreferences.model.js";
18
16
  import { useChatThreadSetup } from "./ChatWindow.thread.js";
19
17
  import { ChatThreadSetupStatus } from "./ChatWindow.thread-status.js";
20
- import { UiGitBranch } from "../../icons/components/UiGitBranch.js";
21
- import { UiAdd } from "../../icons/components/UiAdd.js";
22
- import { UiFullscreen } from "../../icons/components/UiFullscreen.js";
23
- import { UiClose } from "../../icons/components/UiClose.js";
18
+ import { CHAT_WINDOW_MOBILE_QUERY, ChatWindowSheet, ChatWindowFloating } from "./ChatWindow.placement.js";
24
19
  const EMPTY_TOOLS = [];
25
- const MAXIMIZE_CSS = `
26
- .chat-maximized .react-draggable {
27
- transform: none !important;
28
- width: auto !important;
29
- height: auto !important;
30
- inset: 0 !important;
31
- position: absolute !important;
32
- }`;
33
20
  function ChatWindow({
34
21
  panel,
35
22
  chat,
@@ -46,7 +33,15 @@ function ChatWindow({
46
33
  renderContextPicker
47
34
  }) {
48
35
  var _a;
49
- const { updatePanel, closePanel, bringToFront, maximizePanel, openPanel } = useChatWindowManager();
36
+ const {
37
+ panels,
38
+ updatePanel,
39
+ closePanel,
40
+ bringToFront,
41
+ maximizePanel,
42
+ openPanel
43
+ } = useChatWindowManager();
44
+ const mobile = useMediaQuery(CHAT_WINDOW_MOBILE_QUERY);
50
45
  const threadSetup = useChatThreadSetup({
51
46
  threadId: panel.threadId,
52
47
  api: sessionsApi,
@@ -163,6 +158,7 @@ function ChatWindow({
163
158
  setUserToolRules((prev) => withUserRule(prev, rule));
164
159
  }, []);
165
160
  useEffect(() => {
161
+ if (mobile) return;
166
162
  let active = true;
167
163
  import("react-rnd").then((m) => {
168
164
  if (active) setRnd(() => m.Rnd);
@@ -170,7 +166,7 @@ function ChatWindow({
170
166
  return () => {
171
167
  active = false;
172
168
  };
173
- }, []);
169
+ }, [mobile]);
174
170
  const removeContext = useCallback(
175
171
  (id) => updatePanel(panel.id, {
176
172
  contextItems: panel.contextItems.filter((c) => c.id !== id)
@@ -263,22 +259,18 @@ function ChatWindow({
263
259
  setForking(false);
264
260
  }
265
261
  }, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);
266
- const header = /* @__PURE__ */ jsxs("div", { className: "chat-drag-handle flex cursor-move items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5", children: [
267
- threadsSource != null || sessionsApi !== null ? /* @__PURE__ */ jsx(
268
- ThreadPicker,
269
- {
270
- threadId: panel.threadId,
271
- onSelect: (tid) => updatePanel(panel.id, { threadId: tid }),
272
- onNew: () => updatePanel(panel.id, { threadId: null }),
273
- refreshToken: titleRefresh,
274
- ...threadsSource ? { source: threadsSource } : sessionsApi !== null ? { api: sessionsApi } : {}
275
- }
276
- ) : /* @__PURE__ */ jsx("span", { className: "px-1 text-sm font-medium", children: title }),
277
- /* @__PURE__ */ jsx("div", { className: "flex-1" }),
278
- headerExtras,
279
- /* @__PURE__ */ jsx(
280
- ToolPreferences,
281
- {
262
+ const header = /* @__PURE__ */ jsx(
263
+ ChatWindowHeader,
264
+ {
265
+ mobile,
266
+ title,
267
+ threadId: panel.threadId,
268
+ maximized: panel.maximized,
269
+ threadsSource,
270
+ sessionsApi,
271
+ titleRefresh,
272
+ headerExtras,
273
+ toolPreferences: {
282
274
  tools: resolvedTools,
283
275
  value: toolPrefs,
284
276
  onRule: handleToolRule,
@@ -301,153 +293,96 @@ function ChatWindow({
301
293
  catalogLoading,
302
294
  catalogError,
303
295
  onCatalogRetry: retryCatalogs
304
- }
305
- ),
306
- sessionsApi && /* @__PURE__ */ jsx(
307
- Button,
308
- {
309
- variant: "ghost",
310
- size: "icon",
311
- title: messageCount === 0 ? "Send a message before forking this conversation" : "Fork conversation into a new window",
312
- disabled: !panel.threadId || messageCount === 0 || forking,
313
- onClick: () => void handleFork(),
314
- children: /* @__PURE__ */ jsx(Icon, { icon: UiGitBranch, className: "size-4" })
315
- }
316
- ),
317
- /* @__PURE__ */ jsx(
318
- Button,
319
- {
320
- variant: "ghost",
321
- size: "icon",
322
- title: "New window",
323
- onClick: () => openPanel(),
324
- children: /* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "size-4" })
325
- }
326
- ),
327
- /* @__PURE__ */ jsx(
328
- Button,
329
- {
330
- variant: "ghost",
331
- size: "icon",
332
- title: panel.maximized ? "Restore" : "Maximize",
333
- onClick: () => maximizePanel(panel.id),
334
- children: /* @__PURE__ */ jsx(Icon, { icon: UiFullscreen, className: "size-4" })
335
- }
336
- ),
337
- /* @__PURE__ */ jsx(
338
- Button,
339
- {
340
- variant: "ghost",
341
- size: "icon",
342
- title: "Close",
343
- onClick: () => closePanel(panel.id),
344
- children: /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "size-4" })
345
- }
346
- )
347
- ] });
348
- const frame = /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl", children: [
349
- header,
350
- (renderContextPicker || panel.contextItems.length > 0) && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5", children: [
351
- renderContextPicker == null ? void 0 : renderContextPicker({
352
- items: panel.contextItems,
353
- onAdd: addContext,
354
- onAddMany: addContextItems
355
- }),
356
- /* @__PURE__ */ jsx(
357
- ContextBadges,
358
- {
359
- items: panel.contextItems,
360
- onRemove: removeContext,
361
- className: "px-0 py-0",
362
- ...contextTypeConfig ? { typeConfig: contextTypeConfig } : {}
363
- }
364
- )
365
- ] }),
366
- /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: threadSetup.blocked ? /* @__PURE__ */ jsx(ChatThreadSetupStatus, { setup: threadSetup }) : /* @__PURE__ */ jsx(
367
- Chat,
368
- {
369
- ...chat,
370
- ...resolvedModels.length ? { models: resolvedModels, modelsApi: null } : {},
371
- runtime,
372
- ...runtimeFamilies ? { runtimeFamilies } : {},
373
- permissionMode,
374
- onRuntimeChange: handleRuntimeChange,
375
- onModelChange: handleModelChange,
376
- onReasoningEffortChange: handleReasoningEffortChange,
377
- budget,
378
- onUsage: handleUsage,
379
- runtimeLocked,
380
- onMessageCountChange: handleMessageCountChange,
381
- onSessionHydrated: handleSessionHydrated,
382
- ...panel.threadId ? { threadId: panel.threadId } : {},
383
- sessionsApi,
384
- tools: resolvedTools,
385
- ...toolRenderers ? { toolRenderers } : {},
386
- body: mergedBody,
387
- initialPrompt,
388
- onInitialPromptConsumed: handleInitialPromptConsumed,
389
- proposedPrompts,
390
- onProposedPromptsConsumed: handleProposedPromptsConsumed
391
296
  },
392
- panel.threadId ?? `new-${panel.id}`
393
- ) })
394
- ] });
395
- const outerClass = cn(
396
- "fixed pointer-events-none",
397
- panel.maximized ? "inset-4 chat-maximized" : "inset-0"
297
+ hasMessages: messageCount > 0,
298
+ forkDisabled: !panel.threadId || messageCount === 0 || forking,
299
+ onSelectThread: (threadId) => updatePanel(panel.id, { threadId }),
300
+ onNewThread: () => updatePanel(panel.id, { threadId: null }),
301
+ onFork: () => void handleFork(),
302
+ onNewWindow: () => openPanel(),
303
+ onMaximize: () => maximizePanel(panel.id),
304
+ onClose: () => closePanel(panel.id)
305
+ }
398
306
  );
399
- if (!Rnd) {
400
- return /* @__PURE__ */ jsx("div", { className: outerClass, style: { zIndex: panel.zIndex }, children: /* @__PURE__ */ jsx(
401
- "div",
402
- {
403
- className: "pointer-events-auto h-full",
404
- style: panel.maximized ? { position: "relative", width: "100%", height: "100%" } : {
405
- position: "absolute",
406
- left: panel.x,
407
- top: panel.y,
408
- width: panel.width,
409
- height: panel.height
410
- },
411
- children: frame
412
- }
413
- ) });
307
+ const frame = /* @__PURE__ */ jsxs(
308
+ "div",
309
+ {
310
+ className: cn(
311
+ "flex h-full flex-col overflow-hidden bg-background",
312
+ !mobile && "rounded-lg border border-border shadow-xl"
313
+ ),
314
+ children: [
315
+ header,
316
+ (renderContextPicker || panel.contextItems.length > 0) && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5", children: [
317
+ renderContextPicker == null ? void 0 : renderContextPicker({
318
+ items: panel.contextItems,
319
+ onAdd: addContext,
320
+ onAddMany: addContextItems
321
+ }),
322
+ /* @__PURE__ */ jsx(
323
+ ContextBadges,
324
+ {
325
+ items: panel.contextItems,
326
+ onRemove: removeContext,
327
+ className: "px-0 py-0",
328
+ ...contextTypeConfig ? { typeConfig: contextTypeConfig } : {}
329
+ }
330
+ )
331
+ ] }),
332
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: threadSetup.blocked ? /* @__PURE__ */ jsx(ChatThreadSetupStatus, { setup: threadSetup }) : /* @__PURE__ */ jsx(
333
+ Chat,
334
+ {
335
+ ...chat,
336
+ ...resolvedModels.length ? { models: resolvedModels, modelsApi: null } : {},
337
+ runtime,
338
+ ...runtimeFamilies ? { runtimeFamilies } : {},
339
+ permissionMode,
340
+ onRuntimeChange: handleRuntimeChange,
341
+ onModelChange: handleModelChange,
342
+ onReasoningEffortChange: handleReasoningEffortChange,
343
+ budget,
344
+ onUsage: handleUsage,
345
+ runtimeLocked,
346
+ onMessageCountChange: handleMessageCountChange,
347
+ onSessionHydrated: handleSessionHydrated,
348
+ ...panel.threadId ? { threadId: panel.threadId } : {},
349
+ sessionsApi,
350
+ tools: resolvedTools,
351
+ ...toolRenderers ? { toolRenderers } : {},
352
+ body: mergedBody,
353
+ initialPrompt,
354
+ onInitialPromptConsumed: handleInitialPromptConsumed,
355
+ proposedPrompts,
356
+ onProposedPromptsConsumed: handleProposedPromptsConsumed
357
+ },
358
+ panel.threadId ?? `new-${panel.id}`
359
+ ) })
360
+ ]
361
+ }
362
+ );
363
+ const layerStyle = { zIndex: panel.zIndex };
364
+ if (mobile) {
365
+ const front = panels.reduce((top, p) => p.zIndex >= top.zIndex ? p : top);
366
+ return /* @__PURE__ */ jsx(ChatWindowSheet, { layerStyle, hidden: front.id !== panel.id, children: frame });
414
367
  }
415
- return /* @__PURE__ */ jsxs("div", { className: outerClass, style: { zIndex: panel.zIndex }, children: [
416
- /* @__PURE__ */ jsx("style", { children: MAXIMIZE_CSS }),
417
- /* @__PURE__ */ jsx(
368
+ return /* @__PURE__ */ jsx(
369
+ ChatWindowFloating,
370
+ {
371
+ panel,
372
+ layerStyle,
418
373
  Rnd,
419
- {
420
- default: {
421
- x: panel.x,
422
- y: panel.y,
423
- width: panel.width,
424
- height: panel.height
425
- },
426
- style: { pointerEvents: "auto" },
427
- minWidth: Math.min(360, Math.max(1, window.innerWidth - 32)),
428
- minHeight: Math.min(400, Math.max(1, window.innerHeight - 32)),
429
- bounds: "parent",
430
- dragHandleClassName: "chat-drag-handle",
431
- disableDragging: panel.maximized,
432
- enableResizing: !panel.maximized,
433
- onDragStart: () => bringToFront(panel.id),
434
- onDragStop: (_e, d) => updatePanel(panel.id, { x: d.x, y: d.y }),
435
- onResizeStop: (_e, _dir, ref, _delta, pos) => updatePanel(panel.id, {
436
- width: ref.offsetWidth,
437
- height: ref.offsetHeight,
438
- x: pos.x,
439
- y: pos.y
440
- }),
441
- children: frame
442
- }
443
- )
444
- ] });
374
+ onDragStart: () => bringToFront(panel.id),
375
+ onGeometryChange: (partial) => updatePanel(panel.id, partial),
376
+ children: frame
377
+ }
378
+ );
445
379
  }
446
380
  function ChatWindowLayer(props) {
447
381
  const { panels } = useChatWindowManager();
448
382
  return /* @__PURE__ */ jsx(Fragment, { children: panels.map((panel) => /* @__PURE__ */ jsx(ChatWindow, { panel, ...props }, panel.id)) });
449
383
  }
450
384
  export {
385
+ CHAT_WINDOW_MOBILE_QUERY,
451
386
  ChatWindow,
452
387
  ChatWindowLayer
453
388
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.js","sources":["../../../src/data/ai/ChatWindow.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiAdd, UiClose, UiFullscreen, UiGitBranch } from \"../../icons\";\nimport { Chat } from \"../chat/Chat\";\nimport { forkChatSession, type CaptainChatSession } from \"../chat/approval\";\nimport type {\n ChatBudgetConfig,\n ChatUsageSummary,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { ThreadPicker } from \"./ThreadPicker\";\nimport { ContextBadges } from \"./ContextBadges\";\nimport { ToolPreferences, type ToolMeta } from \"./ToolPreferences\";\nimport type { ChatContextItem } from \"./context\";\nimport { chatWindowRequestBody } from \"./ChatWindowRequestBody\";\nimport {\n loadChatPreferences,\n saveChatPreferences,\n type StoredChatPreferences,\n} from \"./ChatWindow.preferences\";\nimport { useChatWindowRuntime } from \"./ChatWindow.runtime\";\nimport { useChatWindowCatalogs } from \"./ChatWindow.catalogs\";\nimport { normalizeToolCatalog } from \"./ChatWindow.tool-catalog\";\nimport {\n effectiveToolPolicies,\n withUserRule,\n} from \"./ToolPreferences.model\";\nimport type {\n PermissionPolicy,\n PermissionRule,\n} from \"../chat/tool-policy\";\nimport { useChatThreadSetup } from \"./ChatWindow.thread\";\nimport { ChatThreadSetupStatus } from \"./ChatWindow.thread-status\";\nimport type { ChatWindowProps } from \"./ChatWindow.types\";\nexport type {\n ChatContextPickerRenderProps,\n ChatWindowProps,\n} from \"./ChatWindow.types\";\n\nconst EMPTY_TOOLS: ToolMeta[] = [];\n\nconst MAXIMIZE_CSS = `\n.chat-maximized .react-draggable {\n transform: none !important;\n width: auto !important;\n height: auto !important;\n inset: 0 !important;\n position: absolute !important;\n}`;\n\n/** A draggable, resizable floating chat window. It lazy-loads `react-rnd` (an\n * optional dependency, so consumers of just the inner <Chat> never pull it)\n * and renders the existing <Chat> beneath a drag-handle header with thread\n * switching, a context-badge row and optional tool preferences. */\nexport function ChatWindow({\n panel,\n chat,\n title = \"Assistant\",\n sessionsApi = \"/api/chat/sessions\",\n threadsSource,\n contextTypeConfig,\n tools,\n defaultToolPolicy = \"ask\",\n toolsApi = \"/api/chat/tools\",\n runtimesApi = null,\n toolRenderers,\n headerExtras,\n renderContextPicker,\n}: ChatWindowProps) {\n const { updatePanel, closePanel, bringToFront, maximizePanel, openPanel } =\n useChatWindowManager();\n const threadSetup = useChatThreadSetup({\n threadId: panel.threadId,\n api: sessionsApi,\n source: threadsSource,\n onCreated: (threadId) => updatePanel(panel.id, { threadId }),\n });\n const [Rnd, setRnd] = useState<ComponentType<RndProps> | null>(null);\n const [storedPrefs] = useState<StoredChatPreferences>(() =>\n loadChatPreferences(),\n );\n const [budget, setBudget] = useState<ChatBudgetConfig>(\n chat?.budget ?? storedPrefs.budget ?? {},\n );\n const [permissionMode, setPermissionMode] = useState<ClaudePermissionMode>(\n chat?.permissionMode ?? storedPrefs.permissionMode ?? \"default\",\n );\n const [titleRefresh, setTitleRefresh] = useState(0);\n // Only the rules the user actually toggled are stored. Everything else is\n // derived, so a surface's rules still reach tools the user never touched, and\n // a group toggle keeps applying as the catalog grows.\n const [userToolRules, setUserToolRules] = useState<PermissionPolicy>(\n storedPrefs.toolRules ?? [],\n );\n const [fetchedTools, setFetchedTools] = useState<ToolMeta[] | undefined>(\n undefined,\n );\n const [toolsLoading, setToolsLoading] = useState(false);\n const [toolsError, setToolsError] = useState<string | null>(null);\n const resolvedTools = tools ?? fetchedTools ?? EMPTY_TOOLS;\n const modelsApi =\n chat?.modelsApi === undefined ? \"/api/chat/models\" : chat.modelsApi;\n const {\n models: resolvedModels,\n runtimeFamilies,\n loading: catalogLoading,\n error: catalogError,\n retry: retryCatalogs,\n } = useChatWindowCatalogs({\n models: chat?.models,\n modelsApi,\n runtimeFamilies: chat?.runtimeFamilies,\n runtimesApi,\n });\n const {\n runtime,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n } = useChatWindowRuntime({\n chat,\n initialModel: panel.initialModel,\n models: resolvedModels,\n storedRuntime: storedPrefs.runtime,\n });\n const [messageCount, setMessageCount] = useState(0);\n const [runtimeBound, setRuntimeBound] = useState(false);\n const [forking, setForking] = useState(false);\n const runtimeLocked = runtimeBound || messageCount > 0;\n const preferredRuntimeRef = useRef(runtime);\n const threadIdRef = useRef(panel.threadId);\n threadIdRef.current = panel.threadId;\n\n useEffect(() => {\n if (!runtimeLocked) preferredRuntimeRef.current = runtime;\n }, [runtime, runtimeLocked]);\n\n useEffect(() => {\n setMessageCount(0);\n setRuntimeBound(false);\n replaceRuntime(preferredRuntimeRef.current);\n }, [panel.threadId, replaceRuntime]);\n\n useEffect(() => {\n if (chat?.budget !== undefined) setBudget(chat.budget);\n }, [chat?.budget]);\n\n useEffect(() => {\n if (chat?.permissionMode !== undefined)\n setPermissionMode(chat.permissionMode);\n }, [chat?.permissionMode]);\n\n useEffect(() => {\n if (tools || toolsApi === null) return;\n let active = true;\n setToolsLoading(true);\n setToolsError(null);\n fetch(toolsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`tools ${r.status}`)),\n )\n .then((data) => {\n if (!active) return;\n setFetchedTools(normalizeToolCatalog(data));\n })\n .catch((err) => {\n if (!active) return;\n setToolsError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n if (active) setToolsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [tools, toolsApi]);\n\n useEffect(() => {\n saveChatPreferences({\n runtime: runtimeLocked ? preferredRuntimeRef.current : runtime,\n ...(budget.cost !== undefined || budget.maxTokens !== undefined\n ? { budget }\n : {}),\n permissionMode,\n toolRules: userToolRules,\n });\n }, [budget, permissionMode, runtime, runtimeLocked, userToolRules]);\n\n const toolPrefs = useMemo(\n () =>\n effectiveToolPolicies({\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userRules: userToolRules,\n fallback: defaultToolPolicy,\n }),\n [defaultToolPolicy, panel.toolPolicy, resolvedTools, userToolRules],\n );\n\n // The popover hands back the one rule the toggle means, not a whole map, so\n // which control was used survives into the request.\n const handleToolRule = useCallback((rule: PermissionRule) => {\n setUserToolRules((prev) => withUserRule(prev, rule));\n }, []);\n\n useEffect(() => {\n let active = true;\n import(\"react-rnd\").then((m) => {\n if (active) setRnd(() => m.Rnd as unknown as ComponentType<RndProps>);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const removeContext = useCallback(\n (id: string) =>\n updatePanel(panel.id, {\n contextItems: panel.contextItems.filter((c) => c.id !== id),\n }),\n [updatePanel, panel.id, panel.contextItems],\n );\n\n const addContextItems = useCallback(\n (items: ChatContextItem[]) =>\n updatePanel(panel.id, {\n contextItems: [\n ...panel.contextItems,\n ...items.filter(\n (item, index) =>\n !panel.contextItems.some((existing) => existing.id === item.id) &&\n items.findIndex((candidate) => candidate.id === item.id) ===\n index,\n ),\n ],\n }),\n [panel.contextItems, panel.id, updatePanel],\n );\n const addContext = useCallback(\n (item: ChatContextItem) => addContextItems([item]),\n [addContextItems],\n );\n\n const mergedBody = chatWindowRequestBody({\n base: chat?.body,\n contextItems: panel.contextItems,\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userPolicy: userToolRules,\n });\n\n const initialPrompt = panel.initialPrompt ?? chat?.initialPrompt ?? null;\n const handleInitialPromptConsumed = useCallback(() => {\n if (panel.initialPrompt) updatePanel(panel.id, { initialPrompt: null });\n chat?.onInitialPromptConsumed?.();\n }, [chat, panel.id, panel.initialPrompt, updatePanel]);\n const proposedPrompts = panel.proposedPrompts?.length\n ? panel.proposedPrompts\n : (chat?.proposedPrompts ?? null);\n const handleProposedPromptsConsumed = useCallback(() => {\n if (panel.proposedPrompts?.length)\n updatePanel(panel.id, { proposedPrompts: [] });\n chat?.onProposedPromptsConsumed?.();\n }, [chat, panel.id, panel.proposedPrompts, updatePanel]);\n const handleUsage = useCallback(\n (snapshot: ChatUsageSummary) => {\n // A settled turn is also when the backend has named the conversation, so\n // this is what refreshes the picker's label.\n setTitleRefresh((value) => value + 1);\n chat?.onUsage?.(snapshot);\n },\n [chat],\n );\n const handlePermissionModeChange = useCallback(\n (next: ClaudePermissionMode) => {\n setPermissionMode(next);\n chat?.onPermissionModeChange?.(next);\n },\n [chat],\n );\n const handleSessionHydrated = useCallback(\n (session: CaptainChatSession) => {\n if (session.id !== panel.threadId) return;\n // A hydrated session names its runtime as (model, mode). Requiring a\n // `backend` key here left every loaded session unbound — the picker kept\n // its defaults and the next send posted a runtime the thread had not\n // agreed to.\n setRuntimeBound(Boolean(session.runtime?.model && session.runtime.mode));\n if (session.runtime?.model && session.runtime.mode) {\n replaceRuntimeIdentity(session.runtime);\n }\n chat?.onSessionHydrated?.(session);\n },\n [chat, panel.threadId, replaceRuntimeIdentity],\n );\n const handleMessageCountChange = useCallback(\n (count: number) => {\n setMessageCount(count);\n chat?.onMessageCountChange?.(count);\n },\n [chat],\n );\n const handleFork = useCallback(async () => {\n if (!sessionsApi || !panel.threadId || messageCount === 0 || forking)\n return;\n const sourceThreadId = panel.threadId;\n setForking(true);\n try {\n const fork = await forkChatSession(sessionsApi, sourceThreadId);\n if (threadIdRef.current !== sourceThreadId) return;\n openPanel({ threadId: fork.id });\n } catch (error) {\n console.warn(\"clicky-ui: failed to fork chat session\", error);\n } finally {\n setForking(false);\n }\n }, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);\n\n const header = (\n <div className=\"chat-drag-handle flex cursor-move items-center gap-1 border-b border-border bg-muted/40 px-2 py-1.5\">\n {threadsSource != null || sessionsApi !== null ? (\n <ThreadPicker\n threadId={panel.threadId}\n onSelect={(tid) => updatePanel(panel.id, { threadId: tid })}\n onNew={() => updatePanel(panel.id, { threadId: null })}\n refreshToken={titleRefresh}\n {...(threadsSource\n ? { source: threadsSource }\n : sessionsApi !== null\n ? { api: sessionsApi }\n : {})}\n />\n ) : (\n <span className=\"px-1 text-sm font-medium\">{title}</span>\n )}\n <div className=\"flex-1\" />\n {headerExtras}\n <ToolPreferences\n tools={resolvedTools}\n value={toolPrefs}\n onRule={handleToolRule}\n rules={userToolRules}\n onRulesChange={setUserToolRules}\n models={resolvedModels}\n runtime={runtime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={handlePermissionModeChange}\n budget={budget}\n onBudgetChange={setBudget}\n runtimeLocked={runtimeLocked}\n {...(sessionsApi ? { costsApi: sessionsApi } : {})}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n toolsLoading={toolsLoading}\n toolsError={toolsError}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={retryCatalogs}\n />\n {sessionsApi && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={\n messageCount === 0\n ? \"Send a message before forking this conversation\"\n : \"Fork conversation into a new window\"\n }\n disabled={!panel.threadId || messageCount === 0 || forking}\n onClick={() => void handleFork()}\n >\n <Icon icon={UiGitBranch} className=\"size-4\" />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"New window\"\n onClick={() => openPanel()}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title={panel.maximized ? \"Restore\" : \"Maximize\"}\n onClick={() => maximizePanel(panel.id)}\n >\n <Icon icon={UiFullscreen} className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Close\"\n onClick={() => closePanel(panel.id)}\n >\n <Icon icon={UiClose} className=\"size-4\" />\n </Button>\n </div>\n );\n\n const frame = (\n <div className=\"flex h-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\">\n {header}\n {(renderContextPicker || panel.contextItems.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5\">\n {renderContextPicker?.({\n items: panel.contextItems,\n onAdd: addContext,\n onAddMany: addContextItems,\n })}\n <ContextBadges\n items={panel.contextItems}\n onRemove={removeContext}\n className=\"px-0 py-0\"\n {...(contextTypeConfig ? { typeConfig: contextTypeConfig } : {})}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {threadSetup.blocked ? (\n <ChatThreadSetupStatus setup={threadSetup} />\n ) : (\n <Chat\n key={panel.threadId ?? `new-${panel.id}`}\n {...chat}\n {...(resolvedModels.length\n ? { models: resolvedModels, modelsApi: null }\n : {})}\n runtime={runtime}\n {...(runtimeFamilies ? { runtimeFamilies } : {})}\n permissionMode={permissionMode}\n onRuntimeChange={handleRuntimeChange}\n onModelChange={handleModelChange}\n onReasoningEffortChange={handleReasoningEffortChange}\n budget={budget}\n onUsage={handleUsage}\n runtimeLocked={runtimeLocked}\n onMessageCountChange={handleMessageCountChange}\n onSessionHydrated={handleSessionHydrated}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n sessionsApi={sessionsApi}\n tools={resolvedTools}\n {...(toolRenderers ? { toolRenderers } : {})}\n body={mergedBody}\n initialPrompt={initialPrompt}\n onInitialPromptConsumed={handleInitialPromptConsumed}\n proposedPrompts={proposedPrompts}\n onProposedPromptsConsumed={handleProposedPromptsConsumed}\n />\n )}\n </div>\n </div>\n );\n\n const outerClass = cn(\n \"fixed pointer-events-none\",\n panel.maximized ? \"inset-4 chat-maximized\" : \"inset-0\",\n );\n\n // Until react-rnd loads (and as a graceful fallback if it never does) the\n // window is statically positioned — still usable, just not draggable.\n if (!Rnd) {\n return (\n <div className={outerClass} style={{ zIndex: panel.zIndex }}>\n <div\n className=\"pointer-events-auto h-full\"\n style={\n panel.maximized\n ? { position: \"relative\", width: \"100%\", height: \"100%\" }\n : {\n position: \"absolute\",\n left: panel.x,\n top: panel.y,\n width: panel.width,\n height: panel.height,\n }\n }\n >\n {frame}\n </div>\n </div>\n );\n }\n\n return (\n <div className={outerClass} style={{ zIndex: panel.zIndex }}>\n <style>{MAXIMIZE_CSS}</style>\n <Rnd\n default={{\n x: panel.x,\n y: panel.y,\n width: panel.width,\n height: panel.height,\n }}\n style={{ pointerEvents: \"auto\" }}\n minWidth={Math.min(360, Math.max(1, window.innerWidth - 32))}\n minHeight={Math.min(400, Math.max(1, window.innerHeight - 32))}\n bounds=\"parent\"\n dragHandleClassName=\"chat-drag-handle\"\n disableDragging={panel.maximized}\n enableResizing={!panel.maximized}\n onDragStart={() => bringToFront(panel.id)}\n onDragStop={(_e, d) => updatePanel(panel.id, { x: d.x, y: d.y })}\n onResizeStop={(_e, _dir, ref, _delta, pos) =>\n updatePanel(panel.id, {\n width: ref.offsetWidth,\n height: ref.offsetHeight,\n x: pos.x,\n y: pos.y,\n })\n }\n >\n {frame}\n </Rnd>\n </div>\n );\n}\n\n/** Renders every open window for the current {@link useChatWindowManager}.\n * Drop one of these near the root alongside a <ChatFab/>. */\nexport function ChatWindowLayer(props: Omit<ChatWindowProps, \"panel\">) {\n const { panels } = useChatWindowManager();\n return (\n <>\n {panels.map((panel) => (\n <ChatWindow key={panel.id} panel={panel} {...props} />\n ))}\n </>\n );\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"ChatWindow.js","sources":["../../../src/data/ai/ChatWindow.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n} from \"react\";\nimport type { Props as RndProps } from \"react-rnd\";\nimport { cn } from \"../../lib/utils\";\nimport { useMediaQuery } from \"../../hooks/use-media-query\";\nimport { Chat } from \"../chat/Chat\";\nimport { forkChatSession, type CaptainChatSession } from \"../chat/approval\";\nimport type {\n ChatBudgetConfig,\n ChatUsageSummary,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { ChatWindowHeader } from \"./ChatWindow.header\";\nimport { ContextBadges } from \"./ContextBadges\";\nimport type { ToolMeta } from \"./ToolPreferences\";\nimport type { ChatContextItem } from \"./context\";\nimport { chatWindowRequestBody } from \"./ChatWindowRequestBody\";\nimport {\n loadChatPreferences,\n saveChatPreferences,\n type StoredChatPreferences,\n} from \"./ChatWindow.preferences\";\nimport { useChatWindowRuntime } from \"./ChatWindow.runtime\";\nimport { useChatWindowCatalogs } from \"./ChatWindow.catalogs\";\nimport { normalizeToolCatalog } from \"./ChatWindow.tool-catalog\";\nimport {\n effectiveToolPolicies,\n withUserRule,\n} from \"./ToolPreferences.model\";\nimport type {\n PermissionPolicy,\n PermissionRule,\n} from \"../chat/tool-policy\";\nimport { useChatThreadSetup } from \"./ChatWindow.thread\";\nimport { ChatThreadSetupStatus } from \"./ChatWindow.thread-status\";\nimport type { ChatWindowProps } from \"./ChatWindow.types\";\nimport {\n CHAT_WINDOW_MOBILE_QUERY,\n ChatWindowFloating,\n ChatWindowSheet,\n} from \"./ChatWindow.placement\";\nexport { CHAT_WINDOW_MOBILE_QUERY };\nexport type {\n ChatContextPickerRenderProps,\n ChatWindowProps,\n} from \"./ChatWindow.types\";\n\nconst EMPTY_TOOLS: ToolMeta[] = [];\n\n/** A draggable, resizable floating chat window — or, below\n * {@link CHAT_WINDOW_MOBILE_QUERY}, a full-screen sheet. It lazy-loads `react-rnd` (an\n * optional dependency, so consumers of just the inner <Chat> never pull it)\n * and renders the existing <Chat> beneath a drag-handle header with thread\n * switching, a context-badge row and optional tool preferences. */\nexport function ChatWindow({\n panel,\n chat,\n title = \"Assistant\",\n sessionsApi = \"/api/chat/sessions\",\n threadsSource,\n contextTypeConfig,\n tools,\n defaultToolPolicy = \"ask\",\n toolsApi = \"/api/chat/tools\",\n runtimesApi = null,\n toolRenderers,\n headerExtras,\n renderContextPicker,\n}: ChatWindowProps) {\n const {\n panels,\n updatePanel,\n closePanel,\n bringToFront,\n maximizePanel,\n openPanel,\n } = useChatWindowManager();\n const mobile = useMediaQuery(CHAT_WINDOW_MOBILE_QUERY);\n const threadSetup = useChatThreadSetup({\n threadId: panel.threadId,\n api: sessionsApi,\n source: threadsSource,\n onCreated: (threadId) => updatePanel(panel.id, { threadId }),\n });\n const [Rnd, setRnd] = useState<ComponentType<RndProps> | null>(null);\n const [storedPrefs] = useState<StoredChatPreferences>(() =>\n loadChatPreferences(),\n );\n const [budget, setBudget] = useState<ChatBudgetConfig>(\n chat?.budget ?? storedPrefs.budget ?? {},\n );\n const [permissionMode, setPermissionMode] = useState<ClaudePermissionMode>(\n chat?.permissionMode ?? storedPrefs.permissionMode ?? \"default\",\n );\n const [titleRefresh, setTitleRefresh] = useState(0);\n // Only the rules the user actually toggled are stored. Everything else is\n // derived, so a surface's rules still reach tools the user never touched, and\n // a group toggle keeps applying as the catalog grows.\n const [userToolRules, setUserToolRules] = useState<PermissionPolicy>(\n storedPrefs.toolRules ?? [],\n );\n const [fetchedTools, setFetchedTools] = useState<ToolMeta[] | undefined>(\n undefined,\n );\n const [toolsLoading, setToolsLoading] = useState(false);\n const [toolsError, setToolsError] = useState<string | null>(null);\n const resolvedTools = tools ?? fetchedTools ?? EMPTY_TOOLS;\n const modelsApi =\n chat?.modelsApi === undefined ? \"/api/chat/models\" : chat.modelsApi;\n const {\n models: resolvedModels,\n runtimeFamilies,\n loading: catalogLoading,\n error: catalogError,\n retry: retryCatalogs,\n } = useChatWindowCatalogs({\n models: chat?.models,\n modelsApi,\n runtimeFamilies: chat?.runtimeFamilies,\n runtimesApi,\n });\n const {\n runtime,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n } = useChatWindowRuntime({\n chat,\n initialModel: panel.initialModel,\n models: resolvedModels,\n storedRuntime: storedPrefs.runtime,\n });\n const [messageCount, setMessageCount] = useState(0);\n const [runtimeBound, setRuntimeBound] = useState(false);\n const [forking, setForking] = useState(false);\n const runtimeLocked = runtimeBound || messageCount > 0;\n const preferredRuntimeRef = useRef(runtime);\n const threadIdRef = useRef(panel.threadId);\n threadIdRef.current = panel.threadId;\n\n useEffect(() => {\n if (!runtimeLocked) preferredRuntimeRef.current = runtime;\n }, [runtime, runtimeLocked]);\n\n useEffect(() => {\n setMessageCount(0);\n setRuntimeBound(false);\n replaceRuntime(preferredRuntimeRef.current);\n }, [panel.threadId, replaceRuntime]);\n\n useEffect(() => {\n if (chat?.budget !== undefined) setBudget(chat.budget);\n }, [chat?.budget]);\n\n useEffect(() => {\n if (chat?.permissionMode !== undefined)\n setPermissionMode(chat.permissionMode);\n }, [chat?.permissionMode]);\n\n useEffect(() => {\n if (tools || toolsApi === null) return;\n let active = true;\n setToolsLoading(true);\n setToolsError(null);\n fetch(toolsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`tools ${r.status}`)),\n )\n .then((data) => {\n if (!active) return;\n setFetchedTools(normalizeToolCatalog(data));\n })\n .catch((err) => {\n if (!active) return;\n setToolsError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n if (active) setToolsLoading(false);\n });\n return () => {\n active = false;\n };\n }, [tools, toolsApi]);\n\n useEffect(() => {\n saveChatPreferences({\n runtime: runtimeLocked ? preferredRuntimeRef.current : runtime,\n ...(budget.cost !== undefined || budget.maxTokens !== undefined\n ? { budget }\n : {}),\n permissionMode,\n toolRules: userToolRules,\n });\n }, [budget, permissionMode, runtime, runtimeLocked, userToolRules]);\n\n const toolPrefs = useMemo(\n () =>\n effectiveToolPolicies({\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userRules: userToolRules,\n fallback: defaultToolPolicy,\n }),\n [defaultToolPolicy, panel.toolPolicy, resolvedTools, userToolRules],\n );\n\n // The popover hands back the one rule the toggle means, not a whole map, so\n // which control was used survives into the request.\n const handleToolRule = useCallback((rule: PermissionRule) => {\n setUserToolRules((prev) => withUserRule(prev, rule));\n }, []);\n\n useEffect(() => {\n if (mobile) return;\n let active = true;\n import(\"react-rnd\").then((m) => {\n if (active) setRnd(() => m.Rnd as unknown as ComponentType<RndProps>);\n });\n return () => {\n active = false;\n };\n }, [mobile]);\n\n const removeContext = useCallback(\n (id: string) =>\n updatePanel(panel.id, {\n contextItems: panel.contextItems.filter((c) => c.id !== id),\n }),\n [updatePanel, panel.id, panel.contextItems],\n );\n\n const addContextItems = useCallback(\n (items: ChatContextItem[]) =>\n updatePanel(panel.id, {\n contextItems: [\n ...panel.contextItems,\n ...items.filter(\n (item, index) =>\n !panel.contextItems.some((existing) => existing.id === item.id) &&\n items.findIndex((candidate) => candidate.id === item.id) ===\n index,\n ),\n ],\n }),\n [panel.contextItems, panel.id, updatePanel],\n );\n const addContext = useCallback(\n (item: ChatContextItem) => addContextItems([item]),\n [addContextItems],\n );\n\n const mergedBody = chatWindowRequestBody({\n base: chat?.body,\n contextItems: panel.contextItems,\n tools: resolvedTools,\n surfacePolicy: panel.toolPolicy,\n userPolicy: userToolRules,\n });\n\n const initialPrompt = panel.initialPrompt ?? chat?.initialPrompt ?? null;\n const handleInitialPromptConsumed = useCallback(() => {\n if (panel.initialPrompt) updatePanel(panel.id, { initialPrompt: null });\n chat?.onInitialPromptConsumed?.();\n }, [chat, panel.id, panel.initialPrompt, updatePanel]);\n const proposedPrompts = panel.proposedPrompts?.length\n ? panel.proposedPrompts\n : (chat?.proposedPrompts ?? null);\n const handleProposedPromptsConsumed = useCallback(() => {\n if (panel.proposedPrompts?.length)\n updatePanel(panel.id, { proposedPrompts: [] });\n chat?.onProposedPromptsConsumed?.();\n }, [chat, panel.id, panel.proposedPrompts, updatePanel]);\n const handleUsage = useCallback(\n (snapshot: ChatUsageSummary) => {\n // A settled turn is also when the backend has named the conversation, so\n // this is what refreshes the picker's label.\n setTitleRefresh((value) => value + 1);\n chat?.onUsage?.(snapshot);\n },\n [chat],\n );\n const handlePermissionModeChange = useCallback(\n (next: ClaudePermissionMode) => {\n setPermissionMode(next);\n chat?.onPermissionModeChange?.(next);\n },\n [chat],\n );\n const handleSessionHydrated = useCallback(\n (session: CaptainChatSession) => {\n if (session.id !== panel.threadId) return;\n // A hydrated session names its runtime as (model, mode). Requiring a\n // `backend` key here left every loaded session unbound — the picker kept\n // its defaults and the next send posted a runtime the thread had not\n // agreed to.\n setRuntimeBound(Boolean(session.runtime?.model && session.runtime.mode));\n if (session.runtime?.model && session.runtime.mode) {\n replaceRuntimeIdentity(session.runtime);\n }\n chat?.onSessionHydrated?.(session);\n },\n [chat, panel.threadId, replaceRuntimeIdentity],\n );\n const handleMessageCountChange = useCallback(\n (count: number) => {\n setMessageCount(count);\n chat?.onMessageCountChange?.(count);\n },\n [chat],\n );\n const handleFork = useCallback(async () => {\n if (!sessionsApi || !panel.threadId || messageCount === 0 || forking)\n return;\n const sourceThreadId = panel.threadId;\n setForking(true);\n try {\n const fork = await forkChatSession(sessionsApi, sourceThreadId);\n if (threadIdRef.current !== sourceThreadId) return;\n openPanel({ threadId: fork.id });\n } catch (error) {\n console.warn(\"clicky-ui: failed to fork chat session\", error);\n } finally {\n setForking(false);\n }\n }, [forking, messageCount, openPanel, panel.threadId, sessionsApi]);\n\n const header = (\n <ChatWindowHeader\n mobile={mobile}\n title={title}\n threadId={panel.threadId}\n maximized={panel.maximized}\n threadsSource={threadsSource}\n sessionsApi={sessionsApi}\n titleRefresh={titleRefresh}\n headerExtras={headerExtras}\n toolPreferences={{\n tools: resolvedTools,\n value: toolPrefs,\n onRule: handleToolRule,\n rules: userToolRules,\n onRulesChange: setUserToolRules,\n models: resolvedModels,\n runtime,\n onRuntimeChange: handleRuntimeChange,\n runtimeFamilies,\n reasoningEfforts,\n permissionMode,\n onPermissionModeChange: handlePermissionModeChange,\n budget,\n onBudgetChange: setBudget,\n runtimeLocked,\n ...(sessionsApi ? { costsApi: sessionsApi } : {}),\n ...(panel.threadId ? { threadId: panel.threadId } : {}),\n toolsLoading,\n toolsError,\n catalogLoading,\n catalogError,\n onCatalogRetry: retryCatalogs,\n }}\n hasMessages={messageCount > 0}\n forkDisabled={!panel.threadId || messageCount === 0 || forking}\n onSelectThread={(threadId) => updatePanel(panel.id, { threadId })}\n onNewThread={() => updatePanel(panel.id, { threadId: null })}\n onFork={() => void handleFork()}\n onNewWindow={() => openPanel()}\n onMaximize={() => maximizePanel(panel.id)}\n onClose={() => closePanel(panel.id)}\n />\n );\n\n const frame = (\n <div\n className={cn(\n \"flex h-full flex-col overflow-hidden bg-background\",\n !mobile && \"rounded-lg border border-border shadow-xl\",\n )}\n >\n {header}\n {(renderContextPicker || panel.contextItems.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-2 py-1.5\">\n {renderContextPicker?.({\n items: panel.contextItems,\n onAdd: addContext,\n onAddMany: addContextItems,\n })}\n <ContextBadges\n items={panel.contextItems}\n onRemove={removeContext}\n className=\"px-0 py-0\"\n {...(contextTypeConfig ? { typeConfig: contextTypeConfig } : {})}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {threadSetup.blocked ? (\n <ChatThreadSetupStatus setup={threadSetup} />\n ) : (\n <Chat\n key={panel.threadId ?? `new-${panel.id}`}\n {...chat}\n {...(resolvedModels.length\n ? { models: resolvedModels, modelsApi: null }\n : {})}\n runtime={runtime}\n {...(runtimeFamilies ? { runtimeFamilies } : {})}\n permissionMode={permissionMode}\n onRuntimeChange={handleRuntimeChange}\n onModelChange={handleModelChange}\n onReasoningEffortChange={handleReasoningEffortChange}\n budget={budget}\n onUsage={handleUsage}\n runtimeLocked={runtimeLocked}\n onMessageCountChange={handleMessageCountChange}\n onSessionHydrated={handleSessionHydrated}\n {...(panel.threadId ? { threadId: panel.threadId } : {})}\n sessionsApi={sessionsApi}\n tools={resolvedTools}\n {...(toolRenderers ? { toolRenderers } : {})}\n body={mergedBody}\n initialPrompt={initialPrompt}\n onInitialPromptConsumed={handleInitialPromptConsumed}\n proposedPrompts={proposedPrompts}\n onProposedPromptsConsumed={handleProposedPromptsConsumed}\n />\n )}\n </div>\n </div>\n );\n\n const layerStyle = { zIndex: panel.zIndex };\n\n if (mobile) {\n const front = panels.reduce((top, p) => (p.zIndex >= top.zIndex ? p : top));\n return (\n <ChatWindowSheet layerStyle={layerStyle} hidden={front.id !== panel.id}>\n {frame}\n </ChatWindowSheet>\n );\n }\n\n return (\n <ChatWindowFloating\n panel={panel}\n layerStyle={layerStyle}\n Rnd={Rnd}\n onDragStart={() => bringToFront(panel.id)}\n onGeometryChange={(partial) => updatePanel(panel.id, partial)}\n >\n {frame}\n </ChatWindowFloating>\n );\n}\n\n/** Renders every open window for the current {@link useChatWindowManager}.\n * Below {@link CHAT_WINDOW_MOBILE_QUERY} each is a full-screen sheet and only\n * the most recently focused one is visible. Drop one of these near the root alongside a <ChatFab/>. */\nexport function ChatWindowLayer(props: Omit<ChatWindowProps, \"panel\">) {\n const { panels } = useChatWindowManager();\n return (\n <>\n {panels.map((panel) => (\n <ChatWindow key={panel.id} panel={panel} {...props} />\n ))}\n </>\n );\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;AAsDA,MAAM,cAA0B,CAAA;AAOzB,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAAoB;;AAClB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,qBAAA;AACJ,QAAM,SAAS,cAAc,wBAAwB;AACrD,QAAM,cAAc,mBAAmB;AAAA,IACrC,UAAU,MAAM;AAAA,IAChB,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW,CAAC,aAAa,YAAY,MAAM,IAAI,EAAE,UAAU;AAAA,EAAA,CAC5D;AACD,QAAM,CAAC,KAAK,MAAM,IAAI,SAAyC,IAAI;AACnE,QAAM,CAAC,WAAW,IAAI;AAAA,IAAgC,MACpD,oBAAA;AAAA,EAAoB;AAEtB,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,KAC1B,6BAAM,WAAU,YAAY,UAAU,CAAA;AAAA,EAAC;AAEzC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI;AAAA,KAC1C,6BAAM,mBAAkB,YAAY,kBAAkB;AAAA,EAAA;AAExD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAIlD,QAAM,CAAC,eAAe,gBAAgB,IAAI;AAAA,IACxC,YAAY,aAAa,CAAA;AAAA,EAAC;AAE5B,QAAM,CAAC,cAAc,eAAe,IAAI;AAAA,IACtC;AAAA,EAAA;AAEF,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAChE,QAAM,gBAAgB,SAAS,gBAAgB;AAC/C,QAAM,aACJ,6BAAM,eAAc,SAAY,qBAAqB,KAAK;AAC5D,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EAAA,IACL,sBAAsB;AAAA,IACxB,QAAQ,6BAAM;AAAA,IACd;AAAA,IACA,iBAAiB,6BAAM;AAAA,IACvB;AAAA,EAAA,CACD;AACD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,qBAAqB;AAAA,IACvB;AAAA,IACA,cAAc,MAAM;AAAA,IACpB,QAAQ;AAAA,IACR,eAAe,YAAY;AAAA,EAAA,CAC5B;AACD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,gBAAgB,gBAAgB,eAAe;AACrD,QAAM,sBAAsB,OAAO,OAAO;AAC1C,QAAM,cAAc,OAAO,MAAM,QAAQ;AACzC,cAAY,UAAU,MAAM;AAE5B,YAAU,MAAM;AACd,QAAI,CAAC,cAAe,qBAAoB,UAAU;AAAA,EACpD,GAAG,CAAC,SAAS,aAAa,CAAC;AAE3B,YAAU,MAAM;AACd,oBAAgB,CAAC;AACjB,oBAAgB,KAAK;AACrB,mBAAe,oBAAoB,OAAO;AAAA,EAC5C,GAAG,CAAC,MAAM,UAAU,cAAc,CAAC;AAEnC,YAAU,MAAM;AACd,SAAI,6BAAM,YAAW,OAAW,WAAU,KAAK,MAAM;AAAA,EACvD,GAAG,CAAC,6BAAM,MAAM,CAAC;AAEjB,YAAU,MAAM;AACd,SAAI,6BAAM,oBAAmB;AAC3B,wBAAkB,KAAK,cAAc;AAAA,EACzC,GAAG,CAAC,6BAAM,cAAc,CAAC;AAEzB,YAAU,MAAM;AACd,QAAI,SAAS,aAAa,KAAM;AAChC,QAAI,SAAS;AACb,oBAAgB,IAAI;AACpB,kBAAc,IAAI;AAClB,UAAM,QAAQ,EACX;AAAA,MAAK,CAAC,MACL,EAAE,KAAK,EAAE,KAAA,IAAS,QAAQ,OAAO,IAAI,MAAM,SAAS,EAAE,MAAM,EAAE,CAAC;AAAA,IAAA,EAEhE,KAAK,CAAC,SAAS;AACd,UAAI,CAAC,OAAQ;AACb,sBAAgB,qBAAqB,IAAI,CAAC;AAAA,IAC5C,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,UAAI,CAAC,OAAQ;AACb,oBAAc,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAChE,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,wBAAwB,KAAK;AAAA,IACnC,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,YAAU,MAAM;AACd,wBAAoB;AAAA,MAClB,SAAS,gBAAgB,oBAAoB,UAAU;AAAA,MACvD,GAAI,OAAO,SAAS,UAAa,OAAO,cAAc,SAClD,EAAE,OAAA,IACF,CAAA;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,IAAA,CACZ;AAAA,EACH,GAAG,CAAC,QAAQ,gBAAgB,SAAS,eAAe,aAAa,CAAC;AAElE,QAAM,YAAY;AAAA,IAChB,MACE,sBAAsB;AAAA,MACpB,OAAO;AAAA,MACP,eAAe,MAAM;AAAA,MACrB,WAAW;AAAA,MACX,UAAU;AAAA,IAAA,CACX;AAAA,IACH,CAAC,mBAAmB,MAAM,YAAY,eAAe,aAAa;AAAA,EAAA;AAKpE,QAAM,iBAAiB,YAAY,CAAC,SAAyB;AAC3D,qBAAiB,CAAC,SAAS,aAAa,MAAM,IAAI,CAAC;AAAA,EACrD,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;AACd,QAAI,OAAQ;AACZ,QAAI,SAAS;AACb,WAAO,WAAW,EAAE,KAAK,CAAC,MAAM;AAC9B,UAAI,OAAQ,QAAO,MAAM,EAAE,GAAyC;AAAA,IACtE,CAAC;AACD,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,gBAAgB;AAAA,IACpB,CAAC,OACC,YAAY,MAAM,IAAI;AAAA,MACpB,cAAc,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IAAA,CAC3D;AAAA,IACH,CAAC,aAAa,MAAM,IAAI,MAAM,YAAY;AAAA,EAAA;AAG5C,QAAM,kBAAkB;AAAA,IACtB,CAAC,UACC,YAAY,MAAM,IAAI;AAAA,MACpB,cAAc;AAAA,QACZ,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,UACP,CAAC,MAAM,UACL,CAAC,MAAM,aAAa,KAAK,CAAC,aAAa,SAAS,OAAO,KAAK,EAAE,KAC9D,MAAM,UAAU,CAAC,cAAc,UAAU,OAAO,KAAK,EAAE,MACrD;AAAA,QAAA;AAAA,MACN;AAAA,IACF,CACD;AAAA,IACH,CAAC,MAAM,cAAc,MAAM,IAAI,WAAW;AAAA,EAAA;AAE5C,QAAM,aAAa;AAAA,IACjB,CAAC,SAA0B,gBAAgB,CAAC,IAAI,CAAC;AAAA,IACjD,CAAC,eAAe;AAAA,EAAA;AAGlB,QAAM,aAAa,sBAAsB;AAAA,IACvC,MAAM,6BAAM;AAAA,IACZ,cAAc,MAAM;AAAA,IACpB,OAAO;AAAA,IACP,eAAe,MAAM;AAAA,IACrB,YAAY;AAAA,EAAA,CACb;AAED,QAAM,gBAAgB,MAAM,kBAAiB,6BAAM,kBAAiB;AACpE,QAAM,8BAA8B,YAAY,MAAM;;AACpD,QAAI,MAAM,cAAe,aAAY,MAAM,IAAI,EAAE,eAAe,MAAM;AACtE,KAAAA,MAAA,6BAAM,4BAAN,gBAAAA,IAAA;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,IAAI,MAAM,eAAe,WAAW,CAAC;AACrD,QAAM,oBAAkB,WAAM,oBAAN,mBAAuB,UAC3C,MAAM,mBACL,6BAAM,oBAAmB;AAC9B,QAAM,gCAAgC,YAAY,MAAM;;AACtD,SAAIA,MAAA,MAAM,oBAAN,gBAAAA,IAAuB;AACzB,kBAAY,MAAM,IAAI,EAAE,iBAAiB,CAAA,GAAI;AAC/C,uCAAM,8BAAN;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,IAAI,MAAM,iBAAiB,WAAW,CAAC;AACvD,QAAM,cAAc;AAAA,IAClB,CAAC,aAA+B;;AAG9B,sBAAgB,CAAC,UAAU,QAAQ,CAAC;AACpC,OAAAA,MAAA,6BAAM,YAAN,gBAAAA,IAAA,WAAgB;AAAA,IAClB;AAAA,IACA,CAAC,IAAI;AAAA,EAAA;AAEP,QAAM,6BAA6B;AAAA,IACjC,CAAC,SAA+B;;AAC9B,wBAAkB,IAAI;AACtB,OAAAA,MAAA,6BAAM,2BAAN,gBAAAA,IAAA,WAA+B;AAAA,IACjC;AAAA,IACA,CAAC,IAAI;AAAA,EAAA;AAEP,QAAM,wBAAwB;AAAA,IAC5B,CAAC,YAAgC;;AAC/B,UAAI,QAAQ,OAAO,MAAM,SAAU;AAKnC,sBAAgB,UAAQA,MAAA,QAAQ,YAAR,gBAAAA,IAAiB,UAAS,QAAQ,QAAQ,IAAI,CAAC;AACvE,YAAI,aAAQ,YAAR,mBAAiB,UAAS,QAAQ,QAAQ,MAAM;AAClD,+BAAuB,QAAQ,OAAO;AAAA,MACxC;AACA,yCAAM,sBAAN,8BAA0B;AAAA,IAC5B;AAAA,IACA,CAAC,MAAM,MAAM,UAAU,sBAAsB;AAAA,EAAA;AAE/C,QAAM,2BAA2B;AAAA,IAC/B,CAAC,UAAkB;;AACjB,sBAAgB,KAAK;AACrB,OAAAA,MAAA,6BAAM,yBAAN,gBAAAA,IAAA,WAA6B;AAAA,IAC/B;AAAA,IACA,CAAC,IAAI;AAAA,EAAA;AAEP,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI,CAAC,eAAe,CAAC,MAAM,YAAY,iBAAiB,KAAK;AAC3D;AACF,UAAM,iBAAiB,MAAM;AAC7B,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,aAAa,cAAc;AAC9D,UAAI,YAAY,YAAY,eAAgB;AAC5C,gBAAU,EAAE,UAAU,KAAK,GAAA,CAAI;AAAA,IACjC,SAAS,OAAO;AACd,cAAQ,KAAK,0CAA0C,KAAK;AAAA,IAC9D,UAAA;AACE,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,cAAc,WAAW,MAAM,UAAU,WAAW,CAAC;AAElE,QAAM,SACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,eAAe;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,wBAAwB;AAAA,QACxB;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA,GAAI,cAAc,EAAE,UAAU,YAAA,IAAgB,CAAA;AAAA,QAC9C,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAAA;AAAA,MAElB,aAAa,eAAe;AAAA,MAC5B,cAAc,CAAC,MAAM,YAAY,iBAAiB,KAAK;AAAA,MACvD,gBAAgB,CAAC,aAAa,YAAY,MAAM,IAAI,EAAE,UAAU;AAAA,MAChE,aAAa,MAAM,YAAY,MAAM,IAAI,EAAE,UAAU,MAAM;AAAA,MAC3D,QAAQ,MAAM,KAAK,WAAA;AAAA,MACnB,aAAa,MAAM,UAAA;AAAA,MACnB,YAAY,MAAM,cAAc,MAAM,EAAE;AAAA,MACxC,SAAS,MAAM,WAAW,MAAM,EAAE;AAAA,IAAA;AAAA,EAAA;AAItC,QAAM,QACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,CAAC,UAAU;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAA;AAAA,SACC,uBAAuB,MAAM,aAAa,SAAS,MACnD,qBAAC,OAAA,EAAI,WAAU,0EACZ,UAAA;AAAA,UAAA,2DAAsB;AAAA,YACrB,OAAO,MAAM;AAAA,YACb,OAAO;AAAA,YACP,WAAW;AAAA,UAAA;AAAA,UAEb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,cACV,WAAU;AAAA,cACT,GAAI,oBAAoB,EAAE,YAAY,sBAAsB,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,QAChE,GACF;AAAA,QAEF,oBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA,YAAY,UACX,oBAAC,uBAAA,EAAsB,OAAO,YAAA,CAAa,IAE3C;AAAA,UAAC;AAAA,UAAA;AAAA,YAEE,GAAG;AAAA,YACH,GAAI,eAAe,SAChB,EAAE,QAAQ,gBAAgB,WAAW,KAAA,IACrC,CAAA;AAAA,YACJ;AAAA,YACC,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,YAC7C;AAAA,YACA,iBAAiB;AAAA,YACjB,eAAe;AAAA,YACf,yBAAyB;AAAA,YACzB;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA,sBAAsB;AAAA,YACtB,mBAAmB;AAAA,YAClB,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,YACrD;AAAA,YACA,OAAO;AAAA,YACN,GAAI,gBAAgB,EAAE,cAAA,IAAkB,CAAA;AAAA,YACzC,MAAM;AAAA,YACN;AAAA,YACA,yBAAyB;AAAA,YACzB;AAAA,YACA,2BAA2B;AAAA,UAAA;AAAA,UAxBtB,MAAM,YAAY,OAAO,MAAM,EAAE;AAAA,QAAA,EAyBxC,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIJ,QAAM,aAAa,EAAE,QAAQ,MAAM,OAAA;AAEnC,MAAI,QAAQ;AACV,UAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,MAAO,EAAE,UAAU,IAAI,SAAS,IAAI,GAAI;AAC1E,WACE,oBAAC,mBAAgB,YAAwB,QAAQ,MAAM,OAAO,MAAM,IACjE,UAAA,MAAA,CACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,MAAM,aAAa,MAAM,EAAE;AAAA,MACxC,kBAAkB,CAAC,YAAY,YAAY,MAAM,IAAI,OAAO;AAAA,MAE3D,UAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAKO,SAAS,gBAAgB,OAAuC;AACrE,QAAM,EAAE,OAAA,IAAW,qBAAA;AACnB,SACE,oBAAA,UAAA,EACG,UAAA,OAAO,IAAI,CAAC,UACX,oBAAC,YAAA,EAA0B,OAAe,GAAG,MAAA,GAA5B,MAAM,EAA6B,CACrD,GACH;AAEJ;"}