@assistant-ui/react-ink 0.0.2 → 0.0.6

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 (370) hide show
  1. package/README.md +86 -0
  2. package/dist/context/AssistantContext.d.ts +1 -7
  3. package/dist/context/AssistantContext.d.ts.map +1 -1
  4. package/dist/context/AssistantContext.js +1 -15
  5. package/dist/context/AssistantContext.js.map +1 -1
  6. package/dist/index.d.ts +27 -18
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +25 -21
  9. package/dist/index.js.map +1 -1
  10. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -1
  11. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  12. package/dist/primitives/actionBar/ActionBarCopy.js +1 -1
  13. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  14. package/dist/primitives/actionBar/ActionBarEdit.js +1 -1
  15. package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
  16. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -1
  17. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  18. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -1
  19. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  20. package/dist/primitives/actionBar/ActionBarReload.js +1 -1
  21. package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
  22. package/dist/primitives/actionBar.d.ts +6 -0
  23. package/dist/primitives/actionBar.d.ts.map +1 -0
  24. package/dist/primitives/actionBar.js +6 -0
  25. package/dist/primitives/actionBar.js.map +1 -0
  26. package/dist/primitives/attachment.d.ts +5 -0
  27. package/dist/primitives/attachment.d.ts.map +1 -0
  28. package/dist/primitives/attachment.js +5 -0
  29. package/dist/primitives/attachment.js.map +1 -0
  30. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  31. package/dist/primitives/branchPicker/BranchPickerNext.js +3 -15
  32. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  33. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  34. package/dist/primitives/branchPicker/BranchPickerPrevious.js +3 -15
  35. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  36. package/dist/primitives/branchPicker.d.ts +5 -0
  37. package/dist/primitives/branchPicker.d.ts.map +1 -0
  38. package/dist/primitives/branchPicker.js +5 -0
  39. package/dist/primitives/branchPicker.js.map +1 -0
  40. package/dist/primitives/chainOfThought.d.ts +4 -0
  41. package/dist/primitives/chainOfThought.d.ts.map +1 -0
  42. package/dist/primitives/chainOfThought.js +4 -0
  43. package/dist/primitives/chainOfThought.js.map +1 -0
  44. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  45. package/dist/primitives/composer/ComposerAddAttachment.js +3 -5
  46. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  47. package/dist/primitives/composer/ComposerCancel.js +3 -3
  48. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  49. package/dist/primitives/composer/ComposerSend.js +3 -3
  50. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  51. package/dist/primitives/composer.d.ts +8 -0
  52. package/dist/primitives/composer.d.ts.map +1 -0
  53. package/dist/primitives/composer.js +8 -0
  54. package/dist/primitives/composer.js.map +1 -0
  55. package/dist/primitives/error/ErrorMessage.d.ts +10 -0
  56. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -0
  57. package/dist/primitives/error/ErrorMessage.js +11 -0
  58. package/dist/primitives/error/ErrorMessage.js.map +1 -0
  59. package/dist/primitives/error/ErrorRoot.d.ts +10 -0
  60. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -0
  61. package/dist/primitives/error/ErrorRoot.js +11 -0
  62. package/dist/primitives/error/ErrorRoot.js.map +1 -0
  63. package/dist/primitives/error/index.d.ts +3 -0
  64. package/dist/primitives/error/index.d.ts.map +1 -0
  65. package/dist/primitives/error/index.js +3 -0
  66. package/dist/primitives/error/index.js.map +1 -0
  67. package/dist/primitives/message/MessageContent.d.ts.map +1 -1
  68. package/dist/primitives/message/MessageContent.js +9 -3
  69. package/dist/primitives/message/MessageContent.js.map +1 -1
  70. package/dist/primitives/message/MessageError.d.ts +3 -0
  71. package/dist/primitives/message/MessageError.d.ts.map +1 -0
  72. package/dist/primitives/message/MessageError.js +7 -0
  73. package/dist/primitives/message/MessageError.js.map +1 -0
  74. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  75. package/dist/primitives/message/MessageParts.js +5 -1
  76. package/dist/primitives/message/MessageParts.js.map +1 -1
  77. package/dist/primitives/message.d.ts +7 -0
  78. package/dist/primitives/message.d.ts.map +1 -0
  79. package/dist/primitives/message.js +7 -0
  80. package/dist/primitives/message.js.map +1 -0
  81. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -1
  82. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  83. package/dist/primitives/suggestion/SuggestionTrigger.js +8 -29
  84. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  85. package/dist/primitives/suggestion.d.ts +4 -0
  86. package/dist/primitives/suggestion.d.ts.map +1 -0
  87. package/dist/primitives/suggestion.js +4 -0
  88. package/dist/primitives/suggestion.js.map +1 -0
  89. package/dist/primitives/thread/ThreadEmpty.js +1 -1
  90. package/dist/primitives/thread/ThreadEmpty.js.map +1 -1
  91. package/dist/primitives/thread/ThreadMessages.d.ts +28 -5
  92. package/dist/primitives/thread/ThreadMessages.d.ts.map +1 -1
  93. package/dist/primitives/thread/ThreadMessages.js +67 -13
  94. package/dist/primitives/thread/ThreadMessages.js.map +1 -1
  95. package/dist/primitives/thread/ThreadSuggestion.d.ts +1 -1
  96. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  97. package/dist/primitives/thread/ThreadSuggestion.js +7 -29
  98. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  99. package/dist/primitives/thread.d.ts +8 -0
  100. package/dist/primitives/thread.d.ts.map +1 -0
  101. package/dist/primitives/thread.js +8 -0
  102. package/dist/primitives/thread.js.map +1 -0
  103. package/dist/primitives/threadList/ThreadListNew.d.ts +1 -1
  104. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  105. package/dist/primitives/threadList/ThreadListNew.js +3 -7
  106. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  107. package/dist/primitives/threadList.d.ts +4 -0
  108. package/dist/primitives/threadList.d.ts.map +1 -0
  109. package/dist/primitives/threadList.js +4 -0
  110. package/dist/primitives/threadList.js.map +1 -0
  111. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +1 -1
  112. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  113. package/dist/primitives/threadListItem/ThreadListItemArchive.js +3 -7
  114. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  115. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +1 -1
  116. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  117. package/dist/primitives/threadListItem/ThreadListItemDelete.js +3 -7
  118. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  119. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +1 -1
  120. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  121. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +3 -7
  122. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  123. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +1 -1
  124. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  125. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +3 -7
  126. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  127. package/dist/primitives/threadListItem.d.ts +7 -0
  128. package/dist/primitives/threadListItem.d.ts.map +1 -0
  129. package/dist/primitives/threadListItem.js +7 -0
  130. package/dist/primitives/threadListItem.js.map +1 -0
  131. package/dist/primitives/toolCall/ToolFallback.d.ts +33 -0
  132. package/dist/primitives/toolCall/ToolFallback.d.ts.map +1 -0
  133. package/dist/primitives/toolCall/ToolFallback.js +103 -0
  134. package/dist/primitives/toolCall/ToolFallback.js.map +1 -0
  135. package/dist/primitives/toolCall.d.ts +2 -0
  136. package/dist/primitives/toolCall.d.ts.map +1 -0
  137. package/dist/primitives/toolCall.js +2 -0
  138. package/dist/primitives/toolCall.js.map +1 -0
  139. package/dist/runtimes/useLocalRuntime.d.ts +1 -17
  140. package/dist/runtimes/useLocalRuntime.d.ts.map +1 -1
  141. package/dist/runtimes/useLocalRuntime.js +1 -61
  142. package/dist/runtimes/useLocalRuntime.js.map +1 -1
  143. package/package.json +13 -11
  144. package/src/context/AssistantContext.tsx +1 -31
  145. package/src/index.ts +80 -44
  146. package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
  147. package/src/primitives/actionBar/ActionBarEdit.tsx +1 -1
  148. package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
  149. package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
  150. package/src/primitives/actionBar/ActionBarReload.tsx +1 -1
  151. package/src/primitives/actionBar.ts +20 -0
  152. package/src/primitives/attachment.ts +16 -0
  153. package/src/primitives/branchPicker/BranchPickerNext.tsx +3 -15
  154. package/src/primitives/branchPicker/BranchPickerPrevious.tsx +3 -15
  155. package/src/primitives/branchPicker.ts +16 -0
  156. package/src/primitives/chainOfThought.ts +9 -0
  157. package/src/primitives/composer/ComposerAddAttachment.tsx +3 -5
  158. package/src/primitives/composer/ComposerCancel.tsx +3 -3
  159. package/src/primitives/composer/ComposerSend.tsx +3 -3
  160. package/src/primitives/composer.ts +25 -0
  161. package/src/primitives/error/ErrorMessage.tsx +17 -0
  162. package/src/primitives/error/ErrorRoot.tsx +16 -0
  163. package/src/primitives/error/index.ts +8 -0
  164. package/src/primitives/message/MessageContent.test.tsx +83 -0
  165. package/src/primitives/message/MessageContent.tsx +22 -16
  166. package/src/primitives/message/MessageError.tsx +9 -0
  167. package/src/primitives/message/MessageParts.tsx +10 -4
  168. package/src/primitives/message.ts +21 -0
  169. package/src/primitives/suggestion/SuggestionTrigger.tsx +10 -30
  170. package/src/primitives/suggestion.ts +12 -0
  171. package/src/primitives/thread/ThreadEmpty.tsx +1 -1
  172. package/src/primitives/thread/ThreadMessages.tsx +133 -29
  173. package/src/primitives/thread/ThreadSuggestion.tsx +9 -30
  174. package/src/primitives/thread.ts +25 -0
  175. package/src/primitives/threadList/ThreadListNew.tsx +4 -8
  176. package/src/primitives/threadList.ts +12 -0
  177. package/src/primitives/threadListItem/ThreadListItemArchive.tsx +4 -8
  178. package/src/primitives/threadListItem/ThreadListItemDelete.tsx +4 -8
  179. package/src/primitives/threadListItem/ThreadListItemTrigger.tsx +4 -8
  180. package/src/primitives/threadListItem/ThreadListItemUnarchive.tsx +4 -8
  181. package/src/primitives/threadListItem.ts +21 -0
  182. package/src/primitives/toolCall/ToolFallback.test.tsx +40 -0
  183. package/src/primitives/toolCall/ToolFallback.tsx +227 -0
  184. package/src/primitives/toolCall.ts +5 -0
  185. package/src/runtimes/useLocalRuntime.ts +4 -105
  186. package/dist/adapters/LocalStorageThreadListAdapter.d.ts +0 -15
  187. package/dist/adapters/LocalStorageThreadListAdapter.d.ts.map +0 -1
  188. package/dist/adapters/LocalStorageThreadListAdapter.js +0 -154
  189. package/dist/adapters/LocalStorageThreadListAdapter.js.map +0 -1
  190. package/dist/adapters/TitleGenerationAdapter.d.ts +0 -6
  191. package/dist/adapters/TitleGenerationAdapter.d.ts.map +0 -1
  192. package/dist/adapters/TitleGenerationAdapter.js +0 -15
  193. package/dist/adapters/TitleGenerationAdapter.js.map +0 -1
  194. package/dist/adapters/index.d.ts +0 -3
  195. package/dist/adapters/index.d.ts.map +0 -1
  196. package/dist/adapters/index.js +0 -3
  197. package/dist/adapters/index.js.map +0 -1
  198. package/dist/client/index.d.ts +0 -5
  199. package/dist/client/index.d.ts.map +0 -1
  200. package/dist/client/index.js +0 -7
  201. package/dist/client/index.js.map +0 -1
  202. package/dist/context/index.d.ts +0 -2
  203. package/dist/context/index.d.ts.map +0 -1
  204. package/dist/context/index.js +0 -2
  205. package/dist/context/index.js.map +0 -1
  206. package/dist/model-context/index.d.ts +0 -9
  207. package/dist/model-context/index.d.ts.map +0 -1
  208. package/dist/model-context/index.js +0 -7
  209. package/dist/model-context/index.js.map +0 -1
  210. package/dist/primitive-hooks/index.d.ts +0 -15
  211. package/dist/primitive-hooks/index.d.ts.map +0 -1
  212. package/dist/primitive-hooks/index.js +0 -15
  213. package/dist/primitive-hooks/index.js.map +0 -1
  214. package/dist/primitive-hooks/useActionBarCopy.d.ts +0 -10
  215. package/dist/primitive-hooks/useActionBarCopy.d.ts.map +0 -1
  216. package/dist/primitive-hooks/useActionBarCopy.js +0 -26
  217. package/dist/primitive-hooks/useActionBarCopy.js.map +0 -1
  218. package/dist/primitive-hooks/useActionBarEdit.d.ts +0 -5
  219. package/dist/primitive-hooks/useActionBarEdit.d.ts.map +0 -1
  220. package/dist/primitive-hooks/useActionBarEdit.js +0 -11
  221. package/dist/primitive-hooks/useActionBarEdit.js.map +0 -1
  222. package/dist/primitive-hooks/useActionBarFeedback.d.ts +0 -9
  223. package/dist/primitive-hooks/useActionBarFeedback.d.ts.map +0 -1
  224. package/dist/primitive-hooks/useActionBarFeedback.js +0 -19
  225. package/dist/primitive-hooks/useActionBarFeedback.js.map +0 -1
  226. package/dist/primitive-hooks/useActionBarReload.d.ts +0 -5
  227. package/dist/primitive-hooks/useActionBarReload.d.ts.map +0 -1
  228. package/dist/primitive-hooks/useActionBarReload.js +0 -13
  229. package/dist/primitive-hooks/useActionBarReload.js.map +0 -1
  230. package/dist/primitive-hooks/useComposerAddAttachment.d.ts +0 -5
  231. package/dist/primitive-hooks/useComposerAddAttachment.d.ts.map +0 -1
  232. package/dist/primitive-hooks/useComposerAddAttachment.js +0 -10
  233. package/dist/primitive-hooks/useComposerAddAttachment.js.map +0 -1
  234. package/dist/primitive-hooks/useComposerCancel.d.ts +0 -5
  235. package/dist/primitive-hooks/useComposerCancel.d.ts.map +0 -1
  236. package/dist/primitive-hooks/useComposerCancel.js +0 -11
  237. package/dist/primitive-hooks/useComposerCancel.js.map +0 -1
  238. package/dist/primitive-hooks/useComposerSend.d.ts +0 -5
  239. package/dist/primitive-hooks/useComposerSend.d.ts.map +0 -1
  240. package/dist/primitive-hooks/useComposerSend.js +0 -11
  241. package/dist/primitive-hooks/useComposerSend.js.map +0 -1
  242. package/dist/primitive-hooks/useEditComposerCancel.d.ts +0 -4
  243. package/dist/primitive-hooks/useEditComposerCancel.d.ts.map +0 -1
  244. package/dist/primitive-hooks/useEditComposerCancel.js +0 -10
  245. package/dist/primitive-hooks/useEditComposerCancel.js.map +0 -1
  246. package/dist/primitive-hooks/useEditComposerSend.d.ts +0 -5
  247. package/dist/primitive-hooks/useEditComposerSend.d.ts.map +0 -1
  248. package/dist/primitive-hooks/useEditComposerSend.js +0 -11
  249. package/dist/primitive-hooks/useEditComposerSend.js.map +0 -1
  250. package/dist/primitive-hooks/useMessageBranching.d.ts +0 -7
  251. package/dist/primitive-hooks/useMessageBranching.d.ts.map +0 -1
  252. package/dist/primitive-hooks/useMessageBranching.js +0 -15
  253. package/dist/primitive-hooks/useMessageBranching.js.map +0 -1
  254. package/dist/primitive-hooks/useMessageReload.d.ts +0 -5
  255. package/dist/primitive-hooks/useMessageReload.d.ts.map +0 -1
  256. package/dist/primitive-hooks/useMessageReload.js +0 -11
  257. package/dist/primitive-hooks/useMessageReload.js.map +0 -1
  258. package/dist/primitive-hooks/useThreadIsEmpty.d.ts +0 -2
  259. package/dist/primitive-hooks/useThreadIsEmpty.d.ts.map +0 -1
  260. package/dist/primitive-hooks/useThreadIsEmpty.js +0 -5
  261. package/dist/primitive-hooks/useThreadIsEmpty.js.map +0 -1
  262. package/dist/primitive-hooks/useThreadIsRunning.d.ts +0 -2
  263. package/dist/primitive-hooks/useThreadIsRunning.d.ts.map +0 -1
  264. package/dist/primitive-hooks/useThreadIsRunning.js +0 -5
  265. package/dist/primitive-hooks/useThreadIsRunning.js.map +0 -1
  266. package/dist/primitive-hooks/useThreadMessages.d.ts +0 -3
  267. package/dist/primitive-hooks/useThreadMessages.d.ts.map +0 -1
  268. package/dist/primitive-hooks/useThreadMessages.js +0 -5
  269. package/dist/primitive-hooks/useThreadMessages.js.map +0 -1
  270. package/dist/primitives/actionBar/index.d.ts +0 -6
  271. package/dist/primitives/actionBar/index.d.ts.map +0 -1
  272. package/dist/primitives/actionBar/index.js +0 -6
  273. package/dist/primitives/actionBar/index.js.map +0 -1
  274. package/dist/primitives/attachment/index.d.ts +0 -5
  275. package/dist/primitives/attachment/index.d.ts.map +0 -1
  276. package/dist/primitives/attachment/index.js +0 -5
  277. package/dist/primitives/attachment/index.js.map +0 -1
  278. package/dist/primitives/branchPicker/index.d.ts +0 -5
  279. package/dist/primitives/branchPicker/index.d.ts.map +0 -1
  280. package/dist/primitives/branchPicker/index.js +0 -5
  281. package/dist/primitives/branchPicker/index.js.map +0 -1
  282. package/dist/primitives/chainOfThought/index.d.ts +0 -4
  283. package/dist/primitives/chainOfThought/index.d.ts.map +0 -1
  284. package/dist/primitives/chainOfThought/index.js +0 -4
  285. package/dist/primitives/chainOfThought/index.js.map +0 -1
  286. package/dist/primitives/composer/EditComposerCancel.d.ts +0 -7
  287. package/dist/primitives/composer/EditComposerCancel.d.ts.map +0 -1
  288. package/dist/primitives/composer/EditComposerCancel.js +0 -8
  289. package/dist/primitives/composer/EditComposerCancel.js.map +0 -1
  290. package/dist/primitives/composer/EditComposerInput.d.ts +0 -10
  291. package/dist/primitives/composer/EditComposerInput.d.ts.map +0 -1
  292. package/dist/primitives/composer/EditComposerInput.js +0 -19
  293. package/dist/primitives/composer/EditComposerInput.js.map +0 -1
  294. package/dist/primitives/composer/EditComposerSend.d.ts +0 -7
  295. package/dist/primitives/composer/EditComposerSend.d.ts.map +0 -1
  296. package/dist/primitives/composer/EditComposerSend.js +0 -8
  297. package/dist/primitives/composer/EditComposerSend.js.map +0 -1
  298. package/dist/primitives/composer/index.d.ts +0 -11
  299. package/dist/primitives/composer/index.d.ts.map +0 -1
  300. package/dist/primitives/composer/index.js +0 -11
  301. package/dist/primitives/composer/index.js.map +0 -1
  302. package/dist/primitives/message/index.d.ts +0 -6
  303. package/dist/primitives/message/index.d.ts.map +0 -1
  304. package/dist/primitives/message/index.js +0 -6
  305. package/dist/primitives/message/index.js.map +0 -1
  306. package/dist/primitives/suggestion/index.d.ts +0 -4
  307. package/dist/primitives/suggestion/index.d.ts.map +0 -1
  308. package/dist/primitives/suggestion/index.js +0 -4
  309. package/dist/primitives/suggestion/index.js.map +0 -1
  310. package/dist/primitives/thread/index.d.ts +0 -8
  311. package/dist/primitives/thread/index.d.ts.map +0 -1
  312. package/dist/primitives/thread/index.js +0 -8
  313. package/dist/primitives/thread/index.js.map +0 -1
  314. package/dist/primitives/threadList/index.d.ts +0 -4
  315. package/dist/primitives/threadList/index.d.ts.map +0 -1
  316. package/dist/primitives/threadList/index.js +0 -4
  317. package/dist/primitives/threadList/index.js.map +0 -1
  318. package/dist/primitives/threadListItem/index.d.ts +0 -7
  319. package/dist/primitives/threadListItem/index.d.ts.map +0 -1
  320. package/dist/primitives/threadListItem/index.js +0 -7
  321. package/dist/primitives/threadListItem/index.js.map +0 -1
  322. package/dist/runtimes/index.d.ts +0 -3
  323. package/dist/runtimes/index.d.ts.map +0 -1
  324. package/dist/runtimes/index.js +0 -3
  325. package/dist/runtimes/index.js.map +0 -1
  326. package/dist/types/index.d.ts +0 -2
  327. package/dist/types/index.d.ts.map +0 -1
  328. package/dist/types/index.js +0 -2
  329. package/dist/types/index.js.map +0 -1
  330. package/dist/types/scopes/index.d.ts +0 -3
  331. package/dist/types/scopes/index.d.ts.map +0 -1
  332. package/dist/types/scopes/index.js +0 -2
  333. package/dist/types/scopes/index.js.map +0 -1
  334. package/src/adapters/LocalStorageThreadListAdapter.tsx +0 -227
  335. package/src/adapters/TitleGenerationAdapter.ts +0 -20
  336. package/src/adapters/index.ts +0 -5
  337. package/src/client/index.ts +0 -7
  338. package/src/context/index.ts +0 -1
  339. package/src/model-context/index.ts +0 -44
  340. package/src/primitive-hooks/index.ts +0 -20
  341. package/src/primitive-hooks/useActionBarCopy.ts +0 -38
  342. package/src/primitive-hooks/useActionBarEdit.ts +0 -13
  343. package/src/primitive-hooks/useActionBarFeedback.ts +0 -28
  344. package/src/primitive-hooks/useActionBarReload.ts +0 -18
  345. package/src/primitive-hooks/useComposerAddAttachment.ts +0 -16
  346. package/src/primitive-hooks/useComposerCancel.ts +0 -13
  347. package/src/primitive-hooks/useComposerSend.ts +0 -13
  348. package/src/primitive-hooks/useEditComposerCancel.ts +0 -12
  349. package/src/primitive-hooks/useEditComposerSend.ts +0 -13
  350. package/src/primitive-hooks/useMessageBranching.ts +0 -18
  351. package/src/primitive-hooks/useMessageReload.ts +0 -13
  352. package/src/primitive-hooks/useThreadIsEmpty.ts +0 -5
  353. package/src/primitive-hooks/useThreadIsRunning.ts +0 -5
  354. package/src/primitive-hooks/useThreadMessages.ts +0 -6
  355. package/src/primitives/actionBar/index.ts +0 -11
  356. package/src/primitives/attachment/index.ts +0 -7
  357. package/src/primitives/branchPicker/index.ts +0 -16
  358. package/src/primitives/chainOfThought/index.ts +0 -9
  359. package/src/primitives/composer/EditComposerCancel.tsx +0 -20
  360. package/src/primitives/composer/EditComposerInput.tsx +0 -40
  361. package/src/primitives/composer/EditComposerSend.tsx +0 -25
  362. package/src/primitives/composer/index.ts +0 -25
  363. package/src/primitives/message/index.ts +0 -11
  364. package/src/primitives/suggestion/index.ts +0 -12
  365. package/src/primitives/thread/index.ts +0 -16
  366. package/src/primitives/threadList/index.ts +0 -3
  367. package/src/primitives/threadListItem/index.ts +0 -21
  368. package/src/runtimes/index.ts +0 -2
  369. package/src/types/index.ts +0 -23
  370. package/src/types/scopes/index.ts +0 -59
@@ -0,0 +1,9 @@
1
+ import type { FC, PropsWithChildren } from "react";
2
+ import { useMessageError } from "@assistant-ui/core/react";
3
+
4
+ export const MessageError: FC<PropsWithChildren> = ({ children }) => {
5
+ const error = useMessageError();
6
+ return error !== undefined ? children : null;
7
+ };
8
+
9
+ MessageError.displayName = "MessagePrimitive.Error";
@@ -19,10 +19,16 @@ export namespace MessagePrimitiveParts {
19
19
  /**
20
20
  * Renders the parts of a message with Ink-specific default components.
21
21
  */
22
- export const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = ({
23
- components,
24
- ...rest
25
- }) => {
22
+ export const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = (
23
+ props,
24
+ ) => {
25
+ if ("children" in props) {
26
+ return (
27
+ <MessagePrimitivePartsBase>{props.children}</MessagePrimitivePartsBase>
28
+ );
29
+ }
30
+
31
+ const { components, ...rest } = props;
26
32
  const merged = components
27
33
  ? {
28
34
  Text: components.Text ?? inkDefaultComponents.Text,
@@ -0,0 +1,21 @@
1
+ export {
2
+ MessageRoot as Root,
3
+ type MessageRootProps as RootProps,
4
+ } from "./message/MessageRoot";
5
+ export {
6
+ MessageContent as Content,
7
+ type MessageContentProps as ContentProps,
8
+ } from "./message/MessageContent";
9
+ export {
10
+ MessagePrimitiveParts as Parts,
11
+ MessagePrimitivePartByIndex as PartByIndex,
12
+ } from "./message/MessageParts";
13
+ export {
14
+ MessageIf as If,
15
+ type MessageIfProps as IfProps,
16
+ } from "./message/MessageIf";
17
+ export {
18
+ MessageAttachments as Attachments,
19
+ MessageAttachmentByIndex as AttachmentByIndex,
20
+ } from "./message/MessageAttachments";
21
+ export { MessageError as Error } from "./message/MessageError";
@@ -1,5 +1,6 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAuiState, useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useAuiState } from "@assistant-ui/store";
3
+ import { useSuggestionTrigger } from "@assistant-ui/core/react";
3
4
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
5
 
5
6
  export type SuggestionTriggerProps = Omit<PressableProps, "onPress"> & {
@@ -15,38 +16,17 @@ export const SuggestionTrigger = ({
15
16
  disabled: disabledProp,
16
17
  ...pressableProps
17
18
  }: SuggestionTriggerProps) => {
18
- const aui = useAui();
19
- const isDisabled = useAuiState((s) => s.thread.isDisabled);
20
19
  const prompt = useAuiState((s) => s.suggestion.prompt);
21
- const resolvedSend = send ?? false;
22
-
23
- const onPress = useCallback(() => {
24
- const isRunning = aui.thread().getState().isRunning;
25
-
26
- if (resolvedSend && !isRunning) {
27
- aui.thread().append({
28
- content: [{ type: "text", text: prompt }],
29
- runConfig: aui.composer().getState().runConfig,
30
- });
31
- if (clearComposer) {
32
- aui.composer().setText("");
33
- }
34
- } else {
35
- if (clearComposer) {
36
- aui.composer().setText(prompt);
37
- } else {
38
- const currentText = aui.composer().getState().text;
39
- aui
40
- .composer()
41
- .setText(currentText.trim() ? `${currentText} ${prompt}` : prompt);
42
- }
43
- }
44
- }, [aui, resolvedSend, clearComposer, prompt]);
20
+ const { trigger, disabled } = useSuggestionTrigger({
21
+ prompt,
22
+ send,
23
+ clearComposer,
24
+ });
45
25
 
46
26
  return (
47
27
  <Pressable
48
- onPress={onPress}
49
- disabled={disabledProp ?? isDisabled}
28
+ onPress={trigger}
29
+ disabled={disabledProp ?? disabled}
50
30
  {...pressableProps}
51
31
  >
52
32
  {children}
@@ -0,0 +1,12 @@
1
+ export {
2
+ SuggestionTitle as Title,
3
+ type SuggestionTitleProps as TitleProps,
4
+ } from "./suggestion/SuggestionTitle";
5
+ export {
6
+ SuggestionDescription as Description,
7
+ type SuggestionDescriptionProps as DescriptionProps,
8
+ } from "./suggestion/SuggestionDescription";
9
+ export {
10
+ SuggestionTrigger as Trigger,
11
+ type SuggestionTriggerProps as TriggerProps,
12
+ } from "./suggestion/SuggestionTrigger";
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from "react";
2
- import { useThreadIsEmpty } from "../../primitive-hooks/useThreadIsEmpty";
2
+ import { useThreadIsEmpty } from "@assistant-ui/core/react";
3
3
 
4
4
  export type ThreadEmptyProps = {
5
5
  children: ReactNode;
@@ -1,43 +1,147 @@
1
- import { type ReactElement } from "react";
1
+ import { type ComponentType, type FC, type ReactNode, useMemo } from "react";
2
2
  import { Box } from "ink";
3
3
  import type { ThreadMessage } from "@assistant-ui/core";
4
- import { useAui, useAuiState, AuiProvider, Derived } from "@assistant-ui/store";
4
+ import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
5
+ import { MessageByIndexProvider } from "@assistant-ui/core/react";
5
6
 
6
- export type ThreadMessagesProps = {
7
- renderMessage: (props: {
8
- message: ThreadMessage;
9
- index: number;
10
- }) => ReactElement;
7
+ type MessageComponents =
8
+ | {
9
+ Message: ComponentType;
10
+ EditComposer?: ComponentType | undefined;
11
+ UserEditComposer?: ComponentType | undefined;
12
+ AssistantEditComposer?: ComponentType | undefined;
13
+ SystemEditComposer?: ComponentType | undefined;
14
+ UserMessage?: ComponentType | undefined;
15
+ AssistantMessage?: ComponentType | undefined;
16
+ SystemMessage?: ComponentType | undefined;
17
+ }
18
+ | {
19
+ Message?: ComponentType | undefined;
20
+ EditComposer?: ComponentType | undefined;
21
+ UserEditComposer?: ComponentType | undefined;
22
+ AssistantEditComposer?: ComponentType | undefined;
23
+ SystemEditComposer?: ComponentType | undefined;
24
+ UserMessage: ComponentType;
25
+ AssistantMessage: ComponentType;
26
+ SystemMessage?: ComponentType | undefined;
27
+ };
28
+
29
+ export type ThreadMessagesProps =
30
+ | {
31
+ components: MessageComponents;
32
+ children?: never;
33
+ }
34
+ | {
35
+ children: (value: { message: ThreadMessage }) => ReactNode;
36
+ components?: never;
37
+ };
38
+
39
+ const DEFAULT_SYSTEM_MESSAGE = () => null;
40
+
41
+ const getComponent = (
42
+ components: MessageComponents,
43
+ role: ThreadMessage["role"],
44
+ isEditing: boolean,
45
+ ) => {
46
+ switch (role) {
47
+ case "user":
48
+ if (isEditing) {
49
+ return (
50
+ components.UserEditComposer ??
51
+ components.EditComposer ??
52
+ components.UserMessage ??
53
+ (components.Message as ComponentType)
54
+ );
55
+ } else {
56
+ return components.UserMessage ?? (components.Message as ComponentType);
57
+ }
58
+ case "assistant":
59
+ if (isEditing) {
60
+ return (
61
+ components.AssistantEditComposer ??
62
+ components.EditComposer ??
63
+ components.AssistantMessage ??
64
+ (components.Message as ComponentType)
65
+ );
66
+ } else {
67
+ return (
68
+ components.AssistantMessage ?? (components.Message as ComponentType)
69
+ );
70
+ }
71
+ case "system":
72
+ if (isEditing) {
73
+ return (
74
+ components.SystemEditComposer ??
75
+ components.EditComposer ??
76
+ components.SystemMessage ??
77
+ (components.Message as ComponentType) ??
78
+ DEFAULT_SYSTEM_MESSAGE
79
+ );
80
+ } else {
81
+ return (
82
+ components.SystemMessage ??
83
+ (components.Message as ComponentType) ??
84
+ DEFAULT_SYSTEM_MESSAGE
85
+ );
86
+ }
87
+ default: {
88
+ const _exhaustiveCheck: never = role;
89
+ throw new Error(`Unknown message role: ${_exhaustiveCheck}`);
90
+ }
91
+ }
11
92
  };
12
93
 
13
- const MessageScope = ({
14
- index,
15
- children,
16
- }: {
17
- index: number;
18
- children: ReactElement;
94
+ const ThreadMessageComponent: FC<{ components: MessageComponents }> = ({
95
+ components,
19
96
  }) => {
20
- const aui = useAui({
21
- message: Derived({
22
- source: "thread",
23
- query: { type: "index", index },
24
- get: (aui) => aui.threads().thread("main").message({ index }),
25
- }),
26
- });
27
-
28
- return <AuiProvider value={aui}>{children}</AuiProvider>;
97
+ const role = useAuiState((s) => s.message.role);
98
+ const isEditing = useAuiState((s) => s.message.composer.isEditing);
99
+ const Component = getComponent(components, role, isEditing);
100
+
101
+ return <Component />;
29
102
  };
30
103
 
31
- export const ThreadMessages = ({ renderMessage }: ThreadMessagesProps) => {
32
- const messages = useAuiState((s) => s.thread.messages);
104
+ const ThreadMessagesInner: FC<{
105
+ children: (value: { message: ThreadMessage }) => ReactNode;
106
+ }> = ({ children }) => {
107
+ const messagesLength = useAuiState((s) => s.thread.messages.length);
33
108
 
109
+ return useMemo(() => {
110
+ if (messagesLength === 0) return null;
111
+ return Array.from({ length: messagesLength }, (_, index) => (
112
+ <MessageByIndexProvider key={index} index={index}>
113
+ <RenderChildrenWithAccessor
114
+ getItemState={(aui) => aui.thread().message({ index }).getState()}
115
+ >
116
+ {(getItem) =>
117
+ children({
118
+ get message() {
119
+ return getItem();
120
+ },
121
+ })
122
+ }
123
+ </RenderChildrenWithAccessor>
124
+ </MessageByIndexProvider>
125
+ ));
126
+ }, [messagesLength, children]);
127
+ };
128
+
129
+ export const ThreadMessages: FC<ThreadMessagesProps> = ({
130
+ components,
131
+ children,
132
+ }) => {
133
+ if (components) {
134
+ return (
135
+ <Box flexDirection="column">
136
+ <ThreadMessagesInner>
137
+ {() => <ThreadMessageComponent components={components} />}
138
+ </ThreadMessagesInner>
139
+ </Box>
140
+ );
141
+ }
34
142
  return (
35
143
  <Box flexDirection="column">
36
- {(messages as unknown as ThreadMessage[]).map((message, index) => (
37
- <MessageScope key={message.id} index={index}>
38
- {renderMessage({ message, index })}
39
- </MessageScope>
40
- ))}
144
+ <ThreadMessagesInner>{children}</ThreadMessagesInner>
41
145
  </Box>
42
146
  );
43
147
  };
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAuiState, useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useSuggestionTrigger } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadSuggestionProps = Omit<PressableProps, "onPress"> & {
@@ -17,37 +17,16 @@ export const ThreadSuggestion = ({
17
17
  disabled: disabledProp,
18
18
  ...pressableProps
19
19
  }: ThreadSuggestionProps) => {
20
- const aui = useAui();
21
- const isDisabled = useAuiState((s) => s.thread.isDisabled);
22
- const resolvedSend = send ?? false;
23
-
24
- const onPress = useCallback(() => {
25
- const isRunning = aui.thread().getState().isRunning;
26
-
27
- if (resolvedSend && !isRunning) {
28
- aui.thread().append({
29
- content: [{ type: "text", text: prompt }],
30
- runConfig: aui.composer().getState().runConfig,
31
- });
32
- if (clearComposer) {
33
- aui.composer().setText("");
34
- }
35
- } else {
36
- if (clearComposer) {
37
- aui.composer().setText(prompt);
38
- } else {
39
- const currentText = aui.composer().getState().text;
40
- aui
41
- .composer()
42
- .setText(currentText.trim() ? `${currentText} ${prompt}` : prompt);
43
- }
44
- }
45
- }, [aui, resolvedSend, clearComposer, prompt]);
20
+ const { trigger, disabled } = useSuggestionTrigger({
21
+ prompt,
22
+ send,
23
+ clearComposer,
24
+ });
46
25
 
47
26
  return (
48
27
  <Pressable
49
- onPress={onPress}
50
- disabled={disabledProp ?? isDisabled}
28
+ onPress={trigger}
29
+ disabled={disabledProp ?? disabled}
51
30
  {...pressableProps}
52
31
  >
53
32
  {children}
@@ -0,0 +1,25 @@
1
+ export {
2
+ ThreadRoot as Root,
3
+ type ThreadRootProps as RootProps,
4
+ } from "./thread/ThreadRoot";
5
+ export {
6
+ ThreadMessages as Messages,
7
+ type ThreadMessagesProps as MessagesProps,
8
+ } from "./thread/ThreadMessages";
9
+ export { ThreadPrimitiveMessageByIndex as MessageByIndex } from "@assistant-ui/core/react";
10
+ export {
11
+ ThreadEmpty as Empty,
12
+ type ThreadEmptyProps as EmptyProps,
13
+ } from "./thread/ThreadEmpty";
14
+ export {
15
+ ThreadIf as If,
16
+ type ThreadIfProps as IfProps,
17
+ } from "./thread/ThreadIf";
18
+ export {
19
+ ThreadSuggestion as Suggestion,
20
+ type ThreadSuggestionProps as SuggestionProps,
21
+ } from "./thread/ThreadSuggestion";
22
+ export {
23
+ ThreadPrimitiveSuggestions as Suggestions,
24
+ ThreadPrimitiveSuggestionByIndex as SuggestionByIndex,
25
+ } from "@assistant-ui/core/react";
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useThreadListNew } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadListNewProps = Omit<PressableProps, "onPress"> & {
@@ -10,14 +10,10 @@ export const ThreadListNew = ({
10
10
  children,
11
11
  ...pressableProps
12
12
  }: ThreadListNewProps) => {
13
- const aui = useAui();
14
-
15
- const onPress = useCallback(() => {
16
- aui.threads().switchToNewThread();
17
- }, [aui]);
13
+ const { switchToNewThread } = useThreadListNew();
18
14
 
19
15
  return (
20
- <Pressable onPress={onPress} {...pressableProps}>
16
+ <Pressable onPress={switchToNewThread} {...pressableProps}>
21
17
  {children}
22
18
  </Pressable>
23
19
  );
@@ -0,0 +1,12 @@
1
+ export {
2
+ ThreadListRoot as Root,
3
+ type ThreadListRootProps as RootProps,
4
+ } from "./threadList/ThreadListRoot";
5
+ export {
6
+ ThreadListItems as Items,
7
+ type ThreadListItemsProps as ItemsProps,
8
+ } from "./threadList/ThreadListItems";
9
+ export {
10
+ ThreadListNew as New,
11
+ type ThreadListNewProps as NewProps,
12
+ } from "./threadList/ThreadListNew";
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useThreadListItemArchive } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadListItemArchiveProps = Omit<PressableProps, "onPress"> & {
@@ -10,14 +10,10 @@ export const ThreadListItemArchive = ({
10
10
  children,
11
11
  ...pressableProps
12
12
  }: ThreadListItemArchiveProps) => {
13
- const aui = useAui();
14
-
15
- const onPress = useCallback(() => {
16
- aui.threadListItem().archive();
17
- }, [aui]);
13
+ const { archive } = useThreadListItemArchive();
18
14
 
19
15
  return (
20
- <Pressable onPress={onPress} {...pressableProps}>
16
+ <Pressable onPress={archive} {...pressableProps}>
21
17
  {children}
22
18
  </Pressable>
23
19
  );
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useThreadListItemDelete } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadListItemDeleteProps = Omit<PressableProps, "onPress"> & {
@@ -10,14 +10,10 @@ export const ThreadListItemDelete = ({
10
10
  children,
11
11
  ...pressableProps
12
12
  }: ThreadListItemDeleteProps) => {
13
- const aui = useAui();
14
-
15
- const onPress = useCallback(() => {
16
- aui.threadListItem().delete();
17
- }, [aui]);
13
+ const { delete: deleteThread } = useThreadListItemDelete();
18
14
 
19
15
  return (
20
- <Pressable onPress={onPress} {...pressableProps}>
16
+ <Pressable onPress={deleteThread} {...pressableProps}>
21
17
  {children}
22
18
  </Pressable>
23
19
  );
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useThreadListItemTrigger } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadListItemTriggerProps = Omit<PressableProps, "onPress"> & {
@@ -10,14 +10,10 @@ export const ThreadListItemTrigger = ({
10
10
  children,
11
11
  ...pressableProps
12
12
  }: ThreadListItemTriggerProps) => {
13
- const aui = useAui();
14
-
15
- const onPress = useCallback(() => {
16
- aui.threadListItem().switchTo();
17
- }, [aui]);
13
+ const { switchTo } = useThreadListItemTrigger();
18
14
 
19
15
  return (
20
- <Pressable onPress={onPress} {...pressableProps}>
16
+ <Pressable onPress={switchTo} {...pressableProps}>
21
17
  {children}
22
18
  </Pressable>
23
19
  );
@@ -1,5 +1,5 @@
1
- import { useCallback, type ReactNode } from "react";
2
- import { useAui } from "@assistant-ui/store";
1
+ import type { ReactNode } from "react";
2
+ import { useThreadListItemUnarchive } from "@assistant-ui/core/react";
3
3
  import { Pressable, type PressableProps } from "../internal/Pressable";
4
4
 
5
5
  export type ThreadListItemUnarchiveProps = Omit<PressableProps, "onPress"> & {
@@ -10,14 +10,10 @@ export const ThreadListItemUnarchive = ({
10
10
  children,
11
11
  ...pressableProps
12
12
  }: ThreadListItemUnarchiveProps) => {
13
- const aui = useAui();
14
-
15
- const onPress = useCallback(() => {
16
- aui.threadListItem().unarchive();
17
- }, [aui]);
13
+ const { unarchive } = useThreadListItemUnarchive();
18
14
 
19
15
  return (
20
- <Pressable onPress={onPress} {...pressableProps}>
16
+ <Pressable onPress={unarchive} {...pressableProps}>
21
17
  {children}
22
18
  </Pressable>
23
19
  );
@@ -0,0 +1,21 @@
1
+ export {
2
+ ThreadListItemRoot as Root,
3
+ type ThreadListItemRootProps as RootProps,
4
+ } from "./threadListItem/ThreadListItemRoot";
5
+ export { ThreadListItemPrimitiveTitle as Title } from "@assistant-ui/core/react";
6
+ export {
7
+ ThreadListItemTrigger as Trigger,
8
+ type ThreadListItemTriggerProps as TriggerProps,
9
+ } from "./threadListItem/ThreadListItemTrigger";
10
+ export {
11
+ ThreadListItemDelete as Delete,
12
+ type ThreadListItemDeleteProps as DeleteProps,
13
+ } from "./threadListItem/ThreadListItemDelete";
14
+ export {
15
+ ThreadListItemArchive as Archive,
16
+ type ThreadListItemArchiveProps as ArchiveProps,
17
+ } from "./threadListItem/ThreadListItemArchive";
18
+ export {
19
+ ThreadListItemUnarchive as Unarchive,
20
+ type ThreadListItemUnarchiveProps as UnarchiveProps,
21
+ } from "./threadListItem/ThreadListItemUnarchive";
@@ -0,0 +1,40 @@
1
+ import type { ReactElement } from "react";
2
+ import { afterEach, describe, expect, it } from "vitest";
3
+ import { cleanup, render } from "ink-testing-library";
4
+ import { ToolFallback } from "./ToolFallback";
5
+
6
+ const renderFrame = async (node: ReactElement) => {
7
+ const instance = render(node);
8
+ await new Promise((resolve) => setTimeout(resolve, 0));
9
+ return instance.lastFrame() ?? "";
10
+ };
11
+
12
+ afterEach(() => {
13
+ cleanup();
14
+ });
15
+
16
+ describe("ToolFallback", () => {
17
+ it("truncates expanded error output with maxResultLines", async () => {
18
+ const frame = await renderFrame(
19
+ <ToolFallback
20
+ expanded
21
+ maxResultLines={2}
22
+ type="tool-call"
23
+ toolCallId="tool-call-1"
24
+ toolName="search"
25
+ args={{}}
26
+ argsText="{}"
27
+ result={"line 1\nline 2\nline 3\nline 4"}
28
+ isError
29
+ status={{ type: "incomplete", reason: "error", error: "boom" }}
30
+ />,
31
+ );
32
+
33
+ expect(frame).toContain("Error:");
34
+ expect(frame).toContain("line 1");
35
+ expect(frame).toContain("line 2");
36
+ expect(frame).toContain("... (2 more lines)");
37
+ expect(frame).not.toContain("line 3");
38
+ expect(frame).not.toContain("line 4");
39
+ });
40
+ });