@flanksource/clicky-ui 0.3.15 → 0.3.17

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 (823) hide show
  1. package/NOTICE.md +10 -0
  2. package/dist/ai.cjs +33 -4
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +31 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +6 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +7 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/components/Combobox.cjs +92 -170
  11. package/dist/components/Combobox.cjs.map +1 -1
  12. package/dist/components/Combobox.d.ts +2 -111
  13. package/dist/components/Combobox.d.ts.map +1 -1
  14. package/dist/components/Combobox.js +95 -173
  15. package/dist/components/Combobox.js.map +1 -1
  16. package/dist/components/ComboboxActions.cjs +70 -0
  17. package/dist/components/ComboboxActions.cjs.map +1 -0
  18. package/dist/components/ComboboxActions.d.ts +8 -0
  19. package/dist/components/ComboboxActions.d.ts.map +1 -0
  20. package/dist/components/ComboboxActions.js +70 -0
  21. package/dist/components/ComboboxActions.js.map +1 -0
  22. package/dist/components/ComboboxMenu.cjs +160 -0
  23. package/dist/components/ComboboxMenu.cjs.map +1 -0
  24. package/dist/components/ComboboxMenu.d.ts +22 -0
  25. package/dist/components/ComboboxMenu.d.ts.map +1 -0
  26. package/dist/components/ComboboxMenu.js +160 -0
  27. package/dist/components/ComboboxMenu.js.map +1 -0
  28. package/dist/components/EndpointSelector.cjs +407 -0
  29. package/dist/components/EndpointSelector.cjs.map +1 -0
  30. package/dist/components/EndpointSelector.d.ts +3 -0
  31. package/dist/components/EndpointSelector.d.ts.map +1 -0
  32. package/dist/components/EndpointSelector.js +407 -0
  33. package/dist/components/EndpointSelector.js.map +1 -0
  34. package/dist/components/EndpointSelector.model.d.ts +52 -0
  35. package/dist/components/EndpointSelector.model.d.ts.map +1 -0
  36. package/dist/components/FilterBar.cjs +12 -0
  37. package/dist/components/FilterBar.cjs.map +1 -1
  38. package/dist/components/FilterBar.d.ts +4 -0
  39. package/dist/components/FilterBar.d.ts.map +1 -1
  40. package/dist/components/FilterBar.js +12 -0
  41. package/dist/components/FilterBar.js.map +1 -1
  42. package/dist/components/InputField.cjs +11 -12
  43. package/dist/components/InputField.cjs.map +1 -1
  44. package/dist/components/InputField.d.ts +7 -0
  45. package/dist/components/InputField.d.ts.map +1 -1
  46. package/dist/components/InputField.js +12 -13
  47. package/dist/components/InputField.js.map +1 -1
  48. package/dist/components/JsonSchemaForm.cjs +22 -16
  49. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  50. package/dist/components/JsonSchemaForm.d.ts +1 -1
  51. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  52. package/dist/components/JsonSchemaForm.js +22 -16
  53. package/dist/components/JsonSchemaForm.js.map +1 -1
  54. package/dist/components/MultiSelect.cjs +3 -3
  55. package/dist/components/MultiSelect.cjs.map +1 -1
  56. package/dist/components/MultiSelect.d.ts.map +1 -1
  57. package/dist/components/MultiSelect.js +3 -3
  58. package/dist/components/MultiSelect.js.map +1 -1
  59. package/dist/components/SecretKeySelector.cjs +150 -77
  60. package/dist/components/SecretKeySelector.cjs.map +1 -1
  61. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  62. package/dist/components/SecretKeySelector.js +151 -78
  63. package/dist/components/SecretKeySelector.js.map +1 -1
  64. package/dist/components/WorkloadPicker.cjs +2 -1
  65. package/dist/components/WorkloadPicker.cjs.map +1 -1
  66. package/dist/components/WorkloadPicker.d.ts +6 -1
  67. package/dist/components/WorkloadPicker.d.ts.map +1 -1
  68. package/dist/components/WorkloadPicker.js +2 -1
  69. package/dist/components/WorkloadPicker.js.map +1 -1
  70. package/dist/components/combobox-types.d.ts +107 -0
  71. package/dist/components/combobox-types.d.ts.map +1 -0
  72. package/dist/components/combobox-utils.cjs +21 -0
  73. package/dist/components/combobox-utils.cjs.map +1 -0
  74. package/dist/components/combobox-utils.d.ts +15 -0
  75. package/dist/components/combobox-utils.d.ts.map +1 -0
  76. package/dist/components/combobox-utils.js +21 -0
  77. package/dist/components/combobox-utils.js.map +1 -0
  78. package/dist/components/endpoint-port.cjs +12 -0
  79. package/dist/components/endpoint-port.cjs.map +1 -0
  80. package/dist/components/endpoint-port.d.ts +4 -0
  81. package/dist/components/endpoint-port.d.ts.map +1 -0
  82. package/dist/components/endpoint-port.js +12 -0
  83. package/dist/components/endpoint-port.js.map +1 -0
  84. package/dist/components/json-schema-form-array.cjs +12 -23
  85. package/dist/components/json-schema-form-array.cjs.map +1 -1
  86. package/dist/components/json-schema-form-array.d.ts +1 -1
  87. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  88. package/dist/components/json-schema-form-array.js +12 -23
  89. package/dist/components/json-schema-form-array.js.map +1 -1
  90. package/dist/components/json-schema-form-discriminator.cjs +6 -2
  91. package/dist/components/json-schema-form-discriminator.cjs.map +1 -1
  92. package/dist/components/json-schema-form-discriminator.d.ts.map +1 -1
  93. package/dist/components/json-schema-form-discriminator.js +6 -2
  94. package/dist/components/json-schema-form-discriminator.js.map +1 -1
  95. package/dist/components/json-schema-form-error-display.cjs +50 -0
  96. package/dist/components/json-schema-form-error-display.cjs.map +1 -0
  97. package/dist/components/json-schema-form-error-display.d.ts +12 -0
  98. package/dist/components/json-schema-form-error-display.d.ts.map +1 -0
  99. package/dist/components/json-schema-form-error-display.js +50 -0
  100. package/dist/components/json-schema-form-error-display.js.map +1 -0
  101. package/dist/components/json-schema-form-error-types.d.ts +26 -0
  102. package/dist/components/json-schema-form-error-types.d.ts.map +1 -0
  103. package/dist/components/json-schema-form-errors.cjs +169 -0
  104. package/dist/components/json-schema-form-errors.cjs.map +1 -0
  105. package/dist/components/json-schema-form-errors.d.ts +14 -0
  106. package/dist/components/json-schema-form-errors.d.ts.map +1 -0
  107. package/dist/components/json-schema-form-errors.js +169 -0
  108. package/dist/components/json-schema-form-errors.js.map +1 -0
  109. package/dist/components/json-schema-form-object.cjs +12 -2
  110. package/dist/components/json-schema-form-object.cjs.map +1 -1
  111. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-object.js +12 -2
  113. package/dist/components/json-schema-form-object.js.map +1 -1
  114. package/dist/components/json-schema-form-refs.cjs +84 -19
  115. package/dist/components/json-schema-form-refs.cjs.map +1 -1
  116. package/dist/components/json-schema-form-refs.d.ts.map +1 -1
  117. package/dist/components/json-schema-form-refs.js +84 -19
  118. package/dist/components/json-schema-form-refs.js.map +1 -1
  119. package/dist/components/json-schema-form-render.cjs +33 -10
  120. package/dist/components/json-schema-form-render.cjs.map +1 -1
  121. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  122. package/dist/components/json-schema-form-render.js +34 -11
  123. package/dist/components/json-schema-form-render.js.map +1 -1
  124. package/dist/components/json-schema-form-resolve.cjs +16 -4
  125. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  126. package/dist/components/json-schema-form-resolve.d.ts +1 -0
  127. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  128. package/dist/components/json-schema-form-resolve.js +17 -5
  129. package/dist/components/json-schema-form-resolve.js.map +1 -1
  130. package/dist/components/json-schema-form-types.d.ts +4 -3
  131. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  132. package/dist/components.cjs +13 -0
  133. package/dist/components.cjs.map +1 -1
  134. package/dist/components.d.ts +8 -1
  135. package/dist/components.d.ts.map +1 -1
  136. package/dist/components.js +15 -2
  137. package/dist/components.js.map +1 -1
  138. package/dist/data/DataTable.cjs +205 -14
  139. package/dist/data/DataTable.cjs.map +1 -1
  140. package/dist/data/DataTable.d.ts +41 -0
  141. package/dist/data/DataTable.d.ts.map +1 -1
  142. package/dist/data/DataTable.grouping.cjs +21 -0
  143. package/dist/data/DataTable.grouping.cjs.map +1 -0
  144. package/dist/data/DataTable.grouping.d.ts +26 -0
  145. package/dist/data/DataTable.grouping.d.ts.map +1 -0
  146. package/dist/data/DataTable.grouping.js +21 -0
  147. package/dist/data/DataTable.grouping.js.map +1 -0
  148. package/dist/data/DataTable.js +205 -14
  149. package/dist/data/DataTable.js.map +1 -1
  150. package/dist/data/Markdown.cjs +45 -1
  151. package/dist/data/Markdown.cjs.map +1 -1
  152. package/dist/data/Markdown.d.ts +3 -2
  153. package/dist/data/Markdown.d.ts.map +1 -1
  154. package/dist/data/Markdown.js +45 -1
  155. package/dist/data/Markdown.js.map +1 -1
  156. package/dist/data/MarkdownEditor.cjs +4 -3
  157. package/dist/data/MarkdownEditor.cjs.map +1 -1
  158. package/dist/data/MarkdownEditor.d.ts +6 -2
  159. package/dist/data/MarkdownEditor.d.ts.map +1 -1
  160. package/dist/data/MarkdownEditor.js +4 -3
  161. package/dist/data/MarkdownEditor.js.map +1 -1
  162. package/dist/data/ServerTimingBadge.cjs +64 -0
  163. package/dist/data/ServerTimingBadge.cjs.map +1 -0
  164. package/dist/data/ServerTimingBadge.d.ts +9 -0
  165. package/dist/data/ServerTimingBadge.d.ts.map +1 -0
  166. package/dist/data/ServerTimingBadge.js +64 -0
  167. package/dist/data/ServerTimingBadge.js.map +1 -0
  168. package/dist/data/StatStrip.cjs +99 -0
  169. package/dist/data/StatStrip.cjs.map +1 -0
  170. package/dist/data/StatStrip.d.ts +41 -0
  171. package/dist/data/StatStrip.d.ts.map +1 -0
  172. package/dist/data/StatStrip.js +99 -0
  173. package/dist/data/StatStrip.js.map +1 -0
  174. package/dist/data/TaskManager.cjs +20 -1
  175. package/dist/data/TaskManager.cjs.map +1 -1
  176. package/dist/data/TaskManager.d.ts +3 -1
  177. package/dist/data/TaskManager.d.ts.map +1 -1
  178. package/dist/data/TaskManager.js +20 -1
  179. package/dist/data/TaskManager.js.map +1 -1
  180. package/dist/data/TaskManagerButton.cjs +49 -0
  181. package/dist/data/TaskManagerButton.cjs.map +1 -0
  182. package/dist/data/TaskManagerButton.d.ts +8 -0
  183. package/dist/data/TaskManagerButton.d.ts.map +1 -0
  184. package/dist/data/TaskManagerButton.js +49 -0
  185. package/dist/data/TaskManagerButton.js.map +1 -0
  186. package/dist/data/TaskProcessDetails.cjs +113 -0
  187. package/dist/data/TaskProcessDetails.cjs.map +1 -0
  188. package/dist/data/TaskProcessDetails.d.ts +6 -0
  189. package/dist/data/TaskProcessDetails.d.ts.map +1 -0
  190. package/dist/data/TaskProcessDetails.js +113 -0
  191. package/dist/data/TaskProcessDetails.js.map +1 -0
  192. package/dist/data/TaskProgress.cjs +106 -19
  193. package/dist/data/TaskProgress.cjs.map +1 -1
  194. package/dist/data/TaskProgress.d.ts +4 -2
  195. package/dist/data/TaskProgress.d.ts.map +1 -1
  196. package/dist/data/TaskProgress.js +107 -20
  197. package/dist/data/TaskProgress.js.map +1 -1
  198. package/dist/data/TaskSnapshot.cjs.map +1 -1
  199. package/dist/data/TaskSnapshot.d.ts +43 -0
  200. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  201. package/dist/data/TaskSnapshot.js.map +1 -1
  202. package/dist/data/Tree.cjs +91 -82
  203. package/dist/data/Tree.cjs.map +1 -1
  204. package/dist/data/Tree.d.ts +3 -1
  205. package/dist/data/Tree.d.ts.map +1 -1
  206. package/dist/data/Tree.js +91 -82
  207. package/dist/data/Tree.js.map +1 -1
  208. package/dist/data/TreeNode.cjs +3 -0
  209. package/dist/data/TreeNode.cjs.map +1 -1
  210. package/dist/data/TreeNode.d.ts +2 -1
  211. package/dist/data/TreeNode.d.ts.map +1 -1
  212. package/dist/data/TreeNode.js +3 -0
  213. package/dist/data/TreeNode.js.map +1 -1
  214. package/dist/data/ai/ChatWindow.cjs +18 -141
  215. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  216. package/dist/data/ai/ChatWindow.d.ts +2 -40
  217. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  218. package/dist/data/ai/ChatWindow.js +15 -138
  219. package/dist/data/ai/ChatWindow.js.map +1 -1
  220. package/dist/data/ai/ChatWindow.models.cjs +11 -0
  221. package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
  222. package/dist/data/ai/ChatWindow.models.d.ts +3 -0
  223. package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
  224. package/dist/data/ai/ChatWindow.models.js +11 -0
  225. package/dist/data/ai/ChatWindow.models.js.map +1 -0
  226. package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
  227. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
  228. package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
  229. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
  230. package/dist/data/ai/ChatWindow.preferences.js +57 -0
  231. package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
  232. package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
  233. package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
  234. package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
  235. package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
  236. package/dist/data/ai/ChatWindow.thread-status.js +14 -0
  237. package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
  238. package/dist/data/ai/ChatWindow.thread.cjs +68 -0
  239. package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
  240. package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
  241. package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
  242. package/dist/data/ai/ChatWindow.thread.js +68 -0
  243. package/dist/data/ai/ChatWindow.thread.js.map +1 -0
  244. package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
  245. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
  246. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
  247. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
  248. package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
  249. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
  250. package/dist/data/ai/ChatWindow.types.d.ts +41 -0
  251. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
  252. package/dist/data/ai/ContextBadges.cjs +76 -46
  253. package/dist/data/ai/ContextBadges.cjs.map +1 -1
  254. package/dist/data/ai/ContextBadges.d.ts.map +1 -1
  255. package/dist/data/ai/ContextBadges.js +77 -47
  256. package/dist/data/ai/ContextBadges.js.map +1 -1
  257. package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
  258. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  259. package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
  260. package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
  261. package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
  262. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  263. package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
  264. package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
  265. package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
  266. package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
  267. package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
  268. package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
  269. package/dist/data/ai/PromptPicker/index.d.ts +2 -1
  270. package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
  271. package/dist/data/ai/PromptPicker/types.cjs +7 -0
  272. package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
  273. package/dist/data/ai/PromptPicker/types.d.ts +18 -2
  274. package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
  275. package/dist/data/ai/PromptPicker/types.js +7 -0
  276. package/dist/data/ai/PromptPicker/types.js.map +1 -0
  277. package/dist/data/ai/PromptRunEditor/index.cjs +171 -91
  278. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  279. package/dist/data/ai/PromptRunEditor/index.d.ts +9 -9
  280. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  281. package/dist/data/ai/PromptRunEditor/index.js +175 -95
  282. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  283. package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
  284. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
  285. package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
  286. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
  287. package/dist/data/ai/PromptRunEditor/model.js +47 -0
  288. package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
  289. package/dist/data/ai/RuntimeBar.cjs +408 -0
  290. package/dist/data/ai/RuntimeBar.cjs.map +1 -0
  291. package/dist/data/ai/RuntimeBar.d.ts +20 -0
  292. package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
  293. package/dist/data/ai/RuntimeBar.js +408 -0
  294. package/dist/data/ai/RuntimeBar.js.map +1 -0
  295. package/dist/data/ai/RuntimeBar.model.cjs +14 -0
  296. package/dist/data/ai/RuntimeBar.model.cjs.map +1 -0
  297. package/dist/data/ai/RuntimeBar.model.d.ts +10 -0
  298. package/dist/data/ai/RuntimeBar.model.d.ts.map +1 -0
  299. package/dist/data/ai/RuntimeBar.model.js +14 -0
  300. package/dist/data/ai/RuntimeBar.model.js.map +1 -0
  301. package/dist/data/ai/RuntimeBarCombo.cjs +359 -0
  302. package/dist/data/ai/RuntimeBarCombo.cjs.map +1 -0
  303. package/dist/data/ai/RuntimeBarCombo.d.ts +22 -0
  304. package/dist/data/ai/RuntimeBarCombo.d.ts.map +1 -0
  305. package/dist/data/ai/RuntimeBarCombo.js +359 -0
  306. package/dist/data/ai/RuntimeBarCombo.js.map +1 -0
  307. package/dist/data/ai/SessionChatComposer.cjs +56 -0
  308. package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
  309. package/dist/data/ai/SessionChatComposer.d.ts +24 -0
  310. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
  311. package/dist/data/ai/SessionChatComposer.js +56 -0
  312. package/dist/data/ai/SessionChatComposer.js.map +1 -0
  313. package/dist/data/ai/SessionInspector.cjs +222 -382
  314. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  315. package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
  316. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
  317. package/dist/data/ai/SessionInspector.collection.cjs +377 -0
  318. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
  319. package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
  320. package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
  321. package/dist/data/ai/SessionInspector.collection.js +377 -0
  322. package/dist/data/ai/SessionInspector.collection.js.map +1 -0
  323. package/dist/data/ai/SessionInspector.d.ts +9 -4
  324. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  325. package/dist/data/ai/SessionInspector.files.cjs +162 -0
  326. package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
  327. package/dist/data/ai/SessionInspector.files.d.ts +5 -0
  328. package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
  329. package/dist/data/ai/SessionInspector.files.js +162 -0
  330. package/dist/data/ai/SessionInspector.files.js.map +1 -0
  331. package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
  332. package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
  333. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
  334. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
  335. package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
  336. package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
  337. package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
  338. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
  339. package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
  340. package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
  341. package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
  342. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
  343. package/dist/data/ai/SessionInspector.js +224 -384
  344. package/dist/data/ai/SessionInspector.js.map +1 -1
  345. package/dist/data/ai/SessionInspector.model.cjs +125 -0
  346. package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
  347. package/dist/data/ai/SessionInspector.model.d.ts +14 -0
  348. package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
  349. package/dist/data/ai/SessionInspector.model.js +125 -0
  350. package/dist/data/ai/SessionInspector.model.js.map +1 -0
  351. package/dist/data/ai/SessionInspector.panels.cjs +265 -0
  352. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
  353. package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
  354. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
  355. package/dist/data/ai/SessionInspector.panels.js +265 -0
  356. package/dist/data/ai/SessionInspector.panels.js.map +1 -0
  357. package/dist/data/ai/SessionInspector.plan.cjs +77 -0
  358. package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
  359. package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
  360. package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
  361. package/dist/data/ai/SessionInspector.plan.js +77 -0
  362. package/dist/data/ai/SessionInspector.plan.js.map +1 -0
  363. package/dist/data/ai/SessionInspector.summary.cjs +182 -0
  364. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
  365. package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
  366. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
  367. package/dist/data/ai/SessionInspector.summary.js +182 -0
  368. package/dist/data/ai/SessionInspector.summary.js.map +1 -0
  369. package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
  370. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
  371. package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
  372. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
  373. package/dist/data/ai/SessionInspector.transcript.js +94 -0
  374. package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
  375. package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
  376. package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
  377. package/dist/data/ai/SessionViewer.cjs +86 -121
  378. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  379. package/dist/data/ai/SessionViewer.d.ts +8 -1
  380. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  381. package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
  382. package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
  383. package/dist/data/ai/SessionViewer.header.cjs +118 -0
  384. package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
  385. package/dist/data/ai/SessionViewer.header.d.ts +11 -0
  386. package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
  387. package/dist/data/ai/SessionViewer.header.js +118 -0
  388. package/dist/data/ai/SessionViewer.header.js.map +1 -0
  389. package/dist/data/ai/SessionViewer.js +87 -122
  390. package/dist/data/ai/SessionViewer.js.map +1 -1
  391. package/dist/data/ai/SessionViewer.model.cjs +111 -39
  392. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  393. package/dist/data/ai/SessionViewer.model.d.ts +6 -0
  394. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  395. package/dist/data/ai/SessionViewer.model.js +111 -39
  396. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  397. package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
  398. package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
  399. package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
  400. package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
  401. package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
  402. package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
  403. package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
  404. package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
  405. package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
  406. package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
  407. package/dist/data/ai/SessionViewer.row-time.js +15 -0
  408. package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
  409. package/dist/data/ai/SessionViewer.rows.cjs +37 -424
  410. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  411. package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
  412. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  413. package/dist/data/ai/SessionViewer.rows.js +31 -418
  414. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  415. package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
  416. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
  417. package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
  418. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
  419. package/dist/data/ai/SessionViewer.tool-details.js +65 -0
  420. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
  421. package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
  422. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
  423. package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
  424. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
  425. package/dist/data/ai/SessionViewer.tool-row.js +404 -0
  426. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
  427. package/dist/data/ai/SessionViewer.unified.d.ts +11 -2
  428. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  429. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
  430. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  431. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  432. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
  433. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  434. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
  435. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  436. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  437. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
  438. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  439. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
  440. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  441. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
  442. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
  443. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  444. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
  445. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
  446. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
  447. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
  448. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
  449. package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
  450. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  451. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  452. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  453. package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
  454. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  455. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
  456. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  457. package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
  458. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  459. package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
  460. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  461. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
  462. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  463. package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
  464. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  465. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  466. package/dist/data/ai/ThreadPicker.d.ts +2 -0
  467. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  468. package/dist/data/ai/ThreadPicker.js.map +1 -1
  469. package/dist/data/ai/ToolPreferences.cjs +2 -1
  470. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  471. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  472. package/dist/data/ai/ToolPreferences.js +2 -1
  473. package/dist/data/ai/ToolPreferences.js.map +1 -1
  474. package/dist/data/ai/agent-action-icons.cjs +7 -10
  475. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  476. package/dist/data/ai/agent-action-icons.d.ts +1 -2
  477. package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
  478. package/dist/data/ai/agent-action-icons.js +8 -11
  479. package/dist/data/ai/agent-action-icons.js.map +1 -1
  480. package/dist/data/ai/context.cjs.map +1 -1
  481. package/dist/data/ai/context.d.ts +4 -0
  482. package/dist/data/ai/context.d.ts.map +1 -1
  483. package/dist/data/ai/context.js.map +1 -1
  484. package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
  485. package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
  486. package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
  487. package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
  488. package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
  489. package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
  490. package/dist/data/ai/examples/sessions/claude.cjs +252 -0
  491. package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
  492. package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
  493. package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
  494. package/dist/data/ai/examples/sessions/claude.js +252 -0
  495. package/dist/data/ai/examples/sessions/claude.js.map +1 -0
  496. package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
  497. package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
  498. package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
  499. package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
  500. package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
  501. package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
  502. package/dist/data/ai/examples/sessions/codex.cjs +236 -0
  503. package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
  504. package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
  505. package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
  506. package/dist/data/ai/examples/sessions/codex.js +236 -0
  507. package/dist/data/ai/examples/sessions/codex.js.map +1 -0
  508. package/dist/data/ai/examples/sessions/index.cjs +21 -0
  509. package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
  510. package/dist/data/ai/examples/sessions/index.d.ts +10 -0
  511. package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
  512. package/dist/data/ai/examples/sessions/index.js +21 -0
  513. package/dist/data/ai/examples/sessions/index.js.map +1 -0
  514. package/dist/data/ai/index.d.ts +9 -3
  515. package/dist/data/ai/index.d.ts.map +1 -1
  516. package/dist/data/ai/model-capabilities.cjs +12 -1
  517. package/dist/data/ai/model-capabilities.cjs.map +1 -1
  518. package/dist/data/ai/model-capabilities.d.ts +2 -6
  519. package/dist/data/ai/model-capabilities.d.ts.map +1 -1
  520. package/dist/data/ai/model-capabilities.js +12 -1
  521. package/dist/data/ai/model-capabilities.js.map +1 -1
  522. package/dist/data/ai/runtime-mode.cjs +72 -1
  523. package/dist/data/ai/runtime-mode.cjs.map +1 -1
  524. package/dist/data/ai/runtime-mode.d.ts +28 -0
  525. package/dist/data/ai/runtime-mode.d.ts.map +1 -1
  526. package/dist/data/ai/runtime-mode.js +73 -2
  527. package/dist/data/ai/runtime-mode.js.map +1 -1
  528. package/dist/data/cells/EntityCell.cjs +64 -0
  529. package/dist/data/cells/EntityCell.cjs.map +1 -0
  530. package/dist/data/cells/EntityCell.d.ts +27 -0
  531. package/dist/data/cells/EntityCell.d.ts.map +1 -0
  532. package/dist/data/cells/EntityCell.js +64 -0
  533. package/dist/data/cells/EntityCell.js.map +1 -0
  534. package/dist/data/chat/Attachment.cjs +53 -13
  535. package/dist/data/chat/Attachment.cjs.map +1 -1
  536. package/dist/data/chat/Attachment.d.ts +9 -3
  537. package/dist/data/chat/Attachment.d.ts.map +1 -1
  538. package/dist/data/chat/Attachment.js +54 -14
  539. package/dist/data/chat/Attachment.js.map +1 -1
  540. package/dist/data/chat/Chat.cjs +113 -36
  541. package/dist/data/chat/Chat.cjs.map +1 -1
  542. package/dist/data/chat/Chat.d.ts +11 -4
  543. package/dist/data/chat/Chat.d.ts.map +1 -1
  544. package/dist/data/chat/Chat.js +111 -34
  545. package/dist/data/chat/Chat.js.map +1 -1
  546. package/dist/data/chat/ContextMeter.cjs +240 -66
  547. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  548. package/dist/data/chat/ContextMeter.d.ts +11 -3
  549. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  550. package/dist/data/chat/ContextMeter.js +241 -67
  551. package/dist/data/chat/ContextMeter.js.map +1 -1
  552. package/dist/data/chat/Conversation.cjs +55 -3
  553. package/dist/data/chat/Conversation.cjs.map +1 -1
  554. package/dist/data/chat/Conversation.d.ts +5 -1
  555. package/dist/data/chat/Conversation.d.ts.map +1 -1
  556. package/dist/data/chat/Conversation.js +55 -3
  557. package/dist/data/chat/Conversation.js.map +1 -1
  558. package/dist/data/chat/ModelSelector.cjs +8 -10
  559. package/dist/data/chat/ModelSelector.cjs.map +1 -1
  560. package/dist/data/chat/ModelSelector.d.ts.map +1 -1
  561. package/dist/data/chat/ModelSelector.js +9 -11
  562. package/dist/data/chat/ModelSelector.js.map +1 -1
  563. package/dist/data/chat/PromptInput.cjs +56 -5
  564. package/dist/data/chat/PromptInput.cjs.map +1 -1
  565. package/dist/data/chat/PromptInput.d.ts +10 -1
  566. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  567. package/dist/data/chat/PromptInput.js +57 -6
  568. package/dist/data/chat/PromptInput.js.map +1 -1
  569. package/dist/data/chat/approval.cjs +21 -0
  570. package/dist/data/chat/approval.cjs.map +1 -0
  571. package/dist/data/chat/approval.d.ts +11 -0
  572. package/dist/data/chat/approval.d.ts.map +1 -0
  573. package/dist/data/chat/approval.js +21 -0
  574. package/dist/data/chat/approval.js.map +1 -0
  575. package/dist/data/chat/attachment-upload.cjs +33 -0
  576. package/dist/data/chat/attachment-upload.cjs.map +1 -0
  577. package/dist/data/chat/attachment-upload.d.ts +21 -0
  578. package/dist/data/chat/attachment-upload.d.ts.map +1 -0
  579. package/dist/data/chat/attachment-upload.js +33 -0
  580. package/dist/data/chat/attachment-upload.js.map +1 -0
  581. package/dist/data/chat/effort-icons.cjs +36 -6
  582. package/dist/data/chat/effort-icons.cjs.map +1 -1
  583. package/dist/data/chat/effort-icons.d.ts +6 -3
  584. package/dist/data/chat/effort-icons.d.ts.map +1 -1
  585. package/dist/data/chat/effort-icons.js +37 -7
  586. package/dist/data/chat/effort-icons.js.map +1 -1
  587. package/dist/data/chat/index.d.ts +3 -1
  588. package/dist/data/chat/index.d.ts.map +1 -1
  589. package/dist/data/chat/models.cjs +8 -0
  590. package/dist/data/chat/models.cjs.map +1 -0
  591. package/dist/data/chat/models.d.ts +11 -0
  592. package/dist/data/chat/models.d.ts.map +1 -0
  593. package/dist/data/chat/models.js +8 -0
  594. package/dist/data/chat/models.js.map +1 -0
  595. package/dist/data/chat/provider-icons.cjs +49 -16
  596. package/dist/data/chat/provider-icons.cjs.map +1 -1
  597. package/dist/data/chat/provider-icons.d.ts +2 -0
  598. package/dist/data/chat/provider-icons.d.ts.map +1 -1
  599. package/dist/data/chat/provider-icons.js +50 -17
  600. package/dist/data/chat/provider-icons.js.map +1 -1
  601. package/dist/data/chat/types.cjs.map +1 -1
  602. package/dist/data/chat/types.d.ts +21 -0
  603. package/dist/data/chat/types.d.ts.map +1 -1
  604. package/dist/data/chat/types.js.map +1 -1
  605. package/dist/data/examples/markdown-preview-mock.cjs +45 -0
  606. package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
  607. package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
  608. package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
  609. package/dist/data/examples/markdown-preview-mock.js +45 -0
  610. package/dist/data/examples/markdown-preview-mock.js.map +1 -0
  611. package/dist/data/examples/markdown-syntax.cjs +36 -0
  612. package/dist/data/examples/markdown-syntax.cjs.map +1 -0
  613. package/dist/data/examples/markdown-syntax.d.ts +12 -0
  614. package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
  615. package/dist/data/examples/markdown-syntax.js +36 -0
  616. package/dist/data/examples/markdown-syntax.js.map +1 -0
  617. package/dist/data/examples/markdown-syntax.md.cjs +4 -0
  618. package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
  619. package/dist/data/examples/markdown-syntax.md.js +5 -0
  620. package/dist/data/examples/markdown-syntax.md.js.map +1 -0
  621. package/dist/data/server-timing.cjs +120 -0
  622. package/dist/data/server-timing.cjs.map +1 -0
  623. package/dist/data/server-timing.d.ts +11 -0
  624. package/dist/data/server-timing.d.ts.map +1 -0
  625. package/dist/data/server-timing.js +120 -0
  626. package/dist/data/server-timing.js.map +1 -0
  627. package/dist/data/task-process-details.cjs +48 -0
  628. package/dist/data/task-process-details.cjs.map +1 -0
  629. package/dist/data/task-process-details.d.ts +5 -0
  630. package/dist/data/task-process-details.d.ts.map +1 -0
  631. package/dist/data/task-process-details.js +48 -0
  632. package/dist/data/task-process-details.js.map +1 -0
  633. package/dist/data/version-info.cjs +3 -3
  634. package/dist/data/version-info.js +3 -3
  635. package/dist/data.cjs +37 -0
  636. package/dist/data.cjs.map +1 -1
  637. package/dist/data.d.ts +9 -1
  638. package/dist/data.d.ts.map +1 -1
  639. package/dist/data.js +37 -0
  640. package/dist/data.js.map +1 -1
  641. package/dist/hooks/use-hotkey.cjs +98 -0
  642. package/dist/hooks/use-hotkey.cjs.map +1 -0
  643. package/dist/hooks/use-hotkey.d.ts +42 -0
  644. package/dist/hooks/use-hotkey.d.ts.map +1 -0
  645. package/dist/hooks/use-hotkey.js +98 -0
  646. package/dist/hooks/use-hotkey.js.map +1 -0
  647. package/dist/hooks/use-task-run.cjs +23 -1
  648. package/dist/hooks/use-task-run.cjs.map +1 -1
  649. package/dist/hooks/use-task-run.d.ts.map +1 -1
  650. package/dist/hooks/use-task-run.js +23 -1
  651. package/dist/hooks/use-task-run.js.map +1 -1
  652. package/dist/hooks.cjs +4 -0
  653. package/dist/hooks.cjs.map +1 -1
  654. package/dist/hooks.d.ts +1 -0
  655. package/dist/hooks.d.ts.map +1 -1
  656. package/dist/hooks.js +4 -0
  657. package/dist/hooks.js.map +1 -1
  658. package/dist/icons/components/UiBank.cjs +15 -0
  659. package/dist/icons/components/UiBank.cjs.map +1 -0
  660. package/dist/icons/components/UiBank.d.ts +15 -0
  661. package/dist/icons/components/UiBank.d.ts.map +1 -0
  662. package/dist/icons/components/UiBank.js +15 -0
  663. package/dist/icons/components/UiBank.js.map +1 -0
  664. package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
  665. package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
  666. package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
  667. package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
  668. package/dist/icons/components/UiChartOfAccounts.js +15 -0
  669. package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
  670. package/dist/icons/components/UiCloudUpload.cjs +15 -0
  671. package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
  672. package/dist/icons/components/UiCloudUpload.d.ts +15 -0
  673. package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
  674. package/dist/icons/components/UiCloudUpload.js +15 -0
  675. package/dist/icons/components/UiCloudUpload.js.map +1 -0
  676. package/dist/icons/components/UiLedger.cjs +15 -0
  677. package/dist/icons/components/UiLedger.cjs.map +1 -0
  678. package/dist/icons/components/UiLedger.d.ts +15 -0
  679. package/dist/icons/components/UiLedger.d.ts.map +1 -0
  680. package/dist/icons/components/UiLedger.js +15 -0
  681. package/dist/icons/components/UiLedger.js.map +1 -0
  682. package/dist/icons/components/UiReceipt.cjs +15 -0
  683. package/dist/icons/components/UiReceipt.cjs.map +1 -0
  684. package/dist/icons/components/UiReceipt.d.ts +15 -0
  685. package/dist/icons/components/UiReceipt.d.ts.map +1 -0
  686. package/dist/icons/components/UiReceipt.js +15 -0
  687. package/dist/icons/components/UiReceipt.js.map +1 -0
  688. package/dist/icons/index.d.ts +10 -0
  689. package/dist/icons/index.d.ts.map +1 -1
  690. package/dist/icons.cjs +15 -0
  691. package/dist/icons.cjs.map +1 -1
  692. package/dist/icons.js +15 -0
  693. package/dist/icons.js.map +1 -1
  694. package/dist/index.cjs +54 -0
  695. package/dist/index.cjs.map +1 -1
  696. package/dist/index.js +56 -2
  697. package/dist/index.js.map +1 -1
  698. package/dist/layout/AppShell.cjs +270 -238
  699. package/dist/layout/AppShell.cjs.map +1 -1
  700. package/dist/layout/AppShell.d.ts +9 -0
  701. package/dist/layout/AppShell.d.ts.map +1 -1
  702. package/dist/layout/AppShell.debug.cjs +53 -0
  703. package/dist/layout/AppShell.debug.cjs.map +1 -0
  704. package/dist/layout/AppShell.debug.d.ts +6 -0
  705. package/dist/layout/AppShell.debug.d.ts.map +1 -0
  706. package/dist/layout/AppShell.debug.js +53 -0
  707. package/dist/layout/AppShell.debug.js.map +1 -0
  708. package/dist/layout/AppShell.js +269 -237
  709. package/dist/layout/AppShell.js.map +1 -1
  710. package/dist/layout/AppShell.nav.cjs +90 -0
  711. package/dist/layout/AppShell.nav.cjs.map +1 -0
  712. package/dist/layout/AppShell.nav.d.ts +7 -0
  713. package/dist/layout/AppShell.nav.d.ts.map +1 -0
  714. package/dist/layout/AppShell.nav.js +90 -0
  715. package/dist/layout/AppShell.nav.js.map +1 -0
  716. package/dist/layout/AppSidebar.cjs +35 -5
  717. package/dist/layout/AppSidebar.cjs.map +1 -1
  718. package/dist/layout/AppSidebar.d.ts +4 -1
  719. package/dist/layout/AppSidebar.d.ts.map +1 -1
  720. package/dist/layout/AppSidebar.js +35 -5
  721. package/dist/layout/AppSidebar.js.map +1 -1
  722. package/dist/layout/Panel.cjs +25 -41
  723. package/dist/layout/Panel.cjs.map +1 -1
  724. package/dist/layout/Panel.d.ts +2 -1
  725. package/dist/layout/Panel.d.ts.map +1 -1
  726. package/dist/layout/Panel.js +26 -42
  727. package/dist/layout/Panel.js.map +1 -1
  728. package/dist/layout/PanelFrame.cjs +56 -0
  729. package/dist/layout/PanelFrame.cjs.map +1 -0
  730. package/dist/layout/PanelFrame.d.ts +15 -0
  731. package/dist/layout/PanelFrame.d.ts.map +1 -0
  732. package/dist/layout/PanelFrame.js +56 -0
  733. package/dist/layout/PanelFrame.js.map +1 -0
  734. package/dist/layout/Section.cjs +51 -41
  735. package/dist/layout/Section.cjs.map +1 -1
  736. package/dist/layout/Section.d.ts +3 -2
  737. package/dist/layout/Section.d.ts.map +1 -1
  738. package/dist/layout/Section.js +51 -41
  739. package/dist/layout/Section.js.map +1 -1
  740. package/dist/layout/content-width.cjs +8 -0
  741. package/dist/layout/content-width.cjs.map +1 -0
  742. package/dist/layout/content-width.d.ts +3 -0
  743. package/dist/layout/content-width.d.ts.map +1 -0
  744. package/dist/layout/content-width.js +8 -0
  745. package/dist/layout/content-width.js.map +1 -0
  746. package/dist/overlay/CommandPalette.cjs +207 -0
  747. package/dist/overlay/CommandPalette.cjs.map +1 -0
  748. package/dist/overlay/CommandPalette.d.ts +71 -0
  749. package/dist/overlay/CommandPalette.d.ts.map +1 -0
  750. package/dist/overlay/CommandPalette.js +207 -0
  751. package/dist/overlay/CommandPalette.js.map +1 -0
  752. package/dist/overlay/CommandPalette.model.cjs +70 -0
  753. package/dist/overlay/CommandPalette.model.cjs.map +1 -0
  754. package/dist/overlay/CommandPalette.model.d.ts +71 -0
  755. package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
  756. package/dist/overlay/CommandPalette.model.js +70 -0
  757. package/dist/overlay/CommandPalette.model.js.map +1 -0
  758. package/dist/overlay/CommandPaletteList.cjs +88 -0
  759. package/dist/overlay/CommandPaletteList.cjs.map +1 -0
  760. package/dist/overlay/CommandPaletteList.d.ts +23 -0
  761. package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
  762. package/dist/overlay/CommandPaletteList.js +88 -0
  763. package/dist/overlay/CommandPaletteList.js.map +1 -0
  764. package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
  765. package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
  766. package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
  767. package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
  768. package/dist/overlay/CommandPaletteTrigger.js +36 -0
  769. package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
  770. package/dist/overlay/HoverCard.cjs.map +1 -1
  771. package/dist/overlay/HoverCard.d.ts +2 -2
  772. package/dist/overlay/HoverCard.d.ts.map +1 -1
  773. package/dist/overlay/HoverCard.js.map +1 -1
  774. package/dist/overlay/Modal.cjs +12 -5
  775. package/dist/overlay/Modal.cjs.map +1 -1
  776. package/dist/overlay/Modal.d.ts.map +1 -1
  777. package/dist/overlay/Modal.js +12 -5
  778. package/dist/overlay/Modal.js.map +1 -1
  779. package/dist/overlay/modalStack.js +1 -1
  780. package/dist/overlay/zIndex.cjs +2 -0
  781. package/dist/overlay/zIndex.cjs.map +1 -1
  782. package/dist/overlay/zIndex.js +2 -0
  783. package/dist/overlay/zIndex.js.map +1 -1
  784. package/dist/rpc/EntityExplorerApp.cjs +6 -0
  785. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  786. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  787. package/dist/rpc/EntityExplorerApp.js +6 -0
  788. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  789. package/dist/rpc/OperationCatalog.cjs +45 -71
  790. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  791. package/dist/rpc/OperationCatalog.d.ts +12 -2
  792. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  793. package/dist/rpc/OperationCatalog.js +46 -72
  794. package/dist/rpc/OperationCatalog.js.map +1 -1
  795. package/dist/rpc/OperationResultView.cjs +42 -0
  796. package/dist/rpc/OperationResultView.cjs.map +1 -1
  797. package/dist/rpc/OperationResultView.d.ts +2 -1
  798. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  799. package/dist/rpc/OperationResultView.js +42 -0
  800. package/dist/rpc/OperationResultView.js.map +1 -1
  801. package/dist/rpc/clickyMetadata.cjs +2 -1
  802. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  803. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  804. package/dist/rpc/clickyMetadata.js +2 -1
  805. package/dist/rpc/clickyMetadata.js.map +1 -1
  806. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
  807. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
  808. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
  809. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
  810. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
  811. package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
  812. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  813. package/dist/rpc/types.cjs.map +1 -1
  814. package/dist/rpc/types.d.ts +1 -0
  815. package/dist/rpc/types.d.ts.map +1 -1
  816. package/dist/rpc/types.js.map +1 -1
  817. package/dist/styles.css +1 -1
  818. package/dist/tailwind-preset.cjs +15 -0
  819. package/dist/tailwind-preset.cjs.map +1 -1
  820. package/dist/tailwind-preset.d.ts.map +1 -1
  821. package/dist/tailwind-preset.js +15 -0
  822. package/dist/tailwind-preset.js.map +1 -1
  823. package/package.json +2 -2
