@flanksource/clicky-ui 0.3.43 → 0.3.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/README.md +2 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/CodeBlock.cjs +3 -2
  16. package/dist/data/CodeBlock.cjs.map +1 -1
  17. package/dist/data/CodeBlock.d.ts +3 -1
  18. package/dist/data/CodeBlock.d.ts.map +1 -1
  19. package/dist/data/CodeBlock.js +3 -2
  20. package/dist/data/CodeBlock.js.map +1 -1
  21. package/dist/data/CodeLine.cjs +22 -0
  22. package/dist/data/CodeLine.cjs.map +1 -0
  23. package/dist/data/CodeLine.d.ts +8 -0
  24. package/dist/data/CodeLine.d.ts.map +1 -0
  25. package/dist/data/CodeLine.js +22 -0
  26. package/dist/data/CodeLine.js.map +1 -0
  27. package/dist/data/GraphDiagram.cjs +18 -6
  28. package/dist/data/GraphDiagram.cjs.map +1 -1
  29. package/dist/data/GraphDiagram.d.ts +9 -1
  30. package/dist/data/GraphDiagram.d.ts.map +1 -1
  31. package/dist/data/GraphDiagram.js +18 -6
  32. package/dist/data/GraphDiagram.js.map +1 -1
  33. package/dist/data/GraphDiagramNodes.cjs +38 -29
  34. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  35. package/dist/data/GraphDiagramNodes.d.ts +8 -2
  36. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  37. package/dist/data/GraphDiagramNodes.js +38 -29
  38. package/dist/data/GraphDiagramNodes.js.map +1 -1
  39. package/dist/data/JsonView.cjs +118 -49
  40. package/dist/data/JsonView.cjs.map +1 -1
  41. package/dist/data/JsonView.d.ts +13 -10
  42. package/dist/data/JsonView.d.ts.map +1 -1
  43. package/dist/data/JsonView.js +118 -49
  44. package/dist/data/JsonView.js.map +1 -1
  45. package/dist/data/MarkdownEditor.cjs +2 -2
  46. package/dist/data/MarkdownEditor.cjs.map +1 -1
  47. package/dist/data/MarkdownEditor.js +2 -2
  48. package/dist/data/MarkdownEditor.js.map +1 -1
  49. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  50. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  51. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  52. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  53. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  54. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  55. package/dist/data/ai/ChatButton.cjs +2 -0
  56. package/dist/data/ai/ChatButton.cjs.map +1 -1
  57. package/dist/data/ai/ChatButton.d.ts +1 -1
  58. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  59. package/dist/data/ai/ChatButton.js +2 -0
  60. package/dist/data/ai/ChatButton.js.map +1 -1
  61. package/dist/data/ai/ChatFab.cjs +5 -1
  62. package/dist/data/ai/ChatFab.cjs.map +1 -1
  63. package/dist/data/ai/ChatFab.d.ts +5 -1
  64. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  65. package/dist/data/ai/ChatFab.js +5 -1
  66. package/dist/data/ai/ChatFab.js.map +1 -1
  67. package/dist/data/ai/ChatWindow.cjs +2 -8
  68. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  69. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  70. package/dist/data/ai/ChatWindow.js +2 -8
  71. package/dist/data/ai/ChatWindow.js.map +1 -1
  72. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  73. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  74. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  75. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  76. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  77. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  78. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  79. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  80. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  81. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  82. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  83. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  84. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  85. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  86. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  87. package/dist/data/ai/SessionViewer.cjs +13 -4
  88. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  89. package/dist/data/ai/SessionViewer.d.ts +5 -1
  90. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  91. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  92. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.header.js +1 -1
  94. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  95. package/dist/data/ai/SessionViewer.js +13 -4
  96. package/dist/data/ai/SessionViewer.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  98. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  100. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  101. package/dist/data/ai/SessionViewer.model.js +2 -0
  102. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  103. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  104. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  105. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  106. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  107. package/dist/data/ai/SessionViewer.rows.js +41 -27
  108. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  109. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  110. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  111. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  112. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  113. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  114. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  115. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  116. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  117. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  118. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  119. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  120. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  121. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  122. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  123. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  125. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  127. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  128. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  129. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  130. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  131. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  132. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  133. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  134. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  135. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  136. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  137. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  138. package/dist/data/ai/SessionViewerMenu.js +18 -1
  139. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  140. package/dist/data/ai/ToolPreferences.cjs +149 -143
  141. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  142. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  143. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  144. package/dist/data/ai/ToolPreferences.js +151 -146
  145. package/dist/data/ai/ToolPreferences.js.map +1 -1
  146. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  147. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  148. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  149. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  150. package/dist/data/ai/ToolPreferences.model.js +15 -11
  151. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  152. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  153. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  154. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  155. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  156. package/dist/data/ai/ToolPreferencesList.js +2 -1
  157. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  158. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  159. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  160. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  161. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  162. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  163. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  164. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  165. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  166. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  167. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  168. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  169. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  170. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  171. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  172. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  173. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  174. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  175. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  176. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  177. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  178. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  179. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  180. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  181. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  182. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  183. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  184. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  185. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  186. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  187. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  188. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  189. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  190. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  191. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  192. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  193. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  194. package/dist/data/ai/index.d.ts +2 -2
  195. package/dist/data/ai/index.d.ts.map +1 -1
  196. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  197. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  198. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  199. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  200. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  201. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  202. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  203. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  204. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  205. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  206. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  207. package/dist/data/ai/use-session-token-sizing.js +73 -0
  208. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  209. package/dist/data/call-graph/CallGraph.cjs +250 -0
  210. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  211. package/dist/data/call-graph/CallGraph.d.ts +69 -0
  212. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  213. package/dist/data/call-graph/CallGraph.js +250 -0
  214. package/dist/data/call-graph/CallGraph.js.map +1 -0
  215. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  216. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  217. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  218. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  219. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  220. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  221. package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
  222. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  223. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  224. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  225. package/dist/data/call-graph/CallGraphMembers.js +50 -0
  226. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  227. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  228. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  229. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  230. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  231. package/dist/data/call-graph/CallGraphParts.js +204 -0
  232. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  233. package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
  234. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  235. package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
  236. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  237. package/dist/data/call-graph/CallGraphToolbar.js +186 -0
  238. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  239. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  240. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  241. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  242. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  243. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  244. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  245. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  246. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  247. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  248. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  249. package/dist/data/call-graph/call-graph-labels.js +96 -0
  250. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  251. package/dist/data/call-graph/call-graph-model.cjs +161 -0
  252. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  253. package/dist/data/call-graph/call-graph-model.d.ts +102 -0
  254. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  255. package/dist/data/call-graph/call-graph-model.js +161 -0
  256. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  257. package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
  258. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  259. package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
  260. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  261. package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
  262. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  263. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  264. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  265. package/dist/data/call-graph/index.d.ts +7 -0
  266. package/dist/data/call-graph/index.d.ts.map +1 -0
  267. package/dist/data/call-graph/types.cjs +5 -0
  268. package/dist/data/call-graph/types.cjs.map +1 -0
  269. package/dist/data/call-graph/types.d.ts +135 -0
  270. package/dist/data/call-graph/types.d.ts.map +1 -0
  271. package/dist/data/call-graph/types.js +5 -0
  272. package/dist/data/call-graph/types.js.map +1 -0
  273. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  274. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  275. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  276. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  277. package/dist/data/call-graph/use-call-graph.js +93 -0
  278. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  279. package/dist/data/chat/Chat.cjs +39 -15
  280. package/dist/data/chat/Chat.cjs.map +1 -1
  281. package/dist/data/chat/Chat.d.ts.map +1 -1
  282. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  283. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  284. package/dist/data/chat/Chat.fixtures.js +2 -2
  285. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  286. package/dist/data/chat/Chat.js +40 -16
  287. package/dist/data/chat/Chat.js.map +1 -1
  288. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  289. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  290. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  291. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  292. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  293. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  294. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  295. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  296. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  297. package/dist/data/chat/ContextMeter.bar.js +5 -8
  298. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  299. package/dist/data/chat/ContextMeter.cjs +18 -19
  300. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  301. package/dist/data/chat/ContextMeter.d.ts +1 -1
  302. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  303. package/dist/data/chat/ContextMeter.js +18 -19
  304. package/dist/data/chat/ContextMeter.js.map +1 -1
  305. package/dist/data/chat/Conversation.cjs +2 -1
  306. package/dist/data/chat/Conversation.cjs.map +1 -1
  307. package/dist/data/chat/Conversation.d.ts +4 -1
  308. package/dist/data/chat/Conversation.d.ts.map +1 -1
  309. package/dist/data/chat/Conversation.js +2 -1
  310. package/dist/data/chat/Conversation.js.map +1 -1
  311. package/dist/data/chat/Message.cjs +39 -12
  312. package/dist/data/chat/Message.cjs.map +1 -1
  313. package/dist/data/chat/Message.d.ts +1 -1
  314. package/dist/data/chat/Message.d.ts.map +1 -1
  315. package/dist/data/chat/Message.js +40 -13
  316. package/dist/data/chat/Message.js.map +1 -1
  317. package/dist/data/chat/ToolCall.cjs +60 -5
  318. package/dist/data/chat/ToolCall.cjs.map +1 -1
  319. package/dist/data/chat/ToolCall.d.ts +7 -2
  320. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  321. package/dist/data/chat/ToolCall.js +60 -5
  322. package/dist/data/chat/ToolCall.js.map +1 -1
  323. package/dist/data/chat/approval.cjs.map +1 -1
  324. package/dist/data/chat/approval.d.ts +2 -2
  325. package/dist/data/chat/approval.d.ts.map +1 -1
  326. package/dist/data/chat/approval.js.map +1 -1
  327. package/dist/data/chat/tool-policy.cjs +59 -2
  328. package/dist/data/chat/tool-policy.cjs.map +1 -1
  329. package/dist/data/chat/tool-policy.d.ts +9 -0
  330. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  331. package/dist/data/chat/tool-policy.js +59 -2
  332. package/dist/data/chat/tool-policy.js.map +1 -1
  333. package/dist/data/chat/types.cjs +6 -0
  334. package/dist/data/chat/types.cjs.map +1 -1
  335. package/dist/data/chat/types.d.ts +13 -4
  336. package/dist/data/chat/types.d.ts.map +1 -1
  337. package/dist/data/chat/types.js +7 -1
  338. package/dist/data/chat/types.js.map +1 -1
  339. package/dist/data/chat/usage-snapshot.cjs +11 -6
  340. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  341. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  342. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  343. package/dist/data/chat/usage-snapshot.js +11 -6
  344. package/dist/data/chat/usage-snapshot.js.map +1 -1
  345. package/dist/data/diagnostics/RenderedStackTrace.cjs +2 -1
  346. package/dist/data/diagnostics/RenderedStackTrace.cjs.map +1 -1
  347. package/dist/data/diagnostics/RenderedStackTrace.d.ts +3 -1
  348. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -1
  349. package/dist/data/diagnostics/RenderedStackTrace.js +2 -1
  350. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -1
  351. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  352. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  353. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  354. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  355. package/dist/data/graph-columns-layout.cjs +26 -10
  356. package/dist/data/graph-columns-layout.cjs.map +1 -1
  357. package/dist/data/graph-columns-layout.d.ts +8 -0
  358. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  359. package/dist/data/graph-columns-layout.js +26 -10
  360. package/dist/data/graph-columns-layout.js.map +1 -1
  361. package/dist/data/graph-diagram-model.cjs.map +1 -1
  362. package/dist/data/graph-diagram-model.d.ts +5 -0
  363. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  364. package/dist/data/graph-diagram-model.js.map +1 -1
  365. package/dist/data/graph-edge-routing.cjs +9 -3
  366. package/dist/data/graph-edge-routing.cjs.map +1 -1
  367. package/dist/data/graph-edge-routing.d.ts +2 -0
  368. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  369. package/dist/data/graph-edge-routing.js +9 -3
  370. package/dist/data/graph-edge-routing.js.map +1 -1
  371. package/dist/data/json-view/JsonSource.cjs +84 -0
  372. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  373. package/dist/data/json-view/JsonSource.d.ts +7 -0
  374. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  375. package/dist/data/json-view/JsonSource.js +84 -0
  376. package/dist/data/json-view/JsonSource.js.map +1 -0
  377. package/dist/data/json-view/parse-prefix.cjs +132 -0
  378. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  379. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  380. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  381. package/dist/data/json-view/parse-prefix.js +132 -0
  382. package/dist/data/json-view/parse-prefix.js.map +1 -0
  383. package/dist/data/json-view/parse-source.cjs +62 -0
  384. package/dist/data/json-view/parse-source.cjs.map +1 -0
  385. package/dist/data/json-view/parse-source.d.ts +16 -0
  386. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  387. package/dist/data/json-view/parse-source.js +62 -0
  388. package/dist/data/json-view/parse-source.js.map +1 -0
  389. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  390. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  391. package/dist/data/json-view/types.d.ts +14 -0
  392. package/dist/data/json-view/types.d.ts.map +1 -0
  393. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  394. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  395. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  396. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  397. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  398. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  399. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  400. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  401. package/dist/data/runtime/RuntimeBar.js +2 -5
  402. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  403. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  404. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  405. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  406. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  407. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  408. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  409. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  410. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  411. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  412. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  413. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  414. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  415. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  416. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  417. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  418. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  419. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  420. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  421. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  422. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  423. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  424. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  425. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  426. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  427. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  429. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  430. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  431. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  432. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  433. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  434. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  435. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  436. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  437. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  438. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  439. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  440. package/dist/data/use-pan-zoom.cjs +23 -10
  441. package/dist/data/use-pan-zoom.cjs.map +1 -1
  442. package/dist/data/use-pan-zoom.d.ts +16 -2
  443. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  444. package/dist/data/use-pan-zoom.js +23 -10
  445. package/dist/data/use-pan-zoom.js.map +1 -1
  446. package/dist/data/version-info.cjs +3 -3
  447. package/dist/data/version-info.js +3 -3
  448. package/dist/data.cjs +28 -2
  449. package/dist/data.cjs.map +1 -1
  450. package/dist/data.d.ts +2 -0
  451. package/dist/data.d.ts.map +1 -1
  452. package/dist/data.js +26 -0
  453. package/dist/data.js.map +1 -1
  454. package/dist/index.cjs +30 -4
  455. package/dist/index.cjs.map +1 -1
  456. package/dist/index.js +26 -0
  457. package/dist/index.js.map +1 -1
  458. package/dist/layout/Workspace.cjs +13 -4
  459. package/dist/layout/Workspace.cjs.map +1 -1
  460. package/dist/layout/Workspace.d.ts +7 -2
  461. package/dist/layout/Workspace.d.ts.map +1 -1
  462. package/dist/layout/Workspace.js +13 -4
  463. package/dist/layout/Workspace.js.map +1 -1
  464. package/dist/lib/permission-strategies.cjs +71 -11
  465. package/dist/lib/permission-strategies.cjs.map +1 -1
  466. package/dist/lib/permission-strategies.d.ts +3 -0
  467. package/dist/lib/permission-strategies.d.ts.map +1 -1
  468. package/dist/lib/permission-strategies.js +71 -11
  469. package/dist/lib/permission-strategies.js.map +1 -1
  470. package/dist/styles.css +1 -1
  471. package/package.json +5 -3
  472. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  473. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  474. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  475. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  476. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  477. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  478. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  479. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  480. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  481. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  482. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  483. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -1,10 +1,12 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { Button } from "../../components/button.js";
