@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,44 @@
1
+ import * as React from 'react';
2
+ import type { LedgerEventView } from '@wzrhine/agent-core';
3
+ import type { LedgerFilterKey } from '../../provider/messages/workspace.js';
4
+ import type { WorkspaceMessagesProp } from './shared.js';
5
+ /** Events in sequence order, duplicates dropped (first occurrence wins). */
6
+ export declare function orderLedger(events: readonly LedgerEventView[]): LedgerEventView[];
7
+ export type ActivityLedgerProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
8
+ events: LedgerEventView[];
9
+ /** Actor filter (controlled). */
10
+ filter?: LedgerFilterKey;
11
+ defaultFilter?: LedgerFilterKey;
12
+ onFilterChange?: (filter: LedgerFilterKey) => void;
13
+ /** Opens one event; each row title becomes a button. */
14
+ onOpenEvent?: (event: LedgerEventView) => void;
15
+ /** First load in progress (Skeleton rows, `aria-busy`). */
16
+ loading?: boolean;
17
+ /** Show the filter tabs (default true). */
18
+ showFilters?: boolean;
19
+ messages?: WorkspaceMessagesProp;
20
+ };
21
+ /**
22
+ * ActivityLedger (atlas 33): audit events of agent, tool, system and user in `sequence` order.
23
+ * Filtering hides rows but never reorders them; duplicate ids are dropped. Each row has the
24
+ * actor (icon + text), title, optional detail, a `<time dateTime>` and the outcome as glyph +
25
+ * text. Filter tabs are `@wzrhine/react` Tabs (arrow keys, `aria-selected`).
26
+ *
27
+ * Motion: rows present on first render are static; rows that arrive later enter once with
28
+ * AgentEntrance `row` (4px, fast; reduced → no movement). Nothing replays on filter changes.
29
+ */
30
+ export declare const ActivityLedger: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
31
+ events: LedgerEventView[];
32
+ /** Actor filter (controlled). */
33
+ filter?: LedgerFilterKey;
34
+ defaultFilter?: LedgerFilterKey;
35
+ onFilterChange?: (filter: LedgerFilterKey) => void;
36
+ /** Opens one event; each row title becomes a button. */
37
+ onOpenEvent?: (event: LedgerEventView) => void;
38
+ /** First load in progress (Skeleton rows, `aria-busy`). */
39
+ loading?: boolean;
40
+ /** Show the filter tabs (default true). */
41
+ showFilters?: boolean;
42
+ messages?: WorkspaceMessagesProp;
43
+ } & React.RefAttributes<HTMLElement>>;
44
+ //# sourceMappingURL=ActivityLedger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLedger.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ActivityLedger.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAA0B,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAOpG,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,sCAAsC,CAAC;AAE9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAczD,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,EAAE,CAKjF;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG;IACtF,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,iCAAiC;IACjC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;YAvBjB,eAAe,EAAE;IACzB,iCAAiC;aACxB,eAAe;oBACR,eAAe;qBACd,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI;IAClD,wDAAwD;kBAC1C,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI;IAC9C,2DAA2D;cACjD,OAAO;IACjB,2CAA2C;kBAC7B,OAAO;eACV,qBAAqB;qCA8FhC,CAAC"}
@@ -0,0 +1,63 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Skeleton, Tab, TabList, Tabs } from '@wzrhine/react';
5
+ import { dedupeById } from '@wzrhine/agent-core';
6
+ import { useAgentFormat } from '../../provider/AgentMessages.js';
7
+ import { AgentEntrance } from '../../motion/agent-motion.js';
8
+ import { StatusGlyph } from '../../primitives/StatusGlyph.js';
9
+ import { AgentIcon } from '../../primitives/icons.js';
10
+ import { cx } from '../../utils/cx.js';
11
+ import { useIsNewId, useWorkspaceMessages } from './shared.js';
12
+ const FILTERS = ['all', 'agent', 'tool', 'system', 'user'];
13
+ const actorIcon = { agent: 'agent', tool: 'tool', system: 'info', user: 'at' };
14
+ const outcomeGlyph = {
15
+ info: { glyph: 'idle', tone: 'info' },
16
+ success: { glyph: 'done', tone: 'success' },
17
+ warning: { glyph: 'unknown', tone: 'warning' },
18
+ danger: { glyph: 'failed', tone: 'danger' },
19
+ neutral: { glyph: 'idle', tone: 'neutral' },
20
+ };
21
+ /** Events in sequence order, duplicates dropped (first occurrence wins). */
22
+ export function orderLedger(events) {
23
+ return dedupeById(events)
24
+ .map((event, index) => ({ event, index }))
25
+ .sort((a, b) => a.event.sequence - b.event.sequence || a.index - b.index)
26
+ .map(({ event }) => event);
27
+ }
28
+ /**
29
+ * ActivityLedger (atlas 33): audit events of agent, tool, system and user in `sequence` order.
30
+ * Filtering hides rows but never reorders them; duplicate ids are dropped. Each row has the
31
+ * actor (icon + text), title, optional detail, a `<time dateTime>` and the outcome as glyph +
32
+ * text. Filter tabs are `@wzrhine/react` Tabs (arrow keys, `aria-selected`).
33
+ *
34
+ * Motion: rows present on first render are static; rows that arrive later enter once with
35
+ * AgentEntrance `row` (4px, fast; reduced → no movement). Nothing replays on filter changes.
36
+ */
37
+ export const ActivityLedger = React.forwardRef(function ActivityLedger({ events, filter, defaultFilter = 'all', onFilterChange, onOpenEvent, loading, showFilters = true, messages: override, className, ...rest }, ref) {
38
+ const m = useWorkspaceMessages(override);
39
+ const format = useAgentFormat();
40
+ const [innerFilter, setInnerFilter] = React.useState(defaultFilter);
41
+ const active = filter ?? innerFilter;
42
+ const ordered = React.useMemo(() => orderLedger(events), [events]);
43
+ const isNew = useIsNewId(ordered.map((e) => e.id));
44
+ const visible = active === 'all' ? ordered : ordered.filter((e) => e.actor === active);
45
+ const counts = React.useMemo(() => {
46
+ const c = { all: ordered.length, agent: 0, tool: 0, system: 0, user: 0 };
47
+ for (const e of ordered)
48
+ c[e.actor] += 1;
49
+ return c;
50
+ }, [ordered]);
51
+ const listId = React.useId();
52
+ const change = (next) => {
53
+ const key = next;
54
+ if (filter === undefined)
55
+ setInnerFilter(key);
56
+ onFilterChange?.(key);
57
+ };
58
+ return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-ledger', className), "aria-label": m.ledgerList, "aria-busy": loading || undefined, children: [showFilters && (_jsx(Tabs, { value: active, onValueChange: change, size: "sm", variant: "segmented", className: "rl-agent-ledger__filters", children: _jsx(TabList, { "aria-label": m.ledgerFilters, children: FILTERS.map((key) => (_jsx(Tab, { value: key, meta: counts[key], "aria-controls": listId, children: m.ledgerFilter[key] }, key))) }) })), loading && ordered.length === 0 ? (_jsxs("div", { className: "rl-agent-ledger__loading", children: [_jsx(Skeleton, { lines: 3 }), _jsx("span", { className: "rl-agent-sr", children: m.ledgerLoading })] })) : visible.length === 0 ? (_jsx("p", { className: "rl-agent-ledger__empty", id: listId, children: ordered.length === 0 ? m.ledgerEmpty : m.ledgerEmptyFiltered })) : (_jsx("ol", { className: "rl-agent-ledger__list", id: listId, children: visible.map((event) => {
59
+ const outcome = event.outcome ? outcomeGlyph[event.outcome] : undefined;
60
+ return (_jsxs(AgentEntrance, { as: "li", kind: "row", animate: isNew(event.id), className: "rl-agent-ledger__row", "data-actor": event.actor, "data-outcome": event.outcome, children: [_jsxs("span", { className: "rl-agent-ledger__actor", children: [_jsx(AgentIcon, { name: actorIcon[event.actor] }), _jsx("span", { children: m.ledgerActor[event.actor] })] }), _jsxs("span", { className: "rl-agent-ledger__main", children: [onOpenEvent ? (_jsx("button", { type: "button", className: "rl-agent-ledger__title rl-agent-ledger__open", "aria-label": m.ledgerOpen(event.title), onClick: () => onOpenEvent(event), children: event.title })) : (_jsx("span", { className: "rl-agent-ledger__title", children: event.title })), event.detail && _jsx("span", { className: "rl-agent-ledger__detail", children: event.detail })] }), outcome && (_jsxs("span", { className: "rl-agent-ledger__outcome", "data-tone": outcome.tone, children: [_jsx(StatusGlyph, { name: outcome.glyph, tone: outcome.tone }), _jsx("span", { children: m.ledgerOutcome[event.outcome] })] })), _jsx("time", { className: "rl-agent-ledger__time", dateTime: event.at, children: format.time(event.at) })] }, event.id));
61
+ }) }))] }));
62
+ });
63
+ //# sourceMappingURL=ActivityLedger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLedger.js","sourceRoot":"","sources":["../../../src/components/workspace/ActivityLedger.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import * as React from 'react';
2
+ import type { AgentActionHandler } from '@wzrhine/agent-core';
3
+ import type { CompactionPhase, CompactionStatus } from '../../provider/messages/workspace.js';
4
+ import type { WorkspaceMessagesProp } from './shared.js';
5
+ export type { CompactionPhase, CompactionStatus };
6
+ export type CompactionNoticeProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
7
+ status: CompactionStatus;
8
+ /** Sub-step of a running compaction, shown as a sub-label. */
9
+ phase?: CompactionPhase;
10
+ /** Hint after a failed / interrupted compaction; default 「可输入 /compact 重试」. `null` hides it. */
11
+ retryHint?: React.ReactNode;
12
+ tokensBefore?: number;
13
+ tokensAfter?: number;
14
+ /** Elapsed time of a running compaction (the host updates it; nothing polls here). */
15
+ elapsedMs?: number;
16
+ /** Text of the compaction summary (plain text, or markdown through `renderMarkdown`). */
17
+ summary?: string;
18
+ renderMarkdown?: (source: string) => React.ReactNode;
19
+ /** Cancels a running compaction. */
20
+ onCancel?: AgentActionHandler;
21
+ /** Retries saving the result (`save-pending`). */
22
+ onRetrySave?: AgentActionHandler;
23
+ /** Summary disclosure (controlled). */
24
+ summaryOpen?: boolean;
25
+ onSummaryOpenChange?: (open: boolean) => void;
26
+ /** Busy flag for the buttons while an action is being submitted. */
27
+ busy?: boolean;
28
+ messages?: WorkspaceMessagesProp;
29
+ };
30
+ /**
31
+ * CompactionNotice (Wpi context compaction bar): a strip in the message flow for one context
32
+ * compaction. Running: AgentSpark (executing rhythm) + 「正在整理上下文」 + elapsed + cancel.
33
+ * Completed: token delta 「32K → 12K token」 and an optional summary disclosure (Collapsible).
34
+ * `phase` adds a sub-label while running (「准备中」 / 「正在生成摘要」 / 「正在保存结果」).
35
+ * Failed and interrupted (the run stopped before the compaction settled; the old context is kept)
36
+ * show `retryHint`, default 「可输入 /compact 重试」. Save pending: 「重试保存」. The title is a polite
37
+ * status, so the transition to a settled state is announced once.
38
+ */
39
+ export declare const CompactionNotice: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
40
+ status: CompactionStatus;
41
+ /** Sub-step of a running compaction, shown as a sub-label. */
42
+ phase?: CompactionPhase;
43
+ /** Hint after a failed / interrupted compaction; default 「可输入 /compact 重试」. `null` hides it. */
44
+ retryHint?: React.ReactNode;
45
+ tokensBefore?: number;
46
+ tokensAfter?: number;
47
+ /** Elapsed time of a running compaction (the host updates it; nothing polls here). */
48
+ elapsedMs?: number;
49
+ /** Text of the compaction summary (plain text, or markdown through `renderMarkdown`). */
50
+ summary?: string;
51
+ renderMarkdown?: (source: string) => React.ReactNode;
52
+ /** Cancels a running compaction. */
53
+ onCancel?: AgentActionHandler;
54
+ /** Retries saving the result (`save-pending`). */
55
+ onRetrySave?: AgentActionHandler;
56
+ /** Summary disclosure (controlled). */
57
+ summaryOpen?: boolean;
58
+ onSummaryOpenChange?: (open: boolean) => void;
59
+ /** Busy flag for the buttons while an action is being submitted. */
60
+ busy?: boolean;
61
+ messages?: WorkspaceMessagesProp;
62
+ } & React.RefAttributes<HTMLDivElement>>;
63
+ //# sourceMappingURL=CompactionNotice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompactionNotice.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/CompactionNotice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAA8B,MAAM,qBAAqB,CAAC;AAK1F,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC3F,MAAM,EAAE,gBAAgB,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,gGAAgG;IAChG,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACrD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,kDAAkD;IAClD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAUF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;YAzCnB,gBAAgB;IACxB,8DAA8D;YACtD,eAAe;IACvB,gGAAgG;gBACpF,KAAK,CAAC,SAAS;mBACZ,MAAM;kBACP,MAAM;IACpB,sFAAsF;gBAC1E,MAAM;IAClB,yFAAyF;cAC/E,MAAM;qBACC,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS;IACpD,oCAAoC;eACzB,kBAAkB;IAC7B,kDAAkD;kBACpC,kBAAkB;IAChC,uCAAuC;kBACzB,OAAO;0BACC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;IAC7C,oEAAoE;WAC7D,OAAO;eACH,qBAAqB;wCAoFhC,CAAC"}
@@ -0,0 +1,36 @@
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 { useAgentFormat } from '../../provider/AgentMessages.js';
6
+ import { AgentSpark } from '../../primitives/AgentSpark.js';
7
+ import { StatusGlyph } from '../../primitives/StatusGlyph.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ import { useWorkspaceMessages } from './shared.js';
10
+ const settledGlyph = {
11
+ completed: { glyph: 'compacting', tone: 'success' },
12
+ cancelled: { glyph: 'stopped', tone: 'neutral' },
13
+ failed: { glyph: 'failed', tone: 'danger' },
14
+ interrupted: { glyph: 'unknown', tone: 'warning' },
15
+ 'save-pending': { glyph: 'saving', tone: 'warning' },
16
+ };
17
+ /**
18
+ * CompactionNotice (Wpi context compaction bar): a strip in the message flow for one context
19
+ * compaction. Running: AgentSpark (executing rhythm) + 「正在整理上下文」 + elapsed + cancel.
20
+ * Completed: token delta 「32K → 12K token」 and an optional summary disclosure (Collapsible).
21
+ * `phase` adds a sub-label while running (「准备中」 / 「正在生成摘要」 / 「正在保存结果」).
22
+ * Failed and interrupted (the run stopped before the compaction settled; the old context is kept)
23
+ * show `retryHint`, default 「可输入 /compact 重试」. Save pending: 「重试保存」. The title is a polite
24
+ * status, so the transition to a settled state is announced once.
25
+ */
26
+ export const CompactionNotice = React.forwardRef(function CompactionNotice({ status, phase, retryHint, tokensBefore, tokensAfter, elapsedMs, summary, renderMarkdown, onCancel, onRetrySave, summaryOpen, onSummaryOpenChange, busy, messages: override, className, ...rest }, ref) {
27
+ const m = useWorkspaceMessages(override);
28
+ const format = useAgentFormat();
29
+ const running = status === 'running';
30
+ const delta = tokensBefore !== undefined && tokensAfter !== undefined ? m.compactionDelta(format.compact(tokensBefore), format.compact(tokensAfter)) : undefined;
31
+ const text = summary?.trim();
32
+ const glyph = running ? undefined : settledGlyph[status];
33
+ const hint = retryHint === undefined ? m.compactionRetryHint : retryHint;
34
+ return (_jsxs("div", { ...rest, ref: ref, className: cx('rl-agent-compaction', className), "data-status": status, children: [_jsxs("div", { className: "rl-agent-compaction__row", children: [running ? _jsx(AgentSpark, { phase: "executing" }) : _jsx(StatusGlyph, { name: glyph.glyph, tone: glyph.tone }), _jsxs("p", { className: "rl-agent-compaction__title", role: "status", children: [_jsx("span", { children: m.compactionStatus[status] }), running && phase && _jsx("span", { className: "rl-agent-compaction__phase", children: m.compactionPhase[phase] }), !running && delta && _jsx("span", { className: "rl-agent-compaction__delta", children: delta })] }), running && elapsedMs !== undefined && _jsx("span", { className: "rl-agent-compaction__elapsed", children: format.duration(elapsedMs) }), (status === 'failed' || status === 'interrupted') && hint != null && hint !== false && _jsx("span", { className: "rl-agent-compaction__hint", children: hint }), running && onCancel && (_jsx(Button, { size: "sm", variant: "ghost", loading: busy, onClick: () => void onCancel(), children: m.compactionCancel })), status === 'save-pending' && onRetrySave && (_jsx(Button, { size: "sm", variant: "secondary", loading: busy, onClick: () => void onRetrySave(), children: m.compactionRetrySave }))] }), !running && text && (_jsx(Collapsible, { className: "rl-agent-compaction__summary", open: summaryOpen, defaultOpen: summaryOpen === undefined ? false : undefined, onOpenChange: onSummaryOpenChange, trigger: _jsx("span", { children: m.compactionSummary }), children: renderMarkdown ? renderMarkdown(text) : _jsx("p", { className: "rl-agent-compaction__text", children: text }) }))] }));
35
+ });
36
+ //# sourceMappingURL=CompactionNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompactionNotice.js","sourceRoot":"","sources":["../../../src/components/workspace/CompactionNotice.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA8BnD,MAAM,YAAY,GAA8F;IAC9G,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;IACnD,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAChD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC3C,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAClD,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;CACrD,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAwC,SAAS,gBAAgB,CAC/G,EACE,MAAM,EACN,KAAK,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,SAAS,EACT,OAAO,EACP,cAAc,EACd,QAAQ,EACR,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,IAAI,EACJ,QAAQ,EAAE,QAAQ,EAClB,SAAS,EACT,GAAG,IAAI,EACR,EACD,GAAG;IAEH,MAAM,CAAC,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjK,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzE,OAAO,CACL,kBAAS,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,iBAAe,MAAM,aAC3F,eAAK,SAAS,EAAC,0BAA0B,aACtC,OAAO,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,KAAK,EAAC,WAAW,GAAG,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,IAAI,EAAE,KAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAM,CAAC,IAAI,GAAI,EACpG,aAAG,SAAS,EAAC,4BAA4B,EAAC,IAAI,EAAC,QAAQ,aACrD,yBAAO,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAQ,EACxC,OAAO,IAAI,KAAK,IAAI,eAAM,SAAS,EAAC,4BAA4B,YAAE,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAQ,EAClG,CAAC,OAAO,IAAI,KAAK,IAAI,eAAM,SAAS,EAAC,4BAA4B,YAAE,KAAK,GAAQ,IAC/E,EACH,OAAO,IAAI,SAAS,KAAK,SAAS,IAAI,eAAM,SAAS,EAAC,8BAA8B,YAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAQ,EACxH,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,aAAa,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,eAAM,SAAS,EAAC,2BAA2B,YAAE,IAAI,GAAQ,EAChJ,OAAO,IAAI,QAAQ,IAAI,CACtB,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,YAC5E,CAAC,CAAC,gBAAgB,GACZ,CACV,EACA,MAAM,KAAK,cAAc,IAAI,WAAW,IAAI,CAC3C,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,WAAW,EAAE,YACnF,CAAC,CAAC,mBAAmB,GACf,CACV,IACG,EACL,CAAC,OAAO,IAAI,IAAI,IAAI,CACnB,KAAC,WAAW,IACV,SAAS,EAAC,8BAA8B,EACxC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC1D,YAAY,EAAE,mBAAmB,EACjC,OAAO,EAAE,yBAAO,CAAC,CAAC,iBAAiB,GAAQ,YAE1C,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,2BAA2B,YAAE,IAAI,GAAK,GAChF,CACf,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+ import type { PopoverAlign, PopoverSide } from '@wzrhine/react';
3
+ import type { ContextUsageView } from '@wzrhine/agent-core';
4
+ import type { WorkspaceMessagesProp } from './shared.js';
5
+ export type ContextUsageVariant = 'ring' | 'bar' | 'full';
6
+ export type ContextUsageProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
7
+ usage: ContextUsageView;
8
+ /**
9
+ * `ring`: compact trigger (ring + 「12.4K / 32K」) that opens the full view in a Popover.
10
+ * `bar`: one line with a meter. `full`: meter, breakdown legend, warnings and note.
11
+ */
12
+ variant?: ContextUsageVariant;
13
+ /** Popover placement for `ring`. */
14
+ side?: PopoverSide;
15
+ align?: PopoverAlign;
16
+ /** `ring`: also open the Popover on hover (focus and click still open it). */
17
+ openOnHover?: boolean;
18
+ messages?: WorkspaceMessagesProp;
19
+ };
20
+ /**
21
+ * ContextUsage (atlas 27): context / token budget. A percentage — the ring arc, the Meter — is
22
+ * drawn only when `usagePercent` returns a number (exact or estimated value with a reliable max);
23
+ * unknown or partial data shows text without a `role="meter"`. Non-exact numbers always carry
24
+ * 「估计值」 / 「部分数据」. Near (≥ 80%) and over the limit add a warning sentence, not only colour.
25
+ * `usage.stats` (cache hit rate, TTFT, TPS…) render in the full view and the popover as one
26
+ * `<dl>` per section; a missing value shows 「—」 (read as 「无数据」), never 0.
27
+ *
28
+ * Motion: none of its own (the Popover has its CSS transition); values update directly.
29
+ */
30
+ export declare const ContextUsage: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
31
+ usage: ContextUsageView;
32
+ /**
33
+ * `ring`: compact trigger (ring + 「12.4K / 32K」) that opens the full view in a Popover.
34
+ * `bar`: one line with a meter. `full`: meter, breakdown legend, warnings and note.
35
+ */
36
+ variant?: ContextUsageVariant;
37
+ /** Popover placement for `ring`. */
38
+ side?: PopoverSide;
39
+ align?: PopoverAlign;
40
+ /** `ring`: also open the Popover on hover (focus and click still open it). */
41
+ openOnHover?: boolean;
42
+ messages?: WorkspaceMessagesProp;
43
+ } & React.RefAttributes<HTMLDivElement>>;
44
+ //# sourceMappingURL=ContextUsage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextUsage.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ContextUsage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,qBAAqB,CAAC;AAK5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACvF,KAAK,EAAE,gBAAgB,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,oCAAoC;IACpC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAgHF;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;WAtIhB,gBAAgB;IACvB;;;OAGG;cACO,mBAAmB;IAC7B,oCAAoC;WAC7B,WAAW;YACV,YAAY;IACpB,8EAA8E;kBAChE,OAAO;eACV,qBAAqB;wCAqKhC,CAAC"}
@@ -0,0 +1,106 @@
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 { Meter, Popover } from '@wzrhine/react';
5
+ import { usageLevel, usagePercent } from '@wzrhine/agent-core';
6
+ import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { AgentIcon } from '../../primitives/icons.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ import { completenessTag, useWorkspaceMessages } from './shared.js';
10
+ function useDerived(usage, override) {
11
+ const m = useWorkspaceMessages(override);
12
+ const status = useAgentMessages().status;
13
+ const format = useAgentFormat();
14
+ const percent = usagePercent(usage.used, usage.max, usage.completeness);
15
+ const level = usage.completeness === 'unknown' ? 'unknown' : usageLevel(usage.used, usage.max);
16
+ const value = (n) => (usage.unit === 'bytes' ? format.bytes(n) : format.compact(n));
17
+ let summary = m.contextUnknown;
18
+ if (usage.used !== undefined && usage.completeness !== 'unknown') {
19
+ summary = usage.max !== undefined && usage.max > 0 ? `${value(usage.used)} / ${value(usage.max)}` : value(usage.used);
20
+ }
21
+ return { m, percent, level, summary, tag: completenessTag(usage.completeness, status.completeness), label: usage.label ?? m.contextTitle };
22
+ }
23
+ /** The ring: an arc for a reliable percentage, a dashed circle when there is none. */
24
+ function Ring({ percent, level }) {
25
+ const arc = percent === null ? null : Math.max(0, Math.min(100, percent));
26
+ return (_jsxs("svg", { className: "rl-agent-context__ring", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-level": level, "data-unknown": arc === null || undefined, children: [_jsx("circle", { className: "rl-agent-context__ring-track", cx: "8", cy: "8", r: "6", pathLength: "100" }), arc !== null && _jsx("circle", { className: "rl-agent-context__ring-arc", cx: "8", cy: "8", r: "6", pathLength: "100", strokeDasharray: `${arc} 100` })] }));
27
+ }
28
+ function Warning({ level, m }) {
29
+ if (level !== 'near' && level !== 'over')
30
+ return null;
31
+ return (_jsxs("p", { className: "rl-agent-context__warning", "data-level": level, children: [_jsx(AgentIcon, { name: "warning" }), level === 'over' ? m.contextOver : m.contextNear] }));
32
+ }
33
+ /** Meter when the percentage is reliable; otherwise plain text (never a role=meter without a max). */
34
+ function Measure({ usage, d, size }) {
35
+ const { m, percent, level, summary, tag, label } = d;
36
+ const unit = m.contextUnit[usage.unit];
37
+ if (percent !== null && usage.used !== undefined && usage.max !== undefined) {
38
+ const text = `${summary} · ${m.contextPercent(percent)}`;
39
+ return (_jsx(Meter, { className: "rl-agent-context__meter", "data-level": level, size: size, label: _jsxs(_Fragment, { children: [label, tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] }), value: Math.min(usage.used, usage.max), high: usage.max * 0.8, optimum: 0, max: usage.max, valueText: text, getValueText: () => [summary, unit, m.contextPercent(percent), tag].filter(Boolean).join(' ') }));
40
+ }
41
+ return (_jsxs("p", { className: "rl-agent-context__line", "data-level": level, children: [_jsx("span", { className: "rl-agent-context__label", children: label }), _jsxs("span", { className: "rl-agent-context__value", children: [summary, usage.used !== undefined && usage.completeness !== 'unknown' && unit ? ` ${unit}` : ''] }), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag }), (usage.max === undefined || usage.max <= 0) && usage.completeness !== 'unknown' && _jsx("span", { className: "rl-agent-context__hint", children: m.contextNoMax })] }));
42
+ }
43
+ function Breakdown({ usage, m }) {
44
+ const format = useAgentFormat();
45
+ const segments = (usage.segments ?? []).filter((s) => s.value > 0);
46
+ if (segments.length === 0)
47
+ return null;
48
+ const sum = segments.reduce((acc, s) => acc + s.value, 0);
49
+ // With a reliable max the stacked bar shows the share of the window; otherwise the composition.
50
+ const total = usage.max && usage.max > 0 && usage.completeness !== 'unknown' ? Math.max(usage.max, sum) : sum;
51
+ const value = (n) => (usage.unit === 'bytes' ? format.bytes(n) : format.compact(n));
52
+ return (_jsxs("div", { className: "rl-agent-context__breakdown", children: [_jsx("div", { className: "rl-agent-context__stack", "aria-hidden": "true", children: segments.map((s) => (_jsx("span", { className: "rl-agent-context__segment", "data-tone": s.tone ?? 'neutral', style: { inlineSize: `${(s.value / total) * 100}%` } }, s.id))) }), _jsx("ul", { className: "rl-agent-context__legend", "aria-label": m.contextBreakdown, children: segments.map((s) => (_jsxs("li", { className: "rl-agent-context__legend-item", children: [_jsx("span", { className: "rl-agent-context__swatch", "data-tone": s.tone ?? 'neutral', "aria-hidden": "true" }), _jsx("span", { className: "rl-agent-context__legend-label", children: s.label }), _jsx("span", { className: "rl-agent-context__legend-value", children: value(s.value) })] }, s.id))) })] }));
53
+ }
54
+ /**
55
+ * ContextUsage (atlas 27): context / token budget. A percentage — the ring arc, the Meter — is
56
+ * drawn only when `usagePercent` returns a number (exact or estimated value with a reliable max);
57
+ * unknown or partial data shows text without a `role="meter"`. Non-exact numbers always carry
58
+ * 「估计值」 / 「部分数据」. Near (≥ 80%) and over the limit add a warning sentence, not only colour.
59
+ * `usage.stats` (cache hit rate, TTFT, TPS…) render in the full view and the popover as one
60
+ * `<dl>` per section; a missing value shows 「—」 (read as 「无数据」), never 0.
61
+ *
62
+ * Motion: none of its own (the Popover has its CSS transition); values update directly.
63
+ */
64
+ export const ContextUsage = React.forwardRef(function ContextUsage({ usage, variant = 'full', side = 'top', align = 'end', openOnHover, messages: override, className, ...rest }, ref) {
65
+ const d = useDerived(usage, override);
66
+ const { m, level, summary, tag } = d;
67
+ if (variant === 'ring') {
68
+ return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-context', className), "data-variant": "ring", "data-level": level, children: _jsx(Popover, { side: side, align: align, size: "sm", openOnHover: openOnHover, title: m.contextTitle, trigger: _jsxs("button", { type: "button", className: "rl-agent-context__trigger", "data-level": level, "aria-label": m.contextTrigger(tag ? `${summary} · ${tag}` : summary), children: [_jsx(Ring, { percent: d.percent, level: level }), _jsx("span", { className: "rl-agent-context__value", children: summary }), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] }), children: _jsx(ContextUsageDetail, { usage: usage, d: d }) }) }));
69
+ }
70
+ return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-context', className), "data-variant": variant, "data-level": level, children: variant === 'bar' ? (_jsxs(_Fragment, { children: [_jsx(Measure, { usage: usage, d: d, size: "sm" }), _jsx(Warning, { level: level, m: m })] })) : (_jsx(ContextUsageDetail, { usage: usage, d: d })) }));
71
+ });
72
+ function ContextUsageDetail({ usage, d }) {
73
+ return (_jsxs("div", { className: "rl-agent-context__detail", children: [_jsx(Measure, { usage: usage, d: d, size: "md" }), _jsx(Warning, { level: d.level, m: d.m }), _jsx(Breakdown, { usage: usage, m: d.m }), _jsx(Stats, { sections: usage.stats, m: d.m }), usage.note && (_jsxs("p", { className: "rl-agent-context__note", children: [_jsx(AgentIcon, { name: "info" }), usage.note] }))] }));
74
+ }
75
+ function Stats({ sections, m }) {
76
+ const status = useAgentMessages().status;
77
+ const format = useAgentFormat();
78
+ const id = React.useId();
79
+ const shown = (sections ?? []).filter((s) => s.rows.length > 0);
80
+ if (shown.length === 0)
81
+ return null;
82
+ const valueOf = (row) => {
83
+ const v = row.value;
84
+ switch (row.unit) {
85
+ case 'ms':
86
+ return m.contextStatValue(format.duration(v), 'ms');
87
+ case 'tokens':
88
+ return m.contextStatValue(format.compact(v), 'tokens');
89
+ case 'percent':
90
+ return m.contextStatValue(format.number(Math.round(v * 10) / 10), 'percent');
91
+ case 'tokens-per-s':
92
+ return m.contextStatValue(format.number(Math.round(v * 10) / 10), 'tokens-per-s');
93
+ default:
94
+ return m.contextStatValue(format.number(v), 'count');
95
+ }
96
+ };
97
+ return (_jsx("div", { className: "rl-agent-context__stats", role: "group", "aria-label": m.contextStats, children: shown.map((section, i) => {
98
+ const titleId = `${id}-${i}`;
99
+ return (_jsxs("section", { className: "rl-agent-context__stat-section", "aria-labelledby": titleId, children: [_jsx("p", { id: titleId, className: "rl-agent-context__stat-title", children: section.title }), _jsx("dl", { className: "rl-agent-context__stat-list", children: section.rows.map((row, j) => {
100
+ const missing = row.value === undefined || !Number.isFinite(row.value) || row.completeness === 'unknown';
101
+ const tag = !missing && row.completeness ? completenessTag(row.completeness, status.completeness) : undefined;
102
+ return (_jsxs("div", { className: "rl-agent-context__stat", children: [_jsx("dt", { children: row.label }), _jsxs("dd", { "data-missing": missing || undefined, children: [missing ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: "\u2014" }), _jsx("span", { className: "rl-agent-sr", children: m.contextStatMissing })] })) : (valueOf(row)), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] })] }, `${row.label}-${j}`));
103
+ }) })] }, section.id));
104
+ }) }));
105
+ }
106
+ //# sourceMappingURL=ContextUsage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextUsage.js","sourceRoot":"","sources":["../../../src/components/workspace/ContextUsage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import * as React from 'react';
2
+ import type { AgentActionHandler, MaterialPageView, TerminalView } from '@wzrhine/agent-core';
3
+ import type { ChunkPagerActions } from '../tools/ChunkPager.js';
4
+ import type { HeadingLevel, WorkspaceMessagesProp } from './shared.js';
5
+ /** Inherited / read-only terminals are history only: no input, no stop. */
6
+ export declare function isTerminalReadOnly(terminal: TerminalView): boolean;
7
+ export type PersistentTerminalProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onInput'> & {
8
+ terminal: TerminalView;
9
+ /** Sends one line to the session. Without it (or when read-only) no input line is drawn. */
10
+ onInput?: AgentActionHandler<[text: string, terminal: TerminalView]>;
11
+ /** Requests a stop. Drawn only when `terminal.stoppable`. Also used by 「重试停止」. */
12
+ onStop?: AgentActionHandler<[terminal: TerminalView]>;
13
+ /** Loads older output (`terminal.outputTruncated`). The scroll position is kept. */
14
+ onLoadEarlier?: AgentActionHandler<[terminal: TerminalView]>;
15
+ /** Reads the newest output (`terminal.newerOutput`); draws 「有新输出,读取最新」. */
16
+ onReadLatest?: AgentActionHandler<[terminal: TerminalView]>;
17
+ /** Loads earlier entries of `terminal.history`. */
18
+ onLoadMoreHistory?: AgentActionHandler<[terminal: TerminalView]>;
19
+ /** One page of stored output; replaces the live tail with a `ChunkPager`. */
20
+ page?: MaterialPageView;
21
+ /** Paging callbacks for `page` (`canGoBack` defaults to false). */
22
+ pager?: Partial<ChunkPagerActions>;
23
+ headingLevel?: HeadingLevel;
24
+ /** Hide the name heading (e.g. inside `TerminalTabs`, where the tab already names it). */
25
+ hideName?: boolean;
26
+ messages?: WorkspaceMessagesProp;
27
+ };
28
+ /**
29
+ * PersistentTerminal (atlas 22): one terminal session with its own lifecycle. A command
30
+ * returning never closes the session (`idle` says so); a stop request shows 「停止尚未确认」 until
31
+ * the adapter confirms it; `unknown` is never shown as ended.
32
+ *
33
+ * Accessibility: the console is `role="log"` with `aria-live="off"`, so streamed chunks are never
34
+ * read out one by one; the session status sits in a polite `role="status"` instead. The console
35
+ * is focusable for keyboard scrolling. The input is a labelled single-line field; Enter sends,
36
+ * except while an IME composition is active.
37
+ *
38
+ * `terminal.newerOutput` (the loaded snapshot is older than the session) adds 「有新输出,读取最新」
39
+ * (`onReadLatest`); `terminal.notes` render as small notes; `terminal.history` is an ordered list
40
+ * 「调用记录」 (command, glyph + status text, exit code, `<time>`) with `onLoadMoreHistory`. With
41
+ * `page` the stored output is read through a `ChunkPager` instead of the live tail.
42
+ *
43
+ * Motion: none. The cursor is a static block; the console follows new output only while the
44
+ * reader is at the bottom, otherwise a 「有新输出」 button appears.
45
+ */
46
+ export declare const PersistentTerminal: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onInput"> & {
47
+ terminal: TerminalView;
48
+ /** Sends one line to the session. Without it (or when read-only) no input line is drawn. */
49
+ onInput?: AgentActionHandler<[text: string, terminal: TerminalView]>;
50
+ /** Requests a stop. Drawn only when `terminal.stoppable`. Also used by 「重试停止」. */
51
+ onStop?: AgentActionHandler<[terminal: TerminalView]>;
52
+ /** Loads older output (`terminal.outputTruncated`). The scroll position is kept. */
53
+ onLoadEarlier?: AgentActionHandler<[terminal: TerminalView]>;
54
+ /** Reads the newest output (`terminal.newerOutput`); draws 「有新输出,读取最新」. */
55
+ onReadLatest?: AgentActionHandler<[terminal: TerminalView]>;
56
+ /** Loads earlier entries of `terminal.history`. */
57
+ onLoadMoreHistory?: AgentActionHandler<[terminal: TerminalView]>;
58
+ /** One page of stored output; replaces the live tail with a `ChunkPager`. */
59
+ page?: MaterialPageView;
60
+ /** Paging callbacks for `page` (`canGoBack` defaults to false). */
61
+ pager?: Partial<ChunkPagerActions>;
62
+ headingLevel?: HeadingLevel;
63
+ /** Hide the name heading (e.g. inside `TerminalTabs`, where the tab already names it). */
64
+ hideName?: boolean;
65
+ messages?: WorkspaceMessagesProp;
66
+ } & React.RefAttributes<HTMLElement>>;
67
+ export type TerminalTabsProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onInput' | 'defaultValue'> & {
68
+ terminals: TerminalView[];
69
+ /** Active terminal id (controlled). */
70
+ value?: string;
71
+ defaultValue?: string;
72
+ onValueChange?: (id: string) => void;
73
+ onInput?: PersistentTerminalProps['onInput'];
74
+ onStop?: PersistentTerminalProps['onStop'];
75
+ onLoadEarlier?: PersistentTerminalProps['onLoadEarlier'];
76
+ onReadLatest?: PersistentTerminalProps['onReadLatest'];
77
+ onLoadMoreHistory?: PersistentTerminalProps['onLoadMoreHistory'];
78
+ headingLevel?: HeadingLevel;
79
+ messages?: WorkspaceMessagesProp;
80
+ };
81
+ /**
82
+ * Several terminals as tabs (Tabs from `@wzrhine/react`: roving focus, arrow keys, Home / End).
83
+ * Each tab names the terminal and its status, so the status is readable without opening it.
84
+ */
85
+ export declare function TerminalTabs({ terminals, value, defaultValue, onValueChange, onInput, onStop, onLoadEarlier, onReadLatest, onLoadMoreHistory, headingLevel, messages: override, className, ...rest }: TerminalTabsProps): React.JSX.Element;
86
+ //# sourceMappingURL=PersistentTerminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentTerminal.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/PersistentTerminal.tsx"],"names":[],"mappings":"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"}