@wzrhine/agent 0.0.0-stage → 0.2.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 (360) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +29 -3
  4. package/dist/agent.css +16 -0
  5. package/dist/components/artifact/ArtifactCard.d.ts +59 -0
  6. package/dist/components/artifact/ArtifactCard.d.ts.map +1 -0
  7. package/dist/components/artifact/ArtifactCard.js +79 -0
  8. package/dist/components/artifact/ArtifactCard.js.map +1 -0
  9. package/dist/components/artifact/FilePreview.d.ts +121 -0
  10. package/dist/components/artifact/FilePreview.d.ts.map +1 -0
  11. package/dist/components/artifact/FilePreview.js +213 -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 +60 -0
  20. package/dist/components/composer/AttachmentList.js.map +1 -0
  21. package/dist/components/composer/Composer.d.ts +119 -0
  22. package/dist/components/composer/Composer.d.ts.map +1 -0
  23. package/dist/components/composer/Composer.js +336 -0
  24. package/dist/components/composer/Composer.js.map +1 -0
  25. package/dist/components/composer/ComposerInput.d.ts +103 -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 +56 -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 +53 -0
  42. package/dist/components/composer/ModelPicker.d.ts.map +1 -0
  43. package/dist/components/composer/ModelPicker.js +126 -0
  44. package/dist/components/composer/ModelPicker.js.map +1 -0
  45. package/dist/components/composer/PermissionPicker.d.ts +35 -0
  46. package/dist/components/composer/PermissionPicker.d.ts.map +1 -0
  47. package/dist/components/composer/PermissionPicker.js +51 -0
  48. package/dist/components/composer/PermissionPicker.js.map +1 -0
  49. package/dist/components/composer/ReferencePicker.d.ts +31 -0
  50. package/dist/components/composer/ReferencePicker.d.ts.map +1 -0
  51. package/dist/components/composer/ReferencePicker.js +50 -0
  52. package/dist/components/composer/ReferencePicker.js.map +1 -0
  53. package/dist/components/composer/SendStopButton.d.ts +73 -0
  54. package/dist/components/composer/SendStopButton.d.ts.map +1 -0
  55. package/dist/components/composer/SendStopButton.js +88 -0
  56. package/dist/components/composer/SendStopButton.js.map +1 -0
  57. package/dist/components/composer/SkillPicker.d.ts +26 -0
  58. package/dist/components/composer/SkillPicker.d.ts.map +1 -0
  59. package/dist/components/composer/SkillPicker.js +26 -0
  60. package/dist/components/composer/SkillPicker.js.map +1 -0
  61. package/dist/components/composer/SlashCommandMenu.d.ts +33 -0
  62. package/dist/components/composer/SlashCommandMenu.d.ts.map +1 -0
  63. package/dist/components/composer/SlashCommandMenu.js +43 -0
  64. package/dist/components/composer/SlashCommandMenu.js.map +1 -0
  65. package/dist/components/composer/composer-text.d.ts +10 -0
  66. package/dist/components/composer/composer-text.d.ts.map +1 -0
  67. package/dist/components/composer/composer-text.js +26 -0
  68. package/dist/components/composer/composer-text.js.map +1 -0
  69. package/dist/components/composer/composer-utils.d.ts +74 -0
  70. package/dist/components/composer/composer-utils.d.ts.map +1 -0
  71. package/dist/components/composer/composer-utils.js +133 -0
  72. package/dist/components/composer/composer-utils.js.map +1 -0
  73. package/dist/components/conversation/ConversationList.d.ts +94 -0
  74. package/dist/components/conversation/ConversationList.d.ts.map +1 -0
  75. package/dist/components/conversation/ConversationList.js +81 -0
  76. package/dist/components/conversation/ConversationList.js.map +1 -0
  77. package/dist/components/conversation/ConversationRow.d.ts +66 -0
  78. package/dist/components/conversation/ConversationRow.d.ts.map +1 -0
  79. package/dist/components/conversation/ConversationRow.js +65 -0
  80. package/dist/components/conversation/ConversationRow.js.map +1 -0
  81. package/dist/components/conversation/conversation-status.d.ts +21 -0
  82. package/dist/components/conversation/conversation-status.d.ts.map +1 -0
  83. package/dist/components/conversation/conversation-status.js +33 -0
  84. package/dist/components/conversation/conversation-status.js.map +1 -0
  85. package/dist/components/intervention/ApprovalDiff.d.ts +14 -0
  86. package/dist/components/intervention/ApprovalDiff.d.ts.map +1 -0
  87. package/dist/components/intervention/ApprovalDiff.js +25 -0
  88. package/dist/components/intervention/ApprovalDiff.js.map +1 -0
  89. package/dist/components/intervention/ApprovalPanel.d.ts +57 -0
  90. package/dist/components/intervention/ApprovalPanel.d.ts.map +1 -0
  91. package/dist/components/intervention/ApprovalPanel.js +111 -0
  92. package/dist/components/intervention/ApprovalPanel.js.map +1 -0
  93. package/dist/components/intervention/ErrorRecoveryNotice.d.ts +28 -0
  94. package/dist/components/intervention/ErrorRecoveryNotice.d.ts.map +1 -0
  95. package/dist/components/intervention/ErrorRecoveryNotice.js +31 -0
  96. package/dist/components/intervention/ErrorRecoveryNotice.js.map +1 -0
  97. package/dist/components/intervention/GrantList.d.ts +49 -0
  98. package/dist/components/intervention/GrantList.d.ts.map +1 -0
  99. package/dist/components/intervention/GrantList.js +58 -0
  100. package/dist/components/intervention/GrantList.js.map +1 -0
  101. package/dist/components/intervention/InterventionDock.d.ts +24 -0
  102. package/dist/components/intervention/InterventionDock.d.ts.map +1 -0
  103. package/dist/components/intervention/InterventionDock.js +18 -0
  104. package/dist/components/intervention/InterventionDock.js.map +1 -0
  105. package/dist/components/intervention/QuestionnaireCard.d.ts +81 -0
  106. package/dist/components/intervention/QuestionnaireCard.d.ts.map +1 -0
  107. package/dist/components/intervention/QuestionnaireCard.js +333 -0
  108. package/dist/components/intervention/QuestionnaireCard.js.map +1 -0
  109. package/dist/components/intervention/action-lock.d.ts +20 -0
  110. package/dist/components/intervention/action-lock.d.ts.map +1 -0
  111. package/dist/components/intervention/action-lock.js +65 -0
  112. package/dist/components/intervention/action-lock.js.map +1 -0
  113. package/dist/components/intervention/icons.d.ts +8 -0
  114. package/dist/components/intervention/icons.d.ts.map +1 -0
  115. package/dist/components/intervention/icons.js +11 -0
  116. package/dist/components/intervention/icons.js.map +1 -0
  117. package/dist/components/intervention/questionnaire-answers.d.ts +34 -0
  118. package/dist/components/intervention/questionnaire-answers.d.ts.map +1 -0
  119. package/dist/components/intervention/questionnaire-answers.js +97 -0
  120. package/dist/components/intervention/questionnaire-answers.js.map +1 -0
  121. package/dist/components/message/AgentMessage.d.ts +98 -0
  122. package/dist/components/message/AgentMessage.d.ts.map +1 -0
  123. package/dist/components/message/AgentMessage.js +94 -0
  124. package/dist/components/message/AgentMessage.js.map +1 -0
  125. package/dist/components/message/CitationChip.d.ts +38 -0
  126. package/dist/components/message/CitationChip.d.ts.map +1 -0
  127. package/dist/components/message/CitationChip.js +32 -0
  128. package/dist/components/message/CitationChip.js.map +1 -0
  129. package/dist/components/message/CodeBlock.d.ts +45 -0
  130. package/dist/components/message/CodeBlock.d.ts.map +1 -0
  131. package/dist/components/message/CodeBlock.js +21 -0
  132. package/dist/components/message/CodeBlock.js.map +1 -0
  133. package/dist/components/message/JumpToLatest.d.ts +27 -0
  134. package/dist/components/message/JumpToLatest.d.ts.map +1 -0
  135. package/dist/components/message/JumpToLatest.js +17 -0
  136. package/dist/components/message/JumpToLatest.js.map +1 -0
  137. package/dist/components/message/Markdown.d.ts +21 -0
  138. package/dist/components/message/Markdown.d.ts.map +1 -0
  139. package/dist/components/message/Markdown.js +21 -0
  140. package/dist/components/message/Markdown.js.map +1 -0
  141. package/dist/components/message/MessageActions.d.ts +67 -0
  142. package/dist/components/message/MessageActions.d.ts.map +1 -0
  143. package/dist/components/message/MessageActions.js +83 -0
  144. package/dist/components/message/MessageActions.js.map +1 -0
  145. package/dist/components/message/MessageList.d.ts +106 -0
  146. package/dist/components/message/MessageList.d.ts.map +1 -0
  147. package/dist/components/message/MessageList.js +327 -0
  148. package/dist/components/message/MessageList.js.map +1 -0
  149. package/dist/components/message/MessagePart.d.ts +44 -0
  150. package/dist/components/message/MessagePart.d.ts.map +1 -0
  151. package/dist/components/message/MessagePart.js +150 -0
  152. package/dist/components/message/MessagePart.js.map +1 -0
  153. package/dist/components/message/RunDetails.d.ts +26 -0
  154. package/dist/components/message/RunDetails.d.ts.map +1 -0
  155. package/dist/components/message/RunDetails.js +113 -0
  156. package/dist/components/message/RunDetails.js.map +1 -0
  157. package/dist/components/message/SkillUseList.d.ts +22 -0
  158. package/dist/components/message/SkillUseList.d.ts.map +1 -0
  159. package/dist/components/message/SkillUseList.js +20 -0
  160. package/dist/components/message/SkillUseList.js.map +1 -0
  161. package/dist/components/message/ThinkingBlock.d.ts +44 -0
  162. package/dist/components/message/ThinkingBlock.d.ts.map +1 -0
  163. package/dist/components/message/ThinkingBlock.js +34 -0
  164. package/dist/components/message/ThinkingBlock.js.map +1 -0
  165. package/dist/components/message/icons.d.ts +14 -0
  166. package/dist/components/message/icons.d.ts.map +1 -0
  167. package/dist/components/message/icons.js +16 -0
  168. package/dist/components/message/icons.js.map +1 -0
  169. package/dist/components/message/plain-text.d.ts +11 -0
  170. package/dist/components/message/plain-text.d.ts.map +1 -0
  171. package/dist/components/message/plain-text.js +58 -0
  172. package/dist/components/message/plain-text.js.map +1 -0
  173. package/dist/components/message/renderers.d.ts +30 -0
  174. package/dist/components/message/renderers.d.ts.map +1 -0
  175. package/dist/components/message/renderers.js +2 -0
  176. package/dist/components/message/renderers.js.map +1 -0
  177. package/dist/components/message/use-copy.d.ts +19 -0
  178. package/dist/components/message/use-copy.d.ts.map +1 -0
  179. package/dist/components/message/use-copy.js +67 -0
  180. package/dist/components/message/use-copy.js.map +1 -0
  181. package/dist/components/process/AgentProcess.d.ts +47 -0
  182. package/dist/components/process/AgentProcess.d.ts.map +1 -0
  183. package/dist/components/process/AgentProcess.js +78 -0
  184. package/dist/components/process/AgentProcess.js.map +1 -0
  185. package/dist/components/process/RunStatus.d.ts +60 -0
  186. package/dist/components/process/RunStatus.d.ts.map +1 -0
  187. package/dist/components/process/RunStatus.js +34 -0
  188. package/dist/components/process/RunStatus.js.map +1 -0
  189. package/dist/components/shell/AgentEmptyState.d.ts +35 -0
  190. package/dist/components/shell/AgentEmptyState.d.ts.map +1 -0
  191. package/dist/components/shell/AgentEmptyState.js +20 -0
  192. package/dist/components/shell/AgentEmptyState.js.map +1 -0
  193. package/dist/components/shell/AgentHeader.d.ts +84 -0
  194. package/dist/components/shell/AgentHeader.d.ts.map +1 -0
  195. package/dist/components/shell/AgentHeader.js +43 -0
  196. package/dist/components/shell/AgentHeader.js.map +1 -0
  197. package/dist/components/shell/AgentShell.d.ts +154 -0
  198. package/dist/components/shell/AgentShell.d.ts.map +1 -0
  199. package/dist/components/shell/AgentShell.js +210 -0
  200. package/dist/components/shell/AgentShell.js.map +1 -0
  201. package/dist/components/shell/AgentSidePane.d.ts +54 -0
  202. package/dist/components/shell/AgentSidePane.d.ts.map +1 -0
  203. package/dist/components/shell/AgentSidePane.js +26 -0
  204. package/dist/components/shell/AgentSidePane.js.map +1 -0
  205. package/dist/components/shell/ResizeHandle.d.ts +54 -0
  206. package/dist/components/shell/ResizeHandle.d.ts.map +1 -0
  207. package/dist/components/shell/ResizeHandle.js +94 -0
  208. package/dist/components/shell/ResizeHandle.js.map +1 -0
  209. package/dist/components/shell/use-controllable.d.ts +9 -0
  210. package/dist/components/shell/use-controllable.d.ts.map +1 -0
  211. package/dist/components/shell/use-controllable.js +26 -0
  212. package/dist/components/shell/use-controllable.js.map +1 -0
  213. package/dist/components/tools/ChunkPager.d.ts +48 -0
  214. package/dist/components/tools/ChunkPager.d.ts.map +1 -0
  215. package/dist/components/tools/ChunkPager.js +68 -0
  216. package/dist/components/tools/ChunkPager.js.map +1 -0
  217. package/dist/components/tools/CodeModeToolTree.d.ts +64 -0
  218. package/dist/components/tools/CodeModeToolTree.d.ts.map +1 -0
  219. package/dist/components/tools/CodeModeToolTree.js +97 -0
  220. package/dist/components/tools/CodeModeToolTree.js.map +1 -0
  221. package/dist/components/tools/DiffPreview.d.ts +83 -0
  222. package/dist/components/tools/DiffPreview.d.ts.map +1 -0
  223. package/dist/components/tools/DiffPreview.js +95 -0
  224. package/dist/components/tools/DiffPreview.js.map +1 -0
  225. package/dist/components/tools/ToolActivity.d.ts +63 -0
  226. package/dist/components/tools/ToolActivity.d.ts.map +1 -0
  227. package/dist/components/tools/ToolActivity.js +45 -0
  228. package/dist/components/tools/ToolActivity.js.map +1 -0
  229. package/dist/components/tools/ToolDetails.d.ts +118 -0
  230. package/dist/components/tools/ToolDetails.d.ts.map +1 -0
  231. package/dist/components/tools/ToolDetails.js +258 -0
  232. package/dist/components/tools/ToolDetails.js.map +1 -0
  233. package/dist/components/tools/ToolHistory.d.ts +48 -0
  234. package/dist/components/tools/ToolHistory.d.ts.map +1 -0
  235. package/dist/components/tools/ToolHistory.js +37 -0
  236. package/dist/components/tools/ToolHistory.js.map +1 -0
  237. package/dist/components/tools/ToolOutput.d.ts +61 -0
  238. package/dist/components/tools/ToolOutput.d.ts.map +1 -0
  239. package/dist/components/tools/ToolOutput.js +45 -0
  240. package/dist/components/tools/ToolOutput.js.map +1 -0
  241. package/dist/components/tools/ToolRecord.d.ts +58 -0
  242. package/dist/components/tools/ToolRecord.d.ts.map +1 -0
  243. package/dist/components/tools/ToolRecord.js +79 -0
  244. package/dist/components/tools/ToolRecord.js.map +1 -0
  245. package/dist/components/tools/shared.d.ts +93 -0
  246. package/dist/components/tools/shared.d.ts.map +1 -0
  247. package/dist/components/tools/shared.js +160 -0
  248. package/dist/components/tools/shared.js.map +1 -0
  249. package/dist/components/workspace/ActivityLedger.d.ts +44 -0
  250. package/dist/components/workspace/ActivityLedger.d.ts.map +1 -0
  251. package/dist/components/workspace/ActivityLedger.js +63 -0
  252. package/dist/components/workspace/ActivityLedger.js.map +1 -0
  253. package/dist/components/workspace/CompactionNotice.d.ts +63 -0
  254. package/dist/components/workspace/CompactionNotice.d.ts.map +1 -0
  255. package/dist/components/workspace/CompactionNotice.js +36 -0
  256. package/dist/components/workspace/CompactionNotice.js.map +1 -0
  257. package/dist/components/workspace/ContextUsage.d.ts +50 -0
  258. package/dist/components/workspace/ContextUsage.d.ts.map +1 -0
  259. package/dist/components/workspace/ContextUsage.js +106 -0
  260. package/dist/components/workspace/ContextUsage.js.map +1 -0
  261. package/dist/components/workspace/PersistentTerminal.d.ts +86 -0
  262. package/dist/components/workspace/PersistentTerminal.d.ts.map +1 -0
  263. package/dist/components/workspace/PersistentTerminal.js +155 -0
  264. package/dist/components/workspace/PersistentTerminal.js.map +1 -0
  265. package/dist/components/workspace/PinnedSummary.d.ts +43 -0
  266. package/dist/components/workspace/PinnedSummary.d.ts.map +1 -0
  267. package/dist/components/workspace/PinnedSummary.js +33 -0
  268. package/dist/components/workspace/PinnedSummary.js.map +1 -0
  269. package/dist/components/workspace/RunOverview.d.ts +29 -0
  270. package/dist/components/workspace/RunOverview.d.ts.map +1 -0
  271. package/dist/components/workspace/RunOverview.js +20 -0
  272. package/dist/components/workspace/RunOverview.js.map +1 -0
  273. package/dist/components/workspace/RunSummary.d.ts +35 -0
  274. package/dist/components/workspace/RunSummary.d.ts.map +1 -0
  275. package/dist/components/workspace/RunSummary.js +46 -0
  276. package/dist/components/workspace/RunSummary.js.map +1 -0
  277. package/dist/components/workspace/SubAgentCard.d.ts +64 -0
  278. package/dist/components/workspace/SubAgentCard.d.ts.map +1 -0
  279. package/dist/components/workspace/SubAgentCard.js +78 -0
  280. package/dist/components/workspace/SubAgentCard.js.map +1 -0
  281. package/dist/components/workspace/TerminalRow.d.ts +61 -0
  282. package/dist/components/workspace/TerminalRow.d.ts.map +1 -0
  283. package/dist/components/workspace/TerminalRow.js +65 -0
  284. package/dist/components/workspace/TerminalRow.js.map +1 -0
  285. package/dist/components/workspace/shared.d.ts +26 -0
  286. package/dist/components/workspace/shared.d.ts.map +1 -0
  287. package/dist/components/workspace/shared.js +41 -0
  288. package/dist/components/workspace/shared.js.map +1 -0
  289. package/dist/index.d.ts +136 -0
  290. package/dist/index.d.ts.map +1 -0
  291. package/dist/index.js +79 -0
  292. package/dist/index.js.map +1 -0
  293. package/dist/motion/agent-motion.d.ts +62 -0
  294. package/dist/motion/agent-motion.d.ts.map +1 -0
  295. package/dist/motion/agent-motion.js +61 -0
  296. package/dist/motion/agent-motion.js.map +1 -0
  297. package/dist/primitives/AgentSpark.d.ts +17 -0
  298. package/dist/primitives/AgentSpark.d.ts.map +1 -0
  299. package/dist/primitives/AgentSpark.js +11 -0
  300. package/dist/primitives/AgentSpark.js.map +1 -0
  301. package/dist/primitives/AgentStatus.d.ts +32 -0
  302. package/dist/primitives/AgentStatus.d.ts.map +1 -0
  303. package/dist/primitives/AgentStatus.js +13 -0
  304. package/dist/primitives/AgentStatus.js.map +1 -0
  305. package/dist/primitives/StatusGlyph.d.ts +16 -0
  306. package/dist/primitives/StatusGlyph.d.ts.map +1 -0
  307. package/dist/primitives/StatusGlyph.js +31 -0
  308. package/dist/primitives/StatusGlyph.js.map +1 -0
  309. package/dist/primitives/icons.d.ts +13 -0
  310. package/dist/primitives/icons.d.ts.map +1 -0
  311. package/dist/primitives/icons.js +55 -0
  312. package/dist/primitives/icons.js.map +1 -0
  313. package/dist/provider/AgentMessages.d.ts +61 -0
  314. package/dist/provider/AgentMessages.d.ts.map +1 -0
  315. package/dist/provider/AgentMessages.js +81 -0
  316. package/dist/provider/AgentMessages.js.map +1 -0
  317. package/dist/provider/messages/composer.d.ts +112 -0
  318. package/dist/provider/messages/composer.d.ts.map +1 -0
  319. package/dist/provider/messages/composer.js +165 -0
  320. package/dist/provider/messages/composer.js.map +1 -0
  321. package/dist/provider/messages/intervention.d.ts +136 -0
  322. package/dist/provider/messages/intervention.d.ts.map +1 -0
  323. package/dist/provider/messages/intervention.js +321 -0
  324. package/dist/provider/messages/intervention.js.map +1 -0
  325. package/dist/provider/messages/message.d.ts +119 -0
  326. package/dist/provider/messages/message.d.ts.map +1 -0
  327. package/dist/provider/messages/message.js +224 -0
  328. package/dist/provider/messages/message.js.map +1 -0
  329. package/dist/provider/messages/shell.d.ts +70 -0
  330. package/dist/provider/messages/shell.d.ts.map +1 -0
  331. package/dist/provider/messages/shell.js +109 -0
  332. package/dist/provider/messages/shell.js.map +1 -0
  333. package/dist/provider/messages/status.d.ts +21 -0
  334. package/dist/provider/messages/status.d.ts.map +1 -0
  335. package/dist/provider/messages/status.js +195 -0
  336. package/dist/provider/messages/status.js.map +1 -0
  337. package/dist/provider/messages/tools.d.ts +217 -0
  338. package/dist/provider/messages/tools.d.ts.map +1 -0
  339. package/dist/provider/messages/tools.js +496 -0
  340. package/dist/provider/messages/tools.js.map +1 -0
  341. package/dist/provider/messages/workspace.d.ts +187 -0
  342. package/dist/provider/messages/workspace.d.ts.map +1 -0
  343. package/dist/provider/messages/workspace.js +333 -0
  344. package/dist/provider/messages/workspace.js.map +1 -0
  345. package/dist/styles/artifact.css +564 -0
  346. package/dist/styles/base.css +220 -0
  347. package/dist/styles/composer.css +1001 -0
  348. package/dist/styles/conversation.css +275 -0
  349. package/dist/styles/intervention.css +929 -0
  350. package/dist/styles/message.css +917 -0
  351. package/dist/styles/process.css +207 -0
  352. package/dist/styles/shell.css +453 -0
  353. package/dist/styles/tools.css +929 -0
  354. package/dist/styles/workspace.css +1297 -0
  355. package/dist/styles/wpi-adoption.css +24 -0
  356. package/dist/utils/cx.d.ts +3 -0
  357. package/dist/utils/cx.d.ts.map +1 -0
  358. package/dist/utils/cx.js +5 -0
  359. package/dist/utils/cx.js.map +1 -0
  360. package/package.json +64 -3
@@ -0,0 +1,97 @@
1
+ import { codePointLength } from '@wzrhine/agent-core';
2
+ /** Questions are optional unless `optional === false`. */
3
+ export const isQuestionOptional = (question) => question.optional !== false;
4
+ /** `single` / `multiple` are the built-in choice kinds; anything else (incl. `text` and custom
5
+ * kinds, ADR-0013 §4) answers through free text and/or renderer-owned option ids. */
6
+ export const isChoiceQuestion = (question) => question.kind === 'single' || question.kind === 'multiple';
7
+ /** Built-in kinds with their own controls; any other string is a custom kind. */
8
+ export const isKnownQuestionKind = (question) => isChoiceQuestion(question) || question.kind === 'text';
9
+ /** Code-point length of the free text is over `maxLength`. */
10
+ export function isOverLimit(question, answer) {
11
+ if (question.maxLength == null || answer?.text == null)
12
+ return false;
13
+ return codePointLength(answer.text) > question.maxLength;
14
+ }
15
+ export function answerState(question, answer) {
16
+ if (!answer)
17
+ return 'unanswered';
18
+ if (answer.skipped)
19
+ return 'skipped';
20
+ const hasText = typeof answer.text === 'string' && answer.text.trim() !== '';
21
+ if (question.kind === 'text')
22
+ return hasText ? 'answered' : 'unanswered';
23
+ if (!isKnownQuestionKind(question)) {
24
+ // Custom kinds own their answer shape: any option id or text counts (nothing is filtered out).
25
+ return hasText || (answer.optionIds ?? []).length > 0 ? 'answered' : 'unanswered';
26
+ }
27
+ const known = new Set((question.options ?? []).map((o) => o.id));
28
+ const hasOption = (answer.optionIds ?? []).some((id) => known.has(id));
29
+ return hasOption || (question.allowCustom === true && hasText) ? 'answered' : 'unanswered';
30
+ }
31
+ /**
32
+ * The answers to submit: answered questions normalised (unknown option ids and an unselected
33
+ * custom text dropped), explicitly skipped and unanswered optional questions as `skipped: true`.
34
+ * Unanswered required questions are returned in `missing` and must block submission.
35
+ */
36
+ export function normalizeAnswers(questions, answers) {
37
+ const map = answers instanceof Map ? answers : new Map(answers.map((a) => [a.questionId, a]));
38
+ const out = [];
39
+ const missing = [];
40
+ const overLimit = [];
41
+ for (const question of questions) {
42
+ const answer = map.get(question.id);
43
+ const state = answerState(question, answer);
44
+ if (state === 'answered' && isOverLimit(question, answer))
45
+ overLimit.push(question.id);
46
+ if (state === 'answered') {
47
+ const next = { questionId: question.id };
48
+ if (question.kind === 'text') {
49
+ next.text = answer.text;
50
+ }
51
+ else if (!isKnownQuestionKind(question)) {
52
+ // Custom kinds keep their answer verbatim; the custom renderer owns the shape.
53
+ if (answer.optionIds !== undefined)
54
+ next.optionIds = [...answer.optionIds];
55
+ if (typeof answer.text === 'string')
56
+ next.text = answer.text;
57
+ }
58
+ else {
59
+ const known = new Set((question.options ?? []).map((o) => o.id));
60
+ const ids = (answer.optionIds ?? []).filter((id) => known.has(id));
61
+ const custom = question.allowCustom === true && typeof answer.text === 'string' && answer.text.trim() !== '';
62
+ if (question.kind === 'single' && custom) {
63
+ next.optionIds = [];
64
+ next.text = answer.text;
65
+ }
66
+ else {
67
+ next.optionIds = question.kind === 'single' ? ids.slice(0, 1) : ids;
68
+ if (custom && question.kind === 'multiple')
69
+ next.text = answer.text;
70
+ }
71
+ }
72
+ out.push(next);
73
+ }
74
+ else if (state === 'skipped' || isQuestionOptional(question)) {
75
+ out.push({ questionId: question.id, skipped: true });
76
+ }
77
+ else {
78
+ missing.push(question.id);
79
+ }
80
+ }
81
+ return { answers: out, missing, overLimit };
82
+ }
83
+ /** Human-readable answer of one question; `null` when there is none (caller picks the label). */
84
+ export function answerText(question, answer, join) {
85
+ if (!answer || answer.skipped)
86
+ return null;
87
+ const parts = [];
88
+ if (question.kind !== 'text') {
89
+ for (const option of question.options ?? [])
90
+ if (answer.optionIds?.includes(option.id))
91
+ parts.push(option.label);
92
+ }
93
+ if (typeof answer.text === 'string' && answer.text.trim() !== '')
94
+ parts.push(answer.text);
95
+ return parts.length ? parts.join(join) : null;
96
+ }
97
+ //# sourceMappingURL=questionnaire-answers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire-answers.js","sourceRoot":"","sources":["../../../src/components/intervention/questionnaire-answers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import * as React from 'react';
2
+ import type { CitationView, MessagePartView, MessageView, RunDetailsView } from '@wzrhine/agent-core';
3
+ import type { MessageActionCapabilities, MessageFeedback } from './MessageActions.js';
4
+ import type { ArtifactRenderer, MessagePartRenderers, ToolRenderer } from './renderers.js';
5
+ import type { CopyHandler } from './use-copy.js';
6
+ /**
7
+ * AgentMessage (atlas 05): one `<article>` per message, named by its header (author + time).
8
+ *
9
+ * - `user`: right-aligned bubble with a reading max-width; `assistant`: full reading column;
10
+ * `system`: centred notice; `tool`: compact assistant-like block.
11
+ * - Body: parts in order through MessagePart; consecutive inline parts (citations, attachments,
12
+ * references) flow together in one line box.
13
+ * - Metadata: edited / inherited markers and the usage footer; any number that is not `exact`
14
+ * carries its completeness label ("估计" / "部分统计"), never a bare figure.
15
+ * - Status: failed / interrupted / cancelled / partial render as glyph + text (static, no live
16
+ * region); `onRetry` adds a retry button for failed and interrupted messages.
17
+ * - Skills: `message.skillUses` renders a SkillUseList meta row ("已加载技能:…") automatically.
18
+ * - Run details: `details` (or `message.details`) renders RunDetails inside a "运行详情"
19
+ * Collapsible after the meta row; closed by default, controlled with `detailsOpen` /
20
+ * `onDetailsOpenChange`. Nothing renders when every field is missing.
21
+ * - Actions (MessageActions) render only for callbacks that are given and are hidden while the
22
+ * message is pending / streaming (copy stays available once text exists). `actionCapabilities`
23
+ * can switch single actions off with a reason (aria-disabled, never called). `onRestoreInput`
24
+ * ("重新编辑本轮输入") is offered on user and assistant messages that are not inherited, including
25
+ * failed ones — it is the recovery path for a turn whose answer did not arrive.
26
+ * - Streaming: a visually hidden `role="status"` announces the current phase once per change
27
+ * (throttled) and "回答已完成" when it settles — never the tokens themselves.
28
+ *
29
+ * Identity is the message id (the list keys by it); re-renders never replay an entrance — the
30
+ * entrance belongs to MessageList.
31
+ */
32
+ export interface AgentMessagePartHandlers {
33
+ renderers?: MessagePartRenderers;
34
+ renderTool?: ToolRenderer;
35
+ renderArtifact?: ArtifactRenderer;
36
+ onOpenCitation?: (citation: CitationView) => void;
37
+ onRecoveryAction?: (errorId: string, actionId: string) => void;
38
+ onOpenThinking?: (thinkingId: string) => void;
39
+ }
40
+ export type AgentMessageProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onCopy'> & AgentMessagePartHandlers & {
41
+ message: MessageView;
42
+ /** Model label shown after the assistant author. */
43
+ model?: string;
44
+ /** Replaces the rendering of single parts; receives the default rendering. */
45
+ renderPart?: (part: MessagePartView, rendered: React.ReactNode) => React.ReactNode;
46
+ onRetry?: (messageId: string) => void;
47
+ onCopy?: CopyHandler;
48
+ onRegenerate?: (messageId: string) => void;
49
+ onEdit?: (messageId: string) => void;
50
+ onFork?: (messageId: string) => void;
51
+ /** Put this turn's input back into the composer (distinct from `onEdit`). */
52
+ onRestoreInput?: (messageId: string) => void;
53
+ /** Per-message availability of the actions (e.g. fork off while a run is active). */
54
+ actionCapabilities?: (message: MessageView) => MessageActionCapabilities | undefined;
55
+ feedback?: MessageFeedback | null;
56
+ onFeedback?: (messageId: string, value: MessageFeedback | null) => void;
57
+ /** Run details shown in the "运行详情" disclosure; defaults to `message.details`. */
58
+ details?: RunDetailsView;
59
+ /** Controlled open state of the run-details disclosure. */
60
+ detailsOpen?: boolean;
61
+ defaultDetailsOpen?: boolean;
62
+ onDetailsOpenChange?: (open: boolean) => void;
63
+ /** Extra content after the body (e.g. a RunSummary from another family). */
64
+ footer?: React.ReactNode;
65
+ /** Minimum gap between streaming announcements (ms). */
66
+ announceInterval?: number;
67
+ };
68
+ /** Plain text of the copyable parts (text, markdown source, code). */
69
+ export declare function messagePlainText(message: MessageView): string;
70
+ export declare const AgentMessage: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onCopy"> & AgentMessagePartHandlers & {
71
+ message: MessageView;
72
+ /** Model label shown after the assistant author. */
73
+ model?: string;
74
+ /** Replaces the rendering of single parts; receives the default rendering. */
75
+ renderPart?: (part: MessagePartView, rendered: React.ReactNode) => React.ReactNode;
76
+ onRetry?: (messageId: string) => void;
77
+ onCopy?: CopyHandler;
78
+ onRegenerate?: (messageId: string) => void;
79
+ onEdit?: (messageId: string) => void;
80
+ onFork?: (messageId: string) => void;
81
+ /** Put this turn's input back into the composer (distinct from `onEdit`). */
82
+ onRestoreInput?: (messageId: string) => void;
83
+ /** Per-message availability of the actions (e.g. fork off while a run is active). */
84
+ actionCapabilities?: (message: MessageView) => MessageActionCapabilities | undefined;
85
+ feedback?: MessageFeedback | null;
86
+ onFeedback?: (messageId: string, value: MessageFeedback | null) => void;
87
+ /** Run details shown in the "运行详情" disclosure; defaults to `message.details`. */
88
+ details?: RunDetailsView;
89
+ /** Controlled open state of the run-details disclosure. */
90
+ detailsOpen?: boolean;
91
+ defaultDetailsOpen?: boolean;
92
+ onDetailsOpenChange?: (open: boolean) => void;
93
+ /** Extra content after the body (e.g. a RunSummary from another family). */
94
+ footer?: React.ReactNode;
95
+ /** Minimum gap between streaming announcements (ms). */
96
+ announceInterval?: number;
97
+ } & React.RefAttributes<HTMLElement>>;
98
+ //# sourceMappingURL=AgentMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentMessage.d.ts","sourceRoot":"","sources":["../../../src/components/message/AgentMessage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Button, Collapsible } from '@wzrhine/react';
5
+ import { effectivePhase } from '@wzrhine/agent-core';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { StatusGlyph } from '../../primitives/StatusGlyph.js';
8
+ import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
9
+ import { cx } from '../../utils/cx.js';
10
+ import { MessageActions } from './MessageActions.js';
11
+ import { INLINE_PART_TYPES, MessagePart } from './MessagePart.js';
12
+ import { RunDetails, hasRunDetails } from './RunDetails.js';
13
+ import { SkillUseList } from './SkillUseList.js';
14
+ import { useThrottledText } from './use-copy.js';
15
+ const statusGlyph = {
16
+ failed: { glyph: 'failed', tone: 'danger' },
17
+ interrupted: { glyph: 'failed', tone: 'warning' },
18
+ cancelled: { glyph: 'stopped', tone: 'neutral' },
19
+ partial: { glyph: 'unknown', tone: 'warning' },
20
+ };
21
+ /** Plain text of the copyable parts (text, markdown source, code). */
22
+ export function messagePlainText(message) {
23
+ return message.parts
24
+ .map((part) => (part.type === 'text' ? part.text : part.type === 'markdown' ? part.source : part.type === 'code' ? part.code : ''))
25
+ .filter((text) => text.trim() !== '')
26
+ .join('\n\n');
27
+ }
28
+ function Usage({ usage }) {
29
+ const t = useAgentMessages().message;
30
+ const fmt = useAgentFormat();
31
+ const items = [
32
+ [t.usageInput, usage.input],
33
+ [t.usageOutput, usage.output],
34
+ [t.usageCacheRead, usage.cacheRead],
35
+ [t.usageCacheWrite, usage.cacheWrite],
36
+ [t.usageTotal, usage.total],
37
+ ];
38
+ const shown = items.filter((item) => item[1] !== undefined);
39
+ const completeness = t.usageCompleteness[usage.completeness];
40
+ if (shown.length === 0 && !completeness && !usage.note)
41
+ return null;
42
+ return (_jsxs("p", { className: "rl-agent-usage", "data-completeness": usage.completeness, children: [_jsx("span", { className: "rl-agent-usage__label", children: t.usageLabel }), shown.map(([label, value]) => (_jsxs("span", { className: "rl-agent-usage__item", children: [label, " ", _jsx("span", { className: "rl-agent-usage__value", children: fmt.compact(value) })] }, label))), completeness && _jsx("span", { className: "rl-agent-usage__completeness", children: completeness }), usage.note && _jsx("span", { className: "rl-agent-usage__note", children: usage.note })] }));
43
+ }
44
+ /** Groups consecutive inline parts so chips share a line box. */
45
+ function groupParts(parts) {
46
+ const groups = [];
47
+ for (const part of parts) {
48
+ const inline = INLINE_PART_TYPES.has(part.type);
49
+ const last = groups[groups.length - 1];
50
+ if (last && last.inline && inline)
51
+ last.parts.push(part);
52
+ else
53
+ groups.push({ inline, parts: [part] });
54
+ }
55
+ return groups;
56
+ }
57
+ export const AgentMessage = React.forwardRef(function AgentMessage({ message, model, renderPart, renderers, renderTool, renderArtifact, onOpenCitation, onRecoveryAction, onOpenThinking, onRetry, onCopy, onRegenerate, onEdit, onFork, onRestoreInput, actionCapabilities, feedback, onFeedback, details: detailsProp, detailsOpen, defaultDetailsOpen, onDetailsOpenChange, footer, announceInterval = 1500, className, ...rest }, ref) {
58
+ const all = useAgentMessages();
59
+ const t = all.message;
60
+ const fmt = useAgentFormat();
61
+ const headerId = React.useId();
62
+ const { role, status } = message;
63
+ const busy = status === 'pending' || status === 'streaming';
64
+ // Announcement: phase while streaming, one line once it settles; history never announces.
65
+ const wasStreaming = React.useRef(status === 'streaming');
66
+ if (status === 'streaming')
67
+ wasStreaming.current = true;
68
+ const statusPart = [...message.parts].reverse().find((p) => p.type === 'status');
69
+ let announcement = '';
70
+ if (status === 'streaming') {
71
+ const phase = statusPart ? effectivePhase(statusPart.status, statusPart.phase) : undefined;
72
+ announcement = statusPart?.text ?? (phase ? all.status.phase[phase] : t.messageStatus.streaming);
73
+ }
74
+ else if (wasStreaming.current) {
75
+ announcement = status === 'complete' ? t.completedAnnouncement : t.messageStatus[status];
76
+ }
77
+ const announced = useThrottledText(announcement, announceInterval);
78
+ const statusText = role === 'user' && status === 'failed' ? t.sendFailed : t.messageStatus[status];
79
+ const glyph = statusGlyph[status];
80
+ const copyText = React.useMemo(() => messagePlainText(message), [message]);
81
+ const id = message.id;
82
+ const renderOne = (part) => {
83
+ const rendered = (_jsx(MessagePart, { part: part, renderers: renderers, renderTool: renderTool, renderArtifact: renderArtifact, onOpenCitation: onOpenCitation, onRecoveryAction: onRecoveryAction, onOpenThinking: onOpenThinking, onCopy: onCopy }, part.id));
84
+ return renderPart ? _jsx(React.Fragment, { children: renderPart(part, rendered) }, part.id) : rendered;
85
+ };
86
+ const author = message.author ?? t.author[role];
87
+ const showActions = !busy && role !== 'system';
88
+ const details = detailsProp ?? message.details;
89
+ const showDetails = hasRunDetails(details);
90
+ const skills = message.skillUses ?? [];
91
+ const capabilities = showActions ? actionCapabilities?.(message) : undefined;
92
+ return (_jsxs("article", { ...rest, ref: ref, className: cx('rl-agent-message', className), "data-role": role, "data-status": status, "data-message-id": id, "data-inherited": message.inherited || undefined, "aria-labelledby": headerId, "aria-busy": busy || undefined, children: [_jsxs("header", { className: "rl-agent-message__header", id: headerId, children: [role === 'assistant' && _jsx(AgentIcon, { name: "agent", className: "rl-agent-message__avatar" }), _jsx("span", { className: "rl-agent-message__author", children: author }), model && _jsx("span", { className: "rl-agent-message__model", children: model }), message.createdAt && (_jsx("time", { className: "rl-agent-message__time", dateTime: message.createdAt, children: fmt.time(message.createdAt) })), status === 'pending' && _jsx("span", { className: "rl-agent-message__pending", children: statusText })] }), _jsx("div", { className: "rl-agent-message__body", children: groupParts(message.parts).map((group) => group.inline ? (_jsx("p", { className: "rl-agent-message__inline", children: group.parts.map(renderOne) }, group.parts[0].id)) : (group.parts.map(renderOne))) }), glyph && statusText && (_jsxs("div", { className: "rl-agent-message__status", "data-tone": glyph.tone, children: [_jsx(StatusGlyph, { name: glyph.glyph, tone: glyph.tone, className: "rl-agent-message__status-glyph" }), _jsx("span", { children: statusText }), onRetry && (status === 'failed' || status === 'interrupted') && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: () => onRetry(id), children: t.retry }))] })), (message.edited || message.inherited || message.usage) && (_jsxs("div", { className: "rl-agent-message__meta", children: [message.edited && _jsx("span", { className: "rl-agent-message__marker", children: t.edited }), message.inherited && _jsx("span", { className: "rl-agent-message__marker", children: t.inherited }), message.usage && _jsx(Usage, { usage: message.usage })] })), skills.length > 0 && _jsx(SkillUseList, { className: "rl-agent-message__skills", skills: skills }), showDetails && (_jsx(Collapsible, { className: "rl-agent-message__details", panelClassName: "rl-agent-message__details-panel", triggerProps: { className: 'rl-agent-message__details-trigger' }, open: detailsOpen, defaultOpen: defaultDetailsOpen, onOpenChange: onDetailsOpenChange, trigger: _jsx("span", { children: t.runDetails }), children: _jsx(RunDetails, { details: details, "aria-label": t.runDetails }) })), footer, showActions && (_jsx(MessageActions, { className: "rl-agent-message__actions", copyText: copyText || undefined, onCopy: onCopy, onRegenerate: onRegenerate && role === 'assistant' ? () => onRegenerate(id) : undefined, onEdit: onEdit && role === 'user' && !message.inherited ? () => onEdit(id) : undefined, onFork: onFork ? () => onFork(id) : undefined, onRestoreInput: onRestoreInput && (role === 'user' || role === 'assistant') && !message.inherited ? () => onRestoreInput(id) : undefined, capabilities: capabilities, feedback: feedback, onFeedback: onFeedback && role === 'assistant' ? (value) => onFeedback(id, value) : undefined })), role !== 'user' && wasStreaming.current && (_jsx("span", { className: "rl-agent-sr", role: "status", children: announced }))] }));
93
+ });
94
+ //# sourceMappingURL=AgentMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentMessage.js","sourceRoot":"","sources":["../../../src/components/message/AgentMessage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+ import type { CitationView } from '@wzrhine/agent-core';
3
+ /**
4
+ * CitationChip (atlas 32): an inline `<button>` showing "[n]" (or a short label) inside running
5
+ * text. Hover / focus shows a card with title, source type, locator and excerpt; the same text is
6
+ * the button's description (`aria-describedby` → a `hidden` node), so it is never hover-only.
7
+ *
8
+ * - Available + `onOpen`: activating calls `onOpen(citation)`.
9
+ * - Available without `onOpen`: the chip is informational (card on hover / focus, description).
10
+ * - Unavailable: `aria-disabled`, still focusable, struck style, the reason is in the name and the
11
+ * card; `onOpen` is never called — a dead source is never presented as openable.
12
+ *
13
+ * Layout: same font size and inherited line height as the surrounding text, so a paragraph with
14
+ * many chips keeps its line rhythm and wraps between chips. Motion: background colour only.
15
+ */
16
+ export type CitationChipProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'type'> & {
17
+ citation: CitationView;
18
+ onOpen?: (citation: CitationView) => void;
19
+ /** Visible text instead of "[n]" (e.g. a short file name). */
20
+ label?: React.ReactNode;
21
+ /** Show the source-type icon before the index. */
22
+ showIcon?: boolean;
23
+ /** Custom icon content (SVG inner nodes); wins over the built-in source-type icon. */
24
+ icon?: React.ReactNode;
25
+ selected?: boolean;
26
+ };
27
+ export declare const CitationChip: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "onClick"> & {
28
+ citation: CitationView;
29
+ onOpen?: (citation: CitationView) => void;
30
+ /** Visible text instead of "[n]" (e.g. a short file name). */
31
+ label?: React.ReactNode;
32
+ /** Show the source-type icon before the index. */
33
+ showIcon?: boolean;
34
+ /** Custom icon content (SVG inner nodes); wins over the built-in source-type icon. */
35
+ icon?: React.ReactNode;
36
+ selected?: boolean;
37
+ } & React.RefAttributes<HTMLButtonElement>>;
38
+ //# sourceMappingURL=CitationChip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CitationChip.d.ts","sourceRoot":"","sources":["../../../src/components/message/CitationChip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAM5E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG;IACrH,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAYF,eAAO,MAAM,YAAY;cArBb,YAAY;aACb,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI;IACzC,8DAA8D;YACtD,KAAK,CAAC,SAAS;IACvB,kDAAkD;eACvC,OAAO;IAClB,sFAAsF;WAC/E,KAAK,CAAC,SAAS;eACX,OAAO;2CAsElB,CAAC"}
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Tooltip } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ /** Icon per built-in source type; custom types fall back to the `other` icon (ADR-0013 §2). */
9
+ const sourceIcon = {
10
+ file: 'file',
11
+ web: 'globe',
12
+ code: 'code',
13
+ dataset: 'database',
14
+ message: 'list',
15
+ other: 'link',
16
+ };
17
+ export const CitationChip = React.forwardRef(function CitationChip({ citation, onOpen, label, showIcon = false, icon, selected, className, ...rest }, ref) {
18
+ const t = useAgentMessages().message;
19
+ const descriptionId = React.useId();
20
+ const unavailable = citation.unavailable === true;
21
+ const openable = !unavailable && onOpen !== undefined;
22
+ const name = t.citationName(citation.index, citation.title) + (unavailable ? ` (${t.citationUnavailable})` : '');
23
+ const reason = unavailable ? (citation.reason ?? t.citationUnavailable) : undefined;
24
+ const sourceLabel = t.sourceType[citation.sourceType] ?? citation.sourceType;
25
+ const description = [sourceLabel, citation.locator, reason, citation.excerpt].filter(Boolean).join(' · ');
26
+ const card = (_jsxs("span", { className: "rl-agent-cite__card", children: [_jsx("span", { className: "rl-agent-cite__card-title", children: citation.title }), _jsxs("span", { className: "rl-agent-cite__card-meta", children: [sourceLabel, citation.locator && _jsx("span", { className: "rl-agent-cite__card-locator", children: citation.locator })] }), reason && _jsx("span", { className: "rl-agent-cite__card-reason", children: reason }), citation.excerpt && _jsx("span", { className: "rl-agent-cite__card-excerpt", children: citation.excerpt })] }));
27
+ return (_jsxs(_Fragment, { children: [_jsx(Tooltip, { content: card, className: "rl-agent-cite__tooltip", children: _jsxs("button", { ...rest, ref: ref, type: "button", className: cx('rl-agent-cite', className), "aria-label": name, "aria-describedby": descriptionId, "aria-disabled": unavailable || undefined, "aria-pressed": selected, "data-source": citation.sourceType, "data-unavailable": unavailable || undefined, "data-selected": selected || undefined, onClick: () => {
28
+ if (openable)
29
+ onOpen(citation);
30
+ }, children: [showIcon && (_jsx(AgentIcon, { name: sourceIcon[citation.sourceType] ?? 'link', className: "rl-agent-cite__icon", children: icon })), _jsx("span", { className: "rl-agent-cite__text", children: label ?? `[${citation.index}]` })] }) }), _jsx("span", { id: descriptionId, hidden: true, children: description })] }));
31
+ });
32
+ //# sourceMappingURL=CitationChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CitationChip.js","sourceRoot":"","sources":["../../../src/components/message/CitationChip.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ import type { CopyHandler } from './use-copy.js';
3
+ /**
4
+ * CodeBlock: a `<figure>` with a caption (language / file name) and a copy button over a
5
+ * horizontally scrollable `<pre><code>`. Long lines never widen the page; the scroller is
6
+ * focusable (`tabIndex=0`, named by the caption) so keyboard users can scroll it. No highlighting
7
+ * is done here: pass `children` (or MessagePart `renderers.code`) for a highlighted rendering.
8
+ *
9
+ * Copy: `onCopy` if given, else the Clipboard API; the button is not rendered when neither
10
+ * exists. The copied / failed state is announced through the button's own name and a polite
11
+ * status, then resets after a short delay. No motion.
12
+ */
13
+ export type CodeBlockProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onCopy'> & {
14
+ code: string;
15
+ language?: string;
16
+ filename?: string;
17
+ /** Show a line-number gutter (decorative, not copied). */
18
+ showLineNumbers?: boolean;
19
+ /** CSS length; taller code scrolls vertically inside the block. */
20
+ maxHeight?: string;
21
+ /** `false` hides the copy button. Default: shown when a copy path exists. */
22
+ copyable?: boolean;
23
+ onCopy?: CopyHandler;
24
+ /** Replaces the plain `<code>` content (e.g. host-highlighted tokens). The copy text stays `code`. */
25
+ children?: React.ReactNode;
26
+ /** Copy-button name override. */
27
+ copyLabel?: string;
28
+ };
29
+ export declare const CodeBlock: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onCopy"> & {
30
+ code: string;
31
+ language?: string;
32
+ filename?: string;
33
+ /** Show a line-number gutter (decorative, not copied). */
34
+ showLineNumbers?: boolean;
35
+ /** CSS length; taller code scrolls vertically inside the block. */
36
+ maxHeight?: string;
37
+ /** `false` hides the copy button. Default: shown when a copy path exists. */
38
+ copyable?: boolean;
39
+ onCopy?: CopyHandler;
40
+ /** Replaces the plain `<code>` content (e.g. host-highlighted tokens). The copy text stays `code`. */
41
+ children?: React.ReactNode;
42
+ /** Copy-button name override. */
43
+ copyLabel?: string;
44
+ } & React.RefAttributes<HTMLElement>>;
45
+ //# sourceMappingURL=CodeBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../../src/components/message/CodeBlock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sGAAsG;IACtG,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,SAAS;UAhBd,MAAM;eACD,MAAM;eACN,MAAM;IACjB,0DAA0D;sBACxC,OAAO;IACzB,mEAAmE;gBACvD,MAAM;IAClB,6EAA6E;eAClE,OAAO;aACT,WAAW;IACpB,sGAAsG;eAC3F,KAAK,CAAC,SAAS;IAC1B,iCAAiC;gBACrB,MAAM;qCA2DlB,CAAC"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { IconButton } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ import { useClipboardAvailable, useCopy } from './use-copy.js';
9
+ export const CodeBlock = React.forwardRef(function CodeBlock({ code, language, filename, showLineNumbers = false, maxHeight, copyable = true, onCopy, children, copyLabel, className, style, ...rest }, ref) {
10
+ const t = useAgentMessages().message;
11
+ const captionId = React.useId();
12
+ const clipboard = useClipboardAvailable();
13
+ const { state, failed, copy } = useCopy(onCopy);
14
+ const canCopy = copyable && (onCopy !== undefined || clipboard);
15
+ const caption = filename ?? language ?? t.codeLabel;
16
+ const lines = React.useMemo(() => (showLineNumbers ? code.split('\n') : []), [code, showLineNumbers]);
17
+ const name = state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : (copyLabel ?? t.copyCode);
18
+ const scrollStyle = maxHeight ? { '--rl-agent-code-max-height': maxHeight } : undefined;
19
+ return (_jsxs("figure", { ...rest, ref: ref, className: cx('rl-agent-code', className), style: style, "data-line-numbers": showLineNumbers || undefined, children: [_jsxs("figcaption", { className: "rl-agent-code__caption", children: [_jsx(AgentIcon, { name: filename ? 'file' : 'code', className: "rl-agent-code__icon" }), _jsx("span", { id: captionId, className: "rl-agent-code__title", children: caption }), filename && language && _jsx("span", { className: "rl-agent-code__lang", children: language }), canCopy && (_jsx(IconButton, { className: "rl-agent-code__copy", size: "sm", variant: "ghost", label: name, "data-state": state, icon: _jsx(AgentIcon, { name: state === 'copied' ? 'check' : 'copy' }), onClick: () => void copy(code) })), canCopy && (_jsx("span", { className: "rl-agent-sr", role: "status", children: state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : '' }))] }), failed && _jsx("p", { className: "rl-agent-code__error", role: "alert", children: t.copyFailed }), _jsxs("div", { className: "rl-agent-code__scroll", tabIndex: 0, role: "region", "aria-labelledby": captionId, style: scrollStyle, "data-max-height": maxHeight ? '' : undefined, children: [showLineNumbers && (_jsx("span", { className: "rl-agent-code__gutter", "aria-hidden": "true", children: lines.map((_, i) => (_jsx("span", { children: i + 1 }, i))) })), _jsx("pre", { className: "rl-agent-code__pre", children: _jsx("code", { className: "rl-agent-code__code", "data-language": language, children: children ?? code }) })] })] }));
20
+ });
21
+ //# sourceMappingURL=CodeBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.js","sourceRoot":"","sources":["../../../src/components/message/CodeBlock.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * JumpToLatest (atlas 35): floating pill shown while the reader is away from the newest content.
4
+ * A real `<button>` named "返回最新消息" (+ "N 条新消息" when `unreadCount` > 0). Appearing never
5
+ * moves focus; if the button held focus when it hides, focus is left to the caller (MessageList
6
+ * moves nothing — the viewport keeps the reading position).
7
+ *
8
+ * `loading`: the jump is in progress (smooth scroll / fetching the tail): `aria-busy`, spinner.
9
+ * Motion: MotionPresence `fade` (opacity, `fast`); reduced motion shows / hides at once.
10
+ */
11
+ export type JumpToLatestProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'type'> & {
12
+ /** At the newest content: the button is hidden. */
13
+ atLatest: boolean;
14
+ unreadCount?: number;
15
+ onJump: () => void;
16
+ loading?: boolean;
17
+ label?: string;
18
+ };
19
+ export declare const JumpToLatest: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "onClick"> & {
20
+ /** At the newest content: the button is hidden. */
21
+ atLatest: boolean;
22
+ unreadCount?: number;
23
+ onJump: () => void;
24
+ loading?: boolean;
25
+ label?: string;
26
+ } & React.RefAttributes<HTMLButtonElement>>;
27
+ //# sourceMappingURL=JumpToLatest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JumpToLatest.d.ts","sourceRoot":"","sources":["../../../src/components/message/JumpToLatest.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG;IACrH,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY;IARvB,mDAAmD;cACzC,OAAO;kBACH,MAAM;YACZ,MAAM,IAAI;cACR,OAAO;YACT,MAAM;2CA8Bd,CAAC"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { MotionPresence, Spinner } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ export const JumpToLatest = React.forwardRef(function JumpToLatest({ atLatest, unreadCount = 0, onJump, loading = false, label, className, ...rest }, ref) {
9
+ const t = useAgentMessages().message;
10
+ const name = label ?? t.jumpToLatest;
11
+ const count = unreadCount > 0 ? t.newMessages(unreadCount) : undefined;
12
+ return (_jsx(MotionPresence, { show: !atLatest, preset: "fade", className: "rl-agent-jump", "data-slot": "jump-to-latest", children: _jsxs("button", { ...rest, ref: ref, type: "button", className: cx('rl-agent-jump__button', className), "aria-label": count ? t.jumpWithCount(name, count) : name, "aria-busy": loading || undefined, "data-unread": unreadCount > 0 || undefined, onClick: () => {
13
+ if (!loading)
14
+ onJump();
15
+ }, children: [loading ? _jsx(Spinner, { size: "sm" }) : _jsx(AgentIcon, { name: "arrow-down", className: "rl-agent-jump__icon" }), _jsx("span", { className: "rl-agent-jump__label", children: name }), count && _jsx("span", { className: "rl-agent-jump__count", children: count })] }) }));
16
+ });
17
+ //# sourceMappingURL=JumpToLatest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JumpToLatest.js","sourceRoot":"","sources":["../../../src/components/message/JumpToLatest.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAoBvC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAuC,SAAS,YAAY,CACtG,EAAE,QAAQ,EAAE,WAAW,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACjF,GAAG;IAEH,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,OAAO,CACL,KAAC,cAAc,IAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,eAAe,eAAW,gBAAgB,YACjG,qBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,gBACrC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,eAC5C,OAAO,IAAI,SAAS,iBAClB,WAAW,GAAG,CAAC,IAAI,SAAS,EACzC,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO;oBAAE,MAAM,EAAE,CAAC;YACzB,CAAC,aAEA,OAAO,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAC,YAAY,EAAC,SAAS,EAAC,qBAAqB,GAAG,EAClG,eAAM,SAAS,EAAC,sBAAsB,YAAE,IAAI,GAAQ,EACnD,KAAK,IAAI,eAAM,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAQ,IACxD,GACM,CAClB,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import type { CopyHandler } from './use-copy.js';
3
+ import type { MarkdownRenderContext, MessagePartRenderers } from './renderers.js';
4
+ /**
5
+ * Markdown source through the host renderer, or the safe plain-text fallback: paragraphs keep
6
+ * their line breaks (`white-space: pre-wrap`), fenced code becomes a CodeBlock, and no HTML is
7
+ * ever parsed — `<b>` stays the four visible characters it is.
8
+ */
9
+ export declare function MarkdownContent({ source, context, renderers, onCopy, className, }: {
10
+ source: string;
11
+ context: MarkdownRenderContext;
12
+ renderers?: MessagePartRenderers;
13
+ onCopy?: CopyHandler;
14
+ className?: string;
15
+ }): React.JSX.Element;
16
+ export declare function PlainText({ source, onCopy, className }: {
17
+ source: string;
18
+ onCopy?: CopyHandler;
19
+ className?: string;
20
+ }): React.JSX.Element;
21
+ //# sourceMappingURL=Markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../src/components/message/Markdown.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAElF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAGA;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAiBpH"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cx } from '../../utils/cx.js';
5
+ import { CodeBlock } from './CodeBlock.js';
6
+ import { splitFences } from './plain-text.js';
7
+ /**
8
+ * Markdown source through the host renderer, or the safe plain-text fallback: paragraphs keep
9
+ * their line breaks (`white-space: pre-wrap`), fenced code becomes a CodeBlock, and no HTML is
10
+ * ever parsed — `<b>` stays the four visible characters it is.
11
+ */
12
+ export function MarkdownContent({ source, context, renderers, onCopy, className, }) {
13
+ if (renderers?.markdown)
14
+ return _jsx("div", { className: cx('rl-agent-md', className), children: renderers.markdown(source, context) });
15
+ return _jsx(PlainText, { source: source, onCopy: onCopy, className: className });
16
+ }
17
+ export function PlainText({ source, onCopy, className }) {
18
+ const segments = React.useMemo(() => splitFences(source), [source]);
19
+ return (_jsx("div", { className: cx('rl-agent-md', className), "data-fallback": "", children: segments.map((segment, i) => segment.kind === 'code' ? (_jsx(CodeBlock, { code: segment.code, language: segment.language, onCopy: onCopy }, i)) : (segment.paragraphs.map((p, j) => (_jsx("p", { className: "rl-agent-md__p", children: p }, `${i}-${j}`))))) }));
20
+ }
21
+ //# sourceMappingURL=Markdown.js.map