3
3
  import { cn } from "../../lib/utils.js";
4
- import { ProviderStatusPanel } from "../runtime/ProviderStatusPanel.js";
4
+ import { Icon } from "../Icon.js";
5
5
  import { RuntimeBar } from "../runtime/RuntimeBar.js";
6
- import { SPEC_RUNTIME_FAMILIES } from "../runtime/runtime-mode.js";
6
+ import { SegmentItemLabel, SEGMENT_KEY_CLASS, SEGMENT_CAPTION_CLASS } from "../runtime/RuntimeBarSegment.js";
7
7
  import { CLAUDE_PERMISSION_MODE_OPTIONS } from "../chat/types.js";
8
+ import { sessionTone } from "./session-tones.js";
9
+ import { permissionModeVisual } from "./SpecRuntimeEditor/permission-mode-visuals.js";
8
10
  function AdvancedChatConfig({
9
11
  models,
10
12
  runtime,
@@ -14,277 +16,116 @@ function AdvancedChatConfig({
14
16
  runtimeLocked = false,
15
17
  permissionMode,
16
18
  onPermissionModeChange,
17
- temperature,
18
- onTemperatureChange,
19
19
  budget,
20
20
  onBudgetChange,
21
- usage,
22
21
  catalogLoading = false,
23
22
  catalogError = null,
24
23
  onCatalogRetry
25
24
  }) {
26
- const updateBudget = (key, raw) => {
27
- const next = { ...budget };
28
- const parsed = parseOptionalNumber(raw, key === "maxTokens");
29
- if (parsed === void 0) delete next[key];
30
- else next[key] = parsed;
31
- onBudgetChange == null ? void 0 : onBudgetChange(next);
25
+ const barValue = {
26
+ ...runtime,
27
+ ...(budget == null ? void 0 : budget.cost) !== void 0 ? { budget: { cost: budget.cost } } : {}
32
28
  };
33
- return /* @__PURE__ */ jsxs("div", { className: "grid min-h-0 flex-1 gap-4 overflow-y-auto lg:grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)]", children: [
34
- /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
35
- /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
36
- /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Runtime" }),
37
- runtimeLocked && /* @__PURE__ */ jsx("div", { className: "rounded border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground", children: "Model and backend are locked after the first message. Fork this conversation to change them; effort and generation settings remain adjustable." }),
38
- catalogLoading && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Checking model and runtime availability…" }),
39
- catalogError && /* @__PURE__ */ jsxs(
40
- "div",
41
- {
42
- role: "alert",
43
- className: "flex items-center justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",
44
- children: [
45
- /* @__PURE__ */ jsx("span", { children: catalogError }),
46
- onCatalogRetry && /* @__PURE__ */ jsx(
47
- Button,
48
- {
49
- type: "button",
50
- size: "sm",
51
- variant: "outline",
52
- onClick: onCatalogRetry,
53
- children: "Retry"
54
- }
55
- )
56
- ]
57
- }
58
- ),
59
- /* @__PURE__ */ jsx(
60
- RuntimeBar,
61
- {
62
- variant: "segmented",
63
- ariaLabel: "Advanced runtime",
64
- value: runtime,
65
- onChange: (next) => onRuntimeChange == null ? void 0 : onRuntimeChange(next),
66
- models,
67
- reasoningEfforts,
68
- locked: runtimeLocked,
69
- ...runtimeFamilies ? { families: runtimeFamilies } : {},
70
- className: "max-w-full"
71
- }
72
- ),
73
- /* @__PURE__ */ jsxs("label", { className: "grid max-w-md grid-cols-[9rem_minmax(0,1fr)] items-center gap-3 text-xs", children: [
74
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Permission mode" }),
75
- /* @__PURE__ */ jsx(
76
- "select",
77
- {
78
- "aria-label": "Permission mode",
79
- value: permissionMode,
80
- onChange: (event) => onPermissionModeChange == null ? void 0 : onPermissionModeChange(
81
- event.target.value
82
- ),
83
- className: "h-8 rounded border border-border bg-background px-2 text-xs",
84
- children: CLAUDE_PERMISSION_MODE_OPTIONS.map((option) => /* @__PURE__ */ jsx(
85
- "option",
86
- {
87
- value: option.value,
88
- title: option.description,
89
- children: option.label
90
- },
91
- option.value
92
- ))
93
- }
94
- )
95
- ] })
96
- ] }),
97
- /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
98
- /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Generation" }),
99
- /* @__PURE__ */ jsxs("label", { className: "grid grid-cols-[8rem_minmax(0,1fr)_4rem] items-center gap-3 text-xs", children: [
100
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Temperature" }),
101
- /* @__PURE__ */ jsx(
102
- "input",
103
- {
104
- type: "range",
105
- min: 0,
106
- max: 2,
107
- step: 0.1,
108
- value: temperature ?? 0,
109
- onChange: (event) => onTemperatureChange == null ? void 0 : onTemperatureChange(Number(event.target.value))
110
- }
111
- ),
112
- /* @__PURE__ */ jsx(
113
- "input",
29
+ const handleBarChange = ({ budget: limits, ...next }) => {
30
+ if (next.model !== runtime.model || next.id !== runtime.id || next.mode !== runtime.mode || next.temperature !== runtime.temperature || next.effort !== runtime.effort || next.noCache !== runtime.noCache || next.fallbacks !== runtime.fallbacks) {
31
+ onRuntimeChange == null ? void 0 : onRuntimeChange(next);
32
+ }
33
+ if ((limits == null ? void 0 : limits.cost) === (budget == null ? void 0 : budget.cost)) return;
34
+ const updated = { ...budget };
35
+ if ((limits == null ? void 0 : limits.cost) === void 0) delete updated.cost;
36
+ else updated.cost = limits.cost;
37
+ onBudgetChange == null ? void 0 : onBudgetChange(updated);
38
+ };
39
+ return /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 space-y-4 overflow-y-auto", children: /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
40
+ /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Runtime" }),
41
+ runtimeLocked && /* @__PURE__ */ jsx("div", { className: "rounded border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground", children: "Model and backend are locked after the first message. Fork this conversation to change them; effort, permissions and cost remain adjustable." }),
42
+ catalogLoading && /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: "Checking model and runtime availability…" }),
43
+ catalogError && /* @__PURE__ */ jsxs(
44
+ "div",
45
+ {
46
+ role: "alert",
47
+ className: "flex items-center justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",
48
+ children: [
49
+ /* @__PURE__ */ jsx("span", { children: catalogError }),
50
+ onCatalogRetry && /* @__PURE__ */ jsx(
51
+ Button,
114
52
  {
115
- type: "number",
116
- min: 0,
117
- max: 2,
118
- step: 0.1,
119
- value: temperature ?? "",
120
- onChange: (event) => onTemperatureChange == null ? void 0 : onTemperatureChange(parseOptionalNumber(event.target.value)),
121
- className: "h-8 rounded border border-border bg-background px-2 text-xs"
53
+ type: "button",
54
+ size: "sm",
55
+ variant: "outline",
56
+ onClick: onCatalogRetry,
57
+ children: "Retry"
122
58
  }
123
59
  )
124
- ] })
125
- ] }),
126
- /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
127
- /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Budget" }),
128
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
129
- /* @__PURE__ */ jsxs("label", { className: "space-y-1 text-xs", children: [
130
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Max cost" }),
131
- /* @__PURE__ */ jsx(
132
- "input",
133
- {
134
- type: "number",
135
- min: 0,
136
- step: 0.01,
137
- value: (budget == null ? void 0 : budget.cost) ?? "",
138
- onChange: (event) => updateBudget("cost", event.target.value),
139
- className: "h-8 w-full rounded border border-border bg-background px-2 text-xs"
140
- }
141
- )
142
- ] }),
143
- /* @__PURE__ */ jsxs("label", { className: "space-y-1 text-xs", children: [
144
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Max tokens" }),
145
- /* @__PURE__ */ jsx(
146
- "input",
147
- {
148
- type: "number",
149
- min: 0,
150
- step: 1,
151
- value: (budget == null ? void 0 : budget.maxTokens) ?? "",
152
- onChange: (event) => updateBudget("maxTokens", event.target.value),
153
- className: "h-8 w-full rounded border border-border bg-background px-2 text-xs"
154
- }
155
- )
156
- ] })
157
- ] })
158
- ] })
159
- ] }),
60
+ ]
61
+ }
62
+ ),
160
63
  /* @__PURE__ */ jsx(
161
- UsageCostPanel,
64
+ RuntimeBar,
162
65
  {
163
- usage,
66
+ ariaLabel: "Advanced runtime",
67
+ value: barValue,
68
+ onChange: handleBarChange,
164
69
  models,
165
- families: runtimeFamilies ?? SPEC_RUNTIME_FAMILIES,
166
- showProviderStatus: !catalogLoading
70
+ reasoningEfforts,
71
+ locked: runtimeLocked,
72
+ showCost: true,
73
+ actions: {
74
+ fields: [
75
+ chatPermissionField(permissionMode, onPermissionModeChange)
76
+ ]
77
+ },
78
+ ...runtimeFamilies ? { families: runtimeFamilies } : {},
79
+ className: "max-w-full"
167
80
  }
168
81
  )
169
- ] });
82
+ ] }) });
170
83
  }
171
- function UsageCostPanel({
172
- usage,
173
- models,
174
- families,
175
- showProviderStatus
176
- }) {
177
- const tokens = usage == null ? void 0 : usage.usage;
178
- const costs = usage == null ? void 0 : usage.costBreakdown;
179
- return /* @__PURE__ */ jsxs("aside", { className: "space-y-3 border-t border-border pt-4 lg:border-l lg:border-t-0 lg:pl-4 lg:pt-0", children: [
180
- /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Usage (last turn)" }),
181
- /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded border border-border", children: [
182
- /* @__PURE__ */ jsx(
183
- MetricRow,
184
- {
185
- label: "Context",
186
- value: `${formatNumber(usage == null ? void 0 : usage.usedTokens)} / ${formatNumber(
187
- usage == null ? void 0 : usage.maxTokens
188
- )}`
189
- }
190
- ),
191
- /* @__PURE__ */ jsx(
192
- MetricRow,
193
- {
194
- label: "Input tokens",
195
- value: formatNumber(tokens == null ? void 0 : tokens.inputTokens)
196
- }
197
- ),
198
- /* @__PURE__ */ jsx(
199
- MetricRow,
200
- {
201
- label: "Output tokens",
202
- value: formatNumber(tokens == null ? void 0 : tokens.outputTokens)
203
- }
204
- ),
205
- /* @__PURE__ */ jsx(
206
- MetricRow,
207
- {
208
- label: "Reasoning tokens",
209
- value: formatNumber(tokens == null ? void 0 : tokens.reasoningTokens)
210
- }
211
- ),
84
+ const PERMISSION_GROUP = "Permission mode";
85
+ function chatPermissionField(current, onChange) {
86
+ const option = CLAUDE_PERMISSION_MODE_OPTIONS.find(
87
+ (entry) => entry.value === current
88
+ );
89
+ const label = (option == null ? void 0 : option.label) ?? current;
90
+ const visual = (mode) => permissionModeVisual("claude", mode);
91
+ const currentVisual = visual(current);
92
+ return {
93
+ id: "permissions.mode",
94
+ isSet: true,
95
+ label: PERMISSION_GROUP,
96
+ icon: currentVisual.icon,
97
+ iconClassName: sessionTone(currentVisual.tone).text,
98
+ title: `${PERMISSION_GROUP} — ${label}`,
99
+ caption: /* @__PURE__ */ jsxs(Fragment, { children: [
100
+ /* @__PURE__ */ jsx("span", { className: cn(SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
212
101
  /* @__PURE__ */ jsx(
213
- MetricRow,
102
+ Icon,
214
103
  {
215
- label: "Cache read tokens",
216
- value: formatNumber(tokens == null ? void 0 : tokens.cacheReadTokens)
217
- }
218
- ),
219
- /* @__PURE__ */ jsx(
220
- MetricRow,
221
- {
222
- label: "Cache write tokens",
223
- value: formatNumber(tokens == null ? void 0 : tokens.cacheWriteTokens)
104
+ icon: currentVisual.icon,
105
+ className: cn(
106
+ "size-4 shrink-0",
107
+ sessionTone(currentVisual.tone).text
108
+ )
224
109
  }
225
110
  ),
226
- /* @__PURE__ */ jsx(
227
- MetricRow,
228
- {
229
- label: "Total tokens",
230
- value: formatNumber(tokens == null ? void 0 : tokens.totalTokens)
231
- }
232
- )
111
+ /* @__PURE__ */ jsx("span", { className: cn(SEGMENT_CAPTION_CLASS, "shrink-0"), children: label })
233
112
  ] }),
234
- /* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Cost (last turn)" }),
235
- /* @__PURE__ */ jsxs("div", { className: "overflow-hidden rounded border border-border", children: [
236
- /* @__PURE__ */ jsx(MetricRow, { label: "Input", value: formatUSD(costs == null ? void 0 : costs.inputUsd) }),
237
- /* @__PURE__ */ jsx(MetricRow, { label: "Output", value: formatUSD(costs == null ? void 0 : costs.outputUsd) }),
238
- /* @__PURE__ */ jsx(MetricRow, { label: "Reasoning", value: formatUSD(costs == null ? void 0 : costs.reasoningUsd) }),
239
- /* @__PURE__ */ jsx(MetricRow, { label: "Cache read", value: formatUSD(costs == null ? void 0 : costs.cacheReadUsd) }),
240
- /* @__PURE__ */ jsx(
241
- MetricRow,
113
+ items: CLAUDE_PERMISSION_MODE_OPTIONS.map((entry) => ({
114
+ group: PERMISSION_GROUP,
115
+ icon: visual(entry.value).icon,
116
+ iconClassName: sessionTone(visual(entry.value).tone).text,
117
+ label: /* @__PURE__ */ jsx(
118
+ SegmentItemLabel,
242
119
  {
243
- label: "Cache write",
244
- value: formatUSD(costs == null ? void 0 : costs.cacheWriteUsd)
120
+ text: entry.label,
121
+ hint: entry.description,
122
+ selected: entry.value === current,
123
+ stacked: true
245
124
  }
246
125
  ),
247
- /* @__PURE__ */ jsx(
248
- MetricRow,
249
- {
250
- label: "Conversation total",
251
- value: formatUSD((usage == null ? void 0 : usage.cost) ?? (costs == null ? void 0 : costs.totalUsd)),
252
- strong: true
253
- }
254
- )
255
- ] }),
256
- showProviderStatus && /* @__PURE__ */ jsx(ProviderStatusPanel, { models, families })
257
- ] });
258
- }
259
- function MetricRow({
260
- label,
261
- value,
262
- strong = false
263
- }) {
264
- return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[minmax(0,1fr)_auto] gap-3 border-b border-border px-2 py-1.5 text-xs last:border-b-0", children: [
265
- /* @__PURE__ */ jsx("span", { className: "truncate text-muted-foreground", children: label }),
266
- /* @__PURE__ */ jsx(
267
- "span",
268
- {
269
- className: cn("font-mono", strong && "font-semibold text-foreground"),
270
- children: value
271
- }
272
- )
273
- ] });
274
- }
275
- function parseOptionalNumber(raw, integer = false) {
276
- if (raw.trim() === "") return void 0;
277
- const value = Number(raw);
278
- if (!Number.isFinite(value)) return void 0;
279
- return integer ? Math.max(0, Math.trunc(value)) : value;
280
- }
281
- function formatNumber(value) {
282
- if (value == null || !Number.isFinite(value)) return "-";
283
- return new Intl.NumberFormat().format(value);
284
- }
285
- function formatUSD(value) {
286
- if (value == null || !Number.isFinite(value)) return "-";
287
- return `$${value.toFixed(value >= 1 ? 4 : 6)}`;
126
+ onSelect: () => onChange == null ? void 0 : onChange(entry.value)
127
+ }))
128
+ };
288
129
  }
289
130
  export {
290
131
  AdvancedChatConfig
@@ -1 +1 @@
1
- {"version":3,"file":"AdvancedChatConfig.js","sources":["../../../src/data/ai/AdvancedChatConfig.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { cn } from \"../../lib/utils\";\nimport { ProviderStatusPanel } from \"../runtime/ProviderStatusPanel\";\nimport { RuntimeBar } from \"../runtime/RuntimeBar\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n type SpecRuntimeFamily,\n} from \"../runtime/runtime-mode\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\n\nexport type AdvancedChatConfigProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n runtimeLocked?: boolean | undefined;\n permissionMode: ClaudePermissionMode;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n};\n\nexport function AdvancedChatConfig({\n models,\n runtime,\n onRuntimeChange,\n runtimeFamilies,\n reasoningEfforts,\n runtimeLocked = false,\n permissionMode,\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n}: AdvancedChatConfigProps) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, key === \"maxTokens\");\n if (parsed === undefined) delete next[key];\n else next[key] = parsed;\n onBudgetChange?.(next);\n };\n\n return (\n <div className=\"grid min-h-0 flex-1 gap-4 overflow-y-auto lg:grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)]\">\n <div className=\"space-y-4\">\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Runtime\n </div>\n {runtimeLocked && (\n <div className=\"rounded border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\">\n Model and backend are locked after the first message. Fork this\n conversation to change them; effort and generation settings remain\n adjustable.\n </div>\n )}\n {catalogLoading && (\n <div className=\"text-xs text-muted-foreground\">\n Checking model and runtime availability…\n </div>\n )}\n {catalogError && (\n <div\n role=\"alert\"\n className=\"flex items-center justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\"\n >\n <span>{catalogError}</span>\n {onCatalogRetry && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={onCatalogRetry}\n >\n Retry\n </Button>\n )}\n </div>\n )}\n <RuntimeBar\n variant=\"segmented\"\n ariaLabel=\"Advanced runtime\"\n value={runtime}\n onChange={(next) => onRuntimeChange?.(next)}\n models={models}\n reasoningEfforts={reasoningEfforts}\n locked={runtimeLocked}\n {...(runtimeFamilies ? { families: runtimeFamilies } : {})}\n className=\"max-w-full\"\n />\n <label className=\"grid max-w-md grid-cols-[9rem_minmax(0,1fr)] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Permission mode</span>\n <select\n aria-label=\"Permission mode\"\n value={permissionMode}\n onChange={(event) =>\n onPermissionModeChange?.(\n event.target.value as ClaudePermissionMode,\n )\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n >\n {CLAUDE_PERMISSION_MODE_OPTIONS.map((option) => (\n <option\n key={option.value}\n value={option.value}\n title={option.description}\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Generation\n </div>\n <label className=\"grid grid-cols-[8rem_minmax(0,1fr)_4rem] items-center gap-3 text-xs\">\n <span className=\"text-muted-foreground\">Temperature</span>\n <input\n type=\"range\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? 0}\n onChange={(event) =>\n onTemperatureChange?.(Number(event.target.value))\n }\n />\n <input\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n value={temperature ?? \"\"}\n onChange={(event) =>\n onTemperatureChange?.(parseOptionalNumber(event.target.value))\n }\n className=\"h-8 rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </section>\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Budget\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max cost</span>\n <input\n type=\"number\"\n min={0}\n step={0.01}\n value={budget?.cost ?? \"\"}\n onChange={(event) => updateBudget(\"cost\", event.target.value)}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">Max tokens</span>\n <input\n type=\"number\"\n min={0}\n step={1}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) =>\n updateBudget(\"maxTokens\", event.target.value)\n }\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs\"\n />\n </label>\n </div>\n </section>\n </div>\n <UsageCostPanel\n usage={usage}\n models={models}\n families={runtimeFamilies ?? SPEC_RUNTIME_FAMILIES}\n showProviderStatus={!catalogLoading}\n />\n </div>\n );\n}\n\nfunction UsageCostPanel({\n usage,\n models,\n families,\n showProviderStatus,\n}: {\n usage?: ChatUsageSummary | null | undefined;\n models: ChatModel[];\n families: SpecRuntimeFamily[];\n showProviderStatus: boolean;\n}) {\n const tokens = usage?.usage;\n const costs = usage?.costBreakdown;\n return (\n <aside className=\"space-y-3 border-t border-border pt-4 lg:border-l lg:border-t-0 lg:pl-4 lg:pt-0\">\n {/* Both tables describe the last completed turn; only the bold total is\n cumulative. Labelled explicitly because the rows will not sum to it,\n and the full conversation breakdown lives in the Costs tab. */}\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Usage (last turn)\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow\n label=\"Context\"\n value={`${formatNumber(usage?.usedTokens)} / ${formatNumber(\n usage?.maxTokens,\n )}`}\n />\n <MetricRow\n label=\"Input tokens\"\n value={formatNumber(tokens?.inputTokens)}\n />\n <MetricRow\n label=\"Output tokens\"\n value={formatNumber(tokens?.outputTokens)}\n />\n <MetricRow\n label=\"Reasoning tokens\"\n value={formatNumber(tokens?.reasoningTokens)}\n />\n <MetricRow\n label=\"Cache read tokens\"\n value={formatNumber(tokens?.cacheReadTokens)}\n />\n <MetricRow\n label=\"Cache write tokens\"\n value={formatNumber(tokens?.cacheWriteTokens)}\n />\n <MetricRow\n label=\"Total tokens\"\n value={formatNumber(tokens?.totalTokens)}\n />\n </div>\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Cost (last turn)\n </div>\n <div className=\"overflow-hidden rounded border border-border\">\n <MetricRow label=\"Input\" value={formatUSD(costs?.inputUsd)} />\n <MetricRow label=\"Output\" value={formatUSD(costs?.outputUsd)} />\n <MetricRow label=\"Reasoning\" value={formatUSD(costs?.reasoningUsd)} />\n <MetricRow label=\"Cache read\" value={formatUSD(costs?.cacheReadUsd)} />\n <MetricRow\n label=\"Cache write\"\n value={formatUSD(costs?.cacheWriteUsd)}\n />\n <MetricRow\n label=\"Conversation total\"\n value={formatUSD(usage?.cost ?? costs?.totalUsd)}\n strong\n />\n </div>\n {showProviderStatus && (\n <ProviderStatusPanel models={models} families={families} />\n )}\n </aside>\n );\n}\n\nfunction MetricRow({\n label,\n value,\n strong = false,\n}: {\n label: string;\n value: string;\n strong?: boolean;\n}) {\n return (\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto] gap-3 border-b border-border px-2 py-1.5 text-xs last:border-b-0\">\n <span className=\"truncate text-muted-foreground\">{label}</span>\n <span\n className={cn(\"font-mono\", strong && \"font-semibold text-foreground\")}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction parseOptionalNumber(raw: string, integer = false): number | undefined {\n if (raw.trim() === \"\") return undefined;\n const value = Number(raw);\n if (!Number.isFinite(value)) return undefined;\n return integer ? Math.max(0, Math.trunc(value)) : value;\n}\n\nfunction formatNumber(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return new Intl.NumberFormat().format(value);\n}\n\nfunction formatUSD(value: number | undefined): string {\n if (value == null || !Number.isFinite(value)) return \"-\";\n return `$${value.toFixed(value >= 1 ? 4 : 6)}`;\n}\n"],"names":[],"mappings":";;;;;;;AAoCO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf;AACF,GAA4B;AAC1B,QAAM,eAAe,CAAC,KAA6B,QAAgB;AACjE,UAAM,OAAyB,EAAE,GAAG,OAAA;AACpC,UAAM,SAAS,oBAAoB,KAAK,QAAQ,WAAW;AAC3D,QAAI,WAAW,OAAW,QAAO,KAAK,GAAG;AAAA,QACpC,MAAK,GAAG,IAAI;AACjB,qDAAiB;AAAA,EACnB;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,8FACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,MAAA,qBAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,WAEtF;AAAA,QACC,iBACC,oBAAC,OAAA,EAAI,WAAU,oFAAmF,UAAA,kJAIlG;AAAA,QAED,kBACC,oBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,4CAE/C;AAAA,QAED,gBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,oBAAC,UAAM,UAAA,aAAA,CAAa;AAAA,cACnB,kBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,SAAS;AAAA,kBACV,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED;AAAA,UAAA;AAAA,QAAA;AAAA,QAIN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,SAAS,mDAAkB;AAAA,YACtC;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACP,GAAI,kBAAkB,EAAE,UAAU,gBAAA,IAAoB,CAAA;AAAA,YACvD,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,qBAAC,SAAA,EAAM,WAAU,2EACf,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,mBAAe;AAAA,UACvD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU,CAAC,UACT;AAAA,gBACE,MAAM,OAAO;AAAA;AAAA,cAGjB,WAAU;AAAA,cAET,UAAA,+BAA+B,IAAI,CAAC,WACnC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,OAAO,OAAO;AAAA,kBACd,OAAO,OAAO;AAAA,kBAEb,UAAA,OAAO;AAAA,gBAAA;AAAA,gBAJH,OAAO;AAAA,cAAA,CAMf;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,qBAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,cAEtF;AAAA,QACA,qBAAC,SAAA,EAAM,WAAU,uEACf,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,eAAW;AAAA,UACnD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,eAAe;AAAA,cACtB,UAAU,CAAC,UACT,2DAAsB,OAAO,MAAM,OAAO,KAAK;AAAA,YAAC;AAAA,UAAA;AAAA,UAGpD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,eAAe;AAAA,cACtB,UAAU,CAAC,UACT,2DAAsB,oBAAoB,MAAM,OAAO,KAAK;AAAA,cAE9D,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACA,qBAAC,WAAA,EAAQ,WAAU,aACjB,UAAA;AAAA,QAAA,oBAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,UAEtF;AAAA,QACA,qBAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,UAAA,qBAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,YAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,YAAQ;AAAA,YAChD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,QAAO,iCAAQ,SAAQ;AAAA,gBACvB,UAAU,CAAC,UAAU,aAAa,QAAQ,MAAM,OAAO,KAAK;AAAA,gBAC5D,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,GACF;AAAA,UACA,qBAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,YAAA,oBAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,cAAU;AAAA,YAClD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,QAAO,iCAAQ,cAAa;AAAA,gBAC5B,UAAU,CAAC,UACT,aAAa,aAAa,MAAM,OAAO,KAAK;AAAA,gBAE9C,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,UAAU,mBAAmB;AAAA,QAC7B,oBAAoB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACvB,GACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,SAAS,+BAAO;AACtB,QAAM,QAAQ,+BAAO;AACrB,SACE,qBAAC,SAAA,EAAM,WAAU,mFAIf,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,qBAEtF;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,GAAG,aAAa,+BAAO,UAAU,CAAC,MAAM;AAAA,YAC7C,+BAAO;AAAA,UAAA,CACR;AAAA,QAAA;AAAA,MAAA;AAAA,MAEH;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,WAAW;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAE1C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,MAE7C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,gBAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,aAAa,iCAAQ,WAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACzC,GACF;AAAA,IACA,oBAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,oBAEtF;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,MAAA,oBAAC,aAAU,OAAM,SAAQ,OAAO,UAAU,+BAAO,QAAQ,GAAG;AAAA,MAC5D,oBAAC,aAAU,OAAM,UAAS,OAAO,UAAU,+BAAO,SAAS,GAAG;AAAA,MAC9D,oBAAC,aAAU,OAAM,aAAY,OAAO,UAAU,+BAAO,YAAY,GAAG;AAAA,MACpE,oBAAC,aAAU,OAAM,cAAa,OAAO,UAAU,+BAAO,YAAY,GAAG;AAAA,MACrE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,UAAU,+BAAO,aAAa;AAAA,QAAA;AAAA,MAAA;AAAA,MAEvC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,WAAU,+BAAO,UAAQ,+BAAO,SAAQ;AAAA,UAC/C,QAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IACR,GACF;AAAA,IACC,sBACC,oBAAC,qBAAA,EAAoB,QAAgB,SAAA,CAAoB;AAAA,EAAA,GAE7D;AAEJ;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAIG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,wGACb,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,WAAU,kCAAkC,UAAA,OAAM;AAAA,IACxD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAG,aAAa,UAAU,+BAA+B;AAAA,QAEnE,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEA,SAAS,oBAAoB,KAAa,UAAU,OAA2B;AAC7E,MAAI,IAAI,WAAW,GAAI,QAAO;AAC9B,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;AACpD;AAEA,SAAS,aAAa,OAAmC;AACvD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,SAAO,IAAI,KAAK,eAAe,OAAO,KAAK;AAC7C;AAEA,SAAS,UAAU,OAAmC;AACpD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,SAAO,IAAI,MAAM,QAAQ,SAAS,IAAI,IAAI,CAAC,CAAC;AAC9C;"}
1
+ {"version":3,"file":"AdvancedChatConfig.js","sources":["../../../src/data/ai/AdvancedChatConfig.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { RuntimeBar, type RuntimeBarValue } from \"../runtime/RuntimeBar\";\nimport type { RuntimeBarAction } from \"../runtime/RuntimeBarActions\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../runtime/RuntimeBarSegment\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ClaudePermissionMode,\n} from \"../chat/types\";\nimport { CLAUDE_PERMISSION_MODE_OPTIONS } from \"../chat/types\";\nimport { sessionTone } from \"./session-tones\";\nimport { permissionModeVisual } from \"./SpecRuntimeEditor/permission-mode-visuals\";\n\nexport type AdvancedChatConfigProps = {\n models: ChatModel[];\n runtime: ChatModelRuntime;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts: string[];\n runtimeLocked?: boolean | undefined;\n permissionMode: ClaudePermissionMode;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n};\n\nexport function AdvancedChatConfig({\n models,\n runtime,\n onRuntimeChange,\n runtimeFamilies,\n reasoningEfforts,\n runtimeLocked = false,\n permissionMode,\n onPermissionModeChange,\n budget,\n onBudgetChange,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n}: AdvancedChatConfigProps) {\n // The bar edits the run's cost cap alongside its identity; the chat keeps the\n // two in separate settings, so split them on the way out.\n const barValue: RuntimeBarValue = {\n ...runtime,\n ...(budget?.cost !== undefined ? { budget: { cost: budget.cost } } : {}),\n };\n const handleBarChange = ({ budget: limits, ...next }: RuntimeBarValue) => {\n if (\n next.model !== runtime.model ||\n next.id !== runtime.id ||\n next.mode !== runtime.mode ||\n next.temperature !== runtime.temperature ||\n next.effort !== runtime.effort ||\n next.noCache !== runtime.noCache ||\n next.fallbacks !== runtime.fallbacks\n ) {\n onRuntimeChange?.(next);\n }\n if (limits?.cost === budget?.cost) return;\n const updated: ChatBudgetConfig = { ...budget };\n if (limits?.cost === undefined) delete updated.cost;\n else updated.cost = limits.cost;\n onBudgetChange?.(updated);\n };\n\n return (\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto\">\n <section className=\"space-y-3\">\n <div className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n Runtime\n </div>\n {runtimeLocked && (\n <div className=\"rounded border border-border bg-muted/40 px-3 py-2 text-xs text-muted-foreground\">\n Model and backend are locked after the first message. Fork this\n conversation to change them; effort, permissions and cost remain\n adjustable.\n </div>\n )}\n {catalogLoading && (\n <div className=\"text-xs text-muted-foreground\">\n Checking model and runtime availability…\n </div>\n )}\n {catalogError && (\n <div\n role=\"alert\"\n className=\"flex items-center justify-between gap-3 rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive\"\n >\n <span>{catalogError}</span>\n {onCatalogRetry && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={onCatalogRetry}\n >\n Retry\n </Button>\n )}\n </div>\n )}\n <RuntimeBar\n ariaLabel=\"Advanced runtime\"\n value={barValue}\n onChange={handleBarChange}\n models={models}\n reasoningEfforts={reasoningEfforts}\n locked={runtimeLocked}\n showCost\n actions={{\n fields: [\n chatPermissionField(permissionMode, onPermissionModeChange),\n ],\n }}\n {...(runtimeFamilies ? { families: runtimeFamilies } : {})}\n className=\"max-w-full\"\n />\n </section>\n </div>\n );\n}\n\nconst PERMISSION_GROUP = \"Permission mode\";\n\nfunction chatPermissionField(\n current: ClaudePermissionMode,\n onChange: ((mode: ClaudePermissionMode) => void) | undefined,\n): RuntimeBarAction {\n const option = CLAUDE_PERMISSION_MODE_OPTIONS.find(\n (entry) => entry.value === current,\n );\n const label = option?.label ?? current;\n // The chat speaks Claude's permission vocabulary, so it borrows Claude's\n // per-mode glyphs and tones from the shared runtime-bar visuals.\n const visual = (mode: ClaudePermissionMode) =>\n permissionModeVisual(\"claude\", mode);\n const currentVisual = visual(current);\n return {\n id: \"permissions.mode\",\n isSet: true,\n label: PERMISSION_GROUP,\n icon: currentVisual.icon,\n iconClassName: sessionTone(currentVisual.tone).text,\n title: `${PERMISSION_GROUP} — ${label}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n sessionTone(currentVisual.tone).text,\n )}\n />\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>{label}</span>\n </>\n ),\n items: CLAUDE_PERMISSION_MODE_OPTIONS.map((entry) => ({\n group: PERMISSION_GROUP,\n icon: visual(entry.value).icon,\n iconClassName: sessionTone(visual(entry.value).tone).text,\n label: (\n <SegmentItemLabel\n text={entry.label}\n hint={entry.description}\n selected={entry.value === current}\n stacked\n />\n ),\n onSelect: () => onChange?.(entry.value),\n })),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ const UiSparkles = require("../../icons/components/UiSparkles.cjs");
7
7
  function ChatButton({
8
8
  icon = UiSparkles.UiSparkles,
9
9
  label = "Open chat",
10
+ contextItems,
10
11
  className
11
12
  }) {
12
13
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -15,6 +16,7 @@ function ChatButton({
15
16
  persistent: true,
16
17
  icon,
17
18
  label,
19
+ ...contextItems ? { contextItems } : {},
18
20
  className: utils.cn(
19
21
  "static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent",
20
22
  className
@@ -1 +1 @@
1
- {"version":3,"file":"ChatButton.cjs","sources":["../../../src/data/ai/ChatButton.tsx"],"sourcesContent":["import { UiSparkles } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatFab, type ChatFabProps } from \"./ChatFab\";\n\nexport type ChatButtonProps = Omit<ChatFabProps, \"persistent\">;\n\n/** A persistent chat trigger styled as navbar chrome for AppShell actions. */\nexport function ChatButton({\n icon = UiSparkles,\n label = \"Open chat\",\n className,\n}: ChatButtonProps) {\n return (\n <ChatFab\n persistent\n icon={icon}\n label={label}\n className={cn(\n \"static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent\",\n className,\n )}\n />\n );\n}\n"],"names":["UiSparkles","jsx","ChatFab","cn"],"mappings":";;;;;;AAOO,SAAS,WAAW;AAAA,EACzB,OAAOA,WAAAA;AAAAA,EACP,QAAQ;AAAA,EACR;AACF,GAAoB;AAClB,SACEC,2BAAAA;AAAAA,IAACC,QAAAA;AAAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;;"}
1
+ {"version":3,"file":"ChatButton.cjs","sources":["../../../src/data/ai/ChatButton.tsx"],"sourcesContent":["import { UiSparkles } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatFab, type ChatFabProps } from \"./ChatFab\";\n\nexport type ChatButtonProps = Omit<ChatFabProps, \"persistent\">;\n\n/** A persistent chat trigger styled as navbar chrome for AppShell actions. */\nexport function ChatButton({\n icon = UiSparkles,\n label = \"Open chat\",\n contextItems,\n className,\n}: ChatButtonProps) {\n return (\n <ChatFab\n persistent\n icon={icon}\n label={label}\n {...(contextItems ? { contextItems } : {})}\n className={cn(\n \"static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent\",\n className,\n )}\n />\n );\n}\n"],"names":["UiSparkles","jsx","ChatFab","cn"],"mappings":";;;;;;AAOO,SAAS,WAAW;AAAA,EACzB,OAAOA,WAAAA;AAAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAoB;AAClB,SACEC,2BAAAA;AAAAA,IAACC,QAAAA;AAAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV;AAAA,MACA;AAAA,MACC,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACvC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;;"}
@@ -1,5 +1,5 @@
1
1
  import { ChatFabProps } from './ChatFab.js';
2
2
  export type ChatButtonProps = Omit<ChatFabProps, "persistent">;
3
3
  /** A persistent chat trigger styled as navbar chrome for AppShell actions. */
4
- export declare function ChatButton({ icon, label, className, }: ChatButtonProps): import("react").JSX.Element;
4
+ export declare function ChatButton({ icon, label, contextItems, className, }: ChatButtonProps): import("react").JSX.Element;
5
5
  //# sourceMappingURL=ChatButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatButton.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAE/D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,EACzB,IAAiB,EACjB,KAAmB,EACnB,SAAS,GACV,EAAE,eAAe,+BAYjB"}
1
+ {"version":3,"file":"ChatButton.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAE/D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,EACzB,IAAiB,EACjB,KAAmB,EACnB,YAAY,EACZ,SAAS,GACV,EAAE,eAAe,+BAajB"}
@@ -5,6 +5,7 @@ import { UiSparkles } from "../../icons/components/UiSparkles.js";
5
5
  function ChatButton({
6
6
  icon = UiSparkles,
7
7
  label = "Open chat",
8
+ contextItems,
8
9
  className
9
10
  }) {
10
11
  return /* @__PURE__ */ jsx(
@@ -13,6 +14,7 @@ function ChatButton({
13
14
  persistent: true,
14
15
  icon,
15
16
  label,
17
+ ...contextItems ? { contextItems } : {},
16
18
  className: cn(
17
19
  "static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent",
18
20
  className
@@ -1 +1 @@
1
- {"version":3,"file":"ChatButton.js","sources":["../../../src/data/ai/ChatButton.tsx"],"sourcesContent":["import { UiSparkles } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatFab, type ChatFabProps } from \"./ChatFab\";\n\nexport type ChatButtonProps = Omit<ChatFabProps, \"persistent\">;\n\n/** A persistent chat trigger styled as navbar chrome for AppShell actions. */\nexport function ChatButton({\n icon = UiSparkles,\n label = \"Open chat\",\n className,\n}: ChatButtonProps) {\n return (\n <ChatFab\n persistent\n icon={icon}\n label={label}\n className={cn(\n \"static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent\",\n className,\n )}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAOO,SAAS,WAAW;AAAA,EACzB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AACF,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"ChatButton.js","sources":["../../../src/data/ai/ChatButton.tsx"],"sourcesContent":["import { UiSparkles } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { ChatFab, type ChatFabProps } from \"./ChatFab\";\n\nexport type ChatButtonProps = Omit<ChatFabProps, \"persistent\">;\n\n/** A persistent chat trigger styled as navbar chrome for AppShell actions. */\nexport function ChatButton({\n icon = UiSparkles,\n label = \"Open chat\",\n contextItems,\n className,\n}: ChatButtonProps) {\n return (\n <ChatFab\n persistent\n icon={icon}\n label={label}\n {...(contextItems ? { contextItems } : {})}\n className={cn(\n \"static size-9 rounded-md bg-transparent text-foreground shadow-none hover:bg-accent\",\n className,\n )}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAOO,SAAS,WAAW;AAAA,EACzB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAoB;AAClB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV;AAAA,MACA;AAAA,MACC,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACvC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}
@@ -10,6 +10,7 @@ function ChatFab({
10
10
  icon = UiSparkles.UiSparkles,
11
11
  label = "Open chat",
12
12
  persistent = false,
13
+ contextItems,
13
14
  className
14
15
  }) {
15
16
  const { panels, openPanel, findOrCreatePanel } = chatWindowContext.useChatWindowManager();
@@ -21,7 +22,10 @@ function ChatFab({
21
22
  "data-testid": "chat-fab",
22
23
  title: label,
23
24
  "aria-label": label,
24
- onClick: () => persistent ? findOrCreatePanel() : openPanel(),
25
+ onClick: () => {
26
+ const opts = contextItems ? { contextItems } : {};
27
+ return persistent ? findOrCreatePanel(opts) : openPanel(opts);
28
+ },
25
29
  ...!persistent ? { style: { zIndex: zIndex.zIndex.chatFab } } : {},
26
30
  className: utils.cn(
27
31
  "fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center",
@@ -1 +1 @@
1
- {"version":3,"file":"ChatFab.cjs","sources":["../../../src/data/ai/ChatFab.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { UiSparkles } from \"../../icons\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { zIndex } from \"../../overlay/zIndex\";\n\nexport type ChatFabProps = {\n /** Iconify name or imported icon component shown in the button. */\n icon?: string | StaticIconComponent;\n /** Accessible label / tooltip. */\n label?: string;\n /** Keep navbar chrome visible and focus an existing window when clicked. */\n persistent?: boolean;\n className?: string;\n};\n\n/** A fixed bottom-right chat launcher. By default it hides while a window is\n * open; persistent launchers remain visible and focus the existing window. */\nexport function ChatFab({\n icon = UiSparkles,\n label = \"Open chat\",\n persistent = false,\n className,\n}: ChatFabProps) {\n const { panels, openPanel, findOrCreatePanel } = useChatWindowManager();\n if (!persistent && panels.length > 0) return null;\n\n return (\n <button\n type=\"button\"\n data-testid=\"chat-fab\"\n title={label}\n aria-label={label}\n onClick={() => (persistent ? findOrCreatePanel() : openPanel())}\n {...(!persistent ? { style: { zIndex: zIndex.chatFab } } : {})}\n className={cn(\n \"fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center\",\n \"rounded-full bg-primary text-primary-foreground shadow-lg transition-colors hover:bg-primary/90\",\n className,\n )}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"size-5\" />\n </button>\n );\n}\n"],"names":["UiSparkles","useChatWindowManager","jsx","zIndex","cn","Icon"],"mappings":";;;;;;;;AAkBO,SAAS,QAAQ;AAAA,EACtB,OAAOA,WAAAA;AAAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AACF,GAAiB;AACf,QAAM,EAAE,QAAQ,WAAW,kBAAA,IAAsBC,kBAAAA,qBAAA;AACjD,MAAI,CAAC,cAAc,OAAO,SAAS,EAAG,QAAO;AAE7C,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAY;AAAA,MACZ,SAAS,MAAO,aAAa,kBAAA,IAAsB,UAAA;AAAA,MAClD,GAAI,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQC,cAAO,QAAA,EAAQ,IAAM,CAAA;AAAA,MAC3D,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAAF,2BAAAA,IAACG,KAAAA,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAA,IAAS,EAAE,KAAA,GAAS,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAG3F;;"}
1
+ {"version":3,"file":"ChatFab.cjs","sources":["../../../src/data/ai/ChatFab.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { UiSparkles } from \"../../icons\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport type { ChatContextItem } from \"./context\";\nimport { zIndex } from \"../../overlay/zIndex\";\n\nexport type ChatFabProps = {\n /** Iconify name or imported icon component shown in the button. */\n icon?: string | StaticIconComponent;\n /** Accessible label / tooltip. */\n label?: string;\n /** Keep navbar chrome visible and focus an existing window when clicked. */\n persistent?: boolean;\n /** Context the page offers the chat: attached to a newly opened window, or\n * merged (by id) into the window a persistent launcher focuses. */\n contextItems?: ChatContextItem[];\n className?: string;\n};\n\n/** A fixed bottom-right chat launcher. By default it hides while a window is\n * open; persistent launchers remain visible and focus the existing window. */\nexport function ChatFab({\n icon = UiSparkles,\n label = \"Open chat\",\n persistent = false,\n contextItems,\n className,\n}: ChatFabProps) {\n const { panels, openPanel, findOrCreatePanel } = useChatWindowManager();\n if (!persistent && panels.length > 0) return null;\n\n return (\n <button\n type=\"button\"\n data-testid=\"chat-fab\"\n title={label}\n aria-label={label}\n onClick={() => {\n const opts = contextItems ? { contextItems } : {};\n return persistent ? findOrCreatePanel(opts) : openPanel(opts);\n }}\n {...(!persistent ? { style: { zIndex: zIndex.chatFab } } : {})}\n className={cn(\n \"fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center\",\n \"rounded-full bg-primary text-primary-foreground shadow-lg transition-colors hover:bg-primary/90\",\n className,\n )}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"size-5\" />\n </button>\n );\n}\n"],"names":["UiSparkles","useChatWindowManager","jsx","zIndex","cn","Icon"],"mappings":";;;;;;;;AAsBO,SAAS,QAAQ;AAAA,EACtB,OAAOA,WAAAA;AAAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAAiB;AACf,QAAM,EAAE,QAAQ,WAAW,kBAAA,IAAsBC,kBAAAA,qBAAA;AACjD,MAAI,CAAC,cAAc,OAAO,SAAS,EAAG,QAAO;AAE7C,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAY;AAAA,MACZ,SAAS,MAAM;AACb,cAAM,OAAO,eAAe,EAAE,aAAA,IAAiB,CAAA;AAC/C,eAAO,aAAa,kBAAkB,IAAI,IAAI,UAAU,IAAI;AAAA,MAC9D;AAAA,MACC,GAAI,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQC,cAAO,QAAA,EAAQ,IAAM,CAAA;AAAA,MAC3D,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAAF,2BAAAA,IAACG,KAAAA,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAA,IAAS,EAAE,KAAA,GAAS,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAG3F;;"}
@@ -1,4 +1,5 @@
1
1
  import { StaticIconComponent } from '../Icon.js';
2
+ import { ChatContextItem } from './context.js';
2
3
  export type ChatFabProps = {
3
4
  /** Iconify name or imported icon component shown in the button. */
4
5
  icon?: string | StaticIconComponent;
@@ -6,9 +7,12 @@ export type ChatFabProps = {
6
7
  label?: string;
7
8
  /** Keep navbar chrome visible and focus an existing window when clicked. */
8
9
  persistent?: boolean;
10
+ /** Context the page offers the chat: attached to a newly opened window, or
11
+ * merged (by id) into the window a persistent launcher focuses. */
12
+ contextItems?: ChatContextItem[];
9
13
  className?: string;
10
14
  };
11
15
  /** A fixed bottom-right chat launcher. By default it hides while a window is
12
16
  * open; persistent launchers remain visible and focus the existing window. */
13
- export declare function ChatFab({ icon, label, persistent, className, }: ChatFabProps): import("react").JSX.Element | null;
17
+ export declare function ChatFab({ icon, label, persistent, contextItems, className, }: ChatFabProps): import("react").JSX.Element | null;
14
18
  //# sourceMappingURL=ChatFab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatFab.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatFab.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAKzD,MAAM,MAAM,YAAY,GAAG;IACzB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;8EAC8E;AAC9E,wBAAgB,OAAO,CAAC,EACtB,IAAiB,EACjB,KAAmB,EACnB,UAAkB,EAClB,SAAS,GACV,EAAE,YAAY,sCAqBd"}
1
+ {"version":3,"file":"ChatFab.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ChatFab.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,MAAM,YAAY,GAAG;IACzB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;uEACmE;IACnE,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;8EAC8E;AAC9E,wBAAgB,OAAO,CAAC,EACtB,IAAiB,EACjB,KAAmB,EACnB,UAAkB,EAClB,YAAY,EACZ,SAAS,GACV,EAAE,YAAY,sCAwBd"}
@@ -8,6 +8,7 @@ function ChatFab({
8
8
  icon = UiSparkles,
9
9
  label = "Open chat",
10
10
  persistent = false,
11
+ contextItems,
11
12
  className
12
13
  }) {
13
14
  const { panels, openPanel, findOrCreatePanel } = useChatWindowManager();
@@ -19,7 +20,10 @@ function ChatFab({
19
20
  "data-testid": "chat-fab",
20
21
  title: label,
21
22
  "aria-label": label,
22
- onClick: () => persistent ? findOrCreatePanel() : openPanel(),
23
+ onClick: () => {
24
+ const opts = contextItems ? { contextItems } : {};
25
+ return persistent ? findOrCreatePanel(opts) : openPanel(opts);
26
+ },
23
27
  ...!persistent ? { style: { zIndex: zIndex.chatFab } } : {},
24
28
  className: cn(
25
29
  "fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center",
@@ -1 +1 @@
1
- {"version":3,"file":"ChatFab.js","sources":["../../../src/data/ai/ChatFab.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { UiSparkles } from \"../../icons\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport { zIndex } from \"../../overlay/zIndex\";\n\nexport type ChatFabProps = {\n /** Iconify name or imported icon component shown in the button. */\n icon?: string | StaticIconComponent;\n /** Accessible label / tooltip. */\n label?: string;\n /** Keep navbar chrome visible and focus an existing window when clicked. */\n persistent?: boolean;\n className?: string;\n};\n\n/** A fixed bottom-right chat launcher. By default it hides while a window is\n * open; persistent launchers remain visible and focus the existing window. */\nexport function ChatFab({\n icon = UiSparkles,\n label = \"Open chat\",\n persistent = false,\n className,\n}: ChatFabProps) {\n const { panels, openPanel, findOrCreatePanel } = useChatWindowManager();\n if (!persistent && panels.length > 0) return null;\n\n return (\n <button\n type=\"button\"\n data-testid=\"chat-fab\"\n title={label}\n aria-label={label}\n onClick={() => (persistent ? findOrCreatePanel() : openPanel())}\n {...(!persistent ? { style: { zIndex: zIndex.chatFab } } : {})}\n className={cn(\n \"fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center\",\n \"rounded-full bg-primary text-primary-foreground shadow-lg transition-colors hover:bg-primary/90\",\n className,\n )}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"size-5\" />\n </button>\n );\n}\n"],"names":[],"mappings":";;;;;;AAkBO,SAAS,QAAQ;AAAA,EACtB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AACF,GAAiB;AACf,QAAM,EAAE,QAAQ,WAAW,kBAAA,IAAsB,qBAAA;AACjD,MAAI,CAAC,cAAc,OAAO,SAAS,EAAG,QAAO;AAE7C,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAY;AAAA,MACZ,SAAS,MAAO,aAAa,kBAAA,IAAsB,UAAA;AAAA,MAClD,GAAI,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,OAAO,QAAA,EAAQ,IAAM,CAAA;AAAA,MAC3D,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA,oBAAC,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAA,IAAS,EAAE,KAAA,GAAS,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAG3F;"}
1
+ {"version":3,"file":"ChatFab.js","sources":["../../../src/data/ai/ChatFab.tsx"],"sourcesContent":["import { cn } from \"../../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport { UiSparkles } from \"../../icons\";\nimport { useChatWindowManager } from \"./chat-window-context\";\nimport type { ChatContextItem } from \"./context\";\nimport { zIndex } from \"../../overlay/zIndex\";\n\nexport type ChatFabProps = {\n /** Iconify name or imported icon component shown in the button. */\n icon?: string | StaticIconComponent;\n /** Accessible label / tooltip. */\n label?: string;\n /** Keep navbar chrome visible and focus an existing window when clicked. */\n persistent?: boolean;\n /** Context the page offers the chat: attached to a newly opened window, or\n * merged (by id) into the window a persistent launcher focuses. */\n contextItems?: ChatContextItem[];\n className?: string;\n};\n\n/** A fixed bottom-right chat launcher. By default it hides while a window is\n * open; persistent launchers remain visible and focus the existing window. */\nexport function ChatFab({\n icon = UiSparkles,\n label = \"Open chat\",\n persistent = false,\n contextItems,\n className,\n}: ChatFabProps) {\n const { panels, openPanel, findOrCreatePanel } = useChatWindowManager();\n if (!persistent && panels.length > 0) return null;\n\n return (\n <button\n type=\"button\"\n data-testid=\"chat-fab\"\n title={label}\n aria-label={label}\n onClick={() => {\n const opts = contextItems ? { contextItems } : {};\n return persistent ? findOrCreatePanel(opts) : openPanel(opts);\n }}\n {...(!persistent ? { style: { zIndex: zIndex.chatFab } } : {})}\n className={cn(\n \"fixed bottom-4 right-4 flex h-12 w-12 items-center justify-center\",\n \"rounded-full bg-primary text-primary-foreground shadow-lg transition-colors hover:bg-primary/90\",\n className,\n )}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} className=\"size-5\" />\n </button>\n );\n}\n"],"names":[],"mappings":";;;;;;AAsBO,SAAS,QAAQ;AAAA,EACtB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAAiB;AACf,QAAM,EAAE,QAAQ,WAAW,kBAAA,IAAsB,qBAAA;AACjD,MAAI,CAAC,cAAc,OAAO,SAAS,EAAG,QAAO;AAE7C,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAY;AAAA,MACZ,SAAS,MAAM;AACb,cAAM,OAAO,eAAe,EAAE,aAAA,IAAiB,CAAA;AAC/C,eAAO,aAAa,kBAAkB,IAAI,IAAI,UAAU,IAAI;AAAA,MAC9D;AAAA,MACC,GAAI,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,OAAO,QAAA,EAAQ,IAAM,CAAA;AAAA,MAC3D,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA,oBAAC,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,KAAA,IAAS,EAAE,KAAA,GAAS,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAG3F;"}