@flanksource/clicky-ui 0.3.15 → 0.3.16

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 (754) 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 +177 -6
  139. package/dist/data/DataTable.cjs.map +1 -1
  140. package/dist/data/DataTable.d.ts +39 -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 +177 -6
  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/StatStrip.cjs +99 -0
  163. package/dist/data/StatStrip.cjs.map +1 -0
  164. package/dist/data/StatStrip.d.ts +41 -0
  165. package/dist/data/StatStrip.d.ts.map +1 -0
  166. package/dist/data/StatStrip.js +99 -0
  167. package/dist/data/StatStrip.js.map +1 -0
  168. package/dist/data/TaskManager.cjs +20 -1
  169. package/dist/data/TaskManager.cjs.map +1 -1
  170. package/dist/data/TaskManager.d.ts +3 -1
  171. package/dist/data/TaskManager.d.ts.map +1 -1
  172. package/dist/data/TaskManager.js +20 -1
  173. package/dist/data/TaskManager.js.map +1 -1
  174. package/dist/data/TaskManagerButton.cjs +49 -0
  175. package/dist/data/TaskManagerButton.cjs.map +1 -0
  176. package/dist/data/TaskManagerButton.d.ts +8 -0
  177. package/dist/data/TaskManagerButton.d.ts.map +1 -0
  178. package/dist/data/TaskManagerButton.js +49 -0
  179. package/dist/data/TaskManagerButton.js.map +1 -0
  180. package/dist/data/TaskProcessDetails.cjs +113 -0
  181. package/dist/data/TaskProcessDetails.cjs.map +1 -0
  182. package/dist/data/TaskProcessDetails.d.ts +6 -0
  183. package/dist/data/TaskProcessDetails.d.ts.map +1 -0
  184. package/dist/data/TaskProcessDetails.js +113 -0
  185. package/dist/data/TaskProcessDetails.js.map +1 -0
  186. package/dist/data/TaskProgress.cjs +106 -19
  187. package/dist/data/TaskProgress.cjs.map +1 -1
  188. package/dist/data/TaskProgress.d.ts +4 -2
  189. package/dist/data/TaskProgress.d.ts.map +1 -1
  190. package/dist/data/TaskProgress.js +107 -20
  191. package/dist/data/TaskProgress.js.map +1 -1
  192. package/dist/data/TaskSnapshot.cjs.map +1 -1
  193. package/dist/data/TaskSnapshot.d.ts +43 -0
  194. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  195. package/dist/data/TaskSnapshot.js.map +1 -1
  196. package/dist/data/Tree.cjs +91 -82
  197. package/dist/data/Tree.cjs.map +1 -1
  198. package/dist/data/Tree.d.ts +3 -1
  199. package/dist/data/Tree.d.ts.map +1 -1
  200. package/dist/data/Tree.js +91 -82
  201. package/dist/data/Tree.js.map +1 -1
  202. package/dist/data/TreeNode.cjs +3 -0
  203. package/dist/data/TreeNode.cjs.map +1 -1
  204. package/dist/data/TreeNode.d.ts +2 -1
  205. package/dist/data/TreeNode.d.ts.map +1 -1
  206. package/dist/data/TreeNode.js +3 -0
  207. package/dist/data/TreeNode.js.map +1 -1
  208. package/dist/data/ai/ChatWindow.cjs +9 -140
  209. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  210. package/dist/data/ai/ChatWindow.d.ts +2 -40
  211. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  212. package/dist/data/ai/ChatWindow.js +6 -137
  213. package/dist/data/ai/ChatWindow.js.map +1 -1
  214. package/dist/data/ai/ChatWindow.models.cjs +11 -0
  215. package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
  216. package/dist/data/ai/ChatWindow.models.d.ts +3 -0
  217. package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
  218. package/dist/data/ai/ChatWindow.models.js +11 -0
  219. package/dist/data/ai/ChatWindow.models.js.map +1 -0
  220. package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
  221. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
  222. package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
  223. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
  224. package/dist/data/ai/ChatWindow.preferences.js +57 -0
  225. package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
  226. package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
  227. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
  228. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
  229. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
  230. package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
  231. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
  232. package/dist/data/ai/ChatWindow.types.d.ts +41 -0
  233. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
  234. package/dist/data/ai/ContextBadges.cjs +76 -46
  235. package/dist/data/ai/ContextBadges.cjs.map +1 -1
  236. package/dist/data/ai/ContextBadges.d.ts.map +1 -1
  237. package/dist/data/ai/ContextBadges.js +77 -47
  238. package/dist/data/ai/ContextBadges.js.map +1 -1
  239. package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
  240. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  241. package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
  242. package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
  243. package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
  244. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  245. package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
  246. package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
  247. package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
  248. package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
  249. package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
  250. package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
  251. package/dist/data/ai/PromptPicker/index.d.ts +2 -1
  252. package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
  253. package/dist/data/ai/PromptPicker/types.cjs +7 -0
  254. package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
  255. package/dist/data/ai/PromptPicker/types.d.ts +18 -2
  256. package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
  257. package/dist/data/ai/PromptPicker/types.js +7 -0
  258. package/dist/data/ai/PromptPicker/types.js.map +1 -0
  259. package/dist/data/ai/PromptRunEditor/index.cjs +82 -14
  260. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  261. package/dist/data/ai/PromptRunEditor/index.d.ts +5 -1
  262. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  263. package/dist/data/ai/PromptRunEditor/index.js +83 -15
  264. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  265. package/dist/data/ai/RuntimeBar.cjs +336 -0
  266. package/dist/data/ai/RuntimeBar.cjs.map +1 -0
  267. package/dist/data/ai/RuntimeBar.d.ts +27 -0
  268. package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
  269. package/dist/data/ai/RuntimeBar.js +336 -0
  270. package/dist/data/ai/RuntimeBar.js.map +1 -0
  271. package/dist/data/ai/SessionChatComposer.cjs +56 -0
  272. package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
  273. package/dist/data/ai/SessionChatComposer.d.ts +24 -0
  274. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
  275. package/dist/data/ai/SessionChatComposer.js +56 -0
  276. package/dist/data/ai/SessionChatComposer.js.map +1 -0
  277. package/dist/data/ai/SessionInspector.cjs +222 -382
  278. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  279. package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
  280. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
  281. package/dist/data/ai/SessionInspector.collection.cjs +377 -0
  282. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
  283. package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
  284. package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
  285. package/dist/data/ai/SessionInspector.collection.js +377 -0
  286. package/dist/data/ai/SessionInspector.collection.js.map +1 -0
  287. package/dist/data/ai/SessionInspector.d.ts +9 -4
  288. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  289. package/dist/data/ai/SessionInspector.files.cjs +162 -0
  290. package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
  291. package/dist/data/ai/SessionInspector.files.d.ts +5 -0
  292. package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
  293. package/dist/data/ai/SessionInspector.files.js +162 -0
  294. package/dist/data/ai/SessionInspector.files.js.map +1 -0
  295. package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
  296. package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
  297. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
  298. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
  299. package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
  300. package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
  301. package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
  302. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
  303. package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
  304. package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
  305. package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
  306. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
  307. package/dist/data/ai/SessionInspector.js +224 -384
  308. package/dist/data/ai/SessionInspector.js.map +1 -1
  309. package/dist/data/ai/SessionInspector.model.cjs +125 -0
  310. package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
  311. package/dist/data/ai/SessionInspector.model.d.ts +14 -0
  312. package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
  313. package/dist/data/ai/SessionInspector.model.js +125 -0
  314. package/dist/data/ai/SessionInspector.model.js.map +1 -0
  315. package/dist/data/ai/SessionInspector.panels.cjs +265 -0
  316. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
  317. package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
  318. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
  319. package/dist/data/ai/SessionInspector.panels.js +265 -0
  320. package/dist/data/ai/SessionInspector.panels.js.map +1 -0
  321. package/dist/data/ai/SessionInspector.plan.cjs +77 -0
  322. package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
  323. package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
  324. package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
  325. package/dist/data/ai/SessionInspector.plan.js +77 -0
  326. package/dist/data/ai/SessionInspector.plan.js.map +1 -0
  327. package/dist/data/ai/SessionInspector.summary.cjs +182 -0
  328. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
  329. package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
  330. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
  331. package/dist/data/ai/SessionInspector.summary.js +182 -0
  332. package/dist/data/ai/SessionInspector.summary.js.map +1 -0
  333. package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
  334. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
  335. package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
  336. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
  337. package/dist/data/ai/SessionInspector.transcript.js +94 -0
  338. package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
  339. package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
  340. package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
  341. package/dist/data/ai/SessionViewer.cjs +86 -121
  342. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  343. package/dist/data/ai/SessionViewer.d.ts +8 -1
  344. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  345. package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
  346. package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
  347. package/dist/data/ai/SessionViewer.header.cjs +110 -0
  348. package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
  349. package/dist/data/ai/SessionViewer.header.d.ts +11 -0
  350. package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
  351. package/dist/data/ai/SessionViewer.header.js +110 -0
  352. package/dist/data/ai/SessionViewer.header.js.map +1 -0
  353. package/dist/data/ai/SessionViewer.js +87 -122
  354. package/dist/data/ai/SessionViewer.js.map +1 -1
  355. package/dist/data/ai/SessionViewer.model.cjs +109 -39
  356. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  357. package/dist/data/ai/SessionViewer.model.d.ts +2 -0
  358. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  359. package/dist/data/ai/SessionViewer.model.js +109 -39
  360. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  361. package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
  362. package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
  363. package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
  364. package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
  365. package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
  366. package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
  367. package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
  368. package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
  369. package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
  370. package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
  371. package/dist/data/ai/SessionViewer.row-time.js +15 -0
  372. package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
  373. package/dist/data/ai/SessionViewer.rows.cjs +37 -424
  374. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  375. package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
  376. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  377. package/dist/data/ai/SessionViewer.rows.js +31 -418
  378. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  379. package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
  380. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
  381. package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
  382. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
  383. package/dist/data/ai/SessionViewer.tool-details.js +65 -0
  384. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
  385. package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
  386. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
  387. package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
  388. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
  389. package/dist/data/ai/SessionViewer.tool-row.js +404 -0
  390. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
  391. package/dist/data/ai/SessionViewer.unified.d.ts +10 -2
  392. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  393. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
  394. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  395. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  396. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
  397. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  398. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
  399. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  400. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  401. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
  402. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  403. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
  404. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  405. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
  406. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
  407. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  408. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
  409. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
  410. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
  411. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
  412. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
  413. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  414. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  415. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  416. package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
  417. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  418. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
  419. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  420. package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
  421. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  422. package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
  423. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  424. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
  425. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  426. package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
  427. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  428. package/dist/data/ai/ToolPreferences.cjs +2 -1
  429. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  430. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  431. package/dist/data/ai/ToolPreferences.js +2 -1
  432. package/dist/data/ai/ToolPreferences.js.map +1 -1
  433. package/dist/data/ai/agent-action-icons.cjs +7 -10
  434. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  435. package/dist/data/ai/agent-action-icons.d.ts +1 -2
  436. package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
  437. package/dist/data/ai/agent-action-icons.js +8 -11
  438. package/dist/data/ai/agent-action-icons.js.map +1 -1
  439. package/dist/data/ai/context.cjs.map +1 -1
  440. package/dist/data/ai/context.d.ts +4 -0
  441. package/dist/data/ai/context.d.ts.map +1 -1
  442. package/dist/data/ai/context.js.map +1 -1
  443. package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
  444. package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
  445. package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
  446. package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
  447. package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
  448. package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
  449. package/dist/data/ai/examples/sessions/claude.cjs +252 -0
  450. package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
  451. package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
  452. package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
  453. package/dist/data/ai/examples/sessions/claude.js +252 -0
  454. package/dist/data/ai/examples/sessions/claude.js.map +1 -0
  455. package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
  456. package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
  457. package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
  458. package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
  459. package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
  460. package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
  461. package/dist/data/ai/examples/sessions/codex.cjs +236 -0
  462. package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
  463. package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
  464. package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
  465. package/dist/data/ai/examples/sessions/codex.js +236 -0
  466. package/dist/data/ai/examples/sessions/codex.js.map +1 -0
  467. package/dist/data/ai/examples/sessions/index.cjs +21 -0
  468. package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
  469. package/dist/data/ai/examples/sessions/index.d.ts +10 -0
  470. package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
  471. package/dist/data/ai/examples/sessions/index.js +21 -0
  472. package/dist/data/ai/examples/sessions/index.js.map +1 -0
  473. package/dist/data/ai/index.d.ts +8 -3
  474. package/dist/data/ai/index.d.ts.map +1 -1
  475. package/dist/data/ai/runtime-mode.cjs +62 -0
  476. package/dist/data/ai/runtime-mode.cjs.map +1 -1
  477. package/dist/data/ai/runtime-mode.d.ts +27 -0
  478. package/dist/data/ai/runtime-mode.d.ts.map +1 -1
  479. package/dist/data/ai/runtime-mode.js +62 -0
  480. package/dist/data/ai/runtime-mode.js.map +1 -1
  481. package/dist/data/cells/EntityCell.cjs +64 -0
  482. package/dist/data/cells/EntityCell.cjs.map +1 -0
  483. package/dist/data/cells/EntityCell.d.ts +27 -0
  484. package/dist/data/cells/EntityCell.d.ts.map +1 -0
  485. package/dist/data/cells/EntityCell.js +64 -0
  486. package/dist/data/cells/EntityCell.js.map +1 -0
  487. package/dist/data/chat/Attachment.cjs +53 -13
  488. package/dist/data/chat/Attachment.cjs.map +1 -1
  489. package/dist/data/chat/Attachment.d.ts +9 -3
  490. package/dist/data/chat/Attachment.d.ts.map +1 -1
  491. package/dist/data/chat/Attachment.js +54 -14
  492. package/dist/data/chat/Attachment.js.map +1 -1
  493. package/dist/data/chat/Chat.cjs +25 -17
  494. package/dist/data/chat/Chat.cjs.map +1 -1
  495. package/dist/data/chat/Chat.d.ts +8 -4
  496. package/dist/data/chat/Chat.d.ts.map +1 -1
  497. package/dist/data/chat/Chat.js +22 -14
  498. package/dist/data/chat/Chat.js.map +1 -1
  499. package/dist/data/chat/ContextMeter.cjs +142 -39
  500. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  501. package/dist/data/chat/ContextMeter.d.ts +4 -1
  502. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  503. package/dist/data/chat/ContextMeter.js +143 -40
  504. package/dist/data/chat/ContextMeter.js.map +1 -1
  505. package/dist/data/chat/Conversation.cjs +55 -3
  506. package/dist/data/chat/Conversation.cjs.map +1 -1
  507. package/dist/data/chat/Conversation.d.ts +5 -1
  508. package/dist/data/chat/Conversation.d.ts.map +1 -1
  509. package/dist/data/chat/Conversation.js +55 -3
  510. package/dist/data/chat/Conversation.js.map +1 -1
  511. package/dist/data/chat/ModelSelector.cjs +8 -10
  512. package/dist/data/chat/ModelSelector.cjs.map +1 -1
  513. package/dist/data/chat/ModelSelector.d.ts.map +1 -1
  514. package/dist/data/chat/ModelSelector.js +9 -11
  515. package/dist/data/chat/ModelSelector.js.map +1 -1
  516. package/dist/data/chat/PromptInput.cjs +56 -5
  517. package/dist/data/chat/PromptInput.cjs.map +1 -1
  518. package/dist/data/chat/PromptInput.d.ts +10 -1
  519. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  520. package/dist/data/chat/PromptInput.js +57 -6
  521. package/dist/data/chat/PromptInput.js.map +1 -1
  522. package/dist/data/chat/attachment-upload.cjs +33 -0
  523. package/dist/data/chat/attachment-upload.cjs.map +1 -0
  524. package/dist/data/chat/attachment-upload.d.ts +21 -0
  525. package/dist/data/chat/attachment-upload.d.ts.map +1 -0
  526. package/dist/data/chat/attachment-upload.js +33 -0
  527. package/dist/data/chat/attachment-upload.js.map +1 -0
  528. package/dist/data/chat/effort-icons.cjs +36 -6
  529. package/dist/data/chat/effort-icons.cjs.map +1 -1
  530. package/dist/data/chat/effort-icons.d.ts +6 -3
  531. package/dist/data/chat/effort-icons.d.ts.map +1 -1
  532. package/dist/data/chat/effort-icons.js +37 -7
  533. package/dist/data/chat/effort-icons.js.map +1 -1
  534. package/dist/data/chat/index.d.ts +3 -1
  535. package/dist/data/chat/index.d.ts.map +1 -1
  536. package/dist/data/chat/models.cjs +8 -0
  537. package/dist/data/chat/models.cjs.map +1 -0
  538. package/dist/data/chat/models.d.ts +11 -0
  539. package/dist/data/chat/models.d.ts.map +1 -0
  540. package/dist/data/chat/models.js +8 -0
  541. package/dist/data/chat/models.js.map +1 -0
  542. package/dist/data/chat/provider-icons.cjs +49 -16
  543. package/dist/data/chat/provider-icons.cjs.map +1 -1
  544. package/dist/data/chat/provider-icons.d.ts +2 -0
  545. package/dist/data/chat/provider-icons.d.ts.map +1 -1
  546. package/dist/data/chat/provider-icons.js +50 -17
  547. package/dist/data/chat/provider-icons.js.map +1 -1
  548. package/dist/data/chat/types.cjs.map +1 -1
  549. package/dist/data/chat/types.d.ts +9 -0
  550. package/dist/data/chat/types.d.ts.map +1 -1
  551. package/dist/data/chat/types.js.map +1 -1
  552. package/dist/data/examples/markdown-preview-mock.cjs +45 -0
  553. package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
  554. package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
  555. package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
  556. package/dist/data/examples/markdown-preview-mock.js +45 -0
  557. package/dist/data/examples/markdown-preview-mock.js.map +1 -0
  558. package/dist/data/examples/markdown-syntax.cjs +36 -0
  559. package/dist/data/examples/markdown-syntax.cjs.map +1 -0
  560. package/dist/data/examples/markdown-syntax.d.ts +12 -0
  561. package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
  562. package/dist/data/examples/markdown-syntax.js +36 -0
  563. package/dist/data/examples/markdown-syntax.js.map +1 -0
  564. package/dist/data/examples/markdown-syntax.md.cjs +4 -0
  565. package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
  566. package/dist/data/examples/markdown-syntax.md.js +5 -0
  567. package/dist/data/examples/markdown-syntax.md.js.map +1 -0
  568. package/dist/data/task-process-details.cjs +48 -0
  569. package/dist/data/task-process-details.cjs.map +1 -0
  570. package/dist/data/task-process-details.d.ts +5 -0
  571. package/dist/data/task-process-details.d.ts.map +1 -0
  572. package/dist/data/task-process-details.js +48 -0
  573. package/dist/data/task-process-details.js.map +1 -0
  574. package/dist/data/version-info.cjs +2 -2
  575. package/dist/data/version-info.js +2 -2
  576. package/dist/data.cjs +30 -0
  577. package/dist/data.cjs.map +1 -1
  578. package/dist/data.d.ts +7 -1
  579. package/dist/data.d.ts.map +1 -1
  580. package/dist/data.js +30 -0
  581. package/dist/data.js.map +1 -1
  582. package/dist/hooks/use-hotkey.cjs +98 -0
  583. package/dist/hooks/use-hotkey.cjs.map +1 -0
  584. package/dist/hooks/use-hotkey.d.ts +42 -0
  585. package/dist/hooks/use-hotkey.d.ts.map +1 -0
  586. package/dist/hooks/use-hotkey.js +98 -0
  587. package/dist/hooks/use-hotkey.js.map +1 -0
  588. package/dist/hooks/use-task-run.cjs +23 -1
  589. package/dist/hooks/use-task-run.cjs.map +1 -1
  590. package/dist/hooks/use-task-run.d.ts.map +1 -1
  591. package/dist/hooks/use-task-run.js +23 -1
  592. package/dist/hooks/use-task-run.js.map +1 -1
  593. package/dist/hooks.cjs +4 -0
  594. package/dist/hooks.cjs.map +1 -1
  595. package/dist/hooks.d.ts +1 -0
  596. package/dist/hooks.d.ts.map +1 -1
  597. package/dist/hooks.js +4 -0
  598. package/dist/hooks.js.map +1 -1
  599. package/dist/icons/components/UiBank.cjs +15 -0
  600. package/dist/icons/components/UiBank.cjs.map +1 -0
  601. package/dist/icons/components/UiBank.d.ts +15 -0
  602. package/dist/icons/components/UiBank.d.ts.map +1 -0
  603. package/dist/icons/components/UiBank.js +15 -0
  604. package/dist/icons/components/UiBank.js.map +1 -0
  605. package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
  606. package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
  607. package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
  608. package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
  609. package/dist/icons/components/UiChartOfAccounts.js +15 -0
  610. package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
  611. package/dist/icons/components/UiCloudUpload.cjs +15 -0
  612. package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
  613. package/dist/icons/components/UiCloudUpload.d.ts +15 -0
  614. package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
  615. package/dist/icons/components/UiCloudUpload.js +15 -0
  616. package/dist/icons/components/UiCloudUpload.js.map +1 -0
  617. package/dist/icons/components/UiLedger.cjs +15 -0
  618. package/dist/icons/components/UiLedger.cjs.map +1 -0
  619. package/dist/icons/components/UiLedger.d.ts +15 -0
  620. package/dist/icons/components/UiLedger.d.ts.map +1 -0
  621. package/dist/icons/components/UiLedger.js +15 -0
  622. package/dist/icons/components/UiLedger.js.map +1 -0
  623. package/dist/icons/components/UiReceipt.cjs +15 -0
  624. package/dist/icons/components/UiReceipt.cjs.map +1 -0
  625. package/dist/icons/components/UiReceipt.d.ts +15 -0
  626. package/dist/icons/components/UiReceipt.d.ts.map +1 -0
  627. package/dist/icons/components/UiReceipt.js +15 -0
  628. package/dist/icons/components/UiReceipt.js.map +1 -0
  629. package/dist/icons/index.d.ts +10 -0
  630. package/dist/icons/index.d.ts.map +1 -1
  631. package/dist/icons.cjs +15 -0
  632. package/dist/icons.cjs.map +1 -1
  633. package/dist/icons.js +15 -0
  634. package/dist/icons.js.map +1 -1
  635. package/dist/index.cjs +47 -0
  636. package/dist/index.cjs.map +1 -1
  637. package/dist/index.js +49 -2
  638. package/dist/index.js.map +1 -1
  639. package/dist/layout/AppShell.cjs +270 -238
  640. package/dist/layout/AppShell.cjs.map +1 -1
  641. package/dist/layout/AppShell.d.ts +9 -0
  642. package/dist/layout/AppShell.d.ts.map +1 -1
  643. package/dist/layout/AppShell.debug.cjs +53 -0
  644. package/dist/layout/AppShell.debug.cjs.map +1 -0
  645. package/dist/layout/AppShell.debug.d.ts +6 -0
  646. package/dist/layout/AppShell.debug.d.ts.map +1 -0
  647. package/dist/layout/AppShell.debug.js +53 -0
  648. package/dist/layout/AppShell.debug.js.map +1 -0
  649. package/dist/layout/AppShell.js +269 -237
  650. package/dist/layout/AppShell.js.map +1 -1
  651. package/dist/layout/AppShell.nav.cjs +90 -0
  652. package/dist/layout/AppShell.nav.cjs.map +1 -0
  653. package/dist/layout/AppShell.nav.d.ts +7 -0
  654. package/dist/layout/AppShell.nav.d.ts.map +1 -0
  655. package/dist/layout/AppShell.nav.js +90 -0
  656. package/dist/layout/AppShell.nav.js.map +1 -0
  657. package/dist/layout/AppSidebar.cjs +35 -5
  658. package/dist/layout/AppSidebar.cjs.map +1 -1
  659. package/dist/layout/AppSidebar.d.ts +4 -1
  660. package/dist/layout/AppSidebar.d.ts.map +1 -1
  661. package/dist/layout/AppSidebar.js +35 -5
  662. package/dist/layout/AppSidebar.js.map +1 -1
  663. package/dist/layout/Panel.cjs +25 -41
  664. package/dist/layout/Panel.cjs.map +1 -1
  665. package/dist/layout/Panel.d.ts +2 -1
  666. package/dist/layout/Panel.d.ts.map +1 -1
  667. package/dist/layout/Panel.js +26 -42
  668. package/dist/layout/Panel.js.map +1 -1
  669. package/dist/layout/PanelFrame.cjs +56 -0
  670. package/dist/layout/PanelFrame.cjs.map +1 -0
  671. package/dist/layout/PanelFrame.d.ts +15 -0
  672. package/dist/layout/PanelFrame.d.ts.map +1 -0
  673. package/dist/layout/PanelFrame.js +56 -0
  674. package/dist/layout/PanelFrame.js.map +1 -0
  675. package/dist/layout/Section.cjs +51 -41
  676. package/dist/layout/Section.cjs.map +1 -1
  677. package/dist/layout/Section.d.ts +3 -2
  678. package/dist/layout/Section.d.ts.map +1 -1
  679. package/dist/layout/Section.js +51 -41
  680. package/dist/layout/Section.js.map +1 -1
  681. package/dist/layout/content-width.cjs +8 -0
  682. package/dist/layout/content-width.cjs.map +1 -0
  683. package/dist/layout/content-width.d.ts +3 -0
  684. package/dist/layout/content-width.d.ts.map +1 -0
  685. package/dist/layout/content-width.js +8 -0
  686. package/dist/layout/content-width.js.map +1 -0
  687. package/dist/overlay/CommandPalette.cjs +207 -0
  688. package/dist/overlay/CommandPalette.cjs.map +1 -0
  689. package/dist/overlay/CommandPalette.d.ts +71 -0
  690. package/dist/overlay/CommandPalette.d.ts.map +1 -0
  691. package/dist/overlay/CommandPalette.js +207 -0
  692. package/dist/overlay/CommandPalette.js.map +1 -0
  693. package/dist/overlay/CommandPalette.model.cjs +70 -0
  694. package/dist/overlay/CommandPalette.model.cjs.map +1 -0
  695. package/dist/overlay/CommandPalette.model.d.ts +71 -0
  696. package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
  697. package/dist/overlay/CommandPalette.model.js +70 -0
  698. package/dist/overlay/CommandPalette.model.js.map +1 -0
  699. package/dist/overlay/CommandPaletteList.cjs +88 -0
  700. package/dist/overlay/CommandPaletteList.cjs.map +1 -0
  701. package/dist/overlay/CommandPaletteList.d.ts +23 -0
  702. package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
  703. package/dist/overlay/CommandPaletteList.js +88 -0
  704. package/dist/overlay/CommandPaletteList.js.map +1 -0
  705. package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
  706. package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
  707. package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
  708. package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
  709. package/dist/overlay/CommandPaletteTrigger.js +36 -0
  710. package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
  711. package/dist/overlay/Modal.cjs +12 -5
  712. package/dist/overlay/Modal.cjs.map +1 -1
  713. package/dist/overlay/Modal.d.ts.map +1 -1
  714. package/dist/overlay/Modal.js +12 -5
  715. package/dist/overlay/Modal.js.map +1 -1
  716. package/dist/overlay/modalStack.js +1 -1
  717. package/dist/overlay/zIndex.cjs +2 -0
  718. package/dist/overlay/zIndex.cjs.map +1 -1
  719. package/dist/overlay/zIndex.js +2 -0
  720. package/dist/overlay/zIndex.js.map +1 -1
  721. package/dist/rpc/EntityExplorerApp.cjs +6 -0
  722. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  723. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  724. package/dist/rpc/EntityExplorerApp.js +6 -0
  725. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  726. package/dist/rpc/OperationCatalog.cjs +49 -52
  727. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  728. package/dist/rpc/OperationCatalog.d.ts +17 -2
  729. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  730. package/dist/rpc/OperationCatalog.js +49 -52
  731. package/dist/rpc/OperationCatalog.js.map +1 -1
  732. package/dist/rpc/clickyMetadata.cjs +2 -1
  733. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  734. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  735. package/dist/rpc/clickyMetadata.js +2 -1
  736. package/dist/rpc/clickyMetadata.js.map +1 -1
  737. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
  738. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
  739. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
  740. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
  741. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
  742. package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
  743. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
  744. package/dist/rpc/types.cjs.map +1 -1
  745. package/dist/rpc/types.d.ts +1 -0
  746. package/dist/rpc/types.d.ts.map +1 -1
  747. package/dist/rpc/types.js.map +1 -1
  748. package/dist/styles.css +1 -1
  749. package/dist/tailwind-preset.cjs +11 -0
  750. package/dist/tailwind-preset.cjs.map +1 -1
  751. package/dist/tailwind-preset.d.ts.map +1 -1
  752. package/dist/tailwind-preset.js +11 -0
  753. package/dist/tailwind-preset.js.map +1 -1
  754. package/package.json +2 -2