@@ -6,11 +6,15 @@ import { Message } from "./Message.js";
6
6
  import { UiArrowDown } from "../../icons/components/UiArrowDown.js";
7
7
  import { UiLoader } from "../../icons/components/UiLoader.js";
8
8
  import { UiCircleX } from "../../icons/components/UiCircleX.js";
9
+ import { UiCheck } from "../../icons/components/UiCheck.js";
10
+ import { UiCopy } from "../../icons/components/UiCopy.js";
9
11
  function Conversation({
10
12
  messages,
11
13
  status,
12
14
  error,
13
15
  onClearError,
16
+ sessionId,
17
+ model,
14
18
  emptyState,
15
19
  className,
16
20
  ...actions
@@ -46,7 +50,16 @@ function Conversation({
46
50
  children: messages.length === 0 && emptyState ? /* @__PURE__ */ jsx("div", { className: "flex size-full flex-col items-center justify-center gap-3 p-8 text-center", children: emptyState }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-8 p-4", children: [
47
51
  messages.map((message) => /* @__PURE__ */ jsx(Message, { message, ...actions }, message.id)),
48
52
  isWaiting && /* @__PURE__ */ jsx(LoadingIndicator, {}),
49
- errorText && /* @__PURE__ */ jsx(ErrorNotice, { message: errorText, onClear: onClearError })
53
+ errorText && /* @__PURE__ */ jsx(
54
+ ErrorNotice,
55
+ {
56
+ message: errorText,
57
+ error,
58
+ sessionId,
59
+ model,
60
+ onClear: onClearError
61
+ }
62
+ )
50
63
  ] })
51
64
  }
52
65
  ),
