@flanksource/clicky-ui 0.3.44 → 0.3.46

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 (537) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/AccessMark.cjs +23 -0
  16. package/dist/data/AccessMark.cjs.map +1 -0
  17. package/dist/data/AccessMark.d.ts +11 -0
  18. package/dist/data/AccessMark.d.ts.map +1 -0
  19. package/dist/data/AccessMark.js +23 -0
  20. package/dist/data/AccessMark.js.map +1 -0
  21. package/dist/data/CodeBlock.cjs +3 -2
  22. package/dist/data/CodeBlock.cjs.map +1 -1
  23. package/dist/data/CodeBlock.d.ts +3 -1
  24. package/dist/data/CodeBlock.d.ts.map +1 -1
  25. package/dist/data/CodeBlock.js +3 -2
  26. package/dist/data/CodeBlock.js.map +1 -1
  27. package/dist/data/CodeDiff.cjs +116 -23
  28. package/dist/data/CodeDiff.cjs.map +1 -1
  29. package/dist/data/CodeDiff.d.ts +26 -0
  30. package/dist/data/CodeDiff.d.ts.map +1 -1
  31. package/dist/data/CodeDiff.js +116 -23
  32. package/dist/data/CodeDiff.js.map +1 -1
  33. package/dist/data/GraphDiagram.cjs +75 -11
  34. package/dist/data/GraphDiagram.cjs.map +1 -1
  35. package/dist/data/GraphDiagram.d.ts +17 -2
  36. package/dist/data/GraphDiagram.d.ts.map +1 -1
  37. package/dist/data/GraphDiagram.js +76 -12
  38. package/dist/data/GraphDiagram.js.map +1 -1
  39. package/dist/data/GraphDiagramGroups.cjs +100 -0
  40. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  41. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  42. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  43. package/dist/data/GraphDiagramGroups.js +100 -0
  44. package/dist/data/GraphDiagramGroups.js.map +1 -0
  45. package/dist/data/GraphDiagramNodes.cjs +46 -51
  46. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  47. package/dist/data/GraphDiagramNodes.d.ts +8 -9
  48. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  49. package/dist/data/GraphDiagramNodes.js +46 -51
  50. package/dist/data/GraphDiagramNodes.js.map +1 -1
  51. package/dist/data/JsonView.cjs +118 -49
  52. package/dist/data/JsonView.cjs.map +1 -1
  53. package/dist/data/JsonView.d.ts +13 -10
  54. package/dist/data/JsonView.d.ts.map +1 -1
  55. package/dist/data/JsonView.js +118 -49
  56. package/dist/data/JsonView.js.map +1 -1
  57. package/dist/data/MarkdownEditor.cjs +2 -2
  58. package/dist/data/MarkdownEditor.cjs.map +1 -1
  59. package/dist/data/MarkdownEditor.js +2 -2
  60. package/dist/data/MarkdownEditor.js.map +1 -1
  61. package/dist/data/TreeNode.cjs +1 -1
  62. package/dist/data/TreeNode.cjs.map +1 -1
  63. package/dist/data/TreeNode.d.ts.map +1 -1
  64. package/dist/data/TreeNode.js +1 -1
  65. package/dist/data/TreeNode.js.map +1 -1
  66. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  67. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  69. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  70. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  71. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  72. package/dist/data/ai/ChatButton.cjs +2 -0
  73. package/dist/data/ai/ChatButton.cjs.map +1 -1
  74. package/dist/data/ai/ChatButton.d.ts +1 -1
  75. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  76. package/dist/data/ai/ChatButton.js +2 -0
  77. package/dist/data/ai/ChatButton.js.map +1 -1
  78. package/dist/data/ai/ChatFab.cjs +5 -1
  79. package/dist/data/ai/ChatFab.cjs.map +1 -1
  80. package/dist/data/ai/ChatFab.d.ts +5 -1
  81. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  82. package/dist/data/ai/ChatFab.js +5 -1
  83. package/dist/data/ai/ChatFab.js.map +1 -1
  84. package/dist/data/ai/ChatWindow.cjs +2 -8
  85. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  86. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  87. package/dist/data/ai/ChatWindow.js +2 -8
  88. package/dist/data/ai/ChatWindow.js.map +1 -1
  89. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  90. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  91. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  92. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  93. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  94. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  95. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  96. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  97. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  98. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  99. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  100. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  101. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  102. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  103. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  104. package/dist/data/ai/SessionViewer.cjs +13 -4
  105. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  106. package/dist/data/ai/SessionViewer.d.ts +5 -1
  107. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  108. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  109. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  110. package/dist/data/ai/SessionViewer.header.js +1 -1
  111. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  112. package/dist/data/ai/SessionViewer.js +13 -4
  113. package/dist/data/ai/SessionViewer.js.map +1 -1
  114. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  115. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  116. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  117. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.model.js +2 -0
  119. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  121. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  123. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.rows.js +41 -27
  125. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  127. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  128. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  129. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  130. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  131. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  132. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  133. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  134. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  135. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  136. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  137. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  138. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  139. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  140. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  141. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  142. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  143. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  144. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  146. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  148. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  152. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  153. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  154. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  155. package/dist/data/ai/SessionViewerMenu.js +18 -1
  156. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  157. package/dist/data/ai/ToolPreferences.cjs +149 -143
  158. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  159. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  160. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  161. package/dist/data/ai/ToolPreferences.js +151 -146
  162. package/dist/data/ai/ToolPreferences.js.map +1 -1
  163. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  164. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  165. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  166. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  167. package/dist/data/ai/ToolPreferences.model.js +15 -11
  168. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  169. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  170. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  171. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  172. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  173. package/dist/data/ai/ToolPreferencesList.js +2 -1
  174. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  175. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  176. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  177. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  178. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  179. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  180. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  181. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  182. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  183. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  184. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  185. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  186. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  187. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  188. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  189. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  190. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  191. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  192. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  193. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  194. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  195. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  196. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  197. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  198. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  199. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  200. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  201. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  202. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  203. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  204. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  205. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  206. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  207. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  208. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  209. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  210. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  211. package/dist/data/ai/index.d.ts +2 -2
  212. package/dist/data/ai/index.d.ts.map +1 -1
  213. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  214. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  215. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  216. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  217. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  218. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  219. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  220. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  221. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  222. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  223. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  224. package/dist/data/ai/use-session-token-sizing.js +73 -0
  225. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  226. package/dist/data/call-graph/CallGraph.cjs +269 -0
  227. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  228. package/dist/data/call-graph/CallGraph.d.ts +78 -0
  229. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  230. package/dist/data/call-graph/CallGraph.js +269 -0
  231. package/dist/data/call-graph/CallGraph.js.map +1 -0
  232. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  233. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  234. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  235. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  236. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  237. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  238. package/dist/data/call-graph/CallGraphMembers.cjs +51 -0
  239. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  240. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  241. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  242. package/dist/data/call-graph/CallGraphMembers.js +51 -0
  243. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  244. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  245. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  246. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  247. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  248. package/dist/data/call-graph/CallGraphParts.js +204 -0
  249. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  250. package/dist/data/call-graph/CallGraphToolbar.cjs +198 -0
  251. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  252. package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
  253. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  254. package/dist/data/call-graph/CallGraphToolbar.js +198 -0
  255. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  256. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  257. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  258. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  259. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  260. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  261. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  262. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  263. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  264. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  265. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  266. package/dist/data/call-graph/call-graph-labels.js +96 -0
  267. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  268. package/dist/data/call-graph/call-graph-model.cjs +312 -0
  269. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  270. package/dist/data/call-graph/call-graph-model.d.ts +138 -0
  271. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  272. package/dist/data/call-graph/call-graph-model.js +312 -0
  273. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  274. package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
  275. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  276. package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
  277. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  278. package/dist/data/call-graph/call-graph-vocabulary.js +195 -0
  279. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  280. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  281. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  282. package/dist/data/call-graph/index.d.ts +7 -0
  283. package/dist/data/call-graph/index.d.ts.map +1 -0
  284. package/dist/data/call-graph/types.cjs +5 -0
  285. package/dist/data/call-graph/types.cjs.map +1 -0
  286. package/dist/data/call-graph/types.d.ts +140 -0
  287. package/dist/data/call-graph/types.d.ts.map +1 -0
  288. package/dist/data/call-graph/types.js +5 -0
  289. package/dist/data/call-graph/types.js.map +1 -0
  290. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  291. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  292. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  293. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  294. package/dist/data/call-graph/use-call-graph.js +93 -0
  295. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  296. package/dist/data/chat/Chat.cjs +39 -15
  297. package/dist/data/chat/Chat.cjs.map +1 -1
  298. package/dist/data/chat/Chat.d.ts.map +1 -1
  299. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  300. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  301. package/dist/data/chat/Chat.fixtures.js +2 -2
  302. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  303. package/dist/data/chat/Chat.js +40 -16
  304. package/dist/data/chat/Chat.js.map +1 -1
  305. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  306. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  307. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  308. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  309. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  310. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  311. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  312. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  313. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  314. package/dist/data/chat/ContextMeter.bar.js +5 -8
  315. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  316. package/dist/data/chat/ContextMeter.cjs +18 -19
  317. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  318. package/dist/data/chat/ContextMeter.d.ts +1 -1
  319. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  320. package/dist/data/chat/ContextMeter.js +18 -19
  321. package/dist/data/chat/ContextMeter.js.map +1 -1
  322. package/dist/data/chat/Conversation.cjs +2 -1
  323. package/dist/data/chat/Conversation.cjs.map +1 -1
  324. package/dist/data/chat/Conversation.d.ts +4 -1
  325. package/dist/data/chat/Conversation.d.ts.map +1 -1
  326. package/dist/data/chat/Conversation.js +2 -1
  327. package/dist/data/chat/Conversation.js.map +1 -1
  328. package/dist/data/chat/Message.cjs +39 -12
  329. package/dist/data/chat/Message.cjs.map +1 -1
  330. package/dist/data/chat/Message.d.ts +1 -1
  331. package/dist/data/chat/Message.d.ts.map +1 -1
  332. package/dist/data/chat/Message.js +40 -13
  333. package/dist/data/chat/Message.js.map +1 -1
  334. package/dist/data/chat/ToolCall.cjs +60 -5
  335. package/dist/data/chat/ToolCall.cjs.map +1 -1
  336. package/dist/data/chat/ToolCall.d.ts +7 -2
  337. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  338. package/dist/data/chat/ToolCall.js +60 -5
  339. package/dist/data/chat/ToolCall.js.map +1 -1
  340. package/dist/data/chat/approval.cjs.map +1 -1
  341. package/dist/data/chat/approval.d.ts +2 -2
  342. package/dist/data/chat/approval.d.ts.map +1 -1
  343. package/dist/data/chat/approval.js.map +1 -1
  344. package/dist/data/chat/tool-policy.cjs +59 -2
  345. package/dist/data/chat/tool-policy.cjs.map +1 -1
  346. package/dist/data/chat/tool-policy.d.ts +9 -0
  347. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  348. package/dist/data/chat/tool-policy.js +59 -2
  349. package/dist/data/chat/tool-policy.js.map +1 -1
  350. package/dist/data/chat/types.cjs +6 -0
  351. package/dist/data/chat/types.cjs.map +1 -1
  352. package/dist/data/chat/types.d.ts +13 -4
  353. package/dist/data/chat/types.d.ts.map +1 -1
  354. package/dist/data/chat/types.js +7 -1
  355. package/dist/data/chat/types.js.map +1 -1
  356. package/dist/data/chat/usage-snapshot.cjs +11 -6
  357. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  358. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  359. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  360. package/dist/data/chat/usage-snapshot.js +11 -6
  361. package/dist/data/chat/usage-snapshot.js.map +1 -1
  362. package/dist/data/data-access.cjs +8 -0
  363. package/dist/data/data-access.cjs.map +1 -0
  364. package/dist/data/data-access.d.ts +5 -0
  365. package/dist/data/data-access.d.ts.map +1 -0
  366. package/dist/data/data-access.js +8 -0
  367. package/dist/data/data-access.js.map +1 -0
  368. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  369. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  370. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  371. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  372. package/dist/data/git/GitChangeList.cjs +6 -2
  373. package/dist/data/git/GitChangeList.cjs.map +1 -1
  374. package/dist/data/git/GitChangeList.d.ts +6 -1
  375. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  376. package/dist/data/git/GitChangeList.js +6 -2
  377. package/dist/data/git/GitChangeList.js.map +1 -1
  378. package/dist/data/graph-columns-layout.cjs +61 -14
  379. package/dist/data/graph-columns-layout.cjs.map +1 -1
  380. package/dist/data/graph-columns-layout.d.ts +42 -0
  381. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  382. package/dist/data/graph-columns-layout.js +61 -14
  383. package/dist/data/graph-columns-layout.js.map +1 -1
  384. package/dist/data/graph-diagram-model.cjs +5 -0
  385. package/dist/data/graph-diagram-model.cjs.map +1 -1
  386. package/dist/data/graph-diagram-model.d.ts +24 -0
  387. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  388. package/dist/data/graph-diagram-model.js +5 -0
  389. package/dist/data/graph-diagram-model.js.map +1 -1
  390. package/dist/data/graph-edge-routing.cjs +9 -3
  391. package/dist/data/graph-edge-routing.cjs.map +1 -1
  392. package/dist/data/graph-edge-routing.d.ts +2 -0
  393. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  394. package/dist/data/graph-edge-routing.js +9 -3
  395. package/dist/data/graph-edge-routing.js.map +1 -1
  396. package/dist/data/graph-group-window.cjs +60 -0
  397. package/dist/data/graph-group-window.cjs.map +1 -0
  398. package/dist/data/graph-group-window.d.ts +33 -0
  399. package/dist/data/graph-group-window.d.ts.map +1 -0
  400. package/dist/data/graph-group-window.js +60 -0
  401. package/dist/data/graph-group-window.js.map +1 -0
  402. package/dist/data/json-view/JsonSource.cjs +84 -0
  403. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  404. package/dist/data/json-view/JsonSource.d.ts +7 -0
  405. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  406. package/dist/data/json-view/JsonSource.js +84 -0
  407. package/dist/data/json-view/JsonSource.js.map +1 -0
  408. package/dist/data/json-view/parse-prefix.cjs +132 -0
  409. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  410. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  411. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  412. package/dist/data/json-view/parse-prefix.js +132 -0
  413. package/dist/data/json-view/parse-prefix.js.map +1 -0
  414. package/dist/data/json-view/parse-source.cjs +62 -0
  415. package/dist/data/json-view/parse-source.cjs.map +1 -0
  416. package/dist/data/json-view/parse-source.d.ts +16 -0
  417. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  418. package/dist/data/json-view/parse-source.js +62 -0
  419. package/dist/data/json-view/parse-source.js.map +1 -0
  420. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  421. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  422. package/dist/data/json-view/types.d.ts +14 -0
  423. package/dist/data/json-view/types.d.ts.map +1 -0
  424. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  425. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  426. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  427. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  429. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  430. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  431. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  432. package/dist/data/runtime/RuntimeBar.js +2 -5
  433. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  434. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  435. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  436. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  437. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  438. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  439. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  440. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  441. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  442. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  443. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  444. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  445. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  446. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  447. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  448. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  449. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  450. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  451. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  452. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  453. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  454. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  455. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  456. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  457. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  458. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  459. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  460. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  461. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  462. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  463. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  464. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  465. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  466. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  467. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  468. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  469. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  470. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  471. package/dist/data/use-group-windows.cjs +50 -0
  472. package/dist/data/use-group-windows.cjs.map +1 -0
  473. package/dist/data/use-group-windows.d.ts +27 -0
  474. package/dist/data/use-group-windows.d.ts.map +1 -0
  475. package/dist/data/use-group-windows.js +50 -0
  476. package/dist/data/use-group-windows.js.map +1 -0
  477. package/dist/data/use-pan-zoom.cjs +23 -10
  478. package/dist/data/use-pan-zoom.cjs.map +1 -1
  479. package/dist/data/use-pan-zoom.d.ts +16 -2
  480. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  481. package/dist/data/use-pan-zoom.js +23 -10
  482. package/dist/data/use-pan-zoom.js.map +1 -1
  483. package/dist/data/version-info.cjs +3 -3
  484. package/dist/data/version-info.js +3 -3
  485. package/dist/data.cjs +36 -2
  486. package/dist/data.cjs.map +1 -1
  487. package/dist/data.d.ts +5 -2
  488. package/dist/data.d.ts.map +1 -1
  489. package/dist/data.js +35 -1
  490. package/dist/data.js.map +1 -1
  491. package/dist/hooks/event-hub.cjs +229 -0
  492. package/dist/hooks/event-hub.cjs.map +1 -0
  493. package/dist/hooks/event-hub.d.ts +26 -0
  494. package/dist/hooks/event-hub.d.ts.map +1 -0
  495. package/dist/hooks/event-hub.js +229 -0
  496. package/dist/hooks/event-hub.js.map +1 -0
  497. package/dist/hooks.cjs +2 -0
  498. package/dist/hooks.cjs.map +1 -1
  499. package/dist/hooks.d.ts +1 -0
  500. package/dist/hooks.d.ts.map +1 -1
  501. package/dist/hooks.js +2 -0
  502. package/dist/hooks.js.map +1 -1
  503. package/dist/index.cjs +40 -4
  504. package/dist/index.cjs.map +1 -1
  505. package/dist/index.js +37 -1
  506. package/dist/index.js.map +1 -1
  507. package/dist/layout/Workspace.cjs +13 -4
  508. package/dist/layout/Workspace.cjs.map +1 -1
  509. package/dist/layout/Workspace.d.ts +7 -2
  510. package/dist/layout/Workspace.d.ts.map +1 -1
  511. package/dist/layout/Workspace.js +13 -4
  512. package/dist/layout/Workspace.js.map +1 -1
  513. package/dist/lib/permission-strategies.cjs +71 -11
  514. package/dist/lib/permission-strategies.cjs.map +1 -1
  515. package/dist/lib/permission-strategies.d.ts +3 -0
  516. package/dist/lib/permission-strategies.d.ts.map +1 -1
  517. package/dist/lib/permission-strategies.js +71 -11
  518. package/dist/lib/permission-strategies.js.map +1 -1
  519. package/dist/overlay/modalStack.cjs +13 -6
  520. package/dist/overlay/modalStack.cjs.map +1 -1
  521. package/dist/overlay/modalStack.d.ts.map +1 -1
  522. package/dist/overlay/modalStack.js +13 -6
  523. package/dist/overlay/modalStack.js.map +1 -1
  524. package/dist/styles.css +1 -1
  525. package/package.json +5 -3
  526. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  527. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  528. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  529. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  530. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  531. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  532. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  533. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  534. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  535. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  536. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  537. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -87,7 +87,6 @@ function ChatWindow({
87
87
  const [permissionMode, setPermissionMode] = react.useState(
88
88
  (chat == null ? void 0 : chat.permissionMode) ?? storedPrefs.permissionMode ?? "default"
89
89
  );
90
- const [usage, setUsage] = react.useState(null);
91
90
  const [titleRefresh, setTitleRefresh] = react.useState(0);
92
91
  const [userToolRules, setUserToolRules] = react.useState(
93
92
  storedPrefs.toolRules ?? []
@@ -113,12 +112,10 @@ function ChatWindow({
113
112
  });
114
113
  const {
115
114
  runtime,
116
- temperature,
117
115
  reasoningEfforts,
118
116
  handleRuntimeChange,
119
117
  handleModelChange,
120
118
  handleReasoningEffortChange,
121
- handleTemperatureChange,
122
119
  replaceRuntimeIdentity,
123
120
  replaceRuntime
124
121
  } = ChatWindow_runtime.useChatWindowRuntime({
@@ -140,7 +137,6 @@ function ChatWindow({
140
137
  react.useEffect(() => {
141
138
  setMessageCount(0);
142
139
  setRuntimeBound(false);
143
- setUsage(null);
144
140
  replaceRuntime(preferredRuntimeRef.current);
145
141
  }, [panel.threadId, replaceRuntime]);
146
142
  react.useEffect(() => {
@@ -243,7 +239,6 @@ function ChatWindow({
243
239
  const handleUsage = react.useCallback(
244
240
  (snapshot) => {
245
241
  var _a2;
246
- setUsage(snapshot);
247
242
  setTitleRefresh((value) => value + 1);
248
243
  (_a2 = chat == null ? void 0 : chat.onUsage) == null ? void 0 : _a2.call(chat, snapshot);
249
244
  },
@@ -311,6 +306,8 @@ function ChatWindow({
311
306
  tools: resolvedTools,
312
307
  value: toolPrefs,
313
308
  onRule: handleToolRule,
309
+ rules: userToolRules,
310
+ onRulesChange: setUserToolRules,
314
311
  models: resolvedModels,
315
312
  runtime,
316
313
  onRuntimeChange: handleRuntimeChange,
@@ -318,11 +315,8 @@ function ChatWindow({
318
315
  reasoningEfforts,
319
316
  permissionMode,
320
317
  onPermissionModeChange: handlePermissionModeChange,
321
- temperature,
322
- onTemperatureChange: handleTemperatureChange,
323
318
  budget,
324
319
  onBudgetChange: setBudget,
325
- usage,
326
320
  runtimeLocked,
327
321
  ...sessionsApi ? { costsApi: sessionsApi } : {},
328
322
  ...panel.threadId ? { threadId: panel.threadId } : {},
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.cjs","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 [usage, setUsage] = useState<ChatUsageSummary | null>(null);\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 temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\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 setUsage(null);\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 setUsage(snapshot);\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 models={resolvedModels}\n runtime={runtime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={handlePermissionModeChange}\n temperature={temperature}\n onTemperatureChange={handleTemperatureChange}\n budget={budget}\n onBudgetChange={setBudget}\n usage={usage}\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":["useChatWindowManager","useChatThreadSetup","useState","loadChatPreferences","useChatWindowCatalogs","useChatWindowRuntime","useRef","useEffect","normalizeToolCatalog","saveChatPreferences","useMemo","effectiveToolPolicies","useCallback","withUserRule","chatWindowRequestBody","_a","forkChatSession","jsxs","jsx","ThreadPicker","ToolPreferences","Button","Icon","UiGitBranch","UiAdd","UiFullscreen","UiClose","ContextBadges","ChatThreadSetupStatus","Chat","cn","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"ChatWindow.cjs","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":["useChatWindowManager","useChatThreadSetup","useState","loadChatPreferences","useChatWindowCatalogs","useChatWindowRuntime","useRef","useEffect","normalizeToolCatalog","saveChatPreferences","useMemo","effectiveToolPolicies","useCallback","withUserRule","chatWindowRequestBody","_a","forkChatSession","jsxs","jsx","ThreadPicker","ToolPreferences","Button","Icon","UiGitBranch","UiAdd","UiFullscreen","UiClose","ContextBadges","ChatThreadSetupStatus","Chat","cn","Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EACV,4BAA4B,EAC5B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAa5B;;;oEAGoE;AACpE,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACJ,KAAmB,EACnB,WAAkC,EAClC,aAAa,EACb,iBAAiB,EACjB,KAAK,EACL,iBAAyB,EACzB,QAA4B,EAC5B,WAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,EAAE,eAAe,+BA4cjB;AAED;8DAC8D;AAC9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,+BASpE"}
1
+ {"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EACV,4BAA4B,EAC5B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAa5B;;;oEAGoE;AACpE,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACJ,KAAmB,EACnB,WAAkC,EAClC,aAAa,EACb,iBAAiB,EACjB,KAAK,EACL,iBAAyB,EACzB,QAA4B,EAC5B,WAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,EAAE,eAAe,+BAscjB;AAED;8DAC8D;AAC9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,+BASpE"}
@@ -63,7 +63,6 @@ function ChatWindow({
63
63
  const [permissionMode, setPermissionMode] = useState(
64
64
  (chat == null ? void 0 : chat.permissionMode) ?? storedPrefs.permissionMode ?? "default"
65
65
  );
66
- const [usage, setUsage] = useState(null);
67
66
  const [titleRefresh, setTitleRefresh] = useState(0);
68
67
  const [userToolRules, setUserToolRules] = useState(
69
68
  storedPrefs.toolRules ?? []
@@ -89,12 +88,10 @@ function ChatWindow({
89
88
  });
90
89
  const {
91
90
  runtime,
92
- temperature,
93
91
  reasoningEfforts,
94
92
  handleRuntimeChange,
95
93
  handleModelChange,
96
94
  handleReasoningEffortChange,
97
- handleTemperatureChange,
98
95
  replaceRuntimeIdentity,
99
96
  replaceRuntime
100
97
  } = useChatWindowRuntime({
@@ -116,7 +113,6 @@ function ChatWindow({
116
113
  useEffect(() => {
117
114
  setMessageCount(0);
118
115
  setRuntimeBound(false);
119
- setUsage(null);
120
116
  replaceRuntime(preferredRuntimeRef.current);
121
117
  }, [panel.threadId, replaceRuntime]);
122
118
  useEffect(() => {
@@ -219,7 +215,6 @@ function ChatWindow({
219
215
  const handleUsage = useCallback(
220
216
  (snapshot) => {
221
217
  var _a2;
222
- setUsage(snapshot);
223
218
  setTitleRefresh((value) => value + 1);
224
219
  (_a2 = chat == null ? void 0 : chat.onUsage) == null ? void 0 : _a2.call(chat, snapshot);
225
220
  },
@@ -287,6 +282,8 @@ function ChatWindow({
287
282
  tools: resolvedTools,
288
283
  value: toolPrefs,
289
284
  onRule: handleToolRule,
285
+ rules: userToolRules,
286
+ onRulesChange: setUserToolRules,
290
287
  models: resolvedModels,
291
288
  runtime,
292
289
  onRuntimeChange: handleRuntimeChange,
@@ -294,11 +291,8 @@ function ChatWindow({
294
291
  reasoningEfforts,
295
292
  permissionMode,
296
293
  onPermissionModeChange: handlePermissionModeChange,
297
- temperature,
298
- onTemperatureChange: handleTemperatureChange,
299
294
  budget,
300
295
  onBudgetChange: setBudget,
301
- usage,
302
296
  runtimeLocked,
303
297
  ...sessionsApi ? { costsApi: sessionsApi } : {},
304
298
  ...panel.threadId ? { threadId: panel.threadId } : {},
@@ -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 [usage, setUsage] = useState<ChatUsageSummary | null>(null);\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 temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\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 setUsage(null);\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 setUsage(snapshot);\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 models={resolvedModels}\n runtime={runtime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n permissionMode={permissionMode}\n onPermissionModeChange={handlePermissionModeChange}\n temperature={temperature}\n onTemperatureChange={handleTemperatureChange}\n budget={budget}\n onBudgetChange={setBudget}\n usage={usage}\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 { 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":";;;;;;;;;;;;;;;;;;;;;;;AAkDA,MAAM,cAA0B,CAAA;AAEhC,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAad,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,EAAE,aAAa,YAAY,cAAc,eAAe,UAAA,IAC5D,qBAAA;AACF,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,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,CAAA,CAAE;AAEL,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,qBAAC,OAAA,EAAI,WAAU,uGACZ,UAAA;AAAA,IAAA,iBAAiB,QAAQ,gBAAgB,OACxC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU,MAAM;AAAA,QAChB,UAAU,CAAC,QAAQ,YAAY,MAAM,IAAI,EAAE,UAAU,KAAK;AAAA,QAC1D,OAAO,MAAM,YAAY,MAAM,IAAI,EAAE,UAAU,MAAM;AAAA,QACrD,cAAc;AAAA,QACb,GAAI,gBACD,EAAE,QAAQ,cAAA,IACV,gBAAgB,OACd,EAAE,KAAK,gBACP,CAAA;AAAA,MAAC;AAAA,IAAA,IAGT,oBAAC,QAAA,EAAK,WAAU,4BAA4B,UAAA,OAAM;AAAA,IAEpD,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,IACvB;AAAA,IACD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,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,QACC,GAAI,cAAc,EAAE,UAAU,YAAA,IAAgB,CAAA;AAAA,QAC9C,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,QACrD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjB,eACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,OACE,iBAAiB,IACb,oDACA;AAAA,QAEN,UAAU,CAAC,MAAM,YAAY,iBAAiB,KAAK;AAAA,QACnD,SAAS,MAAM,KAAK,WAAA;AAAA,QAEpB,UAAA,oBAAC,MAAA,EAAK,MAAM,aAAa,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAGhD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,OAAM;AAAA,QACN,SAAS,MAAM,UAAA;AAAA,QAEf,UAAA,oBAAC,MAAA,EAAK,MAAM,OAAO,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAExC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,OAAO,MAAM,YAAY,YAAY;AAAA,QACrC,SAAS,MAAM,cAAc,MAAM,EAAE;AAAA,QAErC,UAAA,oBAAC,MAAA,EAAK,MAAM,cAAc,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAE/C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,OAAM;AAAA,QACN,SAAS,MAAM,WAAW,MAAM,EAAE;AAAA,QAElC,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1C,GACF;AAGF,QAAM,QACJ,qBAAC,OAAA,EAAI,WAAU,gGACZ,UAAA;AAAA,IAAA;AAAA,KACC,uBAAuB,MAAM,aAAa,SAAS,MACnD,qBAAC,OAAA,EAAI,WAAU,0EACZ,UAAA;AAAA,MAAA,2DAAsB;AAAA,QACrB,OAAO,MAAM;AAAA,QACb,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,MAEb;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU;AAAA,UACV,WAAU;AAAA,UACT,GAAI,oBAAoB,EAAE,YAAY,sBAAsB,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IAChE,GACF;AAAA,IAEF,oBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA,YAAY,UACX,oBAAC,uBAAA,EAAsB,OAAO,YAAA,CAAa,IAE3C;AAAA,MAAC;AAAA,MAAA;AAAA,QAEE,GAAG;AAAA,QACH,GAAI,eAAe,SAChB,EAAE,QAAQ,gBAAgB,WAAW,KAAA,IACrC,CAAA;AAAA,QACJ;AAAA,QACC,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC7C;AAAA,QACA,iBAAiB;AAAA,QACjB,eAAe;AAAA,QACf,yBAAyB;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,sBAAsB;AAAA,QACtB,mBAAmB;AAAA,QAClB,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAA,IAAa,CAAA;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,QACN,GAAI,gBAAgB,EAAE,cAAA,IAAkB,CAAA;AAAA,QACzC,MAAM;AAAA,QACN;AAAA,QACA,yBAAyB;AAAA,QACzB;AAAA,QACA,2BAA2B;AAAA,MAAA;AAAA,MAxBtB,MAAM,YAAY,OAAO,MAAM,EAAE;AAAA,IAAA,EAyBxC,CAEJ;AAAA,EAAA,GACF;AAGF,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,MAAM,YAAY,2BAA2B;AAAA,EAAA;AAK/C,MAAI,CAAC,KAAK;AACR,WACE,oBAAC,SAAI,WAAW,YAAY,OAAO,EAAE,QAAQ,MAAM,OAAA,GACjD,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OACE,MAAM,YACF,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,WAC/C;AAAA,UACE,UAAU;AAAA,UACV,MAAM,MAAM;AAAA,UACZ,KAAK,MAAM;AAAA,UACX,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAIrB,UAAA;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAW,YAAY,OAAO,EAAE,QAAQ,MAAM,OAAA,GACjD,UAAA;AAAA,IAAA,oBAAC,WAAO,UAAA,aAAA,CAAa;AAAA,IACrB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,UACP,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,UACT,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,QAAA;AAAA,QAEhB,OAAO,EAAE,eAAe,OAAA;AAAA,QACxB,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,CAAC;AAAA,QAC3D,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,cAAc,EAAE,CAAC;AAAA,QAC7D,QAAO;AAAA,QACP,qBAAoB;AAAA,QACpB,iBAAiB,MAAM;AAAA,QACvB,gBAAgB,CAAC,MAAM;AAAA,QACvB,aAAa,MAAM,aAAa,MAAM,EAAE;AAAA,QACxC,YAAY,CAAC,IAAI,MAAM,YAAY,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG;AAAA,QAC/D,cAAc,CAAC,IAAI,MAAM,KAAK,QAAQ,QACpC,YAAY,MAAM,IAAI;AAAA,UACpB,OAAO,IAAI;AAAA,UACX,QAAQ,IAAI;AAAA,UACZ,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,QAAA,CACR;AAAA,QAGF,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAIO,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;"}
@@ -99,9 +99,6 @@ function useChatWindowRuntime({
99
99
  },
100
100
  [chat]
101
101
  );
102
- const handleTemperatureChange = react.useCallback((next) => {
103
- setRuntime((current) => Chat_runtime.withRuntimeField(current, "temperature", next));
104
- }, []);
105
102
  const replaceRuntimeIdentity = react.useCallback((identity) => {
106
103
  setRuntime((current) => {
107
104
  const next = { ...current };
@@ -120,12 +117,10 @@ function useChatWindowRuntime({
120
117
  runtime,
121
118
  model,
122
119
  reasoningEffort,
123
- temperature: runtime.temperature,
124
120
  reasoningEfforts,
125
121
  handleRuntimeChange,
126
122
  handleModelChange,
127
123
  handleReasoningEffortChange,
128
- handleTemperatureChange,
129
124
  replaceRuntimeIdentity,
130
125
  replaceRuntime
131
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.runtime.cjs","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const handleTemperatureChange = useCallback((next: number | undefined) => {\n setRuntime((current) => withRuntimeField(current, \"temperature\", next));\n }, []);\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n if (identity.model) next.model = identity.model;\n if (identity.mode) next.mode = identity.mode;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n temperature: runtime.temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","useState","resolveChatRuntime","useEffect","selectedChatModel","selectConfiguredChatModel","useCallback","withRuntimeField"],"mappings":"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"}
1
+ {"version":3,"file":"ChatWindow.runtime.cjs","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n if (identity.model) next.model = identity.model;\n if (identity.mode) next.mode = identity.mode;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","useState","resolveChatRuntime","useEffect","selectedChatModel","selectConfiguredChatModel","useCallback","withRuntimeField"],"mappings":"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"}
@@ -10,12 +10,10 @@ export declare function useChatWindowRuntime({ chat, initialModel, models, store
10
10
  runtime: ChatModelRuntime;
11
11
  model: string | undefined;
12
12
  reasoningEffort: string;
13
- temperature: number | undefined;
14
13
  reasoningEfforts: string[];
15
14
  handleRuntimeChange: (next: ChatModelRuntime) => void;
16
15
  handleModelChange: (next: string) => void;
17
16
  handleReasoningEffortChange: (next: string) => void;
18
- handleTemperatureChange: (next: number | undefined) => void;
19
17
  replaceRuntimeIdentity: (identity: ChatModelRuntime) => void;
20
18
  replaceRuntime: (next: ChatModelRuntime) => void;
21
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.runtime.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjE,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,GACd,EAAE,wBAAwB;;;;;;gCA4DhB,gBAAgB;8BAOhB,MAAM;wCA6BN,MAAM;oCAMoC,MAAM,GAAG,SAAS;uCAGf,gBAAgB;2BAW5B,gBAAgB;EAiB3D"}
1
+ {"version":3,"file":"ChatWindow.runtime.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjE,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,GACd,EAAE,wBAAwB;;;;;gCA4DhB,gBAAgB;8BAOhB,MAAM;wCA6BN,MAAM;uCAMuC,gBAAgB;2BAW5B,gBAAgB;EAe3D"}
@@ -97,9 +97,6 @@ function useChatWindowRuntime({
97
97
  },
98
98
  [chat]
99
99
  );
100
- const handleTemperatureChange = useCallback((next) => {
101
- setRuntime((current) => withRuntimeField(current, "temperature", next));
102
- }, []);
103
100
  const replaceRuntimeIdentity = useCallback((identity) => {
104
101
  setRuntime((current) => {
105
102
  const next = { ...current };
@@ -118,12 +115,10 @@ function useChatWindowRuntime({
118
115
  runtime,
119
116
  model,
120
117
  reasoningEffort,
121
- temperature: runtime.temperature,
122
118
  reasoningEfforts,
123
119
  handleRuntimeChange,
124
120
  handleModelChange,
125
121
  handleReasoningEffortChange,
126
- handleTemperatureChange,
127
122
  replaceRuntimeIdentity,
128
123
  replaceRuntime
129
124
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const handleTemperatureChange = useCallback((next: number | undefined) => {\n setRuntime((current) => withRuntimeField(current, \"temperature\", next));\n }, []);\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n if (identity.model) next.model = identity.model;\n if (identity.mode) next.mode = identity.mode;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n temperature: runtime.temperature,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n handleTemperatureChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatWindow.runtime.js","sources":["../../../src/data/ai/ChatWindow.runtime.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\nimport type { ChatProps } from \"../chat/Chat\";\nimport {\n resolveChatRuntime,\n selectedChatModel,\n withRuntimeField,\n} from \"../chat/Chat.runtime\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { selectConfiguredChatModel } from \"./ChatWindow.models\";\n\nexport type ChatWindowRuntimeOptions = {\n chat?: Partial<ChatProps> | undefined;\n initialModel?: string | null | undefined;\n models: ChatModel[];\n storedRuntime?: ChatModelRuntime | undefined;\n};\n\nexport function useChatWindowRuntime({\n chat,\n initialModel,\n models,\n storedRuntime,\n}: ChatWindowRuntimeOptions) {\n const reasoningEfforts = chat?.reasoningEfforts ?? DEFAULT_REASONING_EFFORTS;\n const [runtime, setRuntime] = useState<ChatModelRuntime>(() =>\n resolveChatRuntime({\n models,\n current: chat?.runtime ?? chat?.defaultRuntime ?? storedRuntime,\n preferredModel:\n initialModel ??\n chat?.model ??\n (chat?.runtime || chat?.defaultRuntime || storedRuntime\n ? undefined\n : chat?.defaultModel),\n effort: chat?.reasoningEffort ?? chat?.defaultReasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n }),\n );\n\n useEffect(() => {\n if (chat?.runtime) {\n setRuntime(chat.runtime);\n return;\n }\n setRuntime((current) => {\n const currentModel = selectedChatModel(models, current)?.id;\n const preferred =\n initialModel ??\n chat?.model ??\n currentModel ??\n current.id ??\n current.model ??\n chat?.defaultModel;\n const configured = models.length\n ? selectConfiguredChatModel(preferred, models)\n : preferred;\n return resolveChatRuntime({\n models,\n current,\n preferredModel: configured,\n effort: chat?.reasoningEffort,\n temperature: chat?.temperature,\n reasoningEfforts,\n });\n });\n }, [\n chat?.defaultModel,\n chat?.model,\n chat?.reasoningEffort,\n chat?.runtime,\n chat?.temperature,\n initialModel,\n models,\n reasoningEfforts,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const model = selectedModel?.id ?? runtime.id ?? runtime.model;\n const reasoningEffort = runtime.effort ?? \"\";\n\n const handleRuntimeChange = useCallback(\n (next: ChatModelRuntime) => {\n setRuntime(next);\n chat?.onRuntimeChange?.(next);\n },\n [chat],\n );\n const handleModelChange = useCallback(\n (next: string) => {\n setRuntime((current) => {\n if (!next) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n undefined,\n );\n }\n const selected = models.find((candidate) => candidate.id === next);\n if (!selected) {\n return withRuntimeField(\n withRuntimeField(current, \"id\", undefined),\n \"model\",\n next,\n );\n }\n return resolveChatRuntime({\n models,\n current,\n preferredModel: selected.id,\n reasoningEfforts,\n });\n });\n chat?.onModelChange?.(next);\n },\n [chat, models, reasoningEfforts],\n );\n const handleReasoningEffortChange = useCallback(\n (next: string) => {\n setRuntime((current) => withRuntimeField(current, \"effort\", next));\n chat?.onReasoningEffortChange?.(next);\n },\n [chat],\n );\n const replaceRuntimeIdentity = useCallback((identity: ChatModelRuntime) => {\n setRuntime((current) => {\n const next: ChatModelRuntime = { ...current };\n delete next.id;\n delete next.mode;\n delete next.model;\n if (identity.model) next.model = identity.model;\n if (identity.mode) next.mode = identity.mode;\n return next;\n });\n }, []);\n const replaceRuntime = useCallback((next: ChatModelRuntime) => {\n setRuntime(next);\n }, []);\n\n return {\n runtime,\n model,\n reasoningEffort,\n reasoningEfforts,\n handleRuntimeChange,\n handleModelChange,\n handleReasoningEffortChange,\n replaceRuntimeIdentity,\n replaceRuntime,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -58,8 +58,8 @@ function permissionField({
58
58
  id: "permissions.mode",
59
59
  isSet: current !== void 0,
60
60
  label: PERMISSION_GROUP,
61
- icon: UiShield.UiShield,
62
- iconClassName: "text-muted-foreground",
61
+ icon: (currentVisual == null ? void 0 : currentVisual.icon) ?? UiShield.UiShield,
62
+ iconClassName: unpublished ? "text-destructive" : currentVisual ? sessionTones.sessionTone(currentVisual.tone).text : "text-muted-foreground",
63
63
  title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? unspecified.UNSPECIFIED_NAME}`,
64
64
  caption: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
65
65
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn(RuntimeBarSegment.SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),