@@ -2,33 +2,72 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const ai = require("ai");
6
5
  const utils = require("../../lib/utils.cjs");
7
6
  const Icon = require("../Icon.cjs");
8
7
  const button = require("../../components/button.cjs");
8
+ const attachmentUpload = require("./attachment-upload.cjs");
9
9
  const UiAdd = require("../../icons/components/UiAdd.cjs");
10
10
  const UiFile = require("../../icons/components/UiFile.cjs");
11
11
  const UiClose = require("../../icons/components/UiClose.cjs");
12
- const MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;
13
- function AttachmentButton({ onAdd, disabled, className }) {
12
+ function AttachmentButton({
13
+ onAdd,
14
+ disabled,
15
+ className,
16
+ upload = attachmentUpload.createAttachmentUploadAdapter(),
17
+ files = [],
18
+ acceptedMediaTypes,
19
+ limits,
20
+ onError
21
+ }) {
14
22
  const inputRef = react.useRef(null);
23
+ const [uploading, setUploading] = react.useState(false);
24
+ const resolvedLimits = { ...attachmentUpload.DEFAULT_ATTACHMENT_LIMITS, ...limits };
15
25
  const onChange = async (e) => {
16
26
  const list = e.target.files;
17
27
  if (!list || list.length === 0) return;
18
- const tooBig = Array.from(list).filter((f) => f.size > MAX_ATTACHMENT_BYTES);
19
- if (tooBig.length > 0) {
20
- console.warn(`clicky-ui: ${tooBig.length} attachment(s) exceed ${MAX_ATTACHMENT_BYTES} bytes and were skipped`);
28
+ const selected = Array.from(list);
29
+ const currentBytes = files.reduce(
30
+ (total, file) => total + Number(file.size ?? 0),
31
+ 0
32
+ );
33
+ let validationError = "";
34
+ if (files.length + selected.length > resolvedLimits.maxFiles) {
35
+ validationError = `Attachments are limited to ${resolvedLimits.maxFiles} files.`;
36
+ } else if (selected.some((file) => file.size > resolvedLimits.maxFileBytes)) {
37
+ validationError = `Each attachment must be ${resolvedLimits.maxFileBytes} bytes or smaller.`;
38
+ } else if (currentBytes + selected.reduce((total, file) => total + file.size, 0) > resolvedLimits.maxRequestBytes) {
39
+ validationError = `Attachments are limited to ${resolvedLimits.maxRequestBytes} bytes per request.`;
40
+ }
41
+ if (validationError) {
42
+ onError == null ? void 0 : onError(validationError);
43
+ e.target.value = "";
44
+ return;
21
45
  }
22
- const ok = Array.from(list).filter((f) => f.size <= MAX_ATTACHMENT_BYTES);
23
- if (ok.length > 0) {
24
- const dt = new DataTransfer();
25
- ok.forEach((f) => dt.items.add(f));
26
- onAdd(await ai.convertFileListToFileUIParts(dt.files));
46
+ setUploading(true);
47
+ try {
48
+ onAdd(await Promise.all(selected.map((file) => upload(file))));
49
+ onError == null ? void 0 : onError("");
50
+ } catch (error) {
51
+ onError == null ? void 0 : onError(error instanceof Error ? error.message : String(error));
52
+ } finally {
53
+ setUploading(false);
27
54
  }
28
55
  e.target.value = "";
29
56
  };
57
+ const accept = acceptedMediaTypes == null ? void 0 : acceptedMediaTypes.join(",");
58
+ const capabilityDisabled = acceptedMediaTypes != null && acceptedMediaTypes.length === 0;
30
59
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31
- /* @__PURE__ */ jsxRuntime.jsx("input", { ref: inputRef, type: "file", multiple: true, hidden: true, onChange }),
60
+ /* @__PURE__ */ jsxRuntime.jsx(
61
+ "input",
62
+ {
63
+ ref: inputRef,
64
+ type: "file",
65
+ multiple: true,
66
+ hidden: true,
67
+ onChange,
68
+ ...accept ? { accept } : {}
69
+ }
70
+ ),
32
71
  /* @__PURE__ */ jsxRuntime.jsx(
33
72
  button.Button,
34
73
  {
@@ -36,7 +75,8 @@ function AttachmentButton({ onAdd, disabled, className }) {
36
75
  size: "icon",
37
76
  variant: "ghost",
38
77
  "aria-label": "Attach files",
39
- disabled,
78
+ disabled: disabled || uploading || capabilityDisabled,
79
+ title: capabilityDisabled ? "The selected model does not support attachments" : void 0,
40
80
  onClick: () => {
41
81
  var _a;
42
82
  return (_a = inputRef.current) == null ? void 0 : _a.click();
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.cjs","sources":["../../../src/data/chat/Attachment.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport { convertFileListToFileUIParts } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { UiAdd, UiClose, UiFile } from \"../../icons\";\nimport type { FileUIPart } from \"./types\";\n\n/** Files larger than this are rejected client-side: attachments are inlined as\n * data URLs in the request body, so large files would bloat every turn. */\nconst MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;\n\nexport type AttachmentButtonProps = {\n /** Called with newly selected files converted to FileUIParts. */\n onAdd: (parts: FileUIPart[]) => void;\n disabled?: boolean;\n className?: string;\n};\n\n/** A paperclip-style button that opens the file picker and emits the chosen\n * files as FileUIParts (data-URL encoded). */\nexport function AttachmentButton({ onAdd, disabled, className }: AttachmentButtonProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) return;\n const tooBig = Array.from(list).filter((f) => f.size > MAX_ATTACHMENT_BYTES);\n if (tooBig.length > 0) {\n console.warn(`clicky-ui: ${tooBig.length} attachment(s) exceed ${MAX_ATTACHMENT_BYTES} bytes and were skipped`);\n }\n const ok = Array.from(list).filter((f) => f.size <= MAX_ATTACHMENT_BYTES);\n if (ok.length > 0) {\n const dt = new DataTransfer();\n ok.forEach((f) => dt.items.add(f));\n onAdd(await convertFileListToFileUIParts(dt.files));\n }\n e.target.value = \"\";\n };\n\n return (\n <>\n <input ref={inputRef} type=\"file\" multiple hidden onChange={onChange} />\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Attach files\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n className={className}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n </>\n );\n}\n\nexport type AttachmentListProps = {\n files: FileUIPart[];\n onRemove: (index: number) => void;\n className?: string;\n};\n\n/** Chips/thumbnails for the pending attachments, each removable. */\nexport function AttachmentList({ files, onRemove, className }: AttachmentListProps) {\n if (files.length === 0) return null;\n return (\n <div className={cn(\"flex flex-wrap gap-2 px-1\", className)}>\n {files.map((file, i) => (\n <div\n key={`${file.filename ?? \"file\"}-${i}`}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-background py-1 pl-2 pr-1 text-xs\"\n >\n {file.mediaType?.startsWith(\"image/\") && file.url ? (\n <img src={file.url} alt={file.filename ?? \"\"} className=\"size-6 rounded object-cover\" />\n ) : (\n <Icon icon={UiFile} className=\"size-3.5 text-muted-foreground\" />\n )}\n <span className=\"max-w-32 truncate\">{file.filename ?? file.mediaType ?? \"file\"}</span>\n <button\n type=\"button\"\n aria-label=\"Remove attachment\"\n onClick={() => onRemove(i)}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <Icon icon={UiClose} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"names":["useRef","convertFileListToFileUIParts","jsxs","Fragment","jsx","Button","Icon","UiAdd","cn","UiFile","UiClose"],"mappings":";;;;;;;;;;;AAUA,MAAM,uBAAuB,IAAI,OAAO;AAWjC,SAAS,iBAAiB,EAAE,OAAO,UAAU,aAAoC;AACtF,QAAM,WAAWA,MAAAA,OAAyB,IAAI;AAE9C,QAAM,WAAW,OAAO,MAA2C;AACjE,UAAM,OAAO,EAAE,OAAO;AACtB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,UAAM,SAAS,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,oBAAoB;AAC3E,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,KAAK,cAAc,OAAO,MAAM,yBAAyB,oBAAoB,yBAAyB;AAAA,IAChH;AACA,UAAM,KAAK,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,oBAAoB;AACxE,QAAI,GAAG,SAAS,GAAG;AACjB,YAAM,KAAK,IAAI,aAAA;AACf,SAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AACjC,YAAM,MAAMC,GAAAA,6BAA6B,GAAG,KAAK,CAAC;AAAA,IACpD;AACA,MAAE,OAAO,QAAQ;AAAA,EACnB;AAEA,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA,IAAC,SAAA,EAAM,KAAK,UAAU,MAAK,QAAO,UAAQ,MAAC,QAAM,MAAC,SAAA,CAAoB;AAAA,IACtEA,2BAAAA;AAAAA,MAACC,OAAAA;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,cAAW;AAAA,QACX;AAAA,QACA,SAAS,MAAA;;AAAM,gCAAS,YAAT,mBAAkB;AAAA;AAAA,QACjC;AAAA,QAEA,UAAAD,2BAAAA,IAACE,WAAA,EAAK,MAAMC,MAAAA,OAAO,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACxC,GACF;AAEJ;AASO,SAAS,eAAe,EAAE,OAAO,UAAU,aAAkC;AAClF,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACEH,2BAAAA,IAAC,OAAA,EAAI,WAAWI,MAAAA,GAAG,6BAA6B,SAAS,GACtD,UAAA,MAAM,IAAI,CAAC,MAAM,MAAA;;AAChBN,sCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAET,UAAA;AAAA,YAAA,UAAK,cAAL,mBAAgB,WAAW,cAAa,KAAK,MAC5CE,2BAAAA,IAAC,OAAA,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,YAAY,IAAI,WAAU,8BAAA,CAA8B,mCAErFE,KAAAA,MAAA,EAAK,MAAMG,OAAAA,QAAQ,WAAU,iCAAA,CAAiC;AAAA,UAEjEL,2BAAAA,IAAC,UAAK,WAAU,qBAAqB,eAAK,YAAY,KAAK,aAAa,OAAA,CAAO;AAAA,UAC/EA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM,SAAS,CAAC;AAAA,cACzB,WAAU;AAAA,cAEV,UAAAA,2BAAAA,IAACE,WAAA,EAAK,MAAMI,QAAAA,SAAS,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1C;AAAA,MAAA;AAAA,MAhBK,GAAG,KAAK,YAAY,MAAM,IAAI,CAAC;AAAA,IAAA;AAAA,GAkBvC,GACH;AAEJ;;;"}
1
+ {"version":3,"file":"Attachment.cjs","sources":["../../../src/data/chat/Attachment.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { UiAdd, UiClose, UiFile } from \"../../icons\";\nimport type { FileUIPart } from \"./types\";\nimport {\n createAttachmentUploadAdapter,\n DEFAULT_ATTACHMENT_LIMITS,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\n\nexport type AttachmentButtonProps = {\n /** Called with newly selected files converted to FileUIParts. */\n onAdd: (parts: FileUIPart[]) => void;\n disabled?: boolean;\n className?: string;\n upload?: AttachmentUploadAdapter;\n files?: FileUIPart[];\n acceptedMediaTypes?: string[];\n limits?: AttachmentLimits;\n onError?: (message: string) => void;\n};\n\n/** A paperclip-style button that uploads selected files and emits durable file\n * descriptors. Binary content never enters the chat message body. */\nexport function AttachmentButton({\n onAdd,\n disabled,\n className,\n upload = createAttachmentUploadAdapter(),\n files = [],\n acceptedMediaTypes,\n limits,\n onError,\n}: AttachmentButtonProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const resolvedLimits = { ...DEFAULT_ATTACHMENT_LIMITS, ...limits };\n\n const onChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) return;\n const selected = Array.from(list);\n const currentBytes = files.reduce(\n (total, file) =>\n total + Number((file as Partial<AttachmentFilePart>).size ?? 0),\n 0,\n );\n let validationError = \"\";\n if (files.length + selected.length > resolvedLimits.maxFiles) {\n validationError = `Attachments are limited to ${resolvedLimits.maxFiles} files.`;\n } else if (\n selected.some((file) => file.size > resolvedLimits.maxFileBytes)\n ) {\n validationError = `Each attachment must be ${resolvedLimits.maxFileBytes} bytes or smaller.`;\n } else if (\n currentBytes + selected.reduce((total, file) => total + file.size, 0) >\n resolvedLimits.maxRequestBytes\n ) {\n validationError = `Attachments are limited to ${resolvedLimits.maxRequestBytes} bytes per request.`;\n }\n if (validationError) {\n onError?.(validationError);\n e.target.value = \"\";\n return;\n }\n setUploading(true);\n try {\n onAdd(await Promise.all(selected.map((file) => upload(file))));\n onError?.(\"\");\n } catch (error) {\n onError?.(error instanceof Error ? error.message : String(error));\n } finally {\n setUploading(false);\n }\n e.target.value = \"\";\n };\n\n const accept = acceptedMediaTypes?.join(\",\");\n const capabilityDisabled =\n acceptedMediaTypes != null && acceptedMediaTypes.length === 0;\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n hidden\n onChange={onChange}\n {...(accept ? { accept } : {})}\n />\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Attach files\"\n disabled={disabled || uploading || capabilityDisabled}\n title={\n capabilityDisabled\n ? \"The selected model does not support attachments\"\n : undefined\n }\n onClick={() => inputRef.current?.click()}\n className={className}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n </>\n );\n}\n\nexport type AttachmentListProps = {\n files: FileUIPart[];\n onRemove: (index: number) => void;\n className?: string;\n};\n\n/** Chips/thumbnails for the pending attachments, each removable. */\nexport function AttachmentList({ files, onRemove, className }: AttachmentListProps) {\n if (files.length === 0) return null;\n return (\n <div className={cn(\"flex flex-wrap gap-2 px-1\", className)}>\n {files.map((file, i) => (\n <div\n key={`${file.filename ?? \"file\"}-${i}`}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-background py-1 pl-2 pr-1 text-xs\"\n >\n {file.mediaType?.startsWith(\"image/\") && file.url ? (\n <img src={file.url} alt={file.filename ?? \"\"} className=\"size-6 rounded object-cover\" />\n ) : (\n <Icon icon={UiFile} className=\"size-3.5 text-muted-foreground\" />\n )}\n <span className=\"max-w-32 truncate\">{file.filename ?? file.mediaType ?? \"file\"}</span>\n <button\n type=\"button\"\n aria-label=\"Remove attachment\"\n onClick={() => onRemove(i)}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <Icon icon={UiClose} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"names":["createAttachmentUploadAdapter","useRef","useState","DEFAULT_ATTACHMENT_LIMITS","jsxs","Fragment","jsx","Button","Icon","UiAdd","cn","UiFile","UiClose"],"mappings":"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"}
@@ -1,13 +1,19 @@
1
1
  import { FileUIPart } from './types';
2
+ import { AttachmentLimits, AttachmentUploadAdapter } from './attachment-upload';
2
3
  export type AttachmentButtonProps = {
3
4
  /** Called with newly selected files converted to FileUIParts. */
4
5
  onAdd: (parts: FileUIPart[]) => void;
5
6
  disabled?: boolean;
6
7
  className?: string;
8
+ upload?: AttachmentUploadAdapter;
9
+ files?: FileUIPart[];
10
+ acceptedMediaTypes?: string[];
11
+ limits?: AttachmentLimits;
12
+ onError?: (message: string) => void;
7
13
  };
8
- /** A paperclip-style button that opens the file picker and emits the chosen
9
- * files as FileUIParts (data-URL encoded). */
10
- export declare function AttachmentButton({ onAdd, disabled, className }: AttachmentButtonProps): import("react/jsx-runtime").JSX.Element;
14
+ /** A paperclip-style button that uploads selected files and emits durable file
15
+ * descriptors. Binary content never enters the chat message body. */
16
+ export declare function AttachmentButton({ onAdd, disabled, className, upload, files, acceptedMediaTypes, limits, onError, }: AttachmentButtonProps): import("react/jsx-runtime").JSX.Element;
11
17
  export type AttachmentListProps = {
12
18
  files: FileUIPart[];
13
19
  onRemove: (index: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Attachment.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAM1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,iEAAiE;IACjE,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;+CAC+C;AAC/C,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAmCrF;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,kDA2BjF"}
1
+ {"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Attachment.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,qBAAqB,GAAG;IAClC,iEAAiE;IACjE,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF;qEACqE;AACrE,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,SAAS,EACT,MAAwC,EACxC,KAAU,EACV,kBAAkB,EAClB,MAAM,EACN,OAAO,GACR,EAAE,qBAAqB,2CA4EvB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,mBAAmB,kDA2BjF"}
@@ -1,32 +1,71 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
- import { useRef } from "react";
3
- import { convertFileListToFileUIParts } from "ai";
2
+ import { useRef, useState } from "react";
4
3
  import { cn } from "../../lib/utils.js";
5
4
  import { Icon } from "../Icon.js";
6
5
  import { Button } from "../../components/button.js";
6
+ import { DEFAULT_ATTACHMENT_LIMITS, createAttachmentUploadAdapter } from "./attachment-upload.js";
7
7
  import { UiAdd } from "../../icons/components/UiAdd.js";
8
8
  import { UiFile } from "../../icons/components/UiFile.js";
9
9
  import { UiClose } from "../../icons/components/UiClose.js";
10
- const MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;
11
- function AttachmentButton({ onAdd, disabled, className }) {
10
+ function AttachmentButton({
11
+ onAdd,
12
+ disabled,
13
+ className,
14
+ upload = createAttachmentUploadAdapter(),
15
+ files = [],
16
+ acceptedMediaTypes,
17
+ limits,
18
+ onError
19
+ }) {
12
20
  const inputRef = useRef(null);
21
+ const [uploading, setUploading] = useState(false);
22
+ const resolvedLimits = { ...DEFAULT_ATTACHMENT_LIMITS, ...limits };
13
23
  const onChange = async (e) => {
14
24
  const list = e.target.files;
15
25
  if (!list || list.length === 0) return;
16
- const tooBig = Array.from(list).filter((f) => f.size > MAX_ATTACHMENT_BYTES);
17
- if (tooBig.length > 0) {
18
- console.warn(`clicky-ui: ${tooBig.length} attachment(s) exceed ${MAX_ATTACHMENT_BYTES} bytes and were skipped`);
26
+ const selected = Array.from(list);
27
+ const currentBytes = files.reduce(
28
+ (total, file) => total + Number(file.size ?? 0),
29
+ 0
30
+ );
31
+ let validationError = "";
32
+ if (files.length + selected.length > resolvedLimits.maxFiles) {
33
+ validationError = `Attachments are limited to ${resolvedLimits.maxFiles} files.`;
34
+ } else if (selected.some((file) => file.size > resolvedLimits.maxFileBytes)) {
35
+ validationError = `Each attachment must be ${resolvedLimits.maxFileBytes} bytes or smaller.`;
36
+ } else if (currentBytes + selected.reduce((total, file) => total + file.size, 0) > resolvedLimits.maxRequestBytes) {
37
+ validationError = `Attachments are limited to ${resolvedLimits.maxRequestBytes} bytes per request.`;
38
+ }
39
+ if (validationError) {
40
+ onError == null ? void 0 : onError(validationError);
41
+ e.target.value = "";
42
+ return;
19
43
  }
20
- const ok = Array.from(list).filter((f) => f.size <= MAX_ATTACHMENT_BYTES);
21
- if (ok.length > 0) {
22
- const dt = new DataTransfer();
23
- ok.forEach((f) => dt.items.add(f));
24
- onAdd(await convertFileListToFileUIParts(dt.files));
44
+ setUploading(true);
45
+ try {
46
+ onAdd(await Promise.all(selected.map((file) => upload(file))));
47
+ onError == null ? void 0 : onError("");
48
+ } catch (error) {
49
+ onError == null ? void 0 : onError(error instanceof Error ? error.message : String(error));
50
+ } finally {
51
+ setUploading(false);
25
52
  }
26
53
  e.target.value = "";
27
54
  };
55
+ const accept = acceptedMediaTypes == null ? void 0 : acceptedMediaTypes.join(",");
56
+ const capabilityDisabled = acceptedMediaTypes != null && acceptedMediaTypes.length === 0;
28
57
  return /* @__PURE__ */ jsxs(Fragment, { children: [
29
- /* @__PURE__ */ jsx("input", { ref: inputRef, type: "file", multiple: true, hidden: true, onChange }),
58
+ /* @__PURE__ */ jsx(
59
+ "input",
60
+ {
61
+ ref: inputRef,
62
+ type: "file",
63
+ multiple: true,
64
+ hidden: true,
65
+ onChange,
66
+ ...accept ? { accept } : {}
67
+ }
68
+ ),
30
69
  /* @__PURE__ */ jsx(
31
70
  Button,
32
71
  {
@@ -34,7 +73,8 @@ function AttachmentButton({ onAdd, disabled, className }) {
34
73
  size: "icon",
35
74
  variant: "ghost",
36
75
  "aria-label": "Attach files",
37
- disabled,
76
+ disabled: disabled || uploading || capabilityDisabled,
77
+ title: capabilityDisabled ? "The selected model does not support attachments" : void 0,
38
78
  onClick: () => {
39
79
  var _a;
40
80
  return (_a = inputRef.current) == null ? void 0 : _a.click();
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.js","sources":["../../../src/data/chat/Attachment.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport { convertFileListToFileUIParts } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { UiAdd, UiClose, UiFile } from \"../../icons\";\nimport type { FileUIPart } from \"./types\";\n\n/** Files larger than this are rejected client-side: attachments are inlined as\n * data URLs in the request body, so large files would bloat every turn. */\nconst MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;\n\nexport type AttachmentButtonProps = {\n /** Called with newly selected files converted to FileUIParts. */\n onAdd: (parts: FileUIPart[]) => void;\n disabled?: boolean;\n className?: string;\n};\n\n/** A paperclip-style button that opens the file picker and emits the chosen\n * files as FileUIParts (data-URL encoded). */\nexport function AttachmentButton({ onAdd, disabled, className }: AttachmentButtonProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const onChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) return;\n const tooBig = Array.from(list).filter((f) => f.size > MAX_ATTACHMENT_BYTES);\n if (tooBig.length > 0) {\n console.warn(`clicky-ui: ${tooBig.length} attachment(s) exceed ${MAX_ATTACHMENT_BYTES} bytes and were skipped`);\n }\n const ok = Array.from(list).filter((f) => f.size <= MAX_ATTACHMENT_BYTES);\n if (ok.length > 0) {\n const dt = new DataTransfer();\n ok.forEach((f) => dt.items.add(f));\n onAdd(await convertFileListToFileUIParts(dt.files));\n }\n e.target.value = \"\";\n };\n\n return (\n <>\n <input ref={inputRef} type=\"file\" multiple hidden onChange={onChange} />\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Attach files\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n className={className}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n </>\n );\n}\n\nexport type AttachmentListProps = {\n files: FileUIPart[];\n onRemove: (index: number) => void;\n className?: string;\n};\n\n/** Chips/thumbnails for the pending attachments, each removable. */\nexport function AttachmentList({ files, onRemove, className }: AttachmentListProps) {\n if (files.length === 0) return null;\n return (\n <div className={cn(\"flex flex-wrap gap-2 px-1\", className)}>\n {files.map((file, i) => (\n <div\n key={`${file.filename ?? \"file\"}-${i}`}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-background py-1 pl-2 pr-1 text-xs\"\n >\n {file.mediaType?.startsWith(\"image/\") && file.url ? (\n <img src={file.url} alt={file.filename ?? \"\"} className=\"size-6 rounded object-cover\" />\n ) : (\n <Icon icon={UiFile} className=\"size-3.5 text-muted-foreground\" />\n )}\n <span className=\"max-w-32 truncate\">{file.filename ?? file.mediaType ?? \"file\"}</span>\n <button\n type=\"button\"\n aria-label=\"Remove attachment\"\n onClick={() => onRemove(i)}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <Icon icon={UiClose} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAUA,MAAM,uBAAuB,IAAI,OAAO;AAWjC,SAAS,iBAAiB,EAAE,OAAO,UAAU,aAAoC;AACtF,QAAM,WAAW,OAAyB,IAAI;AAE9C,QAAM,WAAW,OAAO,MAA2C;AACjE,UAAM,OAAO,EAAE,OAAO;AACtB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,UAAM,SAAS,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,oBAAoB;AAC3E,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,KAAK,cAAc,OAAO,MAAM,yBAAyB,oBAAoB,yBAAyB;AAAA,IAChH;AACA,UAAM,KAAK,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,oBAAoB;AACxE,QAAI,GAAG,SAAS,GAAG;AACjB,YAAM,KAAK,IAAI,aAAA;AACf,SAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AACjC,YAAM,MAAM,6BAA6B,GAAG,KAAK,CAAC;AAAA,IACpD;AACA,MAAE,OAAO,QAAQ;AAAA,EACnB;AAEA,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAM,KAAK,UAAU,MAAK,QAAO,UAAQ,MAAC,QAAM,MAAC,SAAA,CAAoB;AAAA,IACtE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,cAAW;AAAA,QACX;AAAA,QACA,SAAS,MAAA;;AAAM,gCAAS,YAAT,mBAAkB;AAAA;AAAA,QACjC;AAAA,QAEA,UAAA,oBAAC,MAAA,EAAK,MAAM,OAAO,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACxC,GACF;AAEJ;AASO,SAAS,eAAe,EAAE,OAAO,UAAU,aAAkC;AAClF,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,oBAAC,OAAA,EAAI,WAAW,GAAG,6BAA6B,SAAS,GACtD,UAAA,MAAM,IAAI,CAAC,MAAM,MAAA;;AAChB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAET,UAAA;AAAA,YAAA,UAAK,cAAL,mBAAgB,WAAW,cAAa,KAAK,MAC5C,oBAAC,OAAA,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,YAAY,IAAI,WAAU,8BAAA,CAA8B,wBAErF,MAAA,EAAK,MAAM,QAAQ,WAAU,iCAAA,CAAiC;AAAA,UAEjE,oBAAC,UAAK,WAAU,qBAAqB,eAAK,YAAY,KAAK,aAAa,OAAA,CAAO;AAAA,UAC/E;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM,SAAS,CAAC;AAAA,cACzB,WAAU;AAAA,cAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAC1C;AAAA,MAAA;AAAA,MAhBK,GAAG,KAAK,YAAY,MAAM,IAAI,CAAC;AAAA,IAAA;AAAA,GAkBvC,GACH;AAEJ;"}
1
+ {"version":3,"file":"Attachment.js","sources":["../../../src/data/chat/Attachment.tsx"],"sourcesContent":["import { useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { UiAdd, UiClose, UiFile } from \"../../icons\";\nimport type { FileUIPart } from \"./types\";\nimport {\n createAttachmentUploadAdapter,\n DEFAULT_ATTACHMENT_LIMITS,\n type AttachmentFilePart,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\n\nexport type AttachmentButtonProps = {\n /** Called with newly selected files converted to FileUIParts. */\n onAdd: (parts: FileUIPart[]) => void;\n disabled?: boolean;\n className?: string;\n upload?: AttachmentUploadAdapter;\n files?: FileUIPart[];\n acceptedMediaTypes?: string[];\n limits?: AttachmentLimits;\n onError?: (message: string) => void;\n};\n\n/** A paperclip-style button that uploads selected files and emits durable file\n * descriptors. Binary content never enters the chat message body. */\nexport function AttachmentButton({\n onAdd,\n disabled,\n className,\n upload = createAttachmentUploadAdapter(),\n files = [],\n acceptedMediaTypes,\n limits,\n onError,\n}: AttachmentButtonProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const resolvedLimits = { ...DEFAULT_ATTACHMENT_LIMITS, ...limits };\n\n const onChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const list = e.target.files;\n if (!list || list.length === 0) return;\n const selected = Array.from(list);\n const currentBytes = files.reduce(\n (total, file) =>\n total + Number((file as Partial<AttachmentFilePart>).size ?? 0),\n 0,\n );\n let validationError = \"\";\n if (files.length + selected.length > resolvedLimits.maxFiles) {\n validationError = `Attachments are limited to ${resolvedLimits.maxFiles} files.`;\n } else if (\n selected.some((file) => file.size > resolvedLimits.maxFileBytes)\n ) {\n validationError = `Each attachment must be ${resolvedLimits.maxFileBytes} bytes or smaller.`;\n } else if (\n currentBytes + selected.reduce((total, file) => total + file.size, 0) >\n resolvedLimits.maxRequestBytes\n ) {\n validationError = `Attachments are limited to ${resolvedLimits.maxRequestBytes} bytes per request.`;\n }\n if (validationError) {\n onError?.(validationError);\n e.target.value = \"\";\n return;\n }\n setUploading(true);\n try {\n onAdd(await Promise.all(selected.map((file) => upload(file))));\n onError?.(\"\");\n } catch (error) {\n onError?.(error instanceof Error ? error.message : String(error));\n } finally {\n setUploading(false);\n }\n e.target.value = \"\";\n };\n\n const accept = acceptedMediaTypes?.join(\",\");\n const capabilityDisabled =\n acceptedMediaTypes != null && acceptedMediaTypes.length === 0;\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n hidden\n onChange={onChange}\n {...(accept ? { accept } : {})}\n />\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Attach files\"\n disabled={disabled || uploading || capabilityDisabled}\n title={\n capabilityDisabled\n ? \"The selected model does not support attachments\"\n : undefined\n }\n onClick={() => inputRef.current?.click()}\n className={className}\n >\n <Icon icon={UiAdd} className=\"size-4\" />\n </Button>\n </>\n );\n}\n\nexport type AttachmentListProps = {\n files: FileUIPart[];\n onRemove: (index: number) => void;\n className?: string;\n};\n\n/** Chips/thumbnails for the pending attachments, each removable. */\nexport function AttachmentList({ files, onRemove, className }: AttachmentListProps) {\n if (files.length === 0) return null;\n return (\n <div className={cn(\"flex flex-wrap gap-2 px-1\", className)}>\n {files.map((file, i) => (\n <div\n key={`${file.filename ?? \"file\"}-${i}`}\n className=\"flex items-center gap-1.5 rounded-md border border-border bg-background py-1 pl-2 pr-1 text-xs\"\n >\n {file.mediaType?.startsWith(\"image/\") && file.url ? (\n <img src={file.url} alt={file.filename ?? \"\"} className=\"size-6 rounded object-cover\" />\n ) : (\n <Icon icon={UiFile} className=\"size-3.5 text-muted-foreground\" />\n )}\n <span className=\"max-w-32 truncate\">{file.filename ?? file.mediaType ?? \"file\"}</span>\n <button\n type=\"button\"\n aria-label=\"Remove attachment\"\n onClick={() => onRemove(i)}\n className=\"rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <Icon icon={UiClose} className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -11,14 +11,16 @@ const Suggestion = require("./Suggestion.cjs");
11
11
  const ModelSelector = require("./ModelSelector.cjs");
12
12
  const providerIcons = require("./provider-icons.cjs");
13
13
  const ContextMeter = require("./ContextMeter.cjs");
14
- const DEFAULT_EFFORTS = ["low", "medium", "high"];
14
+ const effortIcons = require("./effort-icons.cjs");
15
+ const models = require("./models.cjs");
16
+ const attachmentUpload = require("./attachment-upload.cjs");
15
17
  function Chat({
16
18
  api = "/api/chat",
17
19
  models: modelsProp,
18
20
  modelsApi = "/api/chat/models",
19
21
  defaultModel,
20
22
  model: controlledModel,
21
- reasoningEfforts = DEFAULT_EFFORTS,
23
+ reasoningEfforts = effortIcons.DEFAULT_REASONING_EFFORTS,
22
24
  defaultReasoningEffort = "",
23
25
  reasoningEffort: controlledEffort,
24
26
  temperature,
@@ -29,7 +31,9 @@ function Chat({
29
31
  onUsage,
30
32
  suggestions,
31
33
  enableAttachments = false,
32
- toolApproval,
34
+ attachmentsApi = "/api/attachments",
35
+ attachmentUpload: attachmentUpload$1,
36
+ attachmentLimits,
33
37
  threadId,
34
38
  renderToolResult,
35
39
  body,
@@ -41,7 +45,7 @@ function Chat({
41
45
  emptyState,
42
46
  className
43
47
  }) {
44
- const [models, setModels] = react.useState(modelsProp ?? []);
48
+ const [models$1, setModels] = react.useState(modelsProp ?? []);
45
49
  const [model, setModel] = react.useState(controlledModel ?? defaultModel);
46
50
  const [effort, setEffort] = react.useState(controlledEffort ?? defaultReasoningEffort);
47
51
  const [usage, setUsage] = react.useState(null);
@@ -50,10 +54,7 @@ function Chat({
50
54
  react.useEffect(() => {
51
55
  if (!modelsProp) return;
52
56
  setModels(modelsProp);
53
- setModel((m) => {
54
- var _a;
55
- return m ?? controlledModel ?? ((_a = modelsProp.find((d) => d.configured !== false)) == null ? void 0 : _a.id);
56
- });
57
+ setModel((m) => m ?? controlledModel ?? models.defaultChatModelId(modelsProp));
57
58
  }, [modelsProp, controlledModel]);
58
59
  react.useEffect(() => {
59
60
  if (modelsProp || !modelsApi) return;
@@ -61,10 +62,7 @@ function Chat({
61
62
  fetch(modelsApi).then((r) => r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`))).then((data) => {
62
63
  if (cancelled) return;
63
64
  setModels(data);
64
- setModel((m) => {
65
- var _a;
66
- return m ?? controlledModel ?? ((_a = data.find((d) => d.configured !== false)) == null ? void 0 : _a.id);
67
- });
65
+ setModel((m) => m ?? controlledModel ?? models.defaultChatModelId(data));
68
66
  }).catch((err) => console.warn("clicky-ui: failed to load chat models", err));
69
67
  return () => {
70
68
  cancelled = true;
@@ -84,8 +82,12 @@ function Chat({
84
82
  lastDefaultModel.current = defaultModel;
85
83
  setModel(defaultModel);
86
84
  }, [controlledModel, defaultModel]);
87
- const selectedModel = models.find((m) => m.id === model);
85
+ const selectedModel = models$1.find((m) => m.id === model);
88
86
  const showEffort = !selectedModel || selectedModel.reasoning;
87
+ const resolvedAttachmentUpload = react.useMemo(
88
+ () => attachmentUpload$1 ?? attachmentUpload.createAttachmentUploadAdapter({ endpoint: attachmentsApi }),
89
+ [attachmentUpload$1, attachmentsApi]
90
+ );
89
91
  const bodyRef = react.useRef({});
90
92
  bodyRef.current = {
91
93
  ...body,
@@ -94,7 +96,6 @@ function Chat({
94
96
  ...temperature !== void 0 ? { temperature } : {},
95
97
  ...budget && (budget.cost !== void 0 || budget.maxTokens !== void 0) ? { budget } : {},
96
98
  ...permissionMode ? { permissionMode } : {},
97
- ...toolApproval ? { toolApproval } : {},
98
99
  ...threadId ? { threadId } : {}
99
100
  };
100
101
  const resolvedTransport = react.useMemo(
@@ -145,8 +146,8 @@ function Chat({
145
146
  onReasoningEffortChange == null ? void 0 : onReasoningEffortChange(next);
146
147
  };
147
148
  const ModelGlyph = providerIcons.providerIcon(selectedModel == null ? void 0 : selectedModel.provider);
148
- const toolbar = models.length > 0 || showEffort || usage && usage.maxTokens > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 items-center gap-2", children: [
149
- /* @__PURE__ */ jsxRuntime.jsx(ModelSelector.ModelSelector, { models, value: model, onChange: onModelSelect }),
149
+ const toolbar = models$1.length > 0 || showEffort || usage && usage.maxTokens > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 items-center gap-2", children: [
150
+ /* @__PURE__ */ jsxRuntime.jsx(ModelSelector.ModelSelector, { models: models$1, value: model, onChange: onModelSelect }),
150
151
  showEffort && /* @__PURE__ */ jsxRuntime.jsx(ModelSelector.EffortSelector, { efforts: reasoningEfforts, value: effort, onChange: onEffortSelect }),
151
152
  usage && usage.maxTokens > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
152
153
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1" }),
@@ -160,7 +161,9 @@ function Chat({
160
161
  ...usage.messageCount != null ? { messageCount: usage.messageCount } : {},
161
162
  ...usage.cost != null ? { cost: { total: usage.cost } } : {},
162
163
  ...usage.modelLabel ? { model: usage.modelLabel } : {},
163
- ...ModelGlyph ? { modelIcon: ModelGlyph } : {}
164
+ ...effort ? { effort } : {},
165
+ ...ModelGlyph ? { modelIcon: ModelGlyph } : {},
166
+ ...(selectedModel == null ? void 0 : selectedModel.provider) ? { modelIconClassName: providerIcons.providerIconColor(selectedModel.provider) } : {}
164
167
  }
165
168
  )
166
169
  ] })
@@ -177,6 +180,8 @@ function Chat({
177
180
  status,
178
181
  error,
179
182
  onClearError: clearError,
183
+ ...threadId ? { sessionId: threadId } : {},
184
+ ...model ? { model } : {},
180
185
  emptyState: empty,
181
186
  onRegenerate: (messageId) => void regenerate({ messageId }),
182
187
  onApprove: (id, approved, reason) => void addToolApprovalResponse(reason ? { id, approved, reason } : { id, approved }),
@@ -190,6 +195,9 @@ function Chat({
190
195
  onStop: () => void stop(),
191
196
  placeholder,
192
197
  enableAttachments,
198
+ attachmentUpload: resolvedAttachmentUpload,
199
+ ...(selectedModel == null ? void 0 : selectedModel.inputMediaTypes) ? { acceptedMediaTypes: selectedModel.inputMediaTypes } : {},
200
+ ...attachmentLimits ? { attachmentLimits } : {},
193
201
  toolbar,
194
202
  onSubmit: (text, files) => void sendMessage({ text, files })
195
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport {\n DefaultChatTransport,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n type ChatTransport,\n type UIMessage,\n} from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { ModelSelector, EffortSelector } from \"./ModelSelector\";\nimport { providerIcon } from \"./provider-icons\";\nimport { ContextMeter } from \"./ContextMeter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolResultRenderer,\n} from \"./types\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts shown on the empty state. */\n suggestions?: Suggestion[];\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** \"manual\" forwards a tool-approval policy hint to the backend. */\n toolApproval?: \"auto\" | \"manual\";\n /** Thread id to persist this conversation under (forwarded in the body). */\n threadId?: string;\n /** Optional host renderer for recognized completed tool outputs. */\n renderToolResult?: ToolResultRenderer;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to send automatically once. A new `id` sends even when text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been handed to the chat transport. */\n onInitialPromptSent?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\nconst DEFAULT_EFFORTS = [\"low\", \"medium\", \"high\"];\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, approval policy and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n reasoningEfforts = DEFAULT_EFFORTS,\n defaultReasoningEffort = \"\",\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n enableAttachments = false,\n toolApproval,\n threadId,\n renderToolResult,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptSent,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [model, setModel] = useState<string | undefined>(controlledModel ?? defaultModel);\n const [effort, setEffort] = useState(controlledEffort ?? defaultReasoningEffort);\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const lastDefaultModel = useRef(defaultModel);\n const sentInitialPromptId = useRef<number | null>(null);\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n setModel((m) => m ?? controlledModel ?? modelsProp.find((d) => d.configured !== false)?.id);\n }, [modelsProp, controlledModel]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`))))\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n setModel((m) => m ?? controlledModel ?? data.find((d) => d.configured !== false)?.id);\n })\n .catch((err) => console.warn(\"clicky-ui: failed to load chat models\", err));\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi, controlledModel]);\n\n useEffect(() => {\n if (controlledModel === undefined) return;\n setModel(controlledModel);\n }, [controlledModel]);\n\n useEffect(() => {\n if (controlledEffort === undefined) return;\n setEffort(controlledEffort);\n }, [controlledEffort]);\n\n useEffect(() => {\n if (controlledModel !== undefined) return;\n if (!defaultModel || defaultModel === lastDefaultModel.current) return;\n lastDefaultModel.current = defaultModel;\n setModel(defaultModel);\n }, [controlledModel, defaultModel]);\n\n const selectedModel = models.find((m) => m.id === model);\n const showEffort = !selectedModel || selectedModel.reasoning;\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/policy selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(model ? { model } : {}),\n ...(effort ? { reasoningEffort: effort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(toolApproval ? { toolApproval } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () => transport ?? new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const { messages, sendMessage, regenerate, addToolApprovalResponse, status, error, clearError, stop } =\n useChat<ChatUIMessage>({\n transport: resolvedTransport,\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithApprovalResponses,\n ...(initialMessages ? { messages: initialMessages as ChatUIMessage[] } : {}),\n });\n\n useEffect(() => {\n if (!initialPrompt || status !== \"ready\") return;\n if (sentInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n sentInitialPromptId.current = initialPrompt.id;\n void sendMessage({ text });\n onInitialPromptSent?.();\n }, [initialPrompt, onInitialPromptSent, sendMessage, status]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message and resolve maxTokens from the selected model.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n const meta = last?.metadata;\n if (!meta) return;\n const cost = meta.threadCostUsd ?? meta.costBreakdown?.totalUsd ?? meta.cost;\n const snapshot: ChatUsageSummary = {\n usedTokens: meta.contextTokens ?? meta.usage?.totalTokens ?? 0,\n maxTokens: selectedModel?.contextWindow ?? 0,\n messageCount: messages.length,\n ...(cost != null ? { cost } : {}),\n ...(meta.usage ? { usage: meta.usage } : {}),\n ...(meta.costBreakdown ? { costBreakdown: meta.costBreakdown } : {}),\n ...(selectedModel?.label ? { modelLabel: selectedModel.label } : {}),\n };\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, status, selectedModel]);\n\n const onModelSelect = (id: string) => {\n setModel(id);\n onModelChange?.(id);\n };\n\n const onEffortSelect = (next: string) => {\n setEffort(next);\n onReasoningEffortChange?.(next);\n };\n\n const ModelGlyph = providerIcon(selectedModel?.provider);\n const toolbar = models.length > 0 || showEffort || (usage && usage.maxTokens > 0) ? (\n <div className=\"flex flex-1 items-center gap-2\">\n <ModelSelector models={models} value={model} onChange={onModelSelect} />\n {showEffort && (\n <EffortSelector efforts={reasoningEfforts} value={effort} onChange={onEffortSelect} />\n )}\n {usage && usage.maxTokens > 0 && (\n <>\n <div className=\"flex-1\" />\n <ContextMeter\n mode=\"gauge\"\n usedPercent={Math.round((usage.usedTokens / usage.maxTokens) * 100)}\n usedTokens={usage.usedTokens}\n windowTokens={usage.maxTokens}\n {...(usage.messageCount != null ? { messageCount: usage.messageCount } : {})}\n {...(usage.cost != null ? { cost: { total: usage.cost } } : {})}\n {...(usage.modelLabel ? { model: usage.modelLabel } : {})}\n {...(ModelGlyph ? { modelIcon: ModelGlyph } : {})}\n />\n </>\n )}\n </div>\n ) : undefined;\n\n const empty = (messages.length === 0 && (emptyState || suggestions?.length)) ? (\n <div className=\"flex flex-col items-center gap-4\">\n {emptyState}\n {suggestions && suggestions.length > 0 && (\n <Suggestions suggestions={suggestions} onSelect={(text) => void sendMessage({ text })} />\n )}\n </div>\n ) : undefined;\n\n return (\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={error}\n onClearError={clearError}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={(id, approved, reason) =>\n void addToolApprovalResponse(reason ? { id, approved, reason } : { id, approved })\n }\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n toolbar={toolbar}\n onSubmit={(text, files) => void sendMessage({ text, files })}\n />\n </div>\n </div>\n );\n}\n"],"names":["useState","useRef","useEffect","useMemo","DefaultChatTransport","useChat","lastAssistantMessageIsCompleteWithApprovalResponses","providerIcon","jsxs","jsx","ModelSelector","EffortSelector","Fragment","ContextMeter","Suggestions","cn","Conversation","PromptInput"],"mappings":"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"}
1
+ {"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport {\n DefaultChatTransport,\n lastAssistantMessageIsCompleteWithApprovalResponses,\n type ChatTransport,\n type UIMessage,\n} from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { ModelSelector, EffortSelector } from \"./ModelSelector\";\nimport { providerIcon, providerIconColor } from \"./provider-icons\";\nimport { ContextMeter } from \"./ContextMeter\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolResultRenderer,\n} from \"./types\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts shown on the empty state. */\n suggestions?: Suggestion[];\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Thread id to persist this conversation under (forwarded in the body). */\n threadId?: string;\n /** Optional host renderer for recognized completed tool outputs. */\n renderToolResult?: ToolResultRenderer;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to send automatically once. A new `id` sends even when text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been handed to the chat transport. */\n onInitialPromptSent?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort = \"\",\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n renderToolResult,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptSent,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [model, setModel] = useState<string | undefined>(controlledModel ?? defaultModel);\n const [effort, setEffort] = useState(controlledEffort ?? defaultReasoningEffort);\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const lastDefaultModel = useRef(defaultModel);\n const sentInitialPromptId = useRef<number | null>(null);\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n setModel((m) => m ?? controlledModel ?? defaultChatModelId(modelsProp));\n }, [modelsProp, controlledModel]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`))))\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n setModel((m) => m ?? controlledModel ?? defaultChatModelId(data));\n })\n .catch((err) => console.warn(\"clicky-ui: failed to load chat models\", err));\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi, controlledModel]);\n\n useEffect(() => {\n if (controlledModel === undefined) return;\n setModel(controlledModel);\n }, [controlledModel]);\n\n useEffect(() => {\n if (controlledEffort === undefined) return;\n setEffort(controlledEffort);\n }, [controlledEffort]);\n\n useEffect(() => {\n if (controlledModel !== undefined) return;\n if (!defaultModel || defaultModel === lastDefaultModel.current) return;\n lastDefaultModel.current = defaultModel;\n setModel(defaultModel);\n }, [controlledModel, defaultModel]);\n\n const selectedModel = models.find((m) => m.id === model);\n const showEffort = !selectedModel || selectedModel.reasoning;\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(model ? { model } : {}),\n ...(effort ? { reasoningEffort: effort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () => transport ?? new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const { messages, sendMessage, regenerate, addToolApprovalResponse, status, error, clearError, stop } =\n useChat<ChatUIMessage>({\n transport: resolvedTransport,\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithApprovalResponses,\n ...(initialMessages ? { messages: initialMessages as ChatUIMessage[] } : {}),\n });\n\n useEffect(() => {\n if (!initialPrompt || status !== \"ready\") return;\n if (sentInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n sentInitialPromptId.current = initialPrompt.id;\n void sendMessage({ text });\n onInitialPromptSent?.();\n }, [initialPrompt, onInitialPromptSent, sendMessage, status]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message and resolve maxTokens from the selected model.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n const meta = last?.metadata;\n if (!meta) return;\n const cost = meta.threadCostUsd ?? meta.costBreakdown?.totalUsd ?? meta.cost;\n const snapshot: ChatUsageSummary = {\n usedTokens: meta.contextTokens ?? meta.usage?.totalTokens ?? 0,\n maxTokens: selectedModel?.contextWindow ?? 0,\n messageCount: messages.length,\n ...(cost != null ? { cost } : {}),\n ...(meta.usage ? { usage: meta.usage } : {}),\n ...(meta.costBreakdown ? { costBreakdown: meta.costBreakdown } : {}),\n ...(selectedModel?.label ? { modelLabel: selectedModel.label } : {}),\n };\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, status, selectedModel]);\n\n const onModelSelect = (id: string) => {\n setModel(id);\n onModelChange?.(id);\n };\n\n const onEffortSelect = (next: string) => {\n setEffort(next);\n onReasoningEffortChange?.(next);\n };\n\n const ModelGlyph = providerIcon(selectedModel?.provider);\n const toolbar = models.length > 0 || showEffort || (usage && usage.maxTokens > 0) ? (\n <div className=\"flex flex-1 items-center gap-2\">\n <ModelSelector models={models} value={model} onChange={onModelSelect} />\n {showEffort && (\n <EffortSelector efforts={reasoningEfforts} value={effort} onChange={onEffortSelect} />\n )}\n {usage && usage.maxTokens > 0 && (\n <>\n <div className=\"flex-1\" />\n <ContextMeter\n mode=\"gauge\"\n usedPercent={Math.round((usage.usedTokens / usage.maxTokens) * 100)}\n usedTokens={usage.usedTokens}\n windowTokens={usage.maxTokens}\n {...(usage.messageCount != null ? { messageCount: usage.messageCount } : {})}\n {...(usage.cost != null ? { cost: { total: usage.cost } } : {})}\n {...(usage.modelLabel ? { model: usage.modelLabel } : {})}\n {...(effort ? { effort } : {})}\n {...(ModelGlyph ? { modelIcon: ModelGlyph } : {})}\n {...(selectedModel?.provider\n ? { modelIconClassName: providerIconColor(selectedModel.provider) }\n : {})}\n />\n </>\n )}\n </div>\n ) : undefined;\n\n const empty = (messages.length === 0 && (emptyState || suggestions?.length)) ? (\n <div className=\"flex flex-col items-center gap-4\">\n {emptyState}\n {suggestions && suggestions.length > 0 && (\n <Suggestions suggestions={suggestions} onSelect={(text) => void sendMessage({ text })} />\n )}\n </div>\n ) : undefined;\n\n return (\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={error}\n onClearError={clearError}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(model ? { model } : {})}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={(id, approved, reason) =>\n void addToolApprovalResponse(reason ? { id, approved, reason } : { id, approved })\n }\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"p-4 pt-0\">\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n toolbar={toolbar}\n onSubmit={(text, files) => void sendMessage({ text, files })}\n />\n </div>\n </div>\n );\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","attachmentUpload","models","useState","useRef","useEffect","defaultChatModelId","useMemo","createAttachmentUploadAdapter","DefaultChatTransport","useChat","lastAssistantMessageIsCompleteWithApprovalResponses","providerIcon","jsxs","jsx","ModelSelector","EffortSelector","Fragment","ContextMeter","providerIconColor","Suggestions","cn","Conversation","PromptInput"],"mappings":";;;;;;;;;;;;;;;;AAuGO,SAAS,KAAK;AAAA,EACnB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,mBAAmBA,YAAAA;AAAAA,EACnB,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EAAA,kBACjBC;AAAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAc;AACZ,QAAM,CAACC,UAAQ,SAAS,IAAIC,MAAAA,SAAsB,cAAc,CAAA,CAAE;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAA6B,mBAAmB,YAAY;AACtF,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,oBAAoB,sBAAsB;AAC/E,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAkC,IAAI;AAChE,QAAM,mBAAmBC,MAAAA,OAAO,YAAY;AAC5C,QAAM,sBAAsBA,MAAAA,OAAsB,IAAI;AAEtDC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,cAAU,UAAU;AACpB,aAAS,CAAC,MAAM,KAAK,mBAAmBC,OAAAA,mBAAmB,UAAU,CAAC;AAAA,EACxE,GAAG,CAAC,YAAY,eAAe,CAAC;AAGhCD,QAAAA,UAAU,MAAM;AACd,QAAI,cAAc,CAAC,UAAW;AAC9B,QAAI,YAAY;AAChB,UAAM,SAAS,EACZ,KAAK,CAAC,MAAO,EAAE,KAAK,EAAE,KAAA,IAAS,QAAQ,OAAO,IAAI,MAAM,UAAU,EAAE,MAAM,EAAE,CAAC,CAAE,EAC/E,KAAK,CAAC,SAAsB;AAC3B,UAAI,UAAW;AACf,gBAAU,IAAI;AACd,eAAS,CAAC,MAAM,KAAK,mBAAmBC,OAAAA,mBAAmB,IAAI,CAAC;AAAA,IAClE,CAAC,EACA,MAAM,CAAC,QAAQ,QAAQ,KAAK,yCAAyC,GAAG,CAAC;AAC5E,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,eAAe,CAAC;AAE3CD,QAAAA,UAAU,MAAM;AACd,QAAI,oBAAoB,OAAW;AACnC,aAAS,eAAe;AAAA,EAC1B,GAAG,CAAC,eAAe,CAAC;AAEpBA,QAAAA,UAAU,MAAM;AACd,QAAI,qBAAqB,OAAW;AACpC,cAAU,gBAAgB;AAAA,EAC5B,GAAG,CAAC,gBAAgB,CAAC;AAErBA,QAAAA,UAAU,MAAM;AACd,QAAI,oBAAoB,OAAW;AACnC,QAAI,CAAC,gBAAgB,iBAAiB,iBAAiB,QAAS;AAChE,qBAAiB,UAAU;AAC3B,aAAS,YAAY;AAAA,EACvB,GAAG,CAAC,iBAAiB,YAAY,CAAC;AAElC,QAAM,gBAAgBH,SAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACvD,QAAM,aAAa,CAAC,iBAAiB,cAAc;AACnD,QAAM,2BAA2BK,MAAAA;AAAAA,IAC/B,MACEN,sBACAO,iBAAAA,8BAA8B,EAAE,UAAU,gBAAgB;AAAA,IAC5D,CAACP,oBAAkB,cAAc;AAAA,EAAA;AAKnC,QAAM,UAAUG,MAAAA,OAAgC,EAAE;AAClD,UAAQ,UAAU;AAAA,IAChB,GAAG;AAAA,IACH,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,IACxB,GAAI,SAAS,EAAE,iBAAiB,OAAA,IAAW,CAAA;AAAA,IAC3C,GAAI,gBAAgB,SAAY,EAAE,YAAA,IAAgB,CAAA;AAAA,IAClD,GAAI,WAAW,OAAO,SAAS,UAAa,OAAO,cAAc,UAC7D,EAAE,OAAA,IACF,CAAA;AAAA,IACJ,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,IAC1C,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAGjC,QAAM,oBAAoBG,MAAAA;AAAAA,IACxB,MAAM,aAAa,IAAIE,GAAAA,qBAAqB,EAAE,KAAK,MAAM,MAAM,QAAQ,SAAS;AAAA,IAChF,CAAC,WAAW,GAAG;AAAA,EAAA;AAGjB,QAAM,EAAE,UAAU,aAAa,YAAY,yBAAyB,QAAQ,OAAO,YAAY,KAAA,IAC7FC,gBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,uBAAuBC,GAAAA;AAAAA,IACvB,GAAI,kBAAkB,EAAE,UAAU,oBAAuC,CAAA;AAAA,EAAC,CAC3E;AAEHN,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,WAAW,QAAS;AAC1C,QAAI,oBAAoB,YAAY,cAAc,GAAI;AACtD,UAAM,OAAO,cAAc,KAAK,KAAA;AAChC,QAAI,CAAC,KAAM;AACX,wBAAoB,UAAU,cAAc;AAC5C,SAAK,YAAY,EAAE,MAAM;AACzB;AAAA,EACF,GAAG,CAAC,eAAe,qBAAqB,aAAa,MAAM,CAAC;AAK5D,QAAM,aAAaD,MAAAA,OAAO,OAAO;AACjC,aAAW,UAAU;AACrBC,QAAAA,UAAU,MAAM;;AACd,QAAI,WAAW,QAAS;AACxB,UAAM,OAAO,CAAC,GAAG,QAAQ,EAAE,QAAA,EAAU,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACvE,UAAM,OAAO,6BAAM;AACnB,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,KAAK,mBAAiB,UAAK,kBAAL,mBAAoB,aAAY,KAAK;AACxE,UAAM,WAA6B;AAAA,MACjC,YAAY,KAAK,mBAAiB,UAAK,UAAL,mBAAY,gBAAe;AAAA,MAC7D,YAAW,+CAAe,kBAAiB;AAAA,MAC3C,cAAc,SAAS;AAAA,MACvB,GAAI,QAAQ,OAAO,EAAE,KAAA,IAAS,CAAA;AAAA,MAC9B,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAA,IAAU,CAAA;AAAA,MACzC,GAAI,KAAK,gBAAgB,EAAE,eAAe,KAAK,cAAA,IAAkB,CAAA;AAAA,MACjE,IAAI,+CAAe,SAAQ,EAAE,YAAY,cAAc,MAAA,IAAU,CAAA;AAAA,IAAC;AAEpE,aAAS,QAAQ;AACjB,qBAAW,YAAX,oCAAqB;AAAA,EACvB,GAAG,CAAC,UAAU,QAAQ,aAAa,CAAC;AAEpC,QAAM,gBAAgB,CAAC,OAAe;AACpC,aAAS,EAAE;AACX,mDAAgB;AAAA,EAClB;AAEA,QAAM,iBAAiB,CAAC,SAAiB;AACvC,cAAU,IAAI;AACd,uEAA0B;AAAA,EAC5B;AAEA,QAAM,aAAaO,cAAAA,aAAa,+CAAe,QAAQ;AACvD,QAAM,UAAUV,SAAO,SAAS,KAAK,cAAe,SAAS,MAAM,YAAY,IAC7EW,2BAAAA,KAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,IAAAC,2BAAAA,IAACC,cAAAA,eAAA,UAAcb,UAAgB,OAAO,OAAO,UAAU,eAAe;AAAA,IACrE,6CACEc,cAAAA,gBAAA,EAAe,SAAS,kBAAkB,OAAO,QAAQ,UAAU,gBAAgB;AAAA,IAErF,SAAS,MAAM,YAAY,KAC1BH,2BAAAA,KAAAI,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,MACxBA,2BAAAA;AAAAA,QAACI,aAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,aAAa,KAAK,MAAO,MAAM,aAAa,MAAM,YAAa,GAAG;AAAA,UAClE,YAAY,MAAM;AAAA,UAClB,cAAc,MAAM;AAAA,UACnB,GAAI,MAAM,gBAAgB,OAAO,EAAE,cAAc,MAAM,aAAA,IAAiB,CAAA;AAAA,UACxE,GAAI,MAAM,QAAQ,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,KAAA,EAAK,IAAM,CAAA;AAAA,UAC3D,GAAI,MAAM,aAAa,EAAE,OAAO,MAAM,WAAA,IAAe,CAAA;AAAA,UACrD,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,UAC1B,GAAI,aAAa,EAAE,WAAW,WAAA,IAAe,CAAA;AAAA,UAC7C,IAAI,+CAAe,YAChB,EAAE,oBAAoBC,cAAAA,kBAAkB,cAAc,QAAQ,MAC9D,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IACP,EAAA,CACF;AAAA,EAAA,EAAA,CAEJ,IACE;AAEJ,QAAM,QAAS,SAAS,WAAW,MAAM,eAAc,2CAAa,WAClEN,2BAAAA,KAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,IAAA;AAAA,IACA,eAAe,YAAY,SAAS,oCAClCO,WAAAA,aAAA,EAAY,aAA0B,UAAU,CAAC,SAAS,KAAK,YAAY,EAAE,KAAA,CAAM,EAAA,CAAG;AAAA,EAAA,EAAA,CAE3F,IACE;AAEJ,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,wBAAwB,SAAS,GAClD,UAAA;AAAA,IAAAP,2BAAAA;AAAAA,MAACQ,aAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACb,GAAI,WAAW,EAAE,WAAW,SAAA,IAAa,CAAA;AAAA,QACzC,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,QACzB,YAAY;AAAA,QACZ,cAAc,CAAC,cAAc,KAAK,WAAW,EAAE,WAAW;AAAA,QAC1D,WAAW,CAAC,IAAI,UAAU,WACxB,KAAK,wBAAwB,SAAS,EAAE,IAAI,UAAU,OAAA,IAAW,EAAE,IAAI,UAAU;AAAA,QAElF,GAAI,mBAAmB,EAAE,qBAAqB,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,IAElDR,2BAAAA,IAAC,OAAA,EAAI,WAAU,YACb,UAAAA,2BAAAA;AAAAA,MAACS,YAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAQ,MAAM,KAAK,KAAA;AAAA,QACnB;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QACjB,IAAI,+CAAe,mBAChB,EAAE,oBAAoB,cAAc,gBAAA,IACpC,CAAA;AAAA,QACH,GAAI,mBAAmB,EAAE,iBAAA,IAAqB,CAAA;AAAA,QAC/C;AAAA,QACA,UAAU,CAAC,MAAM,UAAU,KAAK,YAAY,EAAE,MAAM,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA,EAC7D,CACF;AAAA,EAAA,GACF;AAEJ;;"}
@@ -1,4 +1,5 @@
1
1
  import { ChatTransport, UIMessage } from 'ai';
2
+ import { AttachmentLimits, AttachmentUploadAdapter } from './attachment-upload';
2
3
  import { ChatBudgetConfig, ChatModel, ChatUsageSummary, ClaudePermissionMode, Suggestion, ToolResultRenderer } from './types';
3
4
  export type ChatProps = {
4
5
  /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.
@@ -38,8 +39,11 @@ export type ChatProps = {
38
39
  suggestions?: Suggestion[];
39
40
  /** Enables file/image attachments. */
40
41
  enableAttachments?: boolean;
41
- /** "manual" forwards a tool-approval policy hint to the backend. */
42
- toolApproval?: "auto" | "manual";
42
+ /** Upload endpoint used before an attachment is added to a chat message. */
43
+ attachmentsApi?: string;
44
+ /** Custom durable upload adapter; overrides attachmentsApi. */
45
+ attachmentUpload?: AttachmentUploadAdapter;
46
+ attachmentLimits?: AttachmentLimits;
43
47
  /** Thread id to persist this conversation under (forwarded in the body). */
44
48
  threadId?: string;
45
49
  /** Optional host renderer for recognized completed tool outputs. */
@@ -65,6 +69,6 @@ export type ChatProps = {
65
69
  * conversation with model/effort selectors, suggestions, attachments,
66
70
  * per-message copy/regenerate, and human-in-the-loop tool approvals. The
67
71
  * backend owns model selection and tool execution; the selected model,
68
- * effort, approval policy and thread id are forwarded in the request body. */
69
- export declare function Chat({ api, models: modelsProp, modelsApi, defaultModel, model: controlledModel, reasoningEfforts, defaultReasoningEffort, reasoningEffort: controlledEffort, temperature, budget, permissionMode, onModelChange, onReasoningEffortChange, onUsage, suggestions, enableAttachments, toolApproval, threadId, renderToolResult, body, transport, initialMessages, initialPrompt, onInitialPromptSent, placeholder, emptyState, className, }: ChatProps): import("react/jsx-runtime").JSX.Element;
72
+ * effort, permission mode and thread id are forwarded in the request body. */
73
+ export declare function Chat({ api, models: modelsProp, modelsApi, defaultModel, model: controlledModel, reasoningEfforts, defaultReasoningEffort, reasoningEffort: controlledEffort, temperature, budget, permissionMode, onModelChange, onReasoningEffortChange, onUsage, suggestions, enableAttachments, attachmentsApi, attachmentUpload, attachmentLimits, threadId, renderToolResult, body, transport, initialMessages, initialPrompt, onInitialPromptSent, placeholder, emptyState, className, }: ChatProps): import("react/jsx-runtime").JSX.Element;
70
74
  //# sourceMappingURL=Chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Chat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/data/chat/Chat.tsx"],"names":[],"mappings":"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"}