@@ -77,7 +90,30 @@ function LoadingIndicator() {
77
90
  /* @__PURE__ */ jsx("span", { children: "Waiting for response..." })
78
91
  ] });
79
92
  }
80
- function ErrorNotice({ message, onClear }) {
93
+ function buildErrorReport({ message, error, sessionId, model }) {
94
+ const lines = [`Error: ${message}`];
95
+ if ((error == null ? void 0 : error.name) && error.name !== "Error") lines.push(`Type: ${error.name}`);
96
+ if (sessionId) lines.push(`Session: ${sessionId}`);
97
+ if (model) lines.push(`Model: ${model}`);
98
+ if (typeof window !== "undefined") lines.push(`Page: ${window.location.href}`);
99
+ if (typeof navigator !== "undefined" && navigator.userAgent) lines.push(`User agent: ${navigator.userAgent}`);
100
+ lines.push(`Time: ${(/* @__PURE__ */ new Date()).toISOString()}`);
101
+ const cause = error == null ? void 0 : error.cause;
102
+ const detail = (error == null ? void 0 : error.stack) ?? (cause != null ? String(cause) : "");
103
+ if (detail.trim() && detail.trim() !== message) lines.push("", detail.trim());
104
+ return lines.join("\n");
105
+ }
106
+ function ErrorNotice({ message, error, sessionId, model, onClear }) {
107
+ const [copied, setCopied] = useState(false);
108
+ const copyReport = () => {
109
+ const clip = typeof navigator !== "undefined" ? navigator.clipboard : void 0;
110
+ if (!clip) return;
111
+ void clip.writeText(buildErrorReport({ message, error, sessionId, model })).then(() => {
112
+ setCopied(true);
113
+ setTimeout(() => setCopied(false), 2e3);
114
+ }).catch(() => {
115
+ });
116
+ };
81
117
  return /* @__PURE__ */ jsxs(
82
118
  "div",
83
119
  {
@@ -86,7 +122,23 @@ function ErrorNotice({ message, onClear }) {
86
122
  children: [
87
123
  /* @__PURE__ */ jsx(Icon, { icon: UiCircleX, className: "mt-0.5 size-4 shrink-0" }),
88
124
  /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 whitespace-pre-wrap break-words", children: message }),
89
- onClear && /* @__PURE__ */ jsx("button", { type: "button", className: "shrink-0 text-xs underline-offset-2 hover:underline", onClick: onClear, children: "Dismiss" })
125
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [
126
+ /* @__PURE__ */ jsxs(
127
+ "button",
128
+ {
129
+ type: "button",
130
+ "aria-label": "Copy error details",
131
+ title: "Copy session id, model, page and full error",
132
+ className: "inline-flex items-center gap-1 text-xs underline-offset-2 hover:underline",
133
+ onClick: copyReport,
134
+ children: [
135
+ /* @__PURE__ */ jsx(Icon, { icon: copied ? UiCheck : UiCopy, className: "size-3.5" }),
136
+ copied ? "Copied" : "Copy"
137
+ ]
138
+ }
139
+ ),
140
+ onClear && /* @__PURE__ */ jsx("button", { type: "button", className: "text-xs underline-offset-2 hover:underline", onClick: onClear, children: "Dismiss" })
141
+ ] })
90
142
  ]
91
143
  }
92
144
  );
@@ -1 +1 @@
1
- {"version":3,"file":"Conversation.js","sources":["../../../src/data/chat/Conversation.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowDown, UiCircleX, UiLoader } from \"../../icons\";\nimport { Message, type MessageActionHandlers } from \"./Message\";\nimport type { ChatStatus, UIMessage } from \"./types\";\n\nexport type ConversationProps = MessageActionHandlers & {\n messages: UIMessage[];\n /** Current chat status; used for transient pending/error affordances. */\n status?: ChatStatus | undefined;\n /** Last request error from the chat transport, if any. */\n error?: Error | undefined;\n /** Clears the visible transport error. */\n onClearError?: (() => void) | undefined;\n /** Shown when there are no messages yet. */\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** A scrollable message log that sticks to the bottom as new content streams\n * in, unless the user has scrolled up — in which case a jump-to-bottom button\n * appears. */\nexport function Conversation({\n messages,\n status,\n error,\n onClearError,\n emptyState,\n className,\n ...actions\n}: ConversationProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [pinned, setPinned] = useState(true);\n const isWaiting = status === \"submitted\" || (status === \"streaming\" && !hasVisibleAssistantResponse(messages));\n const errorText = error?.message || (status === \"error\" ? \"The assistant request failed.\" : undefined);\n\n const onScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n setPinned(distance < 32);\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (el && pinned) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n const scrollToBottom = () => {\n const el = scrollRef.current;\n if (el) el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n };\n\n return (\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={scrollRef}\n onScroll={onScroll}\n role=\"log\"\n className={cn(\"flex-1 overflow-y-auto\", className)}\n >\n {messages.length === 0 && emptyState ? (\n <div className=\"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\">\n {emptyState}\n </div>\n ) : (\n <div className=\"flex flex-col gap-8 p-4\">\n {messages.map((message) => (\n <Message key={message.id} message={message} {...actions} />\n ))}\n {isWaiting && <LoadingIndicator />}\n {errorText && <ErrorNotice message={errorText} onClear={onClearError} />}\n </div>\n )}\n </div>\n\n {!pinned && messages.length > 0 && (\n <button\n type=\"button\"\n aria-label=\"Scroll to latest\"\n onClick={scrollToBottom}\n className=\"absolute bottom-3 left-1/2 flex size-8 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-muted-foreground shadow-md hover:text-foreground\"\n >\n <Icon icon={UiArrowDown} className=\"size-4\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction hasVisibleAssistantResponse(messages: UIMessage[]) {\n const last = messages[messages.length - 1];\n if (last?.role !== \"assistant\") return false;\n return last.parts.some((part) => {\n if (part.type === \"step-start\") return false;\n if (part.type === \"text\" || part.type === \"reasoning\") return part.text.length > 0;\n return true;\n });\n}\n\nfunction LoadingIndicator() {\n return (\n <div className=\"flex w-full max-w-[95%] items-center gap-2 text-sm text-muted-foreground\">\n <Icon icon={UiLoader} className=\"size-4 shrink-0 animate-spin\" />\n <span>Waiting for response...</span>\n </div>\n );\n}\n\nfunction ErrorNotice({ message, onClear }: { message: string; onClear?: (() => void) | undefined }) {\n return (\n <div\n role=\"alert\"\n className=\"flex w-full max-w-[95%] items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\"\n >\n <Icon icon={UiCircleX} className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0 flex-1 whitespace-pre-wrap break-words\">{message}</div>\n {onClear && (\n <button type=\"button\" className=\"shrink-0 text-xs underline-offset-2 hover:underline\" onClick={onClear}>\n Dismiss\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Conversation.js","sources":["../../../src/data/chat/Conversation.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowDown, UiCheck, UiCircleX, UiCopy, UiLoader } from \"../../icons\";\nimport { Message, type MessageActionHandlers } from \"./Message\";\nimport type { ChatStatus, UIMessage } from \"./types\";\n\nexport type ConversationProps = MessageActionHandlers & {\n messages: UIMessage[];\n /** Current chat status; used for transient pending/error affordances. */\n status?: ChatStatus | undefined;\n /** Last request error from the chat transport, if any. */\n error?: Error | undefined;\n /** Clears the visible transport error. */\n onClearError?: (() => void) | undefined;\n /** Conversation/thread id, surfaced in the copyable error report. */\n sessionId?: string | undefined;\n /** Selected model id, surfaced in the copyable error report. */\n model?: string | undefined;\n /** Shown when there are no messages yet. */\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** A scrollable message log that sticks to the bottom as new content streams\n * in, unless the user has scrolled up — in which case a jump-to-bottom button\n * appears. */\nexport function Conversation({\n messages,\n status,\n error,\n onClearError,\n sessionId,\n model,\n emptyState,\n className,\n ...actions\n}: ConversationProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [pinned, setPinned] = useState(true);\n const isWaiting = status === \"submitted\" || (status === \"streaming\" && !hasVisibleAssistantResponse(messages));\n const errorText = error?.message || (status === \"error\" ? \"The assistant request failed.\" : undefined);\n\n const onScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n setPinned(distance < 32);\n };\n\n useEffect(() => {\n const el = scrollRef.current;\n if (el && pinned) {\n el.scrollTop = el.scrollHeight;\n }\n });\n\n const scrollToBottom = () => {\n const el = scrollRef.current;\n if (el) el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n };\n\n return (\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={scrollRef}\n onScroll={onScroll}\n role=\"log\"\n className={cn(\"flex-1 overflow-y-auto\", className)}\n >\n {messages.length === 0 && emptyState ? (\n <div className=\"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\">\n {emptyState}\n </div>\n ) : (\n <div className=\"flex flex-col gap-8 p-4\">\n {messages.map((message) => (\n <Message key={message.id} message={message} {...actions} />\n ))}\n {isWaiting && <LoadingIndicator />}\n {errorText && (\n <ErrorNotice\n message={errorText}\n error={error}\n sessionId={sessionId}\n model={model}\n onClear={onClearError}\n />\n )}\n </div>\n )}\n </div>\n\n {!pinned && messages.length > 0 && (\n <button\n type=\"button\"\n aria-label=\"Scroll to latest\"\n onClick={scrollToBottom}\n className=\"absolute bottom-3 left-1/2 flex size-8 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-muted-foreground shadow-md hover:text-foreground\"\n >\n <Icon icon={UiArrowDown} className=\"size-4\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction hasVisibleAssistantResponse(messages: UIMessage[]) {\n const last = messages[messages.length - 1];\n if (last?.role !== \"assistant\") return false;\n return last.parts.some((part) => {\n if (part.type === \"step-start\") return false;\n if (part.type === \"text\" || part.type === \"reasoning\") return part.text.length > 0;\n return true;\n });\n}\n\nfunction LoadingIndicator() {\n return (\n <div className=\"flex w-full max-w-[95%] items-center gap-2 text-sm text-muted-foreground\">\n <Icon icon={UiLoader} className=\"size-4 shrink-0 animate-spin\" />\n <span>Waiting for response...</span>\n </div>\n );\n}\n\ntype ErrorReport = {\n message: string;\n error?: Error | undefined;\n sessionId?: string | undefined;\n model?: string | undefined;\n};\n\n/** Assembles a support-ready plain-text report: the error, the session/model\n * that produced it, the page, and the full stack/cause — everything needed to\n * file or triage the failure without a back-and-forth. */\nfunction buildErrorReport({ message, error, sessionId, model }: ErrorReport): string {\n const lines = [`Error: ${message}`];\n if (error?.name && error.name !== \"Error\") lines.push(`Type: ${error.name}`);\n if (sessionId) lines.push(`Session: ${sessionId}`);\n if (model) lines.push(`Model: ${model}`);\n if (typeof window !== \"undefined\") lines.push(`Page: ${window.location.href}`);\n if (typeof navigator !== \"undefined\" && navigator.userAgent) lines.push(`User agent: ${navigator.userAgent}`);\n lines.push(`Time: ${new Date().toISOString()}`);\n const cause = (error as { cause?: unknown } | undefined)?.cause;\n const detail = error?.stack ?? (cause != null ? String(cause) : \"\");\n if (detail.trim() && detail.trim() !== message) lines.push(\"\", detail.trim());\n return lines.join(\"\\n\");\n}\n\nfunction ErrorNotice({ message, error, sessionId, model, onClear }: ErrorReport & { onClear?: (() => void) | undefined }) {\n const [copied, setCopied] = useState(false);\n const copyReport = () => {\n const clip = typeof navigator !== \"undefined\" ? navigator.clipboard : undefined;\n if (!clip) return;\n void clip\n .writeText(buildErrorReport({ message, error, sessionId, model }))\n .then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {});\n };\n return (\n <div\n role=\"alert\"\n className=\"flex w-full max-w-[95%] items-start gap-2 rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\"\n >\n <Icon icon={UiCircleX} className=\"mt-0.5 size-4 shrink-0\" />\n <div className=\"min-w-0 flex-1 whitespace-pre-wrap break-words\">{message}</div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <button\n type=\"button\"\n aria-label=\"Copy error details\"\n title=\"Copy session id, model, page and full error\"\n className=\"inline-flex items-center gap-1 text-xs underline-offset-2 hover:underline\"\n onClick={copyReport}\n >\n <Icon icon={copied ? UiCheck : UiCopy} className=\"size-3.5\" />\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n {onClear && (\n <button type=\"button\" className=\"text-xs underline-offset-2 hover:underline\" onClick={onClear}>\n Dismiss\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -35,8 +35,11 @@ function ModelSelector({ models, value, onChange, className, size = "sm" }) {
35
35
  );
36
36
  }
37
37
  function EffortSelector({ efforts, value, onChange, className, size = "sm" }) {
38
- const supportedEfforts = efforts.filter(Boolean);
39
- const selectedEffort = value && supportedEfforts.includes(value) ? value : "";
38
+ const selectedEffort = (value == null ? void 0 : value.trim()) ?? "";
39
+ const supportedEfforts = [...new Set(efforts.map((effort) => effort.trim()).filter(Boolean))];
40
+ if (selectedEffort && !supportedEfforts.includes(selectedEffort)) {
41
+ supportedEfforts.push(selectedEffort);
42
+ }
40
43
  const selectedGlyph = selectedEffort ? effortIcons.effortLevelIcon(selectedEffort) : void 0;
41
44
  const selectedColor = selectedEffort ? effortIcons.effortLevelColor(selectedEffort) : void 0;
42
45
  const selectedIcon = selectedGlyph ? react.createElement(selectedGlyph, { className: utils.cn("size-4", selectedColor) }) : void 0;
@@ -44,7 +47,7 @@ function EffortSelector({ efforts, value, onChange, className, size = "sm" }) {
44
47
  Combobox.Combobox,
45
48
  {
46
49
  ariaLabel: "Reasoning effort",
47
- value: value ?? "",
50
+ value: selectedEffort,
48
51
  onChange,
49
52
  allowCustomValue: false,
50
53
  required: true,
@@ -69,7 +72,7 @@ function fullEffortLabel(value) {
69
72
  case "max":
70
73
  return "Maximum";
71
74
  default:
72
- return titleCaseEffort(value);
75
+ return effortIcons.effortLevelLabel(value);
73
76
  }
74
77
  }
75
78
  function shortEffortLabel(value) {
@@ -85,14 +88,9 @@ function shortEffortLabel(value) {
85
88
  case "max":
86
89
  return "Max";
87
90
  default:
88
- return titleCaseEffort(value);
91
+ return effortIcons.effortLevelLabel(value);
89
92
  }
90
93
  }
91
- function titleCaseEffort(value) {
92
- var _a;
93
- const effort = value.trim();
94
- return `${((_a = effort[0]) == null ? void 0 : _a.toUpperCase()) ?? ""}${effort.slice(1)}`;
95
- }
96
94
  function ProviderSelector({
97
95
  providers,
98
96
  value,
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSelector.cjs","sources":["../../../src/data/chat/ModelSelector.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport { Combobox } from \"../../components/Combobox\";\nimport type { FormSize } from \"../../components/json-schema-form-size\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport type { StaticIconComponent } from \"../Icon\";\nimport { cn } from \"../../lib/utils\";\nimport { effortLevelColor, effortLevelIcon } from \"./effort-icons\";\nimport { providerIcon } from \"./provider-icons\";\nimport type { ChatBudgetConfig, ChatModel } from \"./types\";\n\nexport type ModelSelectorProps = {\n models: ChatModel[];\n /** Currently selected model id. */\n value?: string | undefined;\n onChange: (id: string) => void;\n className?: string;\n /** Control size. Defaults to `sm` (compact chat toolbar); pass `md` to match\n * a standard-density form row. */\n size?: FormSize;\n};\n\n/** A searchable model picker driven by the backend model menu, showing each\n * provider's brand icon. Models whose provider is not configured are disabled\n * rather than hidden, so the menu communicates what would be available with the\n * right API key. */\nexport function ModelSelector({ models, value, onChange, className, size = \"sm\" }: ModelSelectorProps) {\n if (models.length === 0) return null;\n const selected = models.find((m) => m.id === value);\n const SelectedGlyph = providerIcon(selected?.provider);\n return (\n <Combobox\n ariaLabel=\"Model\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-48\", className)}\n {...(SelectedGlyph ? { prefix: <SelectedGlyph className=\"size-4\" /> } : {})}\n options={models.map((m) => {\n const Icon = providerIcon(m.provider);\n return {\n value: m.id,\n label: m.label,\n ...(Icon ? { icon: <Icon className=\"size-4\" /> } : {}),\n disabled: m.configured === false,\n };\n })}\n />\n );\n}\n\nexport type EffortSelectorProps = {\n efforts: string[];\n value?: string | undefined;\n onChange: (effort: string) => void;\n className?: string;\n /** Control size. Defaults to `sm`; pass `md` to match a standard form row. */\n size?: FormSize;\n};\n\n/** Reasoning-effort picker, shown only for reasoning-capable models. The empty\n * value means \"no extended thinking\". Strict: only the listed options commit. */\nexport function EffortSelector({ efforts, value, onChange, className, size = \"sm\" }: EffortSelectorProps) {\n const supportedEfforts = efforts.filter(Boolean);\n const selectedEffort = value && supportedEfforts.includes(value) ? value : \"\";\n const selectedGlyph = selectedEffort ? effortLevelIcon(selectedEffort) : undefined;\n const selectedColor = selectedEffort ? effortLevelColor(selectedEffort) : undefined;\n const selectedIcon = selectedGlyph\n ? createElement(selectedGlyph, { className: cn(\"size-4\", selectedColor) })\n : undefined;\n return (\n <Combobox\n ariaLabel=\"Reasoning effort\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-36\", className)}\n {...(selectedIcon ? { prefix: selectedIcon } : {})}\n options={[\n { value: \"\", label: \"None\" },\n ...supportedEfforts.map((effort) => ({\n value: effort,\n label: fullEffortLabel(effort),\n selectedLabel: shortEffortLabel(effort),\n })),\n ]}\n />\n );\n}\n\nfunction fullEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"xhigh\":\n return \"Extra high\";\n case \"max\":\n return \"Maximum\";\n default:\n return titleCaseEffort(value);\n }\n}\n\nfunction shortEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"minimal\":\n return \"Min\";\n case \"medium\":\n return \"Med\";\n case \"xhigh\":\n return \"XHigh\";\n case \"adaptive\":\n return \"Auto\";\n case \"max\":\n return \"Max\";\n default:\n return titleCaseEffort(value);\n }\n}\n\nfunction titleCaseEffort(value: string): string {\n const effort = value.trim();\n return `${effort[0]?.toUpperCase() ?? \"\"}${effort.slice(1)}`;\n}\n\nexport type ProviderSelectorOption<T extends string = string> = {\n id: T;\n label: ReactNode;\n /** Provider id used for the default brand glyph when `icon` is omitted. */\n provider?: string | undefined;\n icon?: string | StaticIconComponent | undefined;\n title?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type ProviderSelectorProps<T extends string = string> = {\n providers: ProviderSelectorOption<T>[];\n value: T;\n onChange: (provider: T) => void;\n className?: string | undefined;\n ariaLabel?: string | undefined;\n};\n\n/** Segmented AI provider picker with the same provider glyphs used by the model\n * selector. Use when the backend needs the provider/agent axis separate from the\n * concrete model id. */\nexport function ProviderSelector<T extends string = string>({\n providers,\n value,\n onChange,\n className,\n ariaLabel = \"AI provider\",\n}: ProviderSelectorProps<T>) {\n return (\n <SegmentedControl\n aria-label={ariaLabel}\n size=\"sm\"\n value={value}\n onChange={onChange}\n className={cn(\"w-fit\", className)}\n options={providers.map((provider) => {\n const icon = provider.icon ?? providerIcon(provider.provider);\n return {\n id: provider.id,\n label: provider.label,\n ...(provider.title ? { title: provider.title } : {}),\n ...(provider.disabled !== undefined ? { disabled: provider.disabled } : {}),\n ...(icon ? { icon } : {}),\n };\n })}\n />\n );\n}\n\nexport type BudgetSelectorProps = {\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange: (budget: ChatBudgetConfig) => void;\n className?: string | undefined;\n disabled?: boolean | undefined;\n costLabel?: string | undefined;\n maxTokensLabel?: string | undefined;\n maxTokensStep?: number | undefined;\n};\n\n/** Compact budget fields matching the advanced chat settings surface. Callers may\n * relabel the token field when their payload contract uses a different budgeted\n * unit, such as conversation turns. */\nexport function BudgetSelector({\n budget,\n onBudgetChange,\n className,\n disabled = false,\n costLabel = \"Max cost\",\n maxTokensLabel = \"Max tokens\",\n maxTokensStep = 1,\n}: BudgetSelectorProps) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string, integer = false) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, integer);\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange(next);\n };\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3\", className)}>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{costLabel}</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 disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{maxTokensLabel}</span>\n <input\n type=\"number\"\n min={0}\n step={maxTokensStep}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) => updateBudget(\"maxTokens\", event.target.value, maxTokensStep >= 1)}\n disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\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"],"names":["providerIcon","jsx","Combobox","cn","effortLevelIcon","effortLevelColor","createElement","SegmentedControl","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ModelSelector.cjs","sources":["../../../src/data/chat/ModelSelector.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport { Combobox } from \"../../components/Combobox\";\nimport type { FormSize } from \"../../components/json-schema-form-size\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport type { StaticIconComponent } from \"../Icon\";\nimport { cn } from \"../../lib/utils\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { providerIcon } from \"./provider-icons\";\nimport type { ChatBudgetConfig, ChatModel } from \"./types\";\n\nexport type ModelSelectorProps = {\n models: ChatModel[];\n /** Currently selected model id. */\n value?: string | undefined;\n onChange: (id: string) => void;\n className?: string;\n /** Control size. Defaults to `sm` (compact chat toolbar); pass `md` to match\n * a standard-density form row. */\n size?: FormSize;\n};\n\n/** A searchable model picker driven by the backend model menu, showing each\n * provider's brand icon. Models whose provider is not configured are disabled\n * rather than hidden, so the menu communicates what would be available with the\n * right API key. */\nexport function ModelSelector({ models, value, onChange, className, size = \"sm\" }: ModelSelectorProps) {\n if (models.length === 0) return null;\n const selected = models.find((m) => m.id === value);\n const SelectedGlyph = providerIcon(selected?.provider);\n return (\n <Combobox\n ariaLabel=\"Model\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-48\", className)}\n {...(SelectedGlyph ? { prefix: <SelectedGlyph className=\"size-4\" /> } : {})}\n options={models.map((m) => {\n const Icon = providerIcon(m.provider);\n return {\n value: m.id,\n label: m.label,\n ...(Icon ? { icon: <Icon className=\"size-4\" /> } : {}),\n disabled: m.configured === false,\n };\n })}\n />\n );\n}\n\nexport type EffortSelectorProps = {\n efforts: string[];\n value?: string | undefined;\n onChange: (effort: string) => void;\n className?: string;\n /** Control size. Defaults to `sm`; pass `md` to match a standard form row. */\n size?: FormSize;\n};\n\n/** Reasoning-effort picker, shown only for reasoning-capable models. The empty\n * value means \"no extended thinking\". Strict: only the listed options commit. */\nexport function EffortSelector({ efforts, value, onChange, className, size = \"sm\" }: EffortSelectorProps) {\n const selectedEffort = value?.trim() ?? \"\";\n const supportedEfforts = [...new Set(efforts.map((effort) => effort.trim()).filter(Boolean))];\n if (selectedEffort && !supportedEfforts.includes(selectedEffort)) {\n supportedEfforts.push(selectedEffort);\n }\n const selectedGlyph = selectedEffort ? effortLevelIcon(selectedEffort) : undefined;\n const selectedColor = selectedEffort ? effortLevelColor(selectedEffort) : undefined;\n const selectedIcon = selectedGlyph\n ? createElement(selectedGlyph, { className: cn(\"size-4\", selectedColor) })\n : undefined;\n return (\n <Combobox\n ariaLabel=\"Reasoning effort\"\n value={selectedEffort}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-36\", className)}\n {...(selectedIcon ? { prefix: selectedIcon } : {})}\n options={[\n { value: \"\", label: \"None\" },\n ...supportedEfforts.map((effort) => ({\n value: effort,\n label: fullEffortLabel(effort),\n selectedLabel: shortEffortLabel(effort),\n })),\n ]}\n />\n );\n}\n\nfunction fullEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"xhigh\":\n return \"Extra high\";\n case \"max\":\n return \"Maximum\";\n default:\n return effortLevelLabel(value);\n }\n}\n\nfunction shortEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"minimal\":\n return \"Min\";\n case \"medium\":\n return \"Med\";\n case \"xhigh\":\n return \"XHigh\";\n case \"adaptive\":\n return \"Auto\";\n case \"max\":\n return \"Max\";\n default:\n return effortLevelLabel(value);\n }\n}\n\nexport type ProviderSelectorOption<T extends string = string> = {\n id: T;\n label: ReactNode;\n /** Provider id used for the default brand glyph when `icon` is omitted. */\n provider?: string | undefined;\n icon?: string | StaticIconComponent | undefined;\n title?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type ProviderSelectorProps<T extends string = string> = {\n providers: ProviderSelectorOption<T>[];\n value: T;\n onChange: (provider: T) => void;\n className?: string | undefined;\n ariaLabel?: string | undefined;\n};\n\n/** Segmented AI provider picker with the same provider glyphs used by the model\n * selector. Use when the backend needs the provider/agent axis separate from the\n * concrete model id. */\nexport function ProviderSelector<T extends string = string>({\n providers,\n value,\n onChange,\n className,\n ariaLabel = \"AI provider\",\n}: ProviderSelectorProps<T>) {\n return (\n <SegmentedControl\n aria-label={ariaLabel}\n size=\"sm\"\n value={value}\n onChange={onChange}\n className={cn(\"w-fit\", className)}\n options={providers.map((provider) => {\n const icon = provider.icon ?? providerIcon(provider.provider);\n return {\n id: provider.id,\n label: provider.label,\n ...(provider.title ? { title: provider.title } : {}),\n ...(provider.disabled !== undefined ? { disabled: provider.disabled } : {}),\n ...(icon ? { icon } : {}),\n };\n })}\n />\n );\n}\n\nexport type BudgetSelectorProps = {\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange: (budget: ChatBudgetConfig) => void;\n className?: string | undefined;\n disabled?: boolean | undefined;\n costLabel?: string | undefined;\n maxTokensLabel?: string | undefined;\n maxTokensStep?: number | undefined;\n};\n\n/** Compact budget fields matching the advanced chat settings surface. Callers may\n * relabel the token field when their payload contract uses a different budgeted\n * unit, such as conversation turns. */\nexport function BudgetSelector({\n budget,\n onBudgetChange,\n className,\n disabled = false,\n costLabel = \"Max cost\",\n maxTokensLabel = \"Max tokens\",\n maxTokensStep = 1,\n}: BudgetSelectorProps) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string, integer = false) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, integer);\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange(next);\n };\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3\", className)}>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{costLabel}</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 disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{maxTokensLabel}</span>\n <input\n type=\"number\"\n min={0}\n step={maxTokensStep}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) => updateBudget(\"maxTokens\", event.target.value, maxTokensStep >= 1)}\n disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\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"],"names":["providerIcon","jsx","Combobox","cn","effortLevelIcon","effortLevelColor","createElement","effortLevelLabel","SegmentedControl","jsxs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSelector.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ModelSelector.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ModelSelector.d.ts","sourceRoot":"","sources":["../../../src/data/chat/ModelSelector.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { createElement } from "react";
3
3
  import { Combobox } from "../../components/Combobox.js";
4
4
  import { SegmentedControl } from "../../components/SegmentedControl.js";
5
5
  import { cn } from "../../lib/utils.js";
6
- import { effortLevelIcon, effortLevelColor } from "./effort-icons.js";
6
+ import { effortLevelIcon, effortLevelColor, effortLevelLabel } from "./effort-icons.js";
7
7
  import { providerIcon } from "./provider-icons.js";
8
8
  function ModelSelector({ models, value, onChange, className, size = "sm" }) {
9
9
  if (models.length === 0) return null;
@@ -33,8 +33,11 @@ function ModelSelector({ models, value, onChange, className, size = "sm" }) {
33
33
  );
34
34
  }
35
35
  function EffortSelector({ efforts, value, onChange, className, size = "sm" }) {
36
- const supportedEfforts = efforts.filter(Boolean);
37
- const selectedEffort = value && supportedEfforts.includes(value) ? value : "";
36
+ const selectedEffort = (value == null ? void 0 : value.trim()) ?? "";
37
+ const supportedEfforts = [...new Set(efforts.map((effort) => effort.trim()).filter(Boolean))];
38
+ if (selectedEffort && !supportedEfforts.includes(selectedEffort)) {
39
+ supportedEfforts.push(selectedEffort);
40
+ }
38
41
  const selectedGlyph = selectedEffort ? effortLevelIcon(selectedEffort) : void 0;
39
42
  const selectedColor = selectedEffort ? effortLevelColor(selectedEffort) : void 0;
40
43
  const selectedIcon = selectedGlyph ? createElement(selectedGlyph, { className: cn("size-4", selectedColor) }) : void 0;
@@ -42,7 +45,7 @@ function EffortSelector({ efforts, value, onChange, className, size = "sm" }) {
42
45
  Combobox,
43
46
  {
44
47
  ariaLabel: "Reasoning effort",
45
- value: value ?? "",
48
+ value: selectedEffort,
46
49
  onChange,
47
50
  allowCustomValue: false,
48
51
  required: true,
@@ -67,7 +70,7 @@ function fullEffortLabel(value) {
67
70
  case "max":
68
71
  return "Maximum";
69
72
  default:
70
- return titleCaseEffort(value);
73
+ return effortLevelLabel(value);
71
74
  }
72
75
  }
73
76
  function shortEffortLabel(value) {
@@ -83,14 +86,9 @@ function shortEffortLabel(value) {
83
86
  case "max":
84
87
  return "Max";
85
88
  default:
86
- return titleCaseEffort(value);
89
+ return effortLevelLabel(value);
87
90
  }
88
91
  }
89
- function titleCaseEffort(value) {
90
- var _a;
91
- const effort = value.trim();
92
- return `${((_a = effort[0]) == null ? void 0 : _a.toUpperCase()) ?? ""}${effort.slice(1)}`;
93
- }
94
92
  function ProviderSelector({
95
93
  providers,
96
94
  value,
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSelector.js","sources":["../../../src/data/chat/ModelSelector.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport { Combobox } from \"../../components/Combobox\";\nimport type { FormSize } from \"../../components/json-schema-form-size\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport type { StaticIconComponent } from \"../Icon\";\nimport { cn } from \"../../lib/utils\";\nimport { effortLevelColor, effortLevelIcon } from \"./effort-icons\";\nimport { providerIcon } from \"./provider-icons\";\nimport type { ChatBudgetConfig, ChatModel } from \"./types\";\n\nexport type ModelSelectorProps = {\n models: ChatModel[];\n /** Currently selected model id. */\n value?: string | undefined;\n onChange: (id: string) => void;\n className?: string;\n /** Control size. Defaults to `sm` (compact chat toolbar); pass `md` to match\n * a standard-density form row. */\n size?: FormSize;\n};\n\n/** A searchable model picker driven by the backend model menu, showing each\n * provider's brand icon. Models whose provider is not configured are disabled\n * rather than hidden, so the menu communicates what would be available with the\n * right API key. */\nexport function ModelSelector({ models, value, onChange, className, size = \"sm\" }: ModelSelectorProps) {\n if (models.length === 0) return null;\n const selected = models.find((m) => m.id === value);\n const SelectedGlyph = providerIcon(selected?.provider);\n return (\n <Combobox\n ariaLabel=\"Model\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-48\", className)}\n {...(SelectedGlyph ? { prefix: <SelectedGlyph className=\"size-4\" /> } : {})}\n options={models.map((m) => {\n const Icon = providerIcon(m.provider);\n return {\n value: m.id,\n label: m.label,\n ...(Icon ? { icon: <Icon className=\"size-4\" /> } : {}),\n disabled: m.configured === false,\n };\n })}\n />\n );\n}\n\nexport type EffortSelectorProps = {\n efforts: string[];\n value?: string | undefined;\n onChange: (effort: string) => void;\n className?: string;\n /** Control size. Defaults to `sm`; pass `md` to match a standard form row. */\n size?: FormSize;\n};\n\n/** Reasoning-effort picker, shown only for reasoning-capable models. The empty\n * value means \"no extended thinking\". Strict: only the listed options commit. */\nexport function EffortSelector({ efforts, value, onChange, className, size = \"sm\" }: EffortSelectorProps) {\n const supportedEfforts = efforts.filter(Boolean);\n const selectedEffort = value && supportedEfforts.includes(value) ? value : \"\";\n const selectedGlyph = selectedEffort ? effortLevelIcon(selectedEffort) : undefined;\n const selectedColor = selectedEffort ? effortLevelColor(selectedEffort) : undefined;\n const selectedIcon = selectedGlyph\n ? createElement(selectedGlyph, { className: cn(\"size-4\", selectedColor) })\n : undefined;\n return (\n <Combobox\n ariaLabel=\"Reasoning effort\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-36\", className)}\n {...(selectedIcon ? { prefix: selectedIcon } : {})}\n options={[\n { value: \"\", label: \"None\" },\n ...supportedEfforts.map((effort) => ({\n value: effort,\n label: fullEffortLabel(effort),\n selectedLabel: shortEffortLabel(effort),\n })),\n ]}\n />\n );\n}\n\nfunction fullEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"xhigh\":\n return \"Extra high\";\n case \"max\":\n return \"Maximum\";\n default:\n return titleCaseEffort(value);\n }\n}\n\nfunction shortEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"minimal\":\n return \"Min\";\n case \"medium\":\n return \"Med\";\n case \"xhigh\":\n return \"XHigh\";\n case \"adaptive\":\n return \"Auto\";\n case \"max\":\n return \"Max\";\n default:\n return titleCaseEffort(value);\n }\n}\n\nfunction titleCaseEffort(value: string): string {\n const effort = value.trim();\n return `${effort[0]?.toUpperCase() ?? \"\"}${effort.slice(1)}`;\n}\n\nexport type ProviderSelectorOption<T extends string = string> = {\n id: T;\n label: ReactNode;\n /** Provider id used for the default brand glyph when `icon` is omitted. */\n provider?: string | undefined;\n icon?: string | StaticIconComponent | undefined;\n title?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type ProviderSelectorProps<T extends string = string> = {\n providers: ProviderSelectorOption<T>[];\n value: T;\n onChange: (provider: T) => void;\n className?: string | undefined;\n ariaLabel?: string | undefined;\n};\n\n/** Segmented AI provider picker with the same provider glyphs used by the model\n * selector. Use when the backend needs the provider/agent axis separate from the\n * concrete model id. */\nexport function ProviderSelector<T extends string = string>({\n providers,\n value,\n onChange,\n className,\n ariaLabel = \"AI provider\",\n}: ProviderSelectorProps<T>) {\n return (\n <SegmentedControl\n aria-label={ariaLabel}\n size=\"sm\"\n value={value}\n onChange={onChange}\n className={cn(\"w-fit\", className)}\n options={providers.map((provider) => {\n const icon = provider.icon ?? providerIcon(provider.provider);\n return {\n id: provider.id,\n label: provider.label,\n ...(provider.title ? { title: provider.title } : {}),\n ...(provider.disabled !== undefined ? { disabled: provider.disabled } : {}),\n ...(icon ? { icon } : {}),\n };\n })}\n />\n );\n}\n\nexport type BudgetSelectorProps = {\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange: (budget: ChatBudgetConfig) => void;\n className?: string | undefined;\n disabled?: boolean | undefined;\n costLabel?: string | undefined;\n maxTokensLabel?: string | undefined;\n maxTokensStep?: number | undefined;\n};\n\n/** Compact budget fields matching the advanced chat settings surface. Callers may\n * relabel the token field when their payload contract uses a different budgeted\n * unit, such as conversation turns. */\nexport function BudgetSelector({\n budget,\n onBudgetChange,\n className,\n disabled = false,\n costLabel = \"Max cost\",\n maxTokensLabel = \"Max tokens\",\n maxTokensStep = 1,\n}: BudgetSelectorProps) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string, integer = false) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, integer);\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange(next);\n };\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3\", className)}>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{costLabel}</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 disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{maxTokensLabel}</span>\n <input\n type=\"number\"\n min={0}\n step={maxTokensStep}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) => updateBudget(\"maxTokens\", event.target.value, maxTokensStep >= 1)}\n disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\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"],"names":[],"mappings":";;;;;;;AAyBO,SAAS,cAAc,EAAE,QAAQ,OAAO,UAAU,WAAW,OAAO,QAA4B;AACrG,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAClD,QAAM,gBAAgB,aAAa,qCAAU,QAAQ;AACrD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,SAAS;AAAA,MAChB;AAAA,MACA,kBAAkB;AAAA,MAClB,UAAQ;AAAA,MACR;AAAA,MACA,WAAW,GAAG,QAAQ,SAAS;AAAA,MAC9B,GAAI,gBAAgB,EAAE,QAAQ,oBAAC,iBAAc,WAAU,UAAS,EAAA,IAAO,CAAA;AAAA,MACxE,SAAS,OAAO,IAAI,CAAC,MAAM;AACzB,cAAM,OAAO,aAAa,EAAE,QAAQ;AACpC,eAAO;AAAA,UACL,OAAO,EAAE;AAAA,UACT,OAAO,EAAE;AAAA,UACT,GAAI,OAAO,EAAE,MAAM,oBAAC,QAAK,WAAU,UAAS,EAAA,IAAO,CAAA;AAAA,UACnD,UAAU,EAAE,eAAe;AAAA,QAAA;AAAA,MAE/B,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;AAaO,SAAS,eAAe,EAAE,SAAS,OAAO,UAAU,WAAW,OAAO,QAA6B;AACxG,QAAM,mBAAmB,QAAQ,OAAO,OAAO;AAC/C,QAAM,iBAAiB,SAAS,iBAAiB,SAAS,KAAK,IAAI,QAAQ;AAC3E,QAAM,gBAAgB,iBAAiB,gBAAgB,cAAc,IAAI;AACzE,QAAM,gBAAgB,iBAAiB,iBAAiB,cAAc,IAAI;AAC1E,QAAM,eAAe,gBACjB,cAAc,eAAe,EAAE,WAAW,GAAG,UAAU,aAAa,EAAA,CAAG,IACvE;AACJ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,SAAS;AAAA,MAChB;AAAA,MACA,kBAAkB;AAAA,MAClB,UAAQ;AAAA,MACR;AAAA,MACA,WAAW,GAAG,QAAQ,SAAS;AAAA,MAC9B,GAAI,eAAe,EAAE,QAAQ,aAAA,IAAiB,CAAA;AAAA,MAC/C,SAAS;AAAA,QACP,EAAE,OAAO,IAAI,OAAO,OAAA;AAAA,QACpB,GAAG,iBAAiB,IAAI,CAAC,YAAY;AAAA,UACnC,OAAO;AAAA,UACP,OAAO,gBAAgB,MAAM;AAAA,UAC7B,eAAe,iBAAiB,MAAM;AAAA,QAAA,EACtC;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA;AAGN;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,UAAQ,MAAM,KAAA,EAAO,YAAA,GAAY;AAAA,IAC/B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,gBAAgB,KAAK;AAAA,EAAA;AAElC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,UAAQ,MAAM,KAAA,EAAO,YAAA,GAAY;AAAA,IAC/B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,gBAAgB,KAAK;AAAA,EAAA;AAElC;AAEA,SAAS,gBAAgB,OAAuB;;AAC9C,QAAM,SAAS,MAAM,KAAA;AACrB,SAAO,KAAG,YAAO,CAAC,MAAR,mBAAW,kBAAiB,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5D;AAuBO,SAAS,iBAA4C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAA6B;AAC3B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAY;AAAA,MACZ,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,GAAG,SAAS,SAAS;AAAA,MAChC,SAAS,UAAU,IAAI,CAAC,aAAa;AACnC,cAAM,OAAO,SAAS,QAAQ,aAAa,SAAS,QAAQ;AAC5D,eAAO;AAAA,UACL,IAAI,SAAS;AAAA,UACb,OAAO,SAAS;AAAA,UAChB,GAAI,SAAS,QAAQ,EAAE,OAAO,SAAS,MAAA,IAAU,CAAA;AAAA,UACjD,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAA,IAAa,CAAA;AAAA,UACxE,GAAI,OAAO,EAAE,SAAS,CAAA;AAAA,QAAC;AAAA,MAE3B,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;AAeO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,GAAwB;AACtB,QAAM,eAAe,CAAC,KAA6B,KAAa,UAAU,UAAU;AAClF,UAAM,OAAyB,EAAE,GAAG,OAAA;AACpC,UAAM,SAAS,oBAAoB,KAAK,OAAO;AAC/C,QAAI,WAAW,QAAW;AACxB,aAAO,KAAK,GAAG;AAAA,IACjB,OAAO;AACL,WAAK,GAAG,IAAI;AAAA,IACd;AACA,mBAAe,IAAI;AAAA,EACrB;AAEA,8BACG,OAAA,EAAI,WAAW,GAAG,0BAA0B,SAAS,GACpD,UAAA;AAAA,IAAA,qBAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,WAAU;AAAA,MACnD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAO,iCAAQ,SAAQ;AAAA,UACvB,UAAU,CAAC,UAAU,aAAa,QAAQ,MAAM,OAAO,KAAK;AAAA,UAC5D;AAAA,UACA,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,GACF;AAAA,IACA,qBAAC,SAAA,EAAM,WAAU,qBACf,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,gBAAe;AAAA,MACxD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAO,iCAAQ,cAAa;AAAA,UAC5B,UAAU,CAAC,UAAU,aAAa,aAAa,MAAM,OAAO,OAAO,iBAAiB,CAAC;AAAA,UACrF;AAAA,UACA,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,EAAA,CACF;AAAA,EAAA,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;"}
1
+ {"version":3,"file":"ModelSelector.js","sources":["../../../src/data/chat/ModelSelector.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport { Combobox } from \"../../components/Combobox\";\nimport type { FormSize } from \"../../components/json-schema-form-size\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport type { StaticIconComponent } from \"../Icon\";\nimport { cn } from \"../../lib/utils\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"./effort-icons\";\nimport { providerIcon } from \"./provider-icons\";\nimport type { ChatBudgetConfig, ChatModel } from \"./types\";\n\nexport type ModelSelectorProps = {\n models: ChatModel[];\n /** Currently selected model id. */\n value?: string | undefined;\n onChange: (id: string) => void;\n className?: string;\n /** Control size. Defaults to `sm` (compact chat toolbar); pass `md` to match\n * a standard-density form row. */\n size?: FormSize;\n};\n\n/** A searchable model picker driven by the backend model menu, showing each\n * provider's brand icon. Models whose provider is not configured are disabled\n * rather than hidden, so the menu communicates what would be available with the\n * right API key. */\nexport function ModelSelector({ models, value, onChange, className, size = \"sm\" }: ModelSelectorProps) {\n if (models.length === 0) return null;\n const selected = models.find((m) => m.id === value);\n const SelectedGlyph = providerIcon(selected?.provider);\n return (\n <Combobox\n ariaLabel=\"Model\"\n value={value ?? \"\"}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-48\", className)}\n {...(SelectedGlyph ? { prefix: <SelectedGlyph className=\"size-4\" /> } : {})}\n options={models.map((m) => {\n const Icon = providerIcon(m.provider);\n return {\n value: m.id,\n label: m.label,\n ...(Icon ? { icon: <Icon className=\"size-4\" /> } : {}),\n disabled: m.configured === false,\n };\n })}\n />\n );\n}\n\nexport type EffortSelectorProps = {\n efforts: string[];\n value?: string | undefined;\n onChange: (effort: string) => void;\n className?: string;\n /** Control size. Defaults to `sm`; pass `md` to match a standard form row. */\n size?: FormSize;\n};\n\n/** Reasoning-effort picker, shown only for reasoning-capable models. The empty\n * value means \"no extended thinking\". Strict: only the listed options commit. */\nexport function EffortSelector({ efforts, value, onChange, className, size = \"sm\" }: EffortSelectorProps) {\n const selectedEffort = value?.trim() ?? \"\";\n const supportedEfforts = [...new Set(efforts.map((effort) => effort.trim()).filter(Boolean))];\n if (selectedEffort && !supportedEfforts.includes(selectedEffort)) {\n supportedEfforts.push(selectedEffort);\n }\n const selectedGlyph = selectedEffort ? effortLevelIcon(selectedEffort) : undefined;\n const selectedColor = selectedEffort ? effortLevelColor(selectedEffort) : undefined;\n const selectedIcon = selectedGlyph\n ? createElement(selectedGlyph, { className: cn(\"size-4\", selectedColor) })\n : undefined;\n return (\n <Combobox\n ariaLabel=\"Reasoning effort\"\n value={selectedEffort}\n onChange={onChange}\n allowCustomValue={false}\n required\n size={size}\n className={cn(\"w-36\", className)}\n {...(selectedIcon ? { prefix: selectedIcon } : {})}\n options={[\n { value: \"\", label: \"None\" },\n ...supportedEfforts.map((effort) => ({\n value: effort,\n label: fullEffortLabel(effort),\n selectedLabel: shortEffortLabel(effort),\n })),\n ]}\n />\n );\n}\n\nfunction fullEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"xhigh\":\n return \"Extra high\";\n case \"max\":\n return \"Maximum\";\n default:\n return effortLevelLabel(value);\n }\n}\n\nfunction shortEffortLabel(value: string): string {\n switch (value.trim().toLowerCase()) {\n case \"minimal\":\n return \"Min\";\n case \"medium\":\n return \"Med\";\n case \"xhigh\":\n return \"XHigh\";\n case \"adaptive\":\n return \"Auto\";\n case \"max\":\n return \"Max\";\n default:\n return effortLevelLabel(value);\n }\n}\n\nexport type ProviderSelectorOption<T extends string = string> = {\n id: T;\n label: ReactNode;\n /** Provider id used for the default brand glyph when `icon` is omitted. */\n provider?: string | undefined;\n icon?: string | StaticIconComponent | undefined;\n title?: string | undefined;\n disabled?: boolean | undefined;\n};\n\nexport type ProviderSelectorProps<T extends string = string> = {\n providers: ProviderSelectorOption<T>[];\n value: T;\n onChange: (provider: T) => void;\n className?: string | undefined;\n ariaLabel?: string | undefined;\n};\n\n/** Segmented AI provider picker with the same provider glyphs used by the model\n * selector. Use when the backend needs the provider/agent axis separate from the\n * concrete model id. */\nexport function ProviderSelector<T extends string = string>({\n providers,\n value,\n onChange,\n className,\n ariaLabel = \"AI provider\",\n}: ProviderSelectorProps<T>) {\n return (\n <SegmentedControl\n aria-label={ariaLabel}\n size=\"sm\"\n value={value}\n onChange={onChange}\n className={cn(\"w-fit\", className)}\n options={providers.map((provider) => {\n const icon = provider.icon ?? providerIcon(provider.provider);\n return {\n id: provider.id,\n label: provider.label,\n ...(provider.title ? { title: provider.title } : {}),\n ...(provider.disabled !== undefined ? { disabled: provider.disabled } : {}),\n ...(icon ? { icon } : {}),\n };\n })}\n />\n );\n}\n\nexport type BudgetSelectorProps = {\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange: (budget: ChatBudgetConfig) => void;\n className?: string | undefined;\n disabled?: boolean | undefined;\n costLabel?: string | undefined;\n maxTokensLabel?: string | undefined;\n maxTokensStep?: number | undefined;\n};\n\n/** Compact budget fields matching the advanced chat settings surface. Callers may\n * relabel the token field when their payload contract uses a different budgeted\n * unit, such as conversation turns. */\nexport function BudgetSelector({\n budget,\n onBudgetChange,\n className,\n disabled = false,\n costLabel = \"Max cost\",\n maxTokensLabel = \"Max tokens\",\n maxTokensStep = 1,\n}: BudgetSelectorProps) {\n const updateBudget = (key: keyof ChatBudgetConfig, raw: string, integer = false) => {\n const next: ChatBudgetConfig = { ...budget };\n const parsed = parseOptionalNumber(raw, integer);\n if (parsed === undefined) {\n delete next[key];\n } else {\n next[key] = parsed;\n }\n onBudgetChange(next);\n };\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3\", className)}>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{costLabel}</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 disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\n <label className=\"space-y-1 text-xs\">\n <span className=\"text-muted-foreground\">{maxTokensLabel}</span>\n <input\n type=\"number\"\n min={0}\n step={maxTokensStep}\n value={budget?.maxTokens ?? \"\"}\n onChange={(event) => updateBudget(\"maxTokens\", event.target.value, maxTokensStep >= 1)}\n disabled={disabled}\n className=\"h-8 w-full rounded border border-border bg-background px-2 text-xs disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </label>\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"],"names":[],"mappings":"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"}
@@ -12,17 +12,26 @@ function PromptInput({
12
12
  onSubmit,
13
13
  onStop,
14
14
  status,
15
+ allowSubmitWhileStreaming = false,
16
+ disabled = false,
17
+ stopLabel = "Stop",
15
18
  placeholder = "What would you like to know?",
16
19
  enableAttachments = false,
20
+ attachmentUpload,
21
+ acceptedMediaTypes,
22
+ attachmentLimits,
17
23
  toolbar,
24
+ inputAccessory,
18
25
  className
19
26
  }) {
20
27
  const [value, setValue] = react.useState("");
21
28
  const [files, setFiles] = react.useState([]);
29
+ const [attachmentError, setAttachmentError] = react.useState("");
22
30
  const isGenerating = status === "submitted" || status === "streaming";
23
31
  const submit = () => {
24
32
  const text = value.trim();
25
- if (!text && files.length === 0 || isGenerating) return;
33
+ if (!text && files.length === 0 || disabled || isGenerating && !allowSubmitWhileStreaming)
34
+ return;
26
35
  onSubmit(text, files);
27
36
  setValue("");
28
37
  setFiles([]);
@@ -37,7 +46,7 @@ function PromptInput({
37
46
  submit();
38
47
  }
39
48
  };
40
- const canSubmit = value.trim().length > 0 || files.length > 0;
49
+ const canSubmit = !disabled && (!isGenerating || allowSubmitWhileStreaming) && (value.trim().length > 0 || files.length > 0);
41
50
  return /* @__PURE__ */ jsxRuntime.jsxs(
42
51
  "form",
43
52
  {
@@ -47,7 +56,16 @@ function PromptInput({
47
56
  className
48
57
  ),
49
58
  children: [
50
- enableAttachments && /* @__PURE__ */ jsxRuntime.jsx(Attachment.AttachmentList, { files, onRemove: (i) => setFiles((f) => f.filter((_, j) => j !== i)) }),
59
+ enableAttachments && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
60
+ /* @__PURE__ */ jsxRuntime.jsx(
61
+ Attachment.AttachmentList,
62
+ {
63
+ files,
64
+ onRemove: (i) => setFiles((f) => f.filter((_, j) => j !== i))
65
+ }
66
+ ),
67
+ attachmentError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-1 text-xs text-destructive", children: attachmentError })
68
+ ] }),
51
69
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-2", children: [
52
70
  /* @__PURE__ */ jsxRuntime.jsx(
53
71
  "textarea",
@@ -56,14 +74,47 @@ function PromptInput({
56
74
  onChange: (e) => setValue(e.target.value),
57
75
  onKeyDown: handleKeyDown,
58
76
  placeholder,
77
+ disabled,
59
78
  rows: 1,
60
79
  className: "max-h-48 min-h-9 flex-1 resize-none bg-transparent px-1 py-1.5 text-sm outline-none placeholder:text-muted-foreground"
61
80
  }
62
81
  ),
63
- isGenerating && onStop ? /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "icon", variant: "secondary", "aria-label": "Stop", onClick: onStop, children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiStop.UiStop, className: "size-4" }) }) : /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "submit", size: "icon", "aria-label": "Send", disabled: !canSubmit, children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiArrowUp.UiArrowUp, className: "size-4" }) })
82
+ inputAccessory,
83
+ isGenerating && onStop && /* @__PURE__ */ jsxRuntime.jsx(
84
+ button.Button,
85
+ {
86
+ type: "button",
87
+ size: "icon",
88
+ variant: "secondary",
89
+ "aria-label": stopLabel,
90
+ onClick: onStop,
91
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiStop.UiStop, className: "size-4" })
92
+ }
93
+ ),
94
+ (!isGenerating || allowSubmitWhileStreaming) && /* @__PURE__ */ jsxRuntime.jsx(
95
+ button.Button,
96
+ {
97
+ type: "submit",
98
+ size: "icon",
99
+ "aria-label": "Send",
100
+ disabled: !canSubmit,
101
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiArrowUp.UiArrowUp, className: "size-4" })
102
+ }
103
+ )
64
104
  ] }),
65
105
  (toolbar || enableAttachments) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
66
- enableAttachments && /* @__PURE__ */ jsxRuntime.jsx(Attachment.AttachmentButton, { onAdd: (p) => setFiles((f) => [...f, ...p]), disabled: isGenerating }),
106
+ enableAttachments && /* @__PURE__ */ jsxRuntime.jsx(
107
+ Attachment.AttachmentButton,
108
+ {
109
+ onAdd: (p) => setFiles((f) => [...f, ...p]),
110
+ disabled: disabled || isGenerating,
111
+ files,
112
+ onError: setAttachmentError,
113
+ ...attachmentUpload ? { upload: attachmentUpload } : {},
114
+ ...acceptedMediaTypes ? { acceptedMediaTypes } : {},
115
+ ...attachmentLimits ? { limits: attachmentLimits } : {}
116
+ }
117
+ ),
67
118
  toolbar
68
119
  ] })
69
120
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInput.cjs","sources":["../../../src/data/chat/PromptInput.tsx"],"sourcesContent":["import { useState, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowUp, UiStop } from \"../../icons\";\nimport { AttachmentButton, AttachmentList } from \"./Attachment\";\nimport type { ChatStatus, FileUIPart } from \"./types\";\n\nexport type PromptInputProps = {\n /** Called with the trimmed text and any attachments when the user submits. */\n onSubmit: (text: string, files: FileUIPart[]) => void;\n /** Called when the user stops an in-flight generation. */\n onStop?: (() => void) | undefined;\n /** Current chat status; drives the submit/stop button affordance. */\n status?: ChatStatus | undefined;\n placeholder?: string | undefined;\n /** Enables the attachment button and chips. */\n enableAttachments?: boolean | undefined;\n /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */\n toolbar?: ReactNode;\n className?: string | undefined;\n};\n\n/** Auto-growing prompt textarea with a submit/stop button, optional attachment\n * controls, and a toolbar slot (model/effort selectors). Enter submits;\n * Shift+Enter inserts a newline; while streaming the button becomes a stop\n * control. */\nexport function PromptInput({\n onSubmit,\n onStop,\n status,\n placeholder = \"What would you like to know?\",\n enableAttachments = false,\n toolbar,\n className,\n}: PromptInputProps) {\n const [value, setValue] = useState(\"\");\n const [files, setFiles] = useState<FileUIPart[]>([]);\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n const submit = () => {\n const text = value.trim();\n if ((!text && files.length === 0) || isGenerating) return;\n onSubmit(text, files);\n setValue(\"\");\n setFiles([]);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n submit();\n }\n };\n\n const canSubmit = value.trim().length > 0 || files.length > 0;\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\n \"flex flex-col gap-2 rounded-lg border border-input bg-background p-2\",\n className,\n )}\n >\n {enableAttachments && (\n <AttachmentList files={files} onRemove={(i) => setFiles((f) => f.filter((_, j) => j !== i))} />\n )}\n\n <div className=\"flex items-end gap-2\">\n <textarea\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n className=\"max-h-48 min-h-9 flex-1 resize-none bg-transparent px-1 py-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n />\n {isGenerating && onStop ? (\n <Button type=\"button\" size=\"icon\" variant=\"secondary\" aria-label=\"Stop\" onClick={onStop}>\n <Icon icon={UiStop} className=\"size-4\" />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" aria-label=\"Send\" disabled={!canSubmit}>\n <Icon icon={UiArrowUp} className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {(toolbar || enableAttachments) && (\n <div className=\"flex items-center gap-2\">\n {enableAttachments && (\n <AttachmentButton onAdd={(p) => setFiles((f) => [...f, ...p])} disabled={isGenerating} />\n )}\n {toolbar}\n </div>\n )}\n </form>\n );\n}\n"],"names":["useState","jsxs","cn","AttachmentList","jsx","Button","Icon","UiStop","UiArrowUp","AttachmentButton"],"mappings":";;;;;;;;;;AA2BO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAuB,CAAA,CAAE;AACnD,QAAM,eAAe,WAAW,eAAe,WAAW;AAE1D,QAAM,SAAS,MAAM;AACnB,UAAM,OAAO,MAAM,KAAA;AACnB,QAAK,CAAC,QAAQ,MAAM,WAAW,KAAM,aAAc;AACnD,aAAS,MAAM,KAAK;AACpB,aAAS,EAAE;AACX,aAAS,CAAA,CAAE;AAAA,EACb;AAEA,QAAM,eAAe,CAAC,MAAiB;AACrC,MAAE,eAAA;AACF,WAAA;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAA0C;AAC/D,QAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,aAAa;AAClE,QAAE,eAAA;AACF,aAAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,KAAA,EAAO,SAAS,KAAK,MAAM,SAAS;AAE5D,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGD,UAAA;AAAA,QAAA,oDACEC,2BAAA,EAAe,OAAc,UAAU,CAAC,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,GAAG;AAAA,QAG/FF,2BAAAA,KAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,UAAAG,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,WAAW;AAAA,cACX;AAAA,cACA,MAAM;AAAA,cACN,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEX,gBAAgB,SACfA,2BAAAA,IAACC,eAAA,EAAO,MAAK,UAAS,MAAK,QAAO,SAAQ,aAAY,cAAW,QAAO,SAAS,QAC/E,UAAAD,+BAACE,KAAAA,MAAA,EAAK,MAAMC,OAAAA,QAAQ,WAAU,SAAA,CAAS,GACzC,IAEAH,+BAACC,OAAAA,QAAA,EAAO,MAAK,UAAS,MAAK,QAAO,cAAW,QAAO,UAAU,CAAC,WAC7D,UAAAD,2BAAAA,IAACE,KAAAA,MAAA,EAAK,MAAME,qBAAW,WAAU,UAAS,EAAA,CAC5C;AAAA,QAAA,GAEJ;AAAA,SAEE,WAAW,sBACXP,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,UAAA,oDACEQ,WAAAA,kBAAA,EAAiB,OAAO,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,UAAU,cAAc;AAAA,UAExF;AAAA,QAAA,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
1
+ {"version":3,"file":"PromptInput.cjs","sources":["../../../src/data/chat/PromptInput.tsx"],"sourcesContent":["import {\n useState,\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowUp, UiStop } from \"../../icons\";\nimport {\n AttachmentButton,\n AttachmentList,\n} from \"./Attachment\";\nimport type {\n AttachmentLimits,\n AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport type { ChatStatus, FileUIPart } from \"./types\";\n\nexport type PromptInputProps = {\n /** Called with the trimmed text and any attachments when the user submits. */\n onSubmit: (text: string, files: FileUIPart[]) => void;\n /** Called when the user stops an in-flight generation. */\n onStop?: (() => void) | undefined;\n /** Current chat status; drives the submit/stop button affordance. */\n status?: ChatStatus | undefined;\n allowSubmitWhileStreaming?: boolean | undefined;\n disabled?: boolean | undefined;\n stopLabel?: string | undefined;\n placeholder?: string | undefined;\n /** Enables the attachment button and chips. */\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n acceptedMediaTypes?: string[] | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */\n toolbar?: ReactNode;\n /** Compact host control rendered beside the textarea and submit button. */\n inputAccessory?: ReactNode;\n className?: string | undefined;\n};\n\n/** Auto-growing prompt textarea with a submit/stop button, optional attachment\n * controls, and a toolbar slot (model/effort selectors). Enter submits;\n * Shift+Enter inserts a newline; while streaming the button becomes a stop\n * control. */\nexport function PromptInput({\n onSubmit,\n onStop,\n status,\n allowSubmitWhileStreaming = false,\n disabled = false,\n stopLabel = \"Stop\",\n placeholder = \"What would you like to know?\",\n enableAttachments = false,\n attachmentUpload,\n acceptedMediaTypes,\n attachmentLimits,\n toolbar,\n inputAccessory,\n className,\n}: PromptInputProps) {\n const [value, setValue] = useState(\"\");\n const [files, setFiles] = useState<FileUIPart[]>([]);\n const [attachmentError, setAttachmentError] = useState(\"\");\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n const submit = () => {\n const text = value.trim();\n if (\n (!text && files.length === 0) ||\n disabled ||\n (isGenerating && !allowSubmitWhileStreaming)\n )\n return;\n onSubmit(text, files);\n setValue(\"\");\n setFiles([]);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n submit();\n }\n };\n\n const canSubmit =\n !disabled &&\n (!isGenerating || allowSubmitWhileStreaming) &&\n (value.trim().length > 0 || files.length > 0);\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\n \"flex flex-col gap-2 rounded-lg border border-input bg-background p-2\",\n className,\n )}\n >\n {enableAttachments && (\n <>\n <AttachmentList\n files={files}\n onRemove={(i) => setFiles((f) => f.filter((_, j) => j !== i))}\n />\n {attachmentError && (\n <p className=\"px-1 text-xs text-destructive\">{attachmentError}</p>\n )}\n </>\n )}\n\n <div className=\"flex items-end gap-2\">\n <textarea\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n className=\"max-h-48 min-h-9 flex-1 resize-none bg-transparent px-1 py-1.5 text-sm outline-none placeholder:text-muted-foreground\"\n />\n {inputAccessory}\n {isGenerating && onStop && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n aria-label={stopLabel}\n onClick={onStop}\n >\n <Icon icon={UiStop} className=\"size-4\" />\n </Button>\n )}\n {(!isGenerating || allowSubmitWhileStreaming) && (\n <Button\n type=\"submit\"\n size=\"icon\"\n aria-label=\"Send\"\n disabled={!canSubmit}\n >\n <Icon icon={UiArrowUp} className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {(toolbar || enableAttachments) && (\n <div className=\"flex items-center gap-2\">\n {enableAttachments && (\n <AttachmentButton\n onAdd={(p) => setFiles((f) => [...f, ...p])}\n disabled={disabled || isGenerating}\n files={files}\n onError={setAttachmentError}\n {...(attachmentUpload ? { upload: attachmentUpload } : {})}\n {...(acceptedMediaTypes ? { acceptedMediaTypes } : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n )}\n {toolbar}\n </div>\n )}\n </form>\n );\n}\n"],"names":["useState","jsxs","cn","Fragment","jsx","AttachmentList","Button","Icon","UiStop","UiArrowUp","AttachmentButton"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
+ import { AttachmentLimits, AttachmentUploadAdapter } from './attachment-upload';
2
3
  import { ChatStatus, FileUIPart } from './types';
3
4
  export type PromptInputProps = {
4
5
  /** Called with the trimmed text and any attachments when the user submits. */
@@ -7,16 +8,24 @@ export type PromptInputProps = {
7
8
  onStop?: (() => void) | undefined;
8
9
  /** Current chat status; drives the submit/stop button affordance. */
9
10
  status?: ChatStatus | undefined;
11
+ allowSubmitWhileStreaming?: boolean | undefined;
12
+ disabled?: boolean | undefined;
13
+ stopLabel?: string | undefined;
10
14
  placeholder?: string | undefined;
11
15
  /** Enables the attachment button and chips. */
12
16
  enableAttachments?: boolean | undefined;
17
+ attachmentUpload?: AttachmentUploadAdapter | undefined;
18
+ acceptedMediaTypes?: string[] | undefined;
19
+ attachmentLimits?: AttachmentLimits | undefined;
13
20
  /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */
14
21
  toolbar?: ReactNode;
22
+ /** Compact host control rendered beside the textarea and submit button. */
23
+ inputAccessory?: ReactNode;
15
24
  className?: string | undefined;
16
25
  };
17
26
  /** Auto-growing prompt textarea with a submit/stop button, optional attachment
18
27
  * controls, and a toolbar slot (model/effort selectors). Enter submits;
19
28
  * Shift+Enter inserts a newline; while streaming the button becomes a stop
20
29
  * control. */
21
- export declare function PromptInput({ onSubmit, onStop, status, placeholder, enableAttachments, toolbar, className, }: PromptInputProps): import("react/jsx-runtime").JSX.Element;
30
+ export declare function PromptInput({ onSubmit, onStop, status, allowSubmitWhileStreaming, disabled, stopLabel, placeholder, enableAttachments, attachmentUpload, acceptedMediaTypes, attachmentLimits, toolbar, inputAccessory, className, }: PromptInputProps): import("react/jsx-runtime").JSX.Element;
22
31
  //# sourceMappingURL=PromptInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/data/chat/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMrF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACtD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF;;;eAGe;AACf,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAA4C,EAC5C,iBAAyB,EACzB,OAAO,EACP,SAAS,GACV,EAAE,gBAAgB,2CAqElB"}
1
+ {"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/data/chat/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACtD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACvD,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF;;;eAGe;AACf,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,yBAAiC,EACjC,QAAgB,EAChB,SAAkB,EAClB,WAA4C,EAC5C,iBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,SAAS,GACV,EAAE,gBAAgB,2CA4GlB"}