@slices.sh/ai-chat 0.1.0

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 (393) hide show
  1. package/LICENSE +21 -0
  2. package/dist/exports.json +794 -0
  3. package/dist/fixture/fixture-approval.d.ts +4 -0
  4. package/dist/fixture/fixture-approval.js +59 -0
  5. package/dist/fixture/fixture-artifacts.d.ts +2 -0
  6. package/dist/fixture/fixture-artifacts.js +48 -0
  7. package/dist/fixture/fixture-question.d.ts +5 -0
  8. package/dist/fixture/fixture-question.js +93 -0
  9. package/dist/fixture/fixture-script.d.ts +35 -0
  10. package/dist/fixture/fixture-script.js +280 -0
  11. package/dist/fixture/fixture-selection.d.ts +5 -0
  12. package/dist/fixture/fixture-selection.js +20 -0
  13. package/dist/fixture/fixture.d.ts +20 -0
  14. package/dist/fixture/fixture.js +75 -0
  15. package/dist/fixture/provider.d.ts +15 -0
  16. package/dist/fixture/provider.js +14 -0
  17. package/dist/headless/always-allow.d.ts +2 -0
  18. package/dist/headless/always-allow.js +24 -0
  19. package/dist/headless/answer.d.ts +6 -0
  20. package/dist/headless/answer.js +29 -0
  21. package/dist/headless/approval-error.d.ts +2 -0
  22. package/dist/headless/approval-error.js +16 -0
  23. package/dist/headless/approval-reason.d.ts +2 -0
  24. package/dist/headless/approval-reason.js +13 -0
  25. package/dist/headless/approval-receipt.d.ts +4 -0
  26. package/dist/headless/approval-receipt.js +13 -0
  27. package/dist/headless/approve.d.ts +4 -0
  28. package/dist/headless/approve.js +15 -0
  29. package/dist/headless/branch-navigation.d.ts +2 -0
  30. package/dist/headless/branch-navigation.js +11 -0
  31. package/dist/headless/branch-next.d.ts +2 -0
  32. package/dist/headless/branch-next.js +21 -0
  33. package/dist/headless/branch-page.d.ts +5 -0
  34. package/dist/headless/branch-page.js +13 -0
  35. package/dist/headless/branch-previous.d.ts +2 -0
  36. package/dist/headless/branch-previous.js +21 -0
  37. package/dist/headless/cancel-edit.d.ts +2 -0
  38. package/dist/headless/cancel-edit.js +10 -0
  39. package/dist/headless/cancel-queue-edit.d.ts +2 -0
  40. package/dist/headless/cancel-queue-edit.js +15 -0
  41. package/dist/headless/cancel-queued.d.ts +2 -0
  42. package/dist/headless/cancel-queued.js +15 -0
  43. package/dist/headless/chat-dictation/confirm.d.ts +2 -0
  44. package/dist/headless/chat-dictation/confirm.js +14 -0
  45. package/dist/headless/chat-dictation/index.d.ts +12 -0
  46. package/dist/headless/chat-dictation/index.js +9 -0
  47. package/dist/headless/chat-dictation/input.d.ts +3 -0
  48. package/dist/headless/chat-dictation/input.js +42 -0
  49. package/dist/headless/chat-dictation/root.d.ts +3 -0
  50. package/dist/headless/chat-dictation/root.js +42 -0
  51. package/dist/headless/chat-dictation/text.d.ts +3 -0
  52. package/dist/headless/chat-dictation/text.js +14 -0
  53. package/dist/headless/chat-dictation/voice.d.ts +3 -0
  54. package/dist/headless/chat-dictation/voice.js +35 -0
  55. package/dist/headless/citation-content.d.ts +3 -0
  56. package/dist/headless/citation-content.js +19 -0
  57. package/dist/headless/citation-description.d.ts +2 -0
  58. package/dist/headless/citation-description.js +12 -0
  59. package/dist/headless/citation-root.d.ts +2 -0
  60. package/dist/headless/citation-root.js +13 -0
  61. package/dist/headless/citation-title.d.ts +2 -0
  62. package/dist/headless/citation-title.js +12 -0
  63. package/dist/headless/citation-trigger.d.ts +2 -0
  64. package/dist/headless/citation-trigger.js +12 -0
  65. package/dist/headless/clear-answer.d.ts +5 -0
  66. package/dist/headless/clear-answer.js +19 -0
  67. package/dist/headless/composer-root.d.ts +14 -0
  68. package/dist/headless/composer-root.js +12 -0
  69. package/dist/headless/composer-standalone.d.ts +3 -0
  70. package/dist/headless/composer-standalone.js +10 -0
  71. package/dist/headless/composer.d.ts +3 -0
  72. package/dist/headless/composer.js +24 -0
  73. package/dist/headless/context-usage.d.ts +3 -0
  74. package/dist/headless/context-usage.js +13 -0
  75. package/dist/headless/contexts.d.ts +77 -0
  76. package/dist/headless/contexts.js +53 -0
  77. package/dist/headless/continue.d.ts +4 -0
  78. package/dist/headless/continue.js +26 -0
  79. package/dist/headless/copy.d.ts +11 -0
  80. package/dist/headless/copy.js +21 -0
  81. package/dist/headless/deny.d.ts +4 -0
  82. package/dist/headless/deny.js +15 -0
  83. package/dist/headless/edit-queued.d.ts +2 -0
  84. package/dist/headless/edit-queued.js +15 -0
  85. package/dist/headless/edit.d.ts +2 -0
  86. package/dist/headless/edit.js +17 -0
  87. package/dist/headless/edited-attachments.d.ts +5 -0
  88. package/dist/headless/edited-attachments.js +11 -0
  89. package/dist/headless/edited-input.d.ts +2 -0
  90. package/dist/headless/edited-input.js +28 -0
  91. package/dist/headless/empty.d.ts +3 -0
  92. package/dist/headless/empty.js +12 -0
  93. package/dist/headless/failed.d.ts +15 -0
  94. package/dist/headless/failed.js +17 -0
  95. package/dist/headless/feedback-error.d.ts +2 -0
  96. package/dist/headless/feedback-error.js +11 -0
  97. package/dist/headless/feedback-root.d.ts +2 -0
  98. package/dist/headless/feedback-root.js +24 -0
  99. package/dist/headless/feedback.d.ts +4 -0
  100. package/dist/headless/feedback.js +18 -0
  101. package/dist/headless/file-audio.d.ts +2 -0
  102. package/dist/headless/file-audio.js +16 -0
  103. package/dist/headless/file-context.d.ts +4 -0
  104. package/dist/headless/file-context.js +7 -0
  105. package/dist/headless/file-img.d.ts +2 -0
  106. package/dist/headless/file-img.js +21 -0
  107. package/dist/headless/file-kind-gate.d.ts +5 -0
  108. package/dist/headless/file-kind-gate.js +11 -0
  109. package/dist/headless/file-link.d.ts +3 -0
  110. package/dist/headless/file-link.js +14 -0
  111. package/dist/headless/file-root.d.ts +5 -0
  112. package/dist/headless/file-root.js +13 -0
  113. package/dist/headless/file-unavailable.d.ts +2 -0
  114. package/dist/headless/file-unavailable.js +12 -0
  115. package/dist/headless/file-video.d.ts +2 -0
  116. package/dist/headless/file-video.js +16 -0
  117. package/dist/headless/follow-ups.d.ts +5 -0
  118. package/dist/headless/follow-ups.js +20 -0
  119. package/dist/headless/forget-approval.d.ts +2 -0
  120. package/dist/headless/forget-approval.js +21 -0
  121. package/dist/headless/gate-content.d.ts +2 -0
  122. package/dist/headless/gate-content.js +6 -0
  123. package/dist/headless/index.d.ts +249 -0
  124. package/dist/headless/index.js +251 -0
  125. package/dist/headless/input.d.ts +11 -0
  126. package/dist/headless/input.js +18 -0
  127. package/dist/headless/jump-to-latest.d.ts +3 -0
  128. package/dist/headless/jump-to-latest.js +14 -0
  129. package/dist/headless/message-edit-root.d.ts +2 -0
  130. package/dist/headless/message-edit-root.js +13 -0
  131. package/dist/headless/message-editing.d.ts +2 -0
  132. package/dist/headless/message-editing.js +10 -0
  133. package/dist/headless/message-editor.d.ts +2 -0
  134. package/dist/headless/message-editor.js +19 -0
  135. package/dist/headless/message-footer.d.ts +3 -0
  136. package/dist/headless/message-footer.js +15 -0
  137. package/dist/headless/message-reading.d.ts +2 -0
  138. package/dist/headless/message-reading.js +10 -0
  139. package/dist/headless/message.d.ts +11 -0
  140. package/dist/headless/message.js +34 -0
  141. package/dist/headless/messages.d.ts +9 -0
  142. package/dist/headless/messages.js +19 -0
  143. package/dist/headless/model-picker.d.ts +2 -0
  144. package/dist/headless/model-picker.js +14 -0
  145. package/dist/headless/model.d.ts +4 -0
  146. package/dist/headless/model.js +13 -0
  147. package/dist/headless/models.d.ts +5 -0
  148. package/dist/headless/models.js +11 -0
  149. package/dist/headless/optional-tools.d.ts +7 -0
  150. package/dist/headless/optional-tools.js +12 -0
  151. package/dist/headless/other-answer.d.ts +5 -0
  152. package/dist/headless/other-answer.js +32 -0
  153. package/dist/headless/part-approval.d.ts +2 -0
  154. package/dist/headless/part-approval.js +33 -0
  155. package/dist/headless/part-file.d.ts +6 -0
  156. package/dist/headless/part-file.js +11 -0
  157. package/dist/headless/part-question.d.ts +2 -0
  158. package/dist/headless/part-question.js +57 -0
  159. package/dist/headless/part-reasoning.d.ts +15 -0
  160. package/dist/headless/part-reasoning.js +26 -0
  161. package/dist/headless/part-source.d.ts +5 -0
  162. package/dist/headless/part-source.js +20 -0
  163. package/dist/headless/part-text.d.ts +16 -0
  164. package/dist/headless/part-text.js +29 -0
  165. package/dist/headless/part-tool.d.ts +16 -0
  166. package/dist/headless/part-tool.js +14 -0
  167. package/dist/headless/parts.d.ts +11 -0
  168. package/dist/headless/parts.js +11 -0
  169. package/dist/headless/question-back.d.ts +2 -0
  170. package/dist/headless/question-back.js +16 -0
  171. package/dist/headless/question-error.d.ts +2 -0
  172. package/dist/headless/question-error.js +14 -0
  173. package/dist/headless/question-invalid.d.ts +8 -0
  174. package/dist/headless/question-invalid.js +18 -0
  175. package/dist/headless/question-item.d.ts +8 -0
  176. package/dist/headless/question-item.js +51 -0
  177. package/dist/headless/question-next.d.ts +3 -0
  178. package/dist/headless/question-next.js +16 -0
  179. package/dist/headless/question-other.d.ts +5 -0
  180. package/dist/headless/question-other.js +22 -0
  181. package/dist/headless/question-progress.d.ts +8 -0
  182. package/dist/headless/question-progress.js +14 -0
  183. package/dist/headless/question-receipt.d.ts +11 -0
  184. package/dist/headless/question-receipt.js +29 -0
  185. package/dist/headless/questions.d.ts +3 -0
  186. package/dist/headless/questions.js +13 -0
  187. package/dist/headless/queue-editing.d.ts +4 -0
  188. package/dist/headless/queue-editing.js +11 -0
  189. package/dist/headless/queue-item.d.ts +2 -0
  190. package/dist/headless/queue-item.js +10 -0
  191. package/dist/headless/queue-items.d.ts +2 -0
  192. package/dist/headless/queue-items.js +11 -0
  193. package/dist/headless/queue-preview.d.ts +6 -0
  194. package/dist/headless/queue-preview.js +11 -0
  195. package/dist/headless/queued-input.d.ts +2 -0
  196. package/dist/headless/queued-input.js +27 -0
  197. package/dist/headless/queued.d.ts +17 -0
  198. package/dist/headless/queued.js +16 -0
  199. package/dist/headless/read-aloud.d.ts +5 -0
  200. package/dist/headless/read-aloud.js +19 -0
  201. package/dist/headless/reasoning-disclosure.d.ts +3 -0
  202. package/dist/headless/reasoning-disclosure.js +17 -0
  203. package/dist/headless/reasoning-timer.d.ts +5 -0
  204. package/dist/headless/reasoning-timer.js +13 -0
  205. package/dist/headless/references.d.ts +6 -0
  206. package/dist/headless/references.js +13 -0
  207. package/dist/headless/regenerate.d.ts +3 -0
  208. package/dist/headless/regenerate.js +22 -0
  209. package/dist/headless/remembered-approval.d.ts +2 -0
  210. package/dist/headless/remembered-approval.js +14 -0
  211. package/dist/headless/root.d.ts +30 -0
  212. package/dist/headless/root.js +99 -0
  213. package/dist/headless/save-edit.d.ts +2 -0
  214. package/dist/headless/save-edit.js +16 -0
  215. package/dist/headless/save-queued.d.ts +2 -0
  216. package/dist/headless/save-queued.js +15 -0
  217. package/dist/headless/send-now.d.ts +2 -0
  218. package/dist/headless/send-now.js +17 -0
  219. package/dist/headless/settings.d.ts +2 -0
  220. package/dist/headless/settings.js +10 -0
  221. package/dist/headless/skip-questions.d.ts +6 -0
  222. package/dist/headless/skip-questions.js +18 -0
  223. package/dist/headless/source-context.d.ts +5 -0
  224. package/dist/headless/source-context.js +9 -0
  225. package/dist/headless/source-link.d.ts +2 -0
  226. package/dist/headless/source-link.js +13 -0
  227. package/dist/headless/source-primitives.d.ts +1 -0
  228. package/dist/headless/source-primitives.js +7 -0
  229. package/dist/headless/source-root.d.ts +5 -0
  230. package/dist/headless/source-root.js +9 -0
  231. package/dist/headless/source-sheet-close.d.ts +2 -0
  232. package/dist/headless/source-sheet-close.js +12 -0
  233. package/dist/headless/source-sheet-content.d.ts +3 -0
  234. package/dist/headless/source-sheet-content.js +16 -0
  235. package/dist/headless/source-sheet-description.d.ts +2 -0
  236. package/dist/headless/source-sheet-description.js +12 -0
  237. package/dist/headless/source-sheet-root.d.ts +2 -0
  238. package/dist/headless/source-sheet-root.js +13 -0
  239. package/dist/headless/source-sheet-title.d.ts +2 -0
  240. package/dist/headless/source-sheet-title.js +12 -0
  241. package/dist/headless/source-sheet-trigger.d.ts +2 -0
  242. package/dist/headless/source-sheet-trigger.js +12 -0
  243. package/dist/headless/source-unavailable.d.ts +2 -0
  244. package/dist/headless/source-unavailable.js +9 -0
  245. package/dist/headless/sources.d.ts +14 -0
  246. package/dist/headless/sources.js +12 -0
  247. package/dist/headless/speaker.d.ts +13 -0
  248. package/dist/headless/speaker.js +10 -0
  249. package/dist/headless/step-boundary.d.ts +4 -0
  250. package/dist/headless/step-boundary.js +16 -0
  251. package/dist/headless/stop.d.ts +10 -0
  252. package/dist/headless/stop.js +18 -0
  253. package/dist/headless/stopped.d.ts +11 -0
  254. package/dist/headless/stopped.js +17 -0
  255. package/dist/headless/submit-answers.d.ts +3 -0
  256. package/dist/headless/submit-answers.js +12 -0
  257. package/dist/headless/submit.d.ts +23 -0
  258. package/dist/headless/submit.js +24 -0
  259. package/dist/headless/suggestion.d.ts +10 -0
  260. package/dist/headless/suggestion.js +14 -0
  261. package/dist/headless/suggestions.d.ts +8 -0
  262. package/dist/headless/suggestions.js +12 -0
  263. package/dist/headless/thread.d.ts +3 -0
  264. package/dist/headless/thread.js +25 -0
  265. package/dist/headless/timing.d.ts +5 -0
  266. package/dist/headless/timing.js +13 -0
  267. package/dist/headless/toggle-tool.d.ts +4 -0
  268. package/dist/headless/toggle-tool.js +15 -0
  269. package/dist/headless/tool-error.d.ts +4 -0
  270. package/dist/headless/tool-error.js +13 -0
  271. package/dist/headless/tool-input.d.ts +4 -0
  272. package/dist/headless/tool-input.js +13 -0
  273. package/dist/headless/tool-output.d.ts +4 -0
  274. package/dist/headless/tool-output.js +13 -0
  275. package/dist/headless/tool-renderer.d.ts +13 -0
  276. package/dist/headless/tool-renderer.js +15 -0
  277. package/dist/headless/transcript.d.ts +23 -0
  278. package/dist/headless/transcript.js +24 -0
  279. package/dist/headless/try-again.d.ts +2 -0
  280. package/dist/headless/try-again.js +24 -0
  281. package/dist/headless/unavailable.d.ts +8 -0
  282. package/dist/headless/unavailable.js +9 -0
  283. package/dist/headless/usage.d.ts +13 -0
  284. package/dist/headless/usage.js +15 -0
  285. package/dist/headless/use-merged-ref.d.ts +2 -0
  286. package/dist/headless/use-merged-ref.js +17 -0
  287. package/dist/headless/use-question.d.ts +3 -0
  288. package/dist/headless/use-question.js +9 -0
  289. package/dist/headless/waiting.d.ts +13 -0
  290. package/dist/headless/waiting.js +12 -0
  291. package/dist/headless/writing.d.ts +13 -0
  292. package/dist/headless/writing.js +12 -0
  293. package/dist/hooks/chat-refusal.d.ts +18 -0
  294. package/dist/hooks/chat-refusal.js +44 -0
  295. package/dist/hooks/turn-mailbox.d.ts +14 -0
  296. package/dist/hooks/turn-mailbox.js +114 -0
  297. package/dist/hooks/use-branches.d.ts +10 -0
  298. package/dist/hooks/use-branches.js +69 -0
  299. package/dist/hooks/use-chat-instance.d.ts +28 -0
  300. package/dist/hooks/use-chat-instance.js +44 -0
  301. package/dist/hooks/use-chat-settings.d.ts +11 -0
  302. package/dist/hooks/use-chat-settings.js +33 -0
  303. package/dist/hooks/use-chat-sink.d.ts +19 -0
  304. package/dist/hooks/use-chat-sink.js +56 -0
  305. package/dist/hooks/use-composer.d.ts +33 -0
  306. package/dist/hooks/use-composer.js +45 -0
  307. package/dist/hooks/use-context-usage.d.ts +8 -0
  308. package/dist/hooks/use-context-usage.js +14 -0
  309. package/dist/hooks/use-copied.d.ts +14 -0
  310. package/dist/hooks/use-copied.js +22 -0
  311. package/dist/hooks/use-draft.d.ts +6 -0
  312. package/dist/hooks/use-draft.js +38 -0
  313. package/dist/hooks/use-feedback.d.ts +8 -0
  314. package/dist/hooks/use-feedback.js +28 -0
  315. package/dist/hooks/use-follow.d.ts +15 -0
  316. package/dist/hooks/use-follow.js +30 -0
  317. package/dist/hooks/use-media-load.d.ts +5 -0
  318. package/dist/hooks/use-media-load.js +12 -0
  319. package/dist/hooks/use-media.d.ts +3 -0
  320. package/dist/hooks/use-media.js +9 -0
  321. package/dist/hooks/use-question-check.d.ts +11 -0
  322. package/dist/hooks/use-question-check.js +29 -0
  323. package/dist/hooks/use-question-draft.d.ts +34 -0
  324. package/dist/hooks/use-question-draft.js +57 -0
  325. package/dist/hooks/use-question-steps.d.ts +18 -0
  326. package/dist/hooks/use-question-steps.js +31 -0
  327. package/dist/hooks/use-question-write.d.ts +8 -0
  328. package/dist/hooks/use-question-write.js +25 -0
  329. package/dist/hooks/use-read-aloud.d.ts +8 -0
  330. package/dist/hooks/use-read-aloud.js +60 -0
  331. package/dist/hooks/use-reasoning.d.ts +8 -0
  332. package/dist/hooks/use-reasoning.js +32 -0
  333. package/dist/hooks/use-remembered-approvals.d.ts +9 -0
  334. package/dist/hooks/use-remembered-approvals.js +40 -0
  335. package/dist/hooks/use-reply.d.ts +3 -0
  336. package/dist/hooks/use-reply.js +9 -0
  337. package/dist/hooks/use-report-missing-configuration.d.ts +9 -0
  338. package/dist/hooks/use-report-missing-configuration.js +14 -0
  339. package/dist/hooks/use-retry-delay.d.ts +5 -0
  340. package/dist/hooks/use-retry-delay.js +17 -0
  341. package/dist/hooks/use-sent-draft.d.ts +8 -0
  342. package/dist/hooks/use-sent-draft.js +25 -0
  343. package/dist/hooks/use-source-disclosure.d.ts +5 -0
  344. package/dist/hooks/use-source-disclosure.js +9 -0
  345. package/dist/hooks/use-sources.d.ts +3 -0
  346. package/dist/hooks/use-sources.js +9 -0
  347. package/dist/hooks/use-tool-approval-memory.d.ts +8 -0
  348. package/dist/hooks/use-tool-approval-memory.js +16 -0
  349. package/dist/hooks/use-tool-approval.d.ts +10 -0
  350. package/dist/hooks/use-tool-approval.js +26 -0
  351. package/dist/hooks/use-turn-queue.d.ts +32 -0
  352. package/dist/hooks/use-turn-queue.js +33 -0
  353. package/dist/index.d.ts +10 -0
  354. package/dist/index.js +5 -0
  355. package/dist/next.d.ts +43 -0
  356. package/dist/next.js +10 -0
  357. package/dist/services/approval-memory.d.ts +9 -0
  358. package/dist/services/approval-memory.js +32 -0
  359. package/dist/services/approval.d.ts +14 -0
  360. package/dist/services/approval.js +37 -0
  361. package/dist/services/branches.d.ts +27 -0
  362. package/dist/services/branches.js +131 -0
  363. package/dist/services/chat-session.d.ts +20 -0
  364. package/dist/services/chat-session.js +61 -0
  365. package/dist/services/choices.d.ts +31 -0
  366. package/dist/services/choices.js +39 -0
  367. package/dist/services/continue.d.ts +8 -0
  368. package/dist/services/continue.js +24 -0
  369. package/dist/services/errors.d.ts +52 -0
  370. package/dist/services/errors.js +54 -0
  371. package/dist/services/media.d.ts +9 -0
  372. package/dist/services/media.js +19 -0
  373. package/dist/services/messages.d.ts +44 -0
  374. package/dist/services/messages.js +0 -0
  375. package/dist/services/optional.d.ts +7 -0
  376. package/dist/services/optional.js +7 -0
  377. package/dist/services/ports.d.ts +31 -0
  378. package/dist/services/ports.js +0 -0
  379. package/dist/services/questions.d.ts +67 -0
  380. package/dist/services/questions.js +119 -0
  381. package/dist/services/request.d.ts +26 -0
  382. package/dist/services/request.js +85 -0
  383. package/dist/services/selection.d.ts +10 -0
  384. package/dist/services/selection.js +49 -0
  385. package/dist/services/sources.d.ts +11 -0
  386. package/dist/services/sources.js +29 -0
  387. package/dist/services/tools.d.ts +11 -0
  388. package/dist/services/tools.js +0 -0
  389. package/dist/services/turn.d.ts +84 -0
  390. package/dist/services/turn.js +0 -0
  391. package/dist/services/types.d.ts +23 -0
  392. package/dist/services/types.js +15 -0
  393. package/package.json +822 -0
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { usePart, useRequired } from "@slices.sh/core/part";
3
+ import { ComposerContext } from "./contexts.js";
4
+ function Input(props) {
5
+ const composer = useRequired(ComposerContext, "Chat.Input must be inside <Chat.Root>.");
6
+ return usePart("textarea", props, {
7
+ attributes: { "chat-composer": true },
8
+ defaults: { autoComplete: "off", enterKeyHint: "send" },
9
+ behavior: {
10
+ onChange: (event) => composer.set(event.currentTarget.value),
11
+ onKeyDown: composer.keyDown
12
+ },
13
+ locked: { value: composer.draft, disabled: composer.disabled }
14
+ });
15
+ }
16
+ export {
17
+ Input
18
+ };
@@ -0,0 +1,3 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ /** Rendered only once the reader has scrolled the transcript away from its end. */
3
+ export declare function JumpToLatest(props: PartProps<"button">): import("react").ReactNode;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { usePart, useRequired } from "@slices.sh/core/part";
3
+ import { FollowContext } from "./contexts.js";
4
+ function JumpToLatest(props) {
5
+ const follow = useRequired(FollowContext, "Chat.JumpToLatest must be inside <Chat.Root>.");
6
+ const element = usePart("button", props, {
7
+ defaults: { type: "button" },
8
+ behavior: { onClick: () => follow.jump() }
9
+ });
10
+ return follow.following ? null : element;
11
+ }
12
+ export {
13
+ JumpToLatest
14
+ };
@@ -0,0 +1,2 @@
1
+ import { type RootProps } from "@slices.sh/core/part";
2
+ export declare function MessageEditRoot({ children }: RootProps): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useSentDraft } from "../hooks/use-sent-draft.js";
4
+ import { useRequired } from "@slices.sh/core/part";
5
+ import { MessageScope, SentDraftContext } from "./contexts.js";
6
+ function MessageEditRoot({ children }) {
7
+ const message = useRequired(MessageScope, "Chat.MessageEditRoot requires Chat.Messages.");
8
+ const draft = useSentDraft(message);
9
+ return /* @__PURE__ */ jsx(SentDraftContext, { value: draft, children });
10
+ }
11
+ export {
12
+ MessageEditRoot
13
+ };
@@ -0,0 +1,2 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ export declare function MessageEditing({ children }: GateProps): import("react").ReactNode;
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { SentDraftContext } from "./contexts.js";
4
+ function MessageEditing({ children }) {
5
+ const draft = useRequired(SentDraftContext, "Chat.MessageEditing requires Chat.MessageEditRoot.");
6
+ return draft.value !== null ? children : null;
7
+ }
8
+ export {
9
+ MessageEditing
10
+ };
@@ -0,0 +1,2 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ export declare function MessageEditor(props: PartProps<"form">): import("react").ReactNode;
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { usePart, useRequired } from "@slices.sh/core/part";
3
+ import { BranchContext, MessageScope, SentDraftContext } from "./contexts.js";
4
+ function MessageEditor(props) {
5
+ const branches = useRequired(BranchContext, "Chat.MessageEditor requires Chat.Root.");
6
+ const message = useRequired(MessageScope, "Chat.MessageEditor requires Chat.Messages.");
7
+ const draft = useRequired(SentDraftContext, "Chat.MessageEditor requires Chat.MessageEditRoot.");
8
+ return usePart("form", props, {
9
+ behavior: {
10
+ onSubmit: (event) => {
11
+ event.preventDefault();
12
+ if (draft.value !== null && branches.edit(message.id, draft.value)) draft.cancel();
13
+ }
14
+ }
15
+ });
16
+ }
17
+ export {
18
+ MessageEditor
19
+ };
@@ -0,0 +1,3 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ /** Completed-turn actions stay available on the latest answer and to keyboard/touch readers. */
3
+ export declare function MessageFooter(props: PartProps<"div">): import("react").ReactNode;
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { useChat } from "@ai-sdk/react";
3
+ import { usePart, useRequired } from "@slices.sh/core/part";
4
+ import { ChatContext, MessageScope } from "./contexts.js";
5
+ import { isWriting } from "./writing.js";
6
+ function MessageFooter(props) {
7
+ const message = useRequired(MessageScope, "Chat.MessageFooter must be inside <Chat.Messages>.");
8
+ const chat = useRequired(ChatContext, "Chat.MessageFooter must be inside <Chat.Root>.");
9
+ const { messages, status } = useChat({ chat });
10
+ const element = usePart("div", props, { attributes: { active: messages.at(-1)?.id === message.id } });
11
+ return isWriting(message, messages, status) ? null : element;
12
+ }
13
+ export {
14
+ MessageFooter
15
+ };
@@ -0,0 +1,2 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ export declare function MessageReading({ children }: GateProps): import("react").ReactNode;
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { SentDraftContext } from "./contexts.js";
4
+ function MessageReading({ children }) {
5
+ const draft = useRequired(SentDraftContext, "Chat.MessageReading requires Chat.MessageEditRoot.");
6
+ return draft.value === null ? children : null;
7
+ }
8
+ export {
9
+ MessageReading
10
+ };
@@ -0,0 +1,11 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ import type { AiChatMessage } from "../services/types";
3
+ type MessageState = {
4
+ role: AiChatMessage["role"];
5
+ interrupted: boolean;
6
+ streaming: boolean;
7
+ };
8
+ export declare function Message({ optimizeHistory, ...props }: PartProps<"div", MessageState> & {
9
+ optimizeHistory?: boolean;
10
+ }): import("react").ReactNode;
11
+ export {};
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { MessageScroller } from "@shadcn/react/message-scroller";
4
+ import { useChat } from "@ai-sdk/react";
5
+ import { usePart, useRequired } from "@slices.sh/core/part";
6
+ import { ChatContext, MessageScope } from "./contexts.js";
7
+ import { isCutOff, isWriting } from "./writing.js";
8
+ function Message({ optimizeHistory = true, ...props }) {
9
+ const message = useRequired(MessageScope, "Chat.Message must be inside <Chat.Messages>.");
10
+ const chat = useRequired(ChatContext, "Chat.Message must be inside <Chat.Root>.");
11
+ const { messages, status } = useChat({ chat });
12
+ const streaming = isWriting(message, messages, status);
13
+ const interrupted = isCutOff(message, streaming);
14
+ const anchor = message.role === "user" && messages.findLast((item) => item.role === "user")?.id === message.id;
15
+ const historical = optimizeHistory && messages.length > 40 && !anchor && !streaming && !messages.slice(-6).some((item) => item.id === message.id);
16
+ return usePart(
17
+ "div",
18
+ { ...props, render: props.render ?? /* @__PURE__ */ jsx(MessageScroller.Item, {}) },
19
+ {
20
+ state: { role: message.role, interrupted, streaming },
21
+ defaults: { style: historical ? { contentVisibility: "auto", containIntrinsicSize: "auto 20rem" } : void 0 },
22
+ // `state` carries the role so one rule can style a side; `interrupted` is its own
23
+ // attribute because it is a fact about the message rather than whose it is.
24
+ //
25
+ // `aria-busy` is why the answer being written is told apart: without it a polite log
26
+ // reads a reply a word at a time, and with it the reply is read once, when it is a reply.
27
+ attributes: { state: message.role, invalid: interrupted, pending: streaming },
28
+ locked: { "aria-busy": streaming || void 0, messageId: message.id, scrollAnchor: anchor }
29
+ }
30
+ );
31
+ }
32
+ export {
33
+ Message
34
+ };
@@ -0,0 +1,9 @@
1
+ import { type RootProps } from "@slices.sh/core/part";
2
+ /**
3
+ * The transcript's messages, each in its own scope, exactly as the AI SDK holds them.
4
+ *
5
+ * The repeat is a part rather than a `map` in the pattern, because a message is where the
6
+ * looks change most and the iteration never does: a skin decides what a row is, and this
7
+ * decides what the rows are.
8
+ */
9
+ export declare function Messages({ children }: RootProps): import("react").JSX.Element[];
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useContext } from "react";
4
+ import { useChat } from "@ai-sdk/react";
5
+ import { useRequired } from "@slices.sh/core/part";
6
+ import { ChatContext, MessageScope, BranchContext } from "./contexts.js";
7
+ function Messages({ children }) {
8
+ const chat = useRequired(ChatContext, "Chat.Messages must be inside <Chat.Root>.");
9
+ const branches = useContext(BranchContext);
10
+ const { messages } = useChat({ chat });
11
+ return messages.map((message) => {
12
+ const page = branches?.page(message.id);
13
+ const key = page?.anchored ? `branch:${page.id}` : `message:${message.id}`;
14
+ return /* @__PURE__ */ jsx(MessageScope, { value: message, children }, key);
15
+ });
16
+ }
17
+ export {
18
+ Messages
19
+ };
@@ -0,0 +1,2 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ export declare function ModelPicker(props: PartProps<"select">): import("react").ReactNode;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { usePart, useRequired } from "@slices.sh/core/part";
3
+ import { SettingsContext } from "./contexts.js";
4
+ function ModelPicker(props) {
5
+ const settings = useRequired(SettingsContext, "Chat.ModelPicker requires Chat.Root.");
6
+ const part = usePart("select", props, {
7
+ locked: { value: settings.selection.model ?? "", disabled: settings.blocked },
8
+ behavior: { onChange: (event) => settings.model(event.currentTarget.value) }
9
+ });
10
+ return settings.choices?.models?.length ? part : null;
11
+ }
12
+ export {
13
+ ModelPicker
14
+ };
@@ -0,0 +1,4 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ export declare function Model({ children }: GateProps<{
3
+ model: string;
4
+ }>): import("react").ReactNode;
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { MessageScope } from "./contexts.js";
4
+ import { gateContent } from "./gate-content.js";
5
+ function Model({ children }) {
6
+ const message = useRequired(MessageScope, "Chat.Model must be inside <Chat.Messages>.");
7
+ const model = message.metadata?.model;
8
+ if (!model) return null;
9
+ return gateContent(children, { model });
10
+ }
11
+ export {
12
+ Model
13
+ };
@@ -0,0 +1,5 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ import type { ChatChoices } from "../services/types";
3
+ export declare function Models({ children }: GateProps<{
4
+ models: NonNullable<ChatChoices["models"]>;
5
+ }>): import("react").ReactNode;
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { SettingsContext } from "./contexts.js";
4
+ import { gateContent } from "./gate-content.js";
5
+ function Models({ children }) {
6
+ const { choices } = useRequired(SettingsContext, "Chat.Models requires Chat.Root.");
7
+ return choices?.models?.length ? gateContent(children, { models: choices.models }) : null;
8
+ }
9
+ export {
10
+ Models
11
+ };
@@ -0,0 +1,7 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ import type { ChatChoices } from "../services/types";
3
+ export declare function OptionalTools({ selected, children }: GateProps<{
4
+ tools: NonNullable<ChatChoices["tools"]>;
5
+ }> & {
6
+ selected?: boolean;
7
+ }): import("react").ReactNode;
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { SettingsContext } from "./contexts.js";
4
+ import { gateContent } from "./gate-content.js";
5
+ function OptionalTools({ selected = false, children }) {
6
+ const state = useRequired(SettingsContext, "Chat.OptionalTools requires Chat.Root.");
7
+ const tools = state.choices?.tools?.filter((tool) => !selected || state.selection.tools?.includes(tool.id));
8
+ return tools?.length ? gateContent(children, { tools }) : null;
9
+ }
10
+ export {
11
+ OptionalTools
12
+ };
@@ -0,0 +1,5 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ /** The control of the "Other" row, last in the same group as the choices: it replaces the pick of a single question and adds to a multiple one. */
3
+ export declare function OtherAnswer({ name, ...props }: PartProps<"input"> & {
4
+ name: string;
5
+ }): import("react").ReactNode;
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { usePart, useRequired } from "@slices.sh/core/part";
3
+ import { QuestionCheckContext, QuestionDraftContext, QuestionWriteContext } from "./contexts.js";
4
+ import { useQuestion } from "./use-question.js";
5
+ function OtherAnswer({ name, ...props }) {
6
+ const question = useQuestion(name, "OtherAnswer");
7
+ const draft = useRequired(QuestionDraftContext, "Chat.OtherAnswer requires Chat.PartQuestion.");
8
+ const check = useRequired(QuestionCheckContext, "Chat.OtherAnswer requires Chat.PartQuestion.");
9
+ const write = useRequired(QuestionWriteContext, "Chat.OtherAnswer requires Chat.PartQuestion.");
10
+ const multiple = Boolean(question?.multiple);
11
+ const element = usePart("input", props, {
12
+ behavior: {
13
+ onChange: () => draft.change(name, { type: "toggle-other" }),
14
+ onClick: (event) => {
15
+ if (event.currentTarget.checked)
16
+ event.currentTarget.closest("fieldset")?.querySelector("input[type=text]")?.focus();
17
+ }
18
+ },
19
+ locked: {
20
+ type: multiple ? "checkbox" : "radio",
21
+ name,
22
+ value: "",
23
+ checked: draft.other(name).on,
24
+ disabled: write.pending,
25
+ "aria-invalid": multiple && check.shown(name) ? true : void 0
26
+ }
27
+ });
28
+ return question?.other ? element : null;
29
+ }
30
+ export {
31
+ OtherAnswer
32
+ };
@@ -0,0 +1,2 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ export declare function PartApproval(props: PartProps<"div">): import("react").JSX.Element | null;
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { isToolUIPart } from "ai";
4
+ import { useToolApproval } from "../hooks/use-tool-approval.js";
5
+ import { usePart, useRequired } from "@slices.sh/core/part";
6
+ import { ApprovalContext, ChatContext, PartScope } from "./contexts.js";
7
+ function PartApproval(props) {
8
+ const part = useRequired(PartScope, "Chat.PartApproval requires Chat.Parts.");
9
+ if (!isToolUIPart(part) || part.state !== "approval-requested") return null;
10
+ return /* @__PURE__ */ jsx(Request, { id: part.approval.id, props }, part.approval.id);
11
+ }
12
+ function Request({ id, props }) {
13
+ const chat = useRequired(ChatContext, "Chat.PartApproval requires Chat.Root.");
14
+ const write = useToolApproval(chat, id);
15
+ const element = usePart("div", props, {
16
+ defaults: { role: "group" },
17
+ locked: { "aria-busy": write.pending || void 0 },
18
+ behavior: {
19
+ onKeyDown: (event) => {
20
+ if (event.defaultPrevented || write.pending) return;
21
+ if (event.key === "Escape" || event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
22
+ event.preventDefault();
23
+ event.stopPropagation();
24
+ void write.run({ approved: event.key !== "Escape" });
25
+ }
26
+ }
27
+ }
28
+ });
29
+ return /* @__PURE__ */ jsx(ApprovalContext, { value: write, children: element });
30
+ }
31
+ export {
32
+ PartApproval
33
+ };
@@ -0,0 +1,6 @@
1
+ import type { FileUIPart } from "ai";
2
+ import { type GateProps } from "@slices.sh/core/part";
3
+ /** A native file stays visible in history even when the rich media viewer is not installed. */
4
+ export declare function PartFile({ children }: GateProps<{
5
+ file: FileUIPart;
6
+ }>): import("react").ReactNode;
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { useRequired } from "@slices.sh/core/part";
3
+ import { PartScope } from "./contexts.js";
4
+ import { gateContent } from "./gate-content.js";
5
+ function PartFile({ children }) {
6
+ const part = useRequired(PartScope, "Chat.PartFile requires Chat.Parts.");
7
+ return part.type === "file" ? gateContent(children, { file: part }) : null;
8
+ }
9
+ export {
10
+ PartFile
11
+ };
@@ -0,0 +1,2 @@
1
+ import { type PartProps } from "@slices.sh/core/part";
2
+ export declare function PartQuestion(props: PartProps<"form">): import("react").JSX.Element | null;
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { isToolUIPart } from "ai";
4
+ import { questionInput, useQuestionDraft } from "../hooks/use-question-draft.js";
5
+ import { useQuestionCheck } from "../hooks/use-question-check.js";
6
+ import { useQuestionSteps } from "../hooks/use-question-steps.js";
7
+ import { useQuestionWrite } from "../hooks/use-question-write.js";
8
+ import { Provide, usePart, useRequired } from "@slices.sh/core/part";
9
+ import {
10
+ ChatContext,
11
+ PartScope,
12
+ QuestionInputContext,
13
+ QuestionDraftContext,
14
+ QuestionCheckContext,
15
+ QuestionStepsContext,
16
+ QuestionWriteContext
17
+ } from "./contexts.js";
18
+ function PartQuestion(props) {
19
+ const part = useRequired(PartScope, "Chat.PartQuestion requires Chat.Parts.");
20
+ const input = questionInput(part);
21
+ if (!input || !isToolUIPart(part) || part.state !== "input-available") return null;
22
+ return /* @__PURE__ */ jsx(Request, { id: part.toolCallId, input, props }, part.toolCallId);
23
+ }
24
+ function Request({ id, input, props }) {
25
+ const chat = useRequired(ChatContext, "Chat.PartQuestion requires Chat.Root.");
26
+ const draft = useQuestionDraft(input);
27
+ const check = useQuestionCheck(input, draft);
28
+ const steps = useQuestionSteps(input, check);
29
+ const write = useQuestionWrite(chat, id);
30
+ const element = usePart("form", props, {
31
+ locked: { "aria-label": input.title, "aria-busy": write.pending || void 0 },
32
+ behavior: {
33
+ onSubmit: (event) => {
34
+ event.preventDefault();
35
+ if (write.pending) return;
36
+ if (steps.index < steps.count - 1) steps.move("next");
37
+ else if (steps.move("finish")) void write.run(draft.answers);
38
+ }
39
+ }
40
+ });
41
+ return /* @__PURE__ */ jsx(
42
+ Provide,
43
+ {
44
+ values: [
45
+ [QuestionInputContext, input],
46
+ [QuestionDraftContext, draft],
47
+ [QuestionCheckContext, check],
48
+ [QuestionStepsContext, steps],
49
+ [QuestionWriteContext, write]
50
+ ],
51
+ children: element
52
+ }
53
+ );
54
+ }
55
+ export {
56
+ PartQuestion
57
+ };
@@ -0,0 +1,15 @@
1
+ import type { ReasoningUIPart } from "ai";
2
+ import { type GateProps } from "@slices.sh/core/part";
3
+ type PartReasoningState = ReasoningUIPart & {
4
+ streaming: boolean;
5
+ };
6
+ /**
7
+ * A model thinking out loud, the SDK's `reasoning` part, and whether it has stopped.
8
+ *
9
+ * `streaming` is what lets one block be open while it fills and closed once the answer
10
+ * starts, which is the convention every product settled on: the trace is interesting while
11
+ * it is the only thing happening and noise the moment it is not. A trace the SDK still
12
+ * holds as `streaming` on an answer nobody is writing was cut off, and is over too.
13
+ */
14
+ export declare function PartReasoning({ children }: GateProps<PartReasoningState>): import("react").JSX.Element | null;
15
+ export {};
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useChat } from "@ai-sdk/react";
4
+ import { useRequired } from "@slices.sh/core/part";
5
+ import { useReasoning } from "../hooks/use-reasoning.js";
6
+ import { ChatContext, MessageScope, PartScope, ReasoningContext } from "./contexts.js";
7
+ import { gateContent } from "./gate-content.js";
8
+ import { isWriting } from "./writing.js";
9
+ function PartReasoning({ children }) {
10
+ const part = useRequired(PartScope, "Chat.PartReasoning must be inside <Chat.Parts>.");
11
+ return part.type === "reasoning" ? /* @__PURE__ */ jsx(Trace, { part, children }) : null;
12
+ }
13
+ function Trace({
14
+ part,
15
+ children
16
+ }) {
17
+ const message = useRequired(MessageScope, "Chat.PartReasoning must be inside <Chat.Messages>.");
18
+ const chat = useRequired(ChatContext, "Chat.PartReasoning must be inside <Chat.Root>.");
19
+ const { messages, status } = useChat({ chat });
20
+ const streaming = part.state === "streaming" && isWriting(message, messages, status);
21
+ const reasoning = useReasoning(streaming);
22
+ return /* @__PURE__ */ jsx(ReasoningContext, { value: reasoning, children: gateContent(children, { ...part, streaming }) });
23
+ }
24
+ export {
25
+ PartReasoning
26
+ };
@@ -0,0 +1,5 @@
1
+ import { type GateProps } from "@slices.sh/core/part";
2
+ import type { ChatSource } from "../services/types";
3
+ export declare function PartSource({ children }: GateProps<{
4
+ source: ChatSource;
5
+ }>): import("react").ReactNode;
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useSources } from "../hooks/use-sources.js";
3
+ import { useRequired } from "@slices.sh/core/part";
4
+ import { MessageScope, PartScope } from "./contexts.js";
5
+ import { gateContent } from "./gate-content.js";
6
+ function PartSource({ children }) {
7
+ const message = useRequired(MessageScope, "Chat.PartSource requires Chat.Messages.");
8
+ const part = useRequired(PartScope, "Chat.PartSource requires Chat.Parts.");
9
+ const sources = useSources(message);
10
+ if (part.type !== "source-url" && part.type !== "source-document") return null;
11
+ const first = message.parts.find(
12
+ (p) => p.type === part.type && "sourceId" in p && p.sourceId === part.sourceId
13
+ );
14
+ if (first !== part) return null;
15
+ const source = sources.find((s) => s.key === `${part.type}:${part.sourceId}`);
16
+ return source ? gateContent(children, { source }) : null;
17
+ }
18
+ export {
19
+ PartSource
20
+ };
@@ -0,0 +1,16 @@
1
+ import type { TextUIPart } from "ai";
2
+ import { type GateProps } from "@slices.sh/core/part";
3
+ import type { AiChatMessage } from "../services/types";
4
+ type PartTextState = TextUIPart & {
5
+ role: AiChatMessage["role"];
6
+ streaming: boolean;
7
+ };
8
+ /**
9
+ * One run of prose, the SDK's `text` part. A message has several when something happened
10
+ * between them.
11
+ *
12
+ * The role comes with it because whose text this is decides whether it is markup: a model
13
+ * writes markdown and means it, and a person who types `2 * 3 * 4` means three numbers.
14
+ */
15
+ export declare function PartText({ children }: GateProps<PartTextState>): import("react").JSX.Element | null;
16
+ export {};
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useChat } from "@ai-sdk/react";
4
+ import { useRequired } from "@slices.sh/core/part";
5
+ import { ChatContext, MessageScope, PartScope } from "./contexts.js";
6
+ import { isWriting } from "./writing.js";
7
+ import { gateContent } from "./gate-content.js";
8
+ function PartText({ children }) {
9
+ const part = useRequired(PartScope, "Chat.PartText must be inside <Chat.Parts>.");
10
+ const message = useRequired(MessageScope, "Chat.PartText must be inside <Chat.Messages>.");
11
+ if (part.type !== "text") return null;
12
+ return /* @__PURE__ */ jsx(Text, { part, message, children });
13
+ }
14
+ function Text({
15
+ part,
16
+ message,
17
+ children
18
+ }) {
19
+ const chat = useRequired(ChatContext, "Chat.PartText requires Chat.Root.");
20
+ const { messages, status } = useChat({ chat });
21
+ return gateContent(children, {
22
+ ...part,
23
+ role: message.role,
24
+ streaming: part.state === "streaming" && isWriting(message, messages, status)
25
+ });
26
+ }
27
+ export {
28
+ PartText
29
+ };
@@ -0,0 +1,16 @@
1
+ import { type DynamicToolUIPart, type ToolUIPart } from "ai";
2
+ import { type GateProps } from "@slices.sh/core/part";
3
+ type PartToolState = (ToolUIPart | DynamicToolUIPart) & {
4
+ toolName: string;
5
+ };
6
+ /**
7
+ * One tool call, the SDK's `tool-<name>` or `dynamic-tool` part, wherever it has got to.
8
+ *
9
+ * The state reaches the screen because the seven of them want different things: an input
10
+ * still arriving is a shimmer, an output is a disclosure, a denial is a sentence and an
11
+ * error is a different sentence. One "called a tool" card for all seven would be six lies.
12
+ * `toolName` is the SDK's own reading of the part's type, beside everything the part holds.
13
+ * → docs/rules/capability-honesty.md
14
+ */
15
+ export declare function PartTool({ children }: GateProps<PartToolState>): import("react").ReactNode;
16
+ export {};
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { getToolName, isToolUIPart } from "ai";
3
+ import { useRequired } from "@slices.sh/core/part";
4
+ import { questionInput } from "../hooks/use-question-draft.js";
5
+ import { PartScope } from "./contexts.js";
6
+ import { gateContent } from "./gate-content.js";
7
+ function PartTool({ children }) {
8
+ const part = useRequired(PartScope, "Chat.PartTool must be inside <Chat.Parts>.");
9
+ if (!isToolUIPart(part) || questionInput(part)) return null;
10
+ return gateContent(children, { ...part, toolName: getToolName(part) });
11
+ }
12
+ export {
13
+ PartTool
14
+ };
@@ -0,0 +1,11 @@
1
+ import { type RootProps } from "@slices.sh/core/part";
2
+ /**
3
+ * A message's parts, in the order the model produced them, exactly as the AI SDK holds them.
4
+ *
5
+ * The order is the content. Reasoning before an answer, a tool call between two halves of
6
+ * one, a citation after both — a transcript that grouped by kind would say the model did
7
+ * things in an order it did not. Each kind gates itself inside here, and a kind no gate
8
+ * draws — a step boundary, an app's own `data-*` part — draws nothing.
9
+ * → docs/rules/states-gate-themselves.md
10
+ */
11
+ export declare function Parts({ children }: RootProps): import("react").JSX.Element[];
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useRequired } from "@slices.sh/core/part";
4
+ import { MessageScope, PartScope } from "./contexts.js";
5
+ function Parts({ children }) {
6
+ const message = useRequired(MessageScope, "Chat.Parts must be inside <Chat.Messages>.");
7
+ return message.parts.map((part, index) => /* @__PURE__ */ jsx(PartScope, { value: part, children }, `${index}:${part.type}`));
8
+ }
9
+ export {
10
+ Parts
11
+ };