@wzrhine/agent 0.0.0-stage → 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 (347) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -0
  3. package/README.md +29 -3
  4. package/dist/agent.css +15 -0
  5. package/dist/components/artifact/ArtifactCard.d.ts +56 -0
  6. package/dist/components/artifact/ArtifactCard.d.ts.map +1 -0
  7. package/dist/components/artifact/ArtifactCard.js +78 -0
  8. package/dist/components/artifact/ArtifactCard.js.map +1 -0
  9. package/dist/components/artifact/FilePreview.d.ts +117 -0
  10. package/dist/components/artifact/FilePreview.d.ts.map +1 -0
  11. package/dist/components/artifact/FilePreview.js +207 -0
  12. package/dist/components/artifact/FilePreview.js.map +1 -0
  13. package/dist/components/artifact/FilePreviewTabs.d.ts +51 -0
  14. package/dist/components/artifact/FilePreviewTabs.d.ts.map +1 -0
  15. package/dist/components/artifact/FilePreviewTabs.js +150 -0
  16. package/dist/components/artifact/FilePreviewTabs.js.map +1 -0
  17. package/dist/components/composer/AttachmentList.d.ts +33 -0
  18. package/dist/components/composer/AttachmentList.d.ts.map +1 -0
  19. package/dist/components/composer/AttachmentList.js +56 -0
  20. package/dist/components/composer/AttachmentList.js.map +1 -0
  21. package/dist/components/composer/Composer.d.ts +113 -0
  22. package/dist/components/composer/Composer.d.ts.map +1 -0
  23. package/dist/components/composer/Composer.js +327 -0
  24. package/dist/components/composer/Composer.js.map +1 -0
  25. package/dist/components/composer/ComposerInput.d.ts +101 -0
  26. package/dist/components/composer/ComposerInput.d.ts.map +1 -0
  27. package/dist/components/composer/ComposerInput.js +301 -0
  28. package/dist/components/composer/ComposerInput.js.map +1 -0
  29. package/dist/components/composer/ComposerNotice.d.ts +38 -0
  30. package/dist/components/composer/ComposerNotice.d.ts.map +1 -0
  31. package/dist/components/composer/ComposerNotice.js +16 -0
  32. package/dist/components/composer/ComposerNotice.js.map +1 -0
  33. package/dist/components/composer/MentionMenu.d.ts +37 -0
  34. package/dist/components/composer/MentionMenu.d.ts.map +1 -0
  35. package/dist/components/composer/MentionMenu.js +55 -0
  36. package/dist/components/composer/MentionMenu.js.map +1 -0
  37. package/dist/components/composer/MenuPanel.d.ts +49 -0
  38. package/dist/components/composer/MenuPanel.d.ts.map +1 -0
  39. package/dist/components/composer/MenuPanel.js +50 -0
  40. package/dist/components/composer/MenuPanel.js.map +1 -0
  41. package/dist/components/composer/ModelPicker.d.ts +40 -0
  42. package/dist/components/composer/ModelPicker.d.ts.map +1 -0
  43. package/dist/components/composer/ModelPicker.js +115 -0
  44. package/dist/components/composer/ModelPicker.js.map +1 -0
  45. package/dist/components/composer/PermissionPicker.d.ts +31 -0
  46. package/dist/components/composer/PermissionPicker.d.ts.map +1 -0
  47. package/dist/components/composer/PermissionPicker.js +43 -0
  48. package/dist/components/composer/PermissionPicker.js.map +1 -0
  49. package/dist/components/composer/SendStopButton.d.ts +71 -0
  50. package/dist/components/composer/SendStopButton.d.ts.map +1 -0
  51. package/dist/components/composer/SendStopButton.js +87 -0
  52. package/dist/components/composer/SendStopButton.js.map +1 -0
  53. package/dist/components/composer/SlashCommandMenu.d.ts +33 -0
  54. package/dist/components/composer/SlashCommandMenu.d.ts.map +1 -0
  55. package/dist/components/composer/SlashCommandMenu.js +43 -0
  56. package/dist/components/composer/SlashCommandMenu.js.map +1 -0
  57. package/dist/components/composer/composer-text.d.ts +10 -0
  58. package/dist/components/composer/composer-text.d.ts.map +1 -0
  59. package/dist/components/composer/composer-text.js +26 -0
  60. package/dist/components/composer/composer-text.js.map +1 -0
  61. package/dist/components/composer/composer-utils.d.ts +74 -0
  62. package/dist/components/composer/composer-utils.d.ts.map +1 -0
  63. package/dist/components/composer/composer-utils.js +133 -0
  64. package/dist/components/composer/composer-utils.js.map +1 -0
  65. package/dist/components/conversation/ConversationList.d.ts +88 -0
  66. package/dist/components/conversation/ConversationList.d.ts.map +1 -0
  67. package/dist/components/conversation/ConversationList.js +81 -0
  68. package/dist/components/conversation/ConversationList.js.map +1 -0
  69. package/dist/components/conversation/ConversationRow.d.ts +66 -0
  70. package/dist/components/conversation/ConversationRow.d.ts.map +1 -0
  71. package/dist/components/conversation/ConversationRow.js +65 -0
  72. package/dist/components/conversation/ConversationRow.js.map +1 -0
  73. package/dist/components/conversation/conversation-status.d.ts +21 -0
  74. package/dist/components/conversation/conversation-status.d.ts.map +1 -0
  75. package/dist/components/conversation/conversation-status.js +33 -0
  76. package/dist/components/conversation/conversation-status.js.map +1 -0
  77. package/dist/components/intervention/ApprovalDiff.d.ts +14 -0
  78. package/dist/components/intervention/ApprovalDiff.d.ts.map +1 -0
  79. package/dist/components/intervention/ApprovalDiff.js +25 -0
  80. package/dist/components/intervention/ApprovalDiff.js.map +1 -0
  81. package/dist/components/intervention/ApprovalPanel.d.ts +57 -0
  82. package/dist/components/intervention/ApprovalPanel.d.ts.map +1 -0
  83. package/dist/components/intervention/ApprovalPanel.js +111 -0
  84. package/dist/components/intervention/ApprovalPanel.js.map +1 -0
  85. package/dist/components/intervention/ErrorRecoveryNotice.d.ts +28 -0
  86. package/dist/components/intervention/ErrorRecoveryNotice.d.ts.map +1 -0
  87. package/dist/components/intervention/ErrorRecoveryNotice.js +30 -0
  88. package/dist/components/intervention/ErrorRecoveryNotice.js.map +1 -0
  89. package/dist/components/intervention/GrantList.d.ts +49 -0
  90. package/dist/components/intervention/GrantList.d.ts.map +1 -0
  91. package/dist/components/intervention/GrantList.js +58 -0
  92. package/dist/components/intervention/GrantList.js.map +1 -0
  93. package/dist/components/intervention/InterventionDock.d.ts +24 -0
  94. package/dist/components/intervention/InterventionDock.d.ts.map +1 -0
  95. package/dist/components/intervention/InterventionDock.js +18 -0
  96. package/dist/components/intervention/InterventionDock.js.map +1 -0
  97. package/dist/components/intervention/QuestionnaireCard.d.ts +60 -0
  98. package/dist/components/intervention/QuestionnaireCard.d.ts.map +1 -0
  99. package/dist/components/intervention/QuestionnaireCard.js +322 -0
  100. package/dist/components/intervention/QuestionnaireCard.js.map +1 -0
  101. package/dist/components/intervention/action-lock.d.ts +20 -0
  102. package/dist/components/intervention/action-lock.d.ts.map +1 -0
  103. package/dist/components/intervention/action-lock.js +65 -0
  104. package/dist/components/intervention/action-lock.js.map +1 -0
  105. package/dist/components/intervention/icons.d.ts +8 -0
  106. package/dist/components/intervention/icons.d.ts.map +1 -0
  107. package/dist/components/intervention/icons.js +11 -0
  108. package/dist/components/intervention/icons.js.map +1 -0
  109. package/dist/components/intervention/questionnaire-answers.d.ts +29 -0
  110. package/dist/components/intervention/questionnaire-answers.d.ts.map +1 -0
  111. package/dist/components/intervention/questionnaire-answers.js +81 -0
  112. package/dist/components/intervention/questionnaire-answers.js.map +1 -0
  113. package/dist/components/message/AgentMessage.d.ts +98 -0
  114. package/dist/components/message/AgentMessage.d.ts.map +1 -0
  115. package/dist/components/message/AgentMessage.js +94 -0
  116. package/dist/components/message/AgentMessage.js.map +1 -0
  117. package/dist/components/message/CitationChip.d.ts +34 -0
  118. package/dist/components/message/CitationChip.d.ts.map +1 -0
  119. package/dist/components/message/CitationChip.js +30 -0
  120. package/dist/components/message/CitationChip.js.map +1 -0
  121. package/dist/components/message/CodeBlock.d.ts +45 -0
  122. package/dist/components/message/CodeBlock.d.ts.map +1 -0
  123. package/dist/components/message/CodeBlock.js +21 -0
  124. package/dist/components/message/CodeBlock.js.map +1 -0
  125. package/dist/components/message/JumpToLatest.d.ts +27 -0
  126. package/dist/components/message/JumpToLatest.d.ts.map +1 -0
  127. package/dist/components/message/JumpToLatest.js +17 -0
  128. package/dist/components/message/JumpToLatest.js.map +1 -0
  129. package/dist/components/message/Markdown.d.ts +21 -0
  130. package/dist/components/message/Markdown.d.ts.map +1 -0
  131. package/dist/components/message/Markdown.js +21 -0
  132. package/dist/components/message/Markdown.js.map +1 -0
  133. package/dist/components/message/MessageActions.d.ts +63 -0
  134. package/dist/components/message/MessageActions.d.ts.map +1 -0
  135. package/dist/components/message/MessageActions.js +83 -0
  136. package/dist/components/message/MessageActions.js.map +1 -0
  137. package/dist/components/message/MessageList.d.ts +100 -0
  138. package/dist/components/message/MessageList.d.ts.map +1 -0
  139. package/dist/components/message/MessageList.js +266 -0
  140. package/dist/components/message/MessageList.js.map +1 -0
  141. package/dist/components/message/MessagePart.d.ts +44 -0
  142. package/dist/components/message/MessagePart.d.ts.map +1 -0
  143. package/dist/components/message/MessagePart.js +146 -0
  144. package/dist/components/message/MessagePart.js.map +1 -0
  145. package/dist/components/message/RunDetails.d.ts +26 -0
  146. package/dist/components/message/RunDetails.d.ts.map +1 -0
  147. package/dist/components/message/RunDetails.js +113 -0
  148. package/dist/components/message/RunDetails.js.map +1 -0
  149. package/dist/components/message/SkillUseList.d.ts +22 -0
  150. package/dist/components/message/SkillUseList.d.ts.map +1 -0
  151. package/dist/components/message/SkillUseList.js +20 -0
  152. package/dist/components/message/SkillUseList.js.map +1 -0
  153. package/dist/components/message/ThinkingBlock.d.ts +44 -0
  154. package/dist/components/message/ThinkingBlock.d.ts.map +1 -0
  155. package/dist/components/message/ThinkingBlock.js +34 -0
  156. package/dist/components/message/ThinkingBlock.js.map +1 -0
  157. package/dist/components/message/icons.d.ts +14 -0
  158. package/dist/components/message/icons.d.ts.map +1 -0
  159. package/dist/components/message/icons.js +16 -0
  160. package/dist/components/message/icons.js.map +1 -0
  161. package/dist/components/message/plain-text.d.ts +11 -0
  162. package/dist/components/message/plain-text.d.ts.map +1 -0
  163. package/dist/components/message/plain-text.js +58 -0
  164. package/dist/components/message/plain-text.js.map +1 -0
  165. package/dist/components/message/renderers.d.ts +30 -0
  166. package/dist/components/message/renderers.d.ts.map +1 -0
  167. package/dist/components/message/renderers.js +2 -0
  168. package/dist/components/message/renderers.js.map +1 -0
  169. package/dist/components/message/use-copy.d.ts +18 -0
  170. package/dist/components/message/use-copy.d.ts.map +1 -0
  171. package/dist/components/message/use-copy.js +65 -0
  172. package/dist/components/message/use-copy.js.map +1 -0
  173. package/dist/components/process/AgentProcess.d.ts +47 -0
  174. package/dist/components/process/AgentProcess.d.ts.map +1 -0
  175. package/dist/components/process/AgentProcess.js +78 -0
  176. package/dist/components/process/AgentProcess.js.map +1 -0
  177. package/dist/components/process/RunStatus.d.ts +60 -0
  178. package/dist/components/process/RunStatus.d.ts.map +1 -0
  179. package/dist/components/process/RunStatus.js +34 -0
  180. package/dist/components/process/RunStatus.js.map +1 -0
  181. package/dist/components/shell/AgentEmptyState.d.ts +35 -0
  182. package/dist/components/shell/AgentEmptyState.d.ts.map +1 -0
  183. package/dist/components/shell/AgentEmptyState.js +20 -0
  184. package/dist/components/shell/AgentEmptyState.js.map +1 -0
  185. package/dist/components/shell/AgentHeader.d.ts +84 -0
  186. package/dist/components/shell/AgentHeader.d.ts.map +1 -0
  187. package/dist/components/shell/AgentHeader.js +38 -0
  188. package/dist/components/shell/AgentHeader.js.map +1 -0
  189. package/dist/components/shell/AgentShell.d.ts +138 -0
  190. package/dist/components/shell/AgentShell.d.ts.map +1 -0
  191. package/dist/components/shell/AgentShell.js +206 -0
  192. package/dist/components/shell/AgentShell.js.map +1 -0
  193. package/dist/components/shell/AgentSidePane.d.ts +54 -0
  194. package/dist/components/shell/AgentSidePane.d.ts.map +1 -0
  195. package/dist/components/shell/AgentSidePane.js +26 -0
  196. package/dist/components/shell/AgentSidePane.js.map +1 -0
  197. package/dist/components/shell/ResizeHandle.d.ts +50 -0
  198. package/dist/components/shell/ResizeHandle.d.ts.map +1 -0
  199. package/dist/components/shell/ResizeHandle.js +84 -0
  200. package/dist/components/shell/ResizeHandle.js.map +1 -0
  201. package/dist/components/shell/use-controllable.d.ts +9 -0
  202. package/dist/components/shell/use-controllable.d.ts.map +1 -0
  203. package/dist/components/shell/use-controllable.js +26 -0
  204. package/dist/components/shell/use-controllable.js.map +1 -0
  205. package/dist/components/tools/ChunkPager.d.ts +48 -0
  206. package/dist/components/tools/ChunkPager.d.ts.map +1 -0
  207. package/dist/components/tools/ChunkPager.js +68 -0
  208. package/dist/components/tools/ChunkPager.js.map +1 -0
  209. package/dist/components/tools/CodeModeToolTree.d.ts +64 -0
  210. package/dist/components/tools/CodeModeToolTree.d.ts.map +1 -0
  211. package/dist/components/tools/CodeModeToolTree.js +97 -0
  212. package/dist/components/tools/CodeModeToolTree.js.map +1 -0
  213. package/dist/components/tools/DiffPreview.d.ts +83 -0
  214. package/dist/components/tools/DiffPreview.d.ts.map +1 -0
  215. package/dist/components/tools/DiffPreview.js +95 -0
  216. package/dist/components/tools/DiffPreview.js.map +1 -0
  217. package/dist/components/tools/ToolActivity.d.ts +63 -0
  218. package/dist/components/tools/ToolActivity.d.ts.map +1 -0
  219. package/dist/components/tools/ToolActivity.js +45 -0
  220. package/dist/components/tools/ToolActivity.js.map +1 -0
  221. package/dist/components/tools/ToolDetails.d.ts +106 -0
  222. package/dist/components/tools/ToolDetails.d.ts.map +1 -0
  223. package/dist/components/tools/ToolDetails.js +247 -0
  224. package/dist/components/tools/ToolDetails.js.map +1 -0
  225. package/dist/components/tools/ToolHistory.d.ts +48 -0
  226. package/dist/components/tools/ToolHistory.d.ts.map +1 -0
  227. package/dist/components/tools/ToolHistory.js +37 -0
  228. package/dist/components/tools/ToolHistory.js.map +1 -0
  229. package/dist/components/tools/ToolOutput.d.ts +61 -0
  230. package/dist/components/tools/ToolOutput.d.ts.map +1 -0
  231. package/dist/components/tools/ToolOutput.js +45 -0
  232. package/dist/components/tools/ToolOutput.js.map +1 -0
  233. package/dist/components/tools/ToolRecord.d.ts +54 -0
  234. package/dist/components/tools/ToolRecord.d.ts.map +1 -0
  235. package/dist/components/tools/ToolRecord.js +78 -0
  236. package/dist/components/tools/ToolRecord.js.map +1 -0
  237. package/dist/components/tools/shared.d.ts +93 -0
  238. package/dist/components/tools/shared.d.ts.map +1 -0
  239. package/dist/components/tools/shared.js +160 -0
  240. package/dist/components/tools/shared.js.map +1 -0
  241. package/dist/components/workspace/ActivityLedger.d.ts +44 -0
  242. package/dist/components/workspace/ActivityLedger.d.ts.map +1 -0
  243. package/dist/components/workspace/ActivityLedger.js +63 -0
  244. package/dist/components/workspace/ActivityLedger.js.map +1 -0
  245. package/dist/components/workspace/CompactionNotice.d.ts +63 -0
  246. package/dist/components/workspace/CompactionNotice.d.ts.map +1 -0
  247. package/dist/components/workspace/CompactionNotice.js +36 -0
  248. package/dist/components/workspace/CompactionNotice.js.map +1 -0
  249. package/dist/components/workspace/ContextUsage.d.ts +44 -0
  250. package/dist/components/workspace/ContextUsage.d.ts.map +1 -0
  251. package/dist/components/workspace/ContextUsage.js +106 -0
  252. package/dist/components/workspace/ContextUsage.js.map +1 -0
  253. package/dist/components/workspace/PersistentTerminal.d.ts +86 -0
  254. package/dist/components/workspace/PersistentTerminal.d.ts.map +1 -0
  255. package/dist/components/workspace/PersistentTerminal.js +155 -0
  256. package/dist/components/workspace/PersistentTerminal.js.map +1 -0
  257. package/dist/components/workspace/PinnedSummary.d.ts +43 -0
  258. package/dist/components/workspace/PinnedSummary.d.ts.map +1 -0
  259. package/dist/components/workspace/PinnedSummary.js +33 -0
  260. package/dist/components/workspace/PinnedSummary.js.map +1 -0
  261. package/dist/components/workspace/RunSummary.d.ts +35 -0
  262. package/dist/components/workspace/RunSummary.d.ts.map +1 -0
  263. package/dist/components/workspace/RunSummary.js +46 -0
  264. package/dist/components/workspace/RunSummary.js.map +1 -0
  265. package/dist/components/workspace/SubAgentCard.d.ts +60 -0
  266. package/dist/components/workspace/SubAgentCard.d.ts.map +1 -0
  267. package/dist/components/workspace/SubAgentCard.js +73 -0
  268. package/dist/components/workspace/SubAgentCard.js.map +1 -0
  269. package/dist/components/workspace/TerminalRow.d.ts +51 -0
  270. package/dist/components/workspace/TerminalRow.d.ts.map +1 -0
  271. package/dist/components/workspace/TerminalRow.js +62 -0
  272. package/dist/components/workspace/TerminalRow.js.map +1 -0
  273. package/dist/components/workspace/shared.d.ts +22 -0
  274. package/dist/components/workspace/shared.d.ts.map +1 -0
  275. package/dist/components/workspace/shared.js +36 -0
  276. package/dist/components/workspace/shared.js.map +1 -0
  277. package/dist/index.d.ts +130 -0
  278. package/dist/index.d.ts.map +1 -0
  279. package/dist/index.js +76 -0
  280. package/dist/index.js.map +1 -0
  281. package/dist/motion/agent-motion.d.ts +62 -0
  282. package/dist/motion/agent-motion.d.ts.map +1 -0
  283. package/dist/motion/agent-motion.js +61 -0
  284. package/dist/motion/agent-motion.js.map +1 -0
  285. package/dist/primitives/AgentSpark.d.ts +17 -0
  286. package/dist/primitives/AgentSpark.d.ts.map +1 -0
  287. package/dist/primitives/AgentSpark.js +11 -0
  288. package/dist/primitives/AgentSpark.js.map +1 -0
  289. package/dist/primitives/AgentStatus.d.ts +32 -0
  290. package/dist/primitives/AgentStatus.d.ts.map +1 -0
  291. package/dist/primitives/AgentStatus.js +13 -0
  292. package/dist/primitives/AgentStatus.js.map +1 -0
  293. package/dist/primitives/StatusGlyph.d.ts +10 -0
  294. package/dist/primitives/StatusGlyph.d.ts.map +1 -0
  295. package/dist/primitives/StatusGlyph.js +31 -0
  296. package/dist/primitives/StatusGlyph.js.map +1 -0
  297. package/dist/primitives/icons.d.ts +7 -0
  298. package/dist/primitives/icons.d.ts.map +1 -0
  299. package/dist/primitives/icons.js +55 -0
  300. package/dist/primitives/icons.js.map +1 -0
  301. package/dist/provider/AgentMessages.d.ts +51 -0
  302. package/dist/provider/AgentMessages.d.ts.map +1 -0
  303. package/dist/provider/AgentMessages.js +77 -0
  304. package/dist/provider/AgentMessages.js.map +1 -0
  305. package/dist/provider/messages/composer.d.ts +90 -0
  306. package/dist/provider/messages/composer.d.ts.map +1 -0
  307. package/dist/provider/messages/composer.js +155 -0
  308. package/dist/provider/messages/composer.js.map +1 -0
  309. package/dist/provider/messages/intervention.d.ts +135 -0
  310. package/dist/provider/messages/intervention.d.ts.map +1 -0
  311. package/dist/provider/messages/intervention.js +321 -0
  312. package/dist/provider/messages/intervention.js.map +1 -0
  313. package/dist/provider/messages/message.d.ts +118 -0
  314. package/dist/provider/messages/message.d.ts.map +1 -0
  315. package/dist/provider/messages/message.js +224 -0
  316. package/dist/provider/messages/message.js.map +1 -0
  317. package/dist/provider/messages/shell.d.ts +70 -0
  318. package/dist/provider/messages/shell.d.ts.map +1 -0
  319. package/dist/provider/messages/shell.js +109 -0
  320. package/dist/provider/messages/shell.js.map +1 -0
  321. package/dist/provider/messages/status.d.ts +20 -0
  322. package/dist/provider/messages/status.d.ts.map +1 -0
  323. package/dist/provider/messages/status.js +195 -0
  324. package/dist/provider/messages/status.js.map +1 -0
  325. package/dist/provider/messages/tools.d.ts +210 -0
  326. package/dist/provider/messages/tools.d.ts.map +1 -0
  327. package/dist/provider/messages/tools.js +482 -0
  328. package/dist/provider/messages/tools.js.map +1 -0
  329. package/dist/provider/messages/workspace.d.ts +176 -0
  330. package/dist/provider/messages/workspace.d.ts.map +1 -0
  331. package/dist/provider/messages/workspace.js +325 -0
  332. package/dist/provider/messages/workspace.js.map +1 -0
  333. package/dist/styles/artifact.css +564 -0
  334. package/dist/styles/base.css +220 -0
  335. package/dist/styles/composer.css +1001 -0
  336. package/dist/styles/conversation.css +275 -0
  337. package/dist/styles/intervention.css +929 -0
  338. package/dist/styles/message.css +917 -0
  339. package/dist/styles/process.css +207 -0
  340. package/dist/styles/shell.css +441 -0
  341. package/dist/styles/tools.css +929 -0
  342. package/dist/styles/workspace.css +1294 -0
  343. package/dist/utils/cx.d.ts +3 -0
  344. package/dist/utils/cx.d.ts.map +1 -0
  345. package/dist/utils/cx.js +5 -0
  346. package/dist/utils/cx.js.map +1 -0
  347. package/package.json +64 -3
@@ -0,0 +1,63 @@
1
+ import * as React from 'react';
2
+ import type { CapabilityInput } from '@wzrhine/agent-core';
3
+ import type { CopyHandler } from './use-copy.js';
4
+ export type MessageFeedback = 'up' | 'down';
5
+ /** Actions that can be gated by a capability. */
6
+ export type MessageActionKey = 'copy' | 'regenerate' | 'edit' | 'fork' | 'restore' | 'feedback';
7
+ /** Per-action availability: `Capability` (`{ enabled, reason }`) or a boolean. Absent = enabled. */
8
+ export type MessageActionCapabilities = Partial<Record<MessageActionKey, CapabilityInput>>;
9
+ /**
10
+ * MessageActions: a `role="toolbar"` of icon buttons for one message. A capability without a
11
+ * callback renders no button (ADR-0011 §4); copy appears when `copyText` is given and either
12
+ * `onCopy` or the Clipboard API exists. One tab stop: arrow keys / Home / End move between the
13
+ * buttons (roving tabindex), Tab leaves the toolbar.
14
+ *
15
+ * Capabilities: an action whose capability is `enabled: false` still renders (the reader learns
16
+ * it exists and why it is off) but is `aria-disabled` — it stays focusable and in the roving
17
+ * order — and its callback is never called. The reason shows in a Tooltip ("name · reason") on
18
+ * hover / focus and is the button's `aria-describedby` text, so it is not hover-only.
19
+ *
20
+ * `onRestoreInput` ("重新编辑本轮输入") puts this turn's input back into the composer; it is a
21
+ * different action from `onEdit` ("编辑消息"), which edits the sent message.
22
+ *
23
+ * Copy feedback: the button's name and icon switch to "已复制" / "复制失败" for 1.2s and a polite
24
+ * status announces it once. Feedback buttons are toggles (`aria-pressed`); pressing the active
25
+ * one again sends `null`. No motion beyond the IconButton press; the Tooltip uses its own fade.
26
+ */
27
+ export type MessageActionsProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onCopy'> & {
28
+ /** Text copied by the copy action; omit to hide copy. */
29
+ copyText?: string;
30
+ onCopy?: CopyHandler;
31
+ onRegenerate?: () => void;
32
+ onEdit?: () => void;
33
+ onFork?: () => void;
34
+ /** Restore this turn's input into the composer (not the same as `onEdit`). */
35
+ onRestoreInput?: () => void;
36
+ feedback?: MessageFeedback | null;
37
+ onFeedback?: (value: MessageFeedback | null) => void;
38
+ /** Availability per action; a disabled one is shown `aria-disabled` with its reason. */
39
+ capabilities?: MessageActionCapabilities;
40
+ /** Toolbar name; defaults to the copy table. */
41
+ label?: string;
42
+ /** Extra trailing buttons (rendered inside the toolbar, part of the roving order). */
43
+ children?: React.ReactNode;
44
+ };
45
+ export declare const MessageActions: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "onCopy"> & {
46
+ /** Text copied by the copy action; omit to hide copy. */
47
+ copyText?: string;
48
+ onCopy?: CopyHandler;
49
+ onRegenerate?: () => void;
50
+ onEdit?: () => void;
51
+ onFork?: () => void;
52
+ /** Restore this turn's input into the composer (not the same as `onEdit`). */
53
+ onRestoreInput?: () => void;
54
+ feedback?: MessageFeedback | null;
55
+ onFeedback?: (value: MessageFeedback | null) => void;
56
+ /** Availability per action; a disabled one is shown `aria-disabled` with its reason. */
57
+ capabilities?: MessageActionCapabilities;
58
+ /** Toolbar name; defaults to the copy table. */
59
+ label?: string;
60
+ /** Extra trailing buttons (rendered inside the toolbar, part of the roving order). */
61
+ children?: React.ReactNode;
62
+ } & React.RefAttributes<HTMLDivElement>>;
63
+ //# sourceMappingURL=MessageActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageActions.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageActions.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,CAAC;AAE5C,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhG,oGAAoG;AACpG,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC;AAE3F;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IACpG,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD,wFAAwF;IACxF,YAAY,CAAC,EAAE,yBAAyB,CAAC;IACzC,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAsDF,eAAO,MAAM,cAAc;IAtEzB,yDAAyD;eAC9C,MAAM;aACR,WAAW;mBACL,MAAM,IAAI;aAChB,MAAM,IAAI;aACV,MAAM,IAAI;IACnB,8EAA8E;qBAC7D,MAAM,IAAI;eAChB,eAAe,GAAG,IAAI;iBACpB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI;IACpD,wFAAwF;mBACzE,yBAAyB;IACxC,gDAAgD;YACxC,MAAM;IACd,sFAAsF;eAC3E,KAAK,CAAC,SAAS;wCAkK1B,CAAC"}
@@ -0,0 +1,83 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { IconButton, Tooltip } from '@wzrhine/react';
5
+ import { capability } from '@wzrhine/agent-core';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ import { MessageIcon } from './icons.js';
10
+ import { useClipboardAvailable, useCopy } from './use-copy.js';
11
+ /**
12
+ * One toolbar button. The Tooltip wrapper is always present (enabled only while the action is
13
+ * off), so a capability flip never remounts the button or drops focus.
14
+ */
15
+ function ActionButton({ action, label, icon, cap, onPress, pressed, state }) {
16
+ const t = useAgentMessages().message;
17
+ const reasonId = React.useId();
18
+ const off = cap !== undefined && !cap.enabled;
19
+ const reason = off && cap.reason ? cap.reason : undefined;
20
+ return (_jsxs(_Fragment, { children: [_jsx(Tooltip, { content: reason ? t.actionUnavailable(label, reason) : label, disabled: !off, children: _jsx(IconButton, { size: "sm", variant: "ghost", label: label, "data-action": action, "data-state": state, pressed: pressed, icon: icon, "aria-disabled": off || undefined, "aria-describedby": reason ? reasonId : undefined,
21
+ // While off the Tooltip shows name + reason; a native title would duplicate it.
22
+ title: off ? '' : undefined, onClick: (event) => {
23
+ if (off) {
24
+ event.preventDefault();
25
+ return;
26
+ }
27
+ onPress();
28
+ } }) }), reason && (_jsx("span", { id: reasonId, className: "rl-agent-sr", children: reason }))] }));
29
+ }
30
+ export const MessageActions = React.forwardRef(function MessageActions({ copyText, onCopy, onRegenerate, onEdit, onFork, onRestoreInput, feedback = null, onFeedback, capabilities, label, children, className, onKeyDown, ...rest }, ref) {
31
+ const t = useAgentMessages().message;
32
+ const clipboard = useClipboardAvailable();
33
+ const { state, copy } = useCopy(onCopy);
34
+ const [active, setActive] = React.useState(0);
35
+ const root = React.useRef(null);
36
+ React.useImperativeHandle(ref, () => root.current);
37
+ const cap = (key) => capability(capabilities?.[key]);
38
+ const canCopy = copyText !== undefined && (onCopy !== undefined || clipboard);
39
+ const copyName = state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : t.copy;
40
+ // aria-disabled buttons stay in the roving order: they keep focus and explain why they are off.
41
+ const buttons = () => Array.from(root.current?.querySelectorAll('button:not([disabled])') ?? []);
42
+ // Keep exactly one button in the tab order; re-applied after every render (buttons may change).
43
+ React.useLayoutEffect(() => {
44
+ const list = buttons();
45
+ const index = Math.min(active, list.length - 1);
46
+ list.forEach((button, i) => {
47
+ button.tabIndex = i === index ? 0 : -1;
48
+ });
49
+ });
50
+ const handleKeyDown = (event) => {
51
+ onKeyDown?.(event);
52
+ if (event.defaultPrevented)
53
+ return;
54
+ const list = buttons();
55
+ const current = list.indexOf(document.activeElement);
56
+ if (current === -1)
57
+ return;
58
+ let next = current;
59
+ if (event.key === 'ArrowRight' || event.key === 'ArrowDown')
60
+ next = (current + 1) % list.length;
61
+ else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp')
62
+ next = (current - 1 + list.length) % list.length;
63
+ else if (event.key === 'Home')
64
+ next = 0;
65
+ else if (event.key === 'End')
66
+ next = list.length - 1;
67
+ else
68
+ return;
69
+ event.preventDefault();
70
+ setActive(next);
71
+ list[next]?.focus();
72
+ };
73
+ const handleFocus = (event) => {
74
+ const index = buttons().indexOf(event.target);
75
+ if (index !== -1)
76
+ setActive(index);
77
+ };
78
+ const hasAny = canCopy || onRegenerate || onEdit || onFork || onRestoreInput || onFeedback || children;
79
+ if (!hasAny)
80
+ return null;
81
+ return (_jsxs("div", { ...rest, ref: root, role: "toolbar", "aria-label": label ?? t.actionsLabel, "aria-orientation": "horizontal", className: cx('rl-agent-actions', className), onKeyDown: handleKeyDown, onFocus: handleFocus, children: [canCopy && (_jsx(ActionButton, { action: "copy", label: copyName, state: state, cap: cap('copy'), icon: _jsx(AgentIcon, { name: state === 'copied' ? 'check' : 'copy' }), onPress: () => void copy(copyText) })), onRegenerate && _jsx(ActionButton, { action: "regenerate", label: t.regenerate, cap: cap('regenerate'), icon: _jsx(AgentIcon, { name: "retry" }), onPress: onRegenerate }), onEdit && _jsx(ActionButton, { action: "edit", label: t.edit, cap: cap('edit'), icon: _jsx(AgentIcon, { name: "edit" }), onPress: onEdit }), onRestoreInput && (_jsx(ActionButton, { action: "restore", label: t.restoreInput, cap: cap('restore'), icon: _jsx(MessageIcon, { name: "restore-input" }), onPress: onRestoreInput })), onFork && _jsx(ActionButton, { action: "fork", label: t.fork, cap: cap('fork'), icon: _jsx(AgentIcon, { name: "fork" }), onPress: onFork }), onFeedback && (_jsxs(_Fragment, { children: [_jsx(ActionButton, { action: "feedback-up", label: t.feedbackUp, cap: cap('feedback'), pressed: feedback === 'up', icon: _jsx(MessageIcon, { name: "thumb-up" }), onPress: () => onFeedback(feedback === 'up' ? null : 'up') }), _jsx(ActionButton, { action: "feedback-down", label: t.feedbackDown, cap: cap('feedback'), pressed: feedback === 'down', icon: _jsx(MessageIcon, { name: "thumb-down" }), onPress: () => onFeedback(feedback === 'down' ? null : 'down') })] })), children, canCopy && (_jsx("span", { className: "rl-agent-sr", role: "status", children: state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : '' }))] }));
82
+ });
83
+ //# sourceMappingURL=MessageActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageActions.js","sourceRoot":"","sources":["../../../src/components/message/MessageActions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import * as React from 'react';
2
+ import type { MessageView } from '@wzrhine/agent-core';
3
+ import type { AgentMessageProps } from './AgentMessage.js';
4
+ /** Distance from the bottom (px, measured in JS) that still counts as "at the latest content". */
5
+ export declare const FOLLOW_THRESHOLD_PX = 4;
6
+ /** Imperative handle of MessageList. */
7
+ export interface MessageListHandle {
8
+ /** Scroll to the newest content and resume following (smooth unless motion is reduced). */
9
+ scrollToLatest: (options?: {
10
+ smooth?: boolean;
11
+ }) => void;
12
+ /** Whether the list currently follows new content. */
13
+ isFollowing: () => boolean;
14
+ /** The scrolling viewport element. */
15
+ viewport: () => HTMLElement | null;
16
+ }
17
+ /**
18
+ * MessageList (atlas 07): the conversation viewport. It owns its own vertical scroll and decides
19
+ * when to follow new content; it never moves focus.
20
+ *
21
+ * Semantics: a focusable `<section aria-label="对话消息">` (keyboard scrolling) containing an
22
+ * `<ol>` of messages. Deliberately **not** `role="log"`: a log is an implicit polite live region
23
+ * and would read streamed text token by token. Announcements come from each AgentMessage's own
24
+ * throttled status line instead.
25
+ *
26
+ * Scroll ownership:
27
+ * - Follows the bottom while the reader is within `FOLLOW_THRESHOLD_PX` of it (on mount, while
28
+ * streaming, when a disclosure grows — content size is watched with ResizeObserver).
29
+ * - Stops following as soon as the reader moves up: wheel up, touch drag, PageUp / Home /
30
+ * ArrowUp on the viewport, scrollbar drag (any scroll that decreases `scrollTop` and was not
31
+ * made by the list itself). Resumes when the reader is back at the bottom.
32
+ * - While not following, JumpToLatest shows, counting messages appended since the reader left.
33
+ * - A new trailing user message (just sent) scrolls to the latest once.
34
+ * - Loading earlier messages keeps the reading anchor: the first visible `[data-message-id]` and
35
+ * its offset are recorded before `onLoadEarlier` and restored after the prepend.
36
+ * - `overflow-anchor: none`, so browser scroll anchoring never fights these rules.
37
+ * - `holdFollow`: while true (e.g. an approval is docked above the composer and the reader must
38
+ * not lose it), appended messages and content growth do not move the viewport. The follow
39
+ * intent is kept; JumpToLatest shows once held content has arrived (counting messages since the
40
+ * hold began) and an explicit jump or a just-sent user message still scrolls. When the hold
41
+ * ends and the reader has not scrolled away, the list returns to the bottom and follows again.
42
+ * Mount and a conversation switch still start at the latest content.
43
+ *
44
+ * Motion: only messages that appear after mount (appended, not prepended history) play the
45
+ * AgentEntrance `message` entrance, once. No layout animation on the list. The jump uses a smooth
46
+ * scroll, `auto` under reduced motion.
47
+ */
48
+ export type MessageListProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
49
+ messages: MessageView[];
50
+ /** Custom rendering per message; the list still wraps it in a keyed `<li data-message-id>`. */
51
+ renderMessage?: (message: MessageView, index: number) => React.ReactNode;
52
+ /** Props forwarded to the default AgentMessage (handlers, renderers). */
53
+ messageProps?: Omit<AgentMessageProps, 'message'>;
54
+ isStreaming?: boolean;
55
+ /** First load: no messages yet. */
56
+ loading?: boolean;
57
+ hasEarlier?: boolean;
58
+ onLoadEarlier?: () => void;
59
+ loadingEarlier?: boolean;
60
+ /** Error text for the last earlier-load attempt; shows a retry button. */
61
+ earlierError?: React.ReactNode;
62
+ /** Replaces the default empty state. */
63
+ empty?: React.ReactNode;
64
+ /** Content after the last message inside the scroller (run summary, typing line). */
65
+ footer?: React.ReactNode;
66
+ onFollowChange?: (following: boolean) => void;
67
+ /** Accessible name of the viewport. */
68
+ label?: string;
69
+ /** Turn off entrance motion for appended messages. */
70
+ animateEntrance?: boolean;
71
+ /** Pause auto-follow while true (content still renders); resumes on release if still at the latest. */
72
+ holdFollow?: boolean;
73
+ };
74
+ export declare const MessageList: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
75
+ messages: MessageView[];
76
+ /** Custom rendering per message; the list still wraps it in a keyed `<li data-message-id>`. */
77
+ renderMessage?: (message: MessageView, index: number) => React.ReactNode;
78
+ /** Props forwarded to the default AgentMessage (handlers, renderers). */
79
+ messageProps?: Omit<AgentMessageProps, "message">;
80
+ isStreaming?: boolean;
81
+ /** First load: no messages yet. */
82
+ loading?: boolean;
83
+ hasEarlier?: boolean;
84
+ onLoadEarlier?: () => void;
85
+ loadingEarlier?: boolean;
86
+ /** Error text for the last earlier-load attempt; shows a retry button. */
87
+ earlierError?: React.ReactNode;
88
+ /** Replaces the default empty state. */
89
+ empty?: React.ReactNode;
90
+ /** Content after the last message inside the scroller (run summary, typing line). */
91
+ footer?: React.ReactNode;
92
+ onFollowChange?: (following: boolean) => void;
93
+ /** Accessible name of the viewport. */
94
+ label?: string;
95
+ /** Turn off entrance motion for appended messages. */
96
+ animateEntrance?: boolean;
97
+ /** Pause auto-follow while true (content still renders); resumes on release if still at the latest. */
98
+ holdFollow?: boolean;
99
+ } & React.RefAttributes<MessageListHandle>>;
100
+ //# sourceMappingURL=MessageList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,kGAAkG;AAClG,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACzD,sDAAsD;IACtD,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACtF,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACzE,yEAAyE;IACzE,YAAY,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,qFAAqF;IACrF,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uGAAuG;IACvG,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAuBF,eAAO,MAAM,WAAW;cA/CZ,WAAW,EAAE;IACvB,+FAA+F;oBAC/E,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS;IACxE,yEAAyE;mBAC1D,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC;kBACnC,OAAO;IACrB,mCAAmC;cACzB,OAAO;iBACJ,OAAO;oBACJ,MAAM,IAAI;qBACT,OAAO;IACxB,0EAA0E;mBAC3D,KAAK,CAAC,SAAS;IAC9B,wCAAwC;YAChC,KAAK,CAAC,SAAS;IACvB,qFAAqF;aAC5E,KAAK,CAAC,SAAS;qBACP,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;IAC7C,uCAAuC;YAC/B,MAAM;IACd,sDAAsD;sBACpC,OAAO;IACzB,uGAAuG;iBAC1F,OAAO;2CA4VpB,CAAC"}
@@ -0,0 +1,266 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Button, EmptyState, Spinner, useRhineMotion } from '@wzrhine/react';
5
+ import { AgentEntrance } from '../../motion/agent-motion.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ import { AgentMessage } from './AgentMessage.js';
9
+ import { JumpToLatest } from './JumpToLatest.js';
10
+ /** Distance from the bottom (px, measured in JS) that still counts as "at the latest content". */
11
+ export const FOLLOW_THRESHOLD_PX = 4;
12
+ function itemNodes(viewport) {
13
+ return Array.from(viewport.querySelectorAll('li[data-message-id]'));
14
+ }
15
+ function distanceFromBottom(el) {
16
+ return el.scrollHeight - el.scrollTop - el.clientHeight;
17
+ }
18
+ /** First message whose box is (partly) below the viewport's top edge, with its offset from it. */
19
+ function captureAnchor(viewport) {
20
+ const top = viewport.getBoundingClientRect().top;
21
+ const nodes = itemNodes(viewport);
22
+ const node = nodes.find((el) => el.getBoundingClientRect().bottom > top) ?? nodes[0];
23
+ const id = node?.dataset.messageId;
24
+ return node && id ? { id, offset: node.getBoundingClientRect().top - top } : null;
25
+ }
26
+ const UP_KEYS = new Set(['ArrowUp', 'PageUp', 'Home']);
27
+ export const MessageList = React.forwardRef(function MessageList({ messages, renderMessage, messageProps, isStreaming = false, loading = false, hasEarlier = false, onLoadEarlier, loadingEarlier = false, earlierError, empty, footer, onFollowChange, label, animateEntrance = true, holdFollow = false, className, ...rest }, ref) {
28
+ const t = useAgentMessages().message;
29
+ const { reduced } = useRhineMotion();
30
+ const viewportRef = React.useRef(null);
31
+ const contentRef = React.useRef(null);
32
+ const followingRef = React.useRef(true);
33
+ const [following, setFollowingState] = React.useState(true);
34
+ const [leaveLastId, setLeaveLastId] = React.useState(null);
35
+ const lastTop = React.useRef(0);
36
+ const touchY = React.useRef(null);
37
+ const anchor = React.useRef(null);
38
+ const messagesRef = React.useRef(messages);
39
+ messagesRef.current = messages;
40
+ const holdRef = React.useRef(holdFollow);
41
+ holdRef.current = holdFollow;
42
+ /** Held content is waiting below the viewport; `holdBase` is the last id when the hold began. */
43
+ const [held, setHeld] = React.useState(false);
44
+ const holdBase = React.useRef(holdFollow ? (messages[messages.length - 1]?.id ?? null) : null);
45
+ const prevHold = React.useRef(holdFollow);
46
+ const mounted = React.useRef(false);
47
+ const setFollowing = React.useCallback((next) => {
48
+ if (followingRef.current === next)
49
+ return;
50
+ followingRef.current = next;
51
+ setFollowingState(next);
52
+ setLeaveLastId(next ? null : (messagesRef.current[messagesRef.current.length - 1]?.id ?? null));
53
+ }, []);
54
+ /** Programmatic scroll: remembered as the last position so the scroll event is not read as intent. */
55
+ const setTop = React.useCallback((value) => {
56
+ const el = viewportRef.current;
57
+ if (!el)
58
+ return;
59
+ el.scrollTop = value;
60
+ lastTop.current = el.scrollTop;
61
+ }, []);
62
+ const toBottom = React.useCallback(() => {
63
+ const el = viewportRef.current;
64
+ if (el)
65
+ setTop(el.scrollHeight);
66
+ }, [setTop]);
67
+ /** Follow-driven move to the bottom; suppressed (and remembered) while `holdFollow` is on. */
68
+ const followBottom = React.useCallback(() => {
69
+ const el = viewportRef.current;
70
+ if (!el)
71
+ return;
72
+ if (holdRef.current && mounted.current) {
73
+ if (distanceFromBottom(el) > FOLLOW_THRESHOLD_PX)
74
+ setHeld(true);
75
+ return;
76
+ }
77
+ toBottom();
78
+ }, [toBottom]);
79
+ const restoreAnchor = React.useCallback(() => {
80
+ const el = viewportRef.current;
81
+ const saved = anchor.current;
82
+ if (!el || !saved)
83
+ return false;
84
+ const node = itemNodes(el).find((n) => n.dataset.messageId === saved.id);
85
+ if (!node) {
86
+ anchor.current = null;
87
+ return false;
88
+ }
89
+ setTop(el.scrollTop + node.getBoundingClientRect().top - el.getBoundingClientRect().top - saved.offset);
90
+ return true;
91
+ }, [setTop]);
92
+ const scrollToLatest = React.useCallback((options) => {
93
+ const el = viewportRef.current;
94
+ anchor.current = null;
95
+ setFollowing(true);
96
+ setHeld(false);
97
+ if (!el)
98
+ return;
99
+ const smooth = (options?.smooth ?? true) && !reduced;
100
+ if (smooth && typeof el.scrollTo === 'function')
101
+ el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });
102
+ else
103
+ toBottom();
104
+ }, [reduced, setFollowing, toBottom]);
105
+ React.useImperativeHandle(ref, () => ({ scrollToLatest, isFollowing: () => followingRef.current, viewport: () => viewportRef.current }), [scrollToLatest]);
106
+ const releaseFollow = React.useCallback(() => {
107
+ const el = viewportRef.current;
108
+ if (!el || el.scrollHeight <= el.clientHeight)
109
+ return;
110
+ setFollowing(false);
111
+ }, [setFollowing]);
112
+ // Prepend detection: read the old DOM before React commits the new list (snapshot pattern).
113
+ const prevFirst = React.useRef(messages[0]?.id);
114
+ if (messages[0]?.id !== prevFirst.current && anchor.current === null && viewportRef.current && !followingRef.current) {
115
+ anchor.current = captureAnchor(viewportRef.current);
116
+ }
117
+ // Entrance only for messages appended after mount; prepended history and the first render stay still.
118
+ const known = React.useRef(null);
119
+ if (known.current === null)
120
+ known.current = new Set(messages.map((m) => m.id));
121
+ let lastKnownIndex = -1;
122
+ messages.forEach((m, i) => {
123
+ if (known.current.has(m.id))
124
+ lastKnownIndex = i;
125
+ });
126
+ // Nothing in common with what was shown before (conversation switch, snapshot reload): history.
127
+ const replaced = lastKnownIndex === -1 && known.current.size > 0;
128
+ const replacedRef = React.useRef(false);
129
+ replacedRef.current = replaced;
130
+ const prevLast = React.useRef(messages[messages.length - 1]?.id);
131
+ // Hold start: the base is the last message that was on screen before this render.
132
+ if (holdFollow && !prevHold.current)
133
+ holdBase.current = prevLast.current ?? null;
134
+ prevHold.current = holdFollow;
135
+ React.useLayoutEffect(() => {
136
+ const ids = known.current;
137
+ const reposition = !mounted.current || replacedRef.current;
138
+ if (replacedRef.current) {
139
+ // A different conversation: start at its latest content, following.
140
+ anchor.current = null;
141
+ setFollowing(true);
142
+ setHeld(false);
143
+ }
144
+ for (const m of messages)
145
+ ids.add(m.id);
146
+ prevFirst.current = messages[0]?.id;
147
+ const last = messages[messages.length - 1];
148
+ const sent = last !== undefined && last.id !== prevLast.current && last.role === 'user';
149
+ prevLast.current = last?.id;
150
+ if (restoreAnchor()) {
151
+ if (!loadingEarlier)
152
+ anchor.current = null;
153
+ return;
154
+ }
155
+ if (sent)
156
+ scrollToLatest({ smooth: false });
157
+ else if (reposition)
158
+ toBottom();
159
+ else if (followingRef.current)
160
+ followBottom();
161
+ mounted.current = true;
162
+ }, [messages, loadingEarlier, restoreAnchor, scrollToLatest, setFollowing, toBottom, followBottom]);
163
+ // Hold off: back to the bottom if the reader did not scroll away meanwhile.
164
+ React.useLayoutEffect(() => {
165
+ if (holdFollow)
166
+ return;
167
+ holdBase.current = null;
168
+ setHeld(false);
169
+ if (mounted.current && followingRef.current && !anchor.current)
170
+ toBottom();
171
+ }, [holdFollow, toBottom]);
172
+ // Content growth (streaming text, disclosures, images): keep the bottom or the anchor.
173
+ React.useEffect(() => {
174
+ const content = contentRef.current;
175
+ if (!content || typeof ResizeObserver === 'undefined')
176
+ return undefined;
177
+ const observer = new ResizeObserver(() => {
178
+ if (restoreAnchor())
179
+ return;
180
+ if (followingRef.current)
181
+ followBottom();
182
+ });
183
+ observer.observe(content);
184
+ return () => observer.disconnect();
185
+ }, [restoreAnchor, followBottom]);
186
+ const reportedFollow = React.useRef(following);
187
+ React.useEffect(() => {
188
+ if (reportedFollow.current === following)
189
+ return;
190
+ reportedFollow.current = following;
191
+ onFollowChange?.(following);
192
+ }, [following, onFollowChange]);
193
+ const handleScroll = () => {
194
+ const el = viewportRef.current;
195
+ if (!el)
196
+ return;
197
+ const top = el.scrollTop;
198
+ const distance = distanceFromBottom(el);
199
+ // Programmatic moves update `lastTop` first, so any other change is the reader's own scroll.
200
+ if (Math.abs(top - lastTop.current) > 1 && !loadingEarlier)
201
+ anchor.current = null;
202
+ if (top < lastTop.current - 1 && distance > FOLLOW_THRESHOLD_PX) {
203
+ // Moved up and not by us: scrollbar drag, keyboard, wheel, touch, find-in-page.
204
+ releaseFollow();
205
+ }
206
+ else if (distance <= FOLLOW_THRESHOLD_PX && !anchor.current) {
207
+ setFollowing(true);
208
+ setHeld(false);
209
+ }
210
+ lastTop.current = top;
211
+ };
212
+ const handleLoadEarlier = () => {
213
+ const el = viewportRef.current;
214
+ if (!onLoadEarlier || loadingEarlier)
215
+ return;
216
+ if (el)
217
+ anchor.current = captureAnchor(el);
218
+ setFollowing(false);
219
+ onLoadEarlier();
220
+ };
221
+ React.useEffect(() => {
222
+ if (earlierError)
223
+ anchor.current = null;
224
+ }, [earlierError]);
225
+ const atLatest = following && !held;
226
+ const unread = (() => {
227
+ const base = !following ? leaveLastId : held ? holdBase.current : null;
228
+ if (atLatest || base === null)
229
+ return 0;
230
+ const index = messages.findIndex((m) => m.id === base);
231
+ return index === -1 ? 0 : messages.length - 1 - index;
232
+ })();
233
+ const ownsEvent = (target) => target instanceof Node && viewportRef.current?.contains(target) === true;
234
+ const showEmpty = messages.length === 0 && !loading;
235
+ return (_jsxs("div", { ...rest, className: cx('rl-agent-list', className), "data-following": following || undefined, "data-hold": holdFollow || undefined, "data-streaming": isStreaming || undefined, children: [_jsx("section", { ref: viewportRef, className: "rl-agent-list__viewport", "aria-label": label ?? t.listLabel, "aria-busy": loading || loadingEarlier || undefined, tabIndex: 0, onScroll: handleScroll, onWheel: (event) => {
236
+ if (!ownsEvent(event.target))
237
+ return;
238
+ anchor.current = null;
239
+ if (event.deltaY < 0)
240
+ releaseFollow();
241
+ }, onKeyDown: (event) => {
242
+ if (event.target !== event.currentTarget)
243
+ return;
244
+ if (UP_KEYS.has(event.key) || (event.key === ' ' && event.shiftKey)) {
245
+ anchor.current = null;
246
+ releaseFollow();
247
+ }
248
+ }, onTouchStart: (event) => {
249
+ touchY.current = event.touches[0]?.clientY ?? null;
250
+ }, onTouchMove: (event) => {
251
+ const y = event.touches[0]?.clientY;
252
+ if (touchY.current !== null && y !== undefined) {
253
+ if (y > touchY.current) {
254
+ anchor.current = null;
255
+ releaseFollow();
256
+ }
257
+ touchY.current = y;
258
+ }
259
+ }, onTouchEnd: () => {
260
+ touchY.current = null;
261
+ }, children: _jsxs("div", { ref: contentRef, className: "rl-agent-list__content", children: [hasEarlier && onLoadEarlier && (_jsx("div", { className: "rl-agent-list__earlier", children: earlierError ? (_jsxs("p", { className: "rl-agent-list__earlier-error", children: [_jsx("span", { children: earlierError === true ? t.earlierFailed : earlierError }), _jsx(Button, { size: "sm", variant: "secondary", onClick: handleLoadEarlier, children: t.retryEarlier })] })) : (_jsx(Button, { size: "sm", variant: "ghost", loading: loadingEarlier, onClick: handleLoadEarlier, children: loadingEarlier ? t.loadingEarlier : t.loadEarlier })) })), loading && messages.length === 0 && (_jsxs("div", { className: "rl-agent-list__loading", children: [_jsx(Spinner, { size: "sm", label: t.loading }), _jsx("span", { "aria-hidden": "true", children: t.loading })] })), showEmpty && _jsx("div", { className: "rl-agent-list__empty", children: empty ?? _jsx(EmptyState, { size: "sm", title: t.empty, description: t.emptyDescription }) }), messages.length > 0 && (_jsx("ol", { className: "rl-agent-list__items", children: messages.map((message, index) => {
262
+ const appended = !replaced && !known.current.has(message.id) && index > lastKnownIndex;
263
+ return (_jsx(AgentEntrance, { as: "li", kind: "message", animate: animateEntrance && appended, className: "rl-agent-list__item", "data-message-id": message.id, "data-role": message.role, children: renderMessage ? renderMessage(message, index) : _jsx(AgentMessage, { ...messageProps, message: message }) }, message.id));
264
+ }) })), footer != null && _jsx("div", { className: "rl-agent-list__footer", children: footer })] }) }), _jsx("div", { className: "rl-agent-list__jump", children: _jsx(JumpToLatest, { atLatest: atLatest, unreadCount: unread, onJump: () => scrollToLatest() }) })] }));
265
+ });
266
+ //# sourceMappingURL=MessageList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../src/components/message/MessageList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+ import type { ArtifactView, CitationView, MessagePartView, RecoveryView, ToolCallView } from '@wzrhine/agent-core';
3
+ import type { ArtifactRenderer, MessagePartRenderers, ToolRenderer } from './renderers.js';
4
+ import type { CopyHandler } from './use-copy.js';
5
+ /**
6
+ * MessagePart (atlas 06): renders one `MessagePartView` by `type`. Stable by `part.id` (the
7
+ * caller keys it). Every branch keeps real text in the DOM; nothing is ever rendered blank:
8
+ * a `custom` part without a registered renderer, or a part type this version does not know,
9
+ * shows a fallback box with the type / renderer name, the summary and "无法显示此内容".
10
+ *
11
+ * Tool calls and artifacts belong to other families: pass `renderTool` / `renderArtifact` to
12
+ * plug the real components in; the built-in fallback is one line (name + status / title + status).
13
+ */
14
+ export interface MessagePartProps {
15
+ part: MessagePartView;
16
+ renderers?: MessagePartRenderers;
17
+ renderTool?: ToolRenderer;
18
+ renderArtifact?: ArtifactRenderer;
19
+ onOpenCitation?: (citation: CitationView) => void;
20
+ /** Error part actions: `(errorId, actionId)`. Without it the action buttons are not rendered. */
21
+ onRecoveryAction?: (errorId: string, actionId: string) => void;
22
+ onOpenThinking?: (thinkingId: string) => void;
23
+ onCopy?: CopyHandler;
24
+ }
25
+ export declare function ToolFallback({ tool }: {
26
+ tool: ToolCallView;
27
+ }): React.JSX.Element;
28
+ export declare function ArtifactFallback({ artifact }: {
29
+ artifact: ArtifactView;
30
+ }): React.JSX.Element;
31
+ /** Error part: a static callout-style notice (not a live region; the message status announces). */
32
+ export declare function MessageErrorNotice({ error, onAction }: {
33
+ error: RecoveryView;
34
+ onAction?: (errorId: string, actionId: string) => void;
35
+ }): React.JSX.Element;
36
+ /** Fallback for unregistered custom renderers and unknown part types. Never blank. */
37
+ export declare function UnsupportedPart({ type, summary }: {
38
+ type: string;
39
+ summary?: string;
40
+ }): React.JSX.Element;
41
+ /** Parts that flow inline with text (chips) rather than taking their own block. */
42
+ export declare const INLINE_PART_TYPES: ReadonlySet<string>;
43
+ export declare function MessagePart({ part, renderers, renderTool, renderArtifact, onOpenCitation, onRecoveryAction, onOpenThinking, onCopy }: MessagePartProps): React.JSX.Element;
44
+ //# sourceMappingURL=MessagePart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagePart.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessagePart.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAkB,YAAY,EAAE,eAAe,EAAE,YAAY,EAAiB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWlJ,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA8BD,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,qBAU5D;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,YAAY,CAAA;CAAE,qBAWxE;AAmDD,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,qBAqCtI;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,qBAYpF;AAgBD,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAoD,CAAC;AAEvG,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,gBAAgB,qBA8DtJ"}