@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,40 @@
1
+ import * as React from 'react';
2
+ import type { ModelEffort, ModelOptionView, ModelProviderView } from '@wzrhine/agent-core';
3
+ export interface ModelPickerProps {
4
+ providers: readonly ModelProviderView[];
5
+ /** Selected model id (controlled). */
6
+ selectedModel?: string | null;
7
+ onModelChange?: (modelId: string, model: ModelOptionView) => void;
8
+ /** Selected effort (controlled); must be one of the model's `efforts`. */
9
+ effort?: ModelEffort | null;
10
+ onEffortChange?: (effort: ModelEffort) => void;
11
+ loading?: boolean;
12
+ /** Error text for the model list (`true` → default copy). */
13
+ error?: React.ReactNode;
14
+ disabled?: boolean;
15
+ open?: boolean;
16
+ defaultOpen?: boolean;
17
+ onOpenChange?: (open: boolean) => void;
18
+ /** Initial layer when the popover opens. */
19
+ defaultLayer?: 'effort' | 'models';
20
+ side?: 'top' | 'bottom';
21
+ align?: 'start' | 'center' | 'end';
22
+ className?: string;
23
+ }
24
+ /**
25
+ * Model and reasoning-effort picker (atlas 19). A trigger button (model label + effort, truncated)
26
+ * opens a Popover with two layers:
27
+ * - effort layer: current model with a 切换模型 drill button and a RadioGroup of the model's
28
+ * efforts (arrow keys move and select);
29
+ * - model layer: providers as labelled groups (a disabled provider shows its reason), model
30
+ * buttons with capability tags; unavailable models are `aria-disabled` with the reason as
31
+ * their description; the selected one has `aria-current` and a check. ↑ / ↓ move between models.
32
+ *
33
+ * Selection is controlled: the picker emits `onModelChange` / `onEffortChange` and the host
34
+ * updates `selectedModel` / `effort`. It never touches the composer draft. Focus moves to the
35
+ * first control of the new layer on drill / back and returns to the trigger on close.
36
+ * Motion: layer drill is motion/react `x` (single axis) + opacity with the `panel` preset;
37
+ * reduced → instant. The popover itself uses the Popover CSS transition.
38
+ */
39
+ export declare function ModelPicker({ providers, selectedModel, onModelChange, effort, onEffortChange, loading, error, disabled, open: openProp, defaultOpen, onOpenChange, defaultLayer, side, align, className, }: ModelPickerProps): React.JSX.Element;
40
+ //# sourceMappingURL=ModelPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelPicker.d.ts","sourceRoot":"","sources":["../../../src/components/composer/ModelPicker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAK3F,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,0EAA0E;IAC1E,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,4CAA4C;IAC5C,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,aAAa,EACb,aAAa,EACb,MAAM,EACN,cAAc,EACd,OAAe,EACf,KAAK,EACL,QAAgB,EAChB,IAAI,EAAE,QAAQ,EACd,WAAmB,EACnB,YAAY,EACZ,YAAuB,EACvB,IAAY,EACZ,KAAe,EACf,SAAS,GACV,EAAE,gBAAgB,qBAgKlB"}
@@ -0,0 +1,115 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { motion } from 'motion/react';
5
+ import { Button, IconButton, Popover, Radio, RadioGroup, Spinner, useRhineMotion } from '@wzrhine/react';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ function findModel(providers, id) {
10
+ if (!id)
11
+ return undefined;
12
+ for (const provider of providers) {
13
+ const hit = provider.models.find((m) => m.id === id);
14
+ if (hit)
15
+ return hit;
16
+ }
17
+ return undefined;
18
+ }
19
+ /**
20
+ * Model and reasoning-effort picker (atlas 19). A trigger button (model label + effort, truncated)
21
+ * opens a Popover with two layers:
22
+ * - effort layer: current model with a 切换模型 drill button and a RadioGroup of the model's
23
+ * efforts (arrow keys move and select);
24
+ * - model layer: providers as labelled groups (a disabled provider shows its reason), model
25
+ * buttons with capability tags; unavailable models are `aria-disabled` with the reason as
26
+ * their description; the selected one has `aria-current` and a check. ↑ / ↓ move between models.
27
+ *
28
+ * Selection is controlled: the picker emits `onModelChange` / `onEffortChange` and the host
29
+ * updates `selectedModel` / `effort`. It never touches the composer draft. Focus moves to the
30
+ * first control of the new layer on drill / back and returns to the trigger on close.
31
+ * Motion: layer drill is motion/react `x` (single axis) + opacity with the `panel` preset;
32
+ * reduced → instant. The popover itself uses the Popover CSS transition.
33
+ */
34
+ export function ModelPicker({ providers, selectedModel, onModelChange, effort, onEffortChange, loading = false, error, disabled = false, open: openProp, defaultOpen = false, onOpenChange, defaultLayer = 'effort', side = 'top', align = 'start', className, }) {
35
+ const messages = useAgentMessages().composer;
36
+ const { reduced, resolve } = useRhineMotion();
37
+ const [innerOpen, setInnerOpen] = React.useState(defaultOpen);
38
+ const open = openProp ?? innerOpen;
39
+ const [layer, setLayer] = React.useState(defaultLayer);
40
+ const [direction, setDirection] = React.useState(0);
41
+ const switchRef = React.useRef(null);
42
+ const backRef = React.useRef(null);
43
+ const moved = React.useRef(false);
44
+ const model = findModel(providers, selectedModel);
45
+ const efforts = model?.efforts ?? [];
46
+ const effortLabel = effort && efforts.includes(effort) ? messages.effort[effort] : undefined;
47
+ const modelLabel = model?.label ?? messages.modelPlaceholder;
48
+ const setOpen = (next) => {
49
+ if (next) {
50
+ setLayer(defaultLayer);
51
+ setDirection(0);
52
+ }
53
+ if (openProp === undefined)
54
+ setInnerOpen(next);
55
+ onOpenChange?.(next);
56
+ };
57
+ const go = (next) => {
58
+ moved.current = true;
59
+ setDirection(next === 'models' ? 1 : -1);
60
+ setLayer(next);
61
+ };
62
+ // Focus follows the layer (not on first open: Popover focuses the first control itself).
63
+ React.useLayoutEffect(() => {
64
+ if (!open || !moved.current)
65
+ return;
66
+ moved.current = false;
67
+ (layer === 'models' ? backRef : switchRef).current?.focus();
68
+ }, [layer, open]);
69
+ const choose = (candidate, provider) => {
70
+ if (candidate.disabled || provider.disabled)
71
+ return;
72
+ if (candidate.id !== selectedModel)
73
+ onModelChange?.(candidate.id, candidate);
74
+ go('effort');
75
+ };
76
+ const moveFocus = (event) => {
77
+ if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Home' && event.key !== 'End')
78
+ return;
79
+ const items = Array.from(event.currentTarget.querySelectorAll('.rl-agent-model__option'));
80
+ if (items.length === 0)
81
+ return;
82
+ const index = items.indexOf(document.activeElement);
83
+ const next = event.key === 'Home'
84
+ ? 0
85
+ : event.key === 'End'
86
+ ? items.length - 1
87
+ : Math.max(0, Math.min(items.length - 1, index + (event.key === 'ArrowDown' ? 1 : -1)));
88
+ event.preventDefault();
89
+ items[next]?.focus();
90
+ };
91
+ const offset = reduced || direction === 0 ? 0 : direction * 16;
92
+ const transition = { x: resolve('transform', 'panel'), opacity: resolve('opacity', 'panel') };
93
+ const effortLayer = (_jsxs("div", { className: "rl-agent-model__layer", "data-layer": "effort", children: [_jsx("div", { className: "rl-agent-model__current", children: _jsxs("button", { ref: switchRef, type: "button", className: "rl-agent-model__switch", onClick: () => go('models'), children: [_jsx(AgentIcon, { name: "model" }), _jsx("span", { className: "rl-agent-model__name", children: modelLabel }), _jsx("span", { className: "rl-agent-model__switch-hint", children: messages.switchModel }), _jsx(AgentIcon, { name: "chevron-right" })] }) }), model && efforts.length > 0 ? (_jsx(RadioGroup, { label: messages.effortHeading, className: "rl-agent-model__efforts", value: effortLabel ? effort : '', onValueChange: (next) => {
94
+ if (typeof next === 'string' && efforts.includes(next))
95
+ onEffortChange?.(next);
96
+ }, readOnly: !onEffortChange, description: messages.effortNote, orientation: "vertical", children: efforts.map((value) => (_jsx(Radio, { value: value, label: messages.effort[value] }, value))) })) : (_jsx("p", { className: "rl-agent-model__note", children: model ? messages.effortNone : messages.modelPlaceholder }))] }));
97
+ const modelLayer = (_jsxs("div", { className: "rl-agent-model__layer", "data-layer": "models", children: [_jsxs("div", { className: "rl-agent-model__layer-header", children: [_jsx(IconButton, { ref: backRef, size: "sm", label: messages.back, icon: _jsx(AgentIcon, { name: "arrow-left" }), onClick: () => go('effort') }), _jsx("span", { className: "rl-agent-model__eyebrow", children: messages.modelHeading })] }), loading ? (_jsxs("p", { className: "rl-agent-model__note", role: "status", children: [_jsx(Spinner, { size: "sm" }), messages.modelsLoading] })) : error != null && error !== false ? (_jsxs("p", { className: "rl-agent-model__note", "data-tone": "danger", role: "alert", children: [_jsx(AgentIcon, { name: "warning" }), error === true ? messages.modelsError : error] })) : providers.every((p) => p.models.length === 0) ? (_jsx("p", { className: "rl-agent-model__note", children: messages.modelsEmpty })) : (_jsx("div", { className: "rl-agent-model__list", onKeyDown: moveFocus, children: providers.map((provider) => (_jsx(ProviderGroup, { provider: provider, selectedModel: selectedModel, onChoose: choose }, provider.id))) }))] }));
98
+ return (_jsx(Popover, { open: open, onOpenChange: setOpen, side: side, align: align, size: "md", "aria-label": messages.modelPickerLabel, className: cx('rl-agent-model', className), trigger: _jsxs(Button, { variant: "ghost", size: "sm", className: "rl-agent-picker-trigger", disabled: disabled, "aria-label": messages.modelTriggerLabel(modelLabel, effortLabel), iconEnd: _jsx(AgentIcon, { name: "chevron-down" }), children: [_jsx("span", { className: "rl-agent-picker-trigger__text", children: modelLabel }), effortLabel && _jsx("span", { className: "rl-agent-picker-trigger__meta", children: effortLabel })] }), children: _jsx(motion.div, { className: "rl-agent-model__viewport", initial: offset === 0 ? false : { opacity: 0, x: offset }, animate: { opacity: 1, x: 0 }, transition: transition, children: layer === 'effort' ? effortLayer : modelLayer }, layer) }));
99
+ }
100
+ function ProviderGroup({ provider, selectedModel, onChoose, }) {
101
+ const messages = useAgentMessages().composer;
102
+ const headingId = React.useId();
103
+ const reasonId = React.useId();
104
+ if (provider.models.length === 0)
105
+ return null;
106
+ return (_jsxs("section", { className: "rl-agent-model__group", "aria-labelledby": headingId, "data-disabled": provider.disabled || undefined, children: [_jsx("h3", { id: headingId, className: "rl-agent-model__group-label", children: provider.label }), provider.disabled && provider.unavailableReason && (_jsx("p", { id: reasonId, className: "rl-agent-model__reason", children: messages.optionUnavailable(provider.unavailableReason) })), _jsx("ul", { className: "rl-agent-model__options", children: provider.models.map((option) => (_jsx(ModelRow, { option: option, provider: provider, providerReasonId: provider.disabled && provider.unavailableReason ? reasonId : undefined, selected: option.id === selectedModel, onChoose: onChoose }, option.id))) })] }));
107
+ }
108
+ function ModelRow({ option, provider, providerReasonId, selected, onChoose, }) {
109
+ const messages = useAgentMessages().composer;
110
+ const descId = React.useId();
111
+ const unavailable = Boolean(option.disabled || provider.disabled);
112
+ const reason = option.disabled ? messages.optionUnavailable(option.unavailableReason) : undefined;
113
+ return (_jsx("li", { children: _jsxs("button", { type: "button", className: "rl-agent-model__option", "aria-current": selected || undefined, "aria-disabled": unavailable || undefined, "aria-describedby": cx(descId, providerReasonId) || undefined, "data-selected": selected || undefined, onClick: () => onChoose(option, provider), children: [_jsxs("span", { className: "rl-agent-model__option-body", children: [_jsx("span", { className: "rl-agent-model__name", title: option.label, children: option.label }), _jsxs("span", { id: descId, className: "rl-agent-model__option-meta", children: [option.capabilities && option.capabilities.length > 0 && (_jsx("span", { className: "rl-agent-model__caps", children: option.capabilities.map((cap, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx("span", { className: "rl-agent-sr", children: ", " }), _jsx("span", { className: "rl-agent-model__cap", children: messages.capability[cap] })] }, cap))) })), option.description && _jsx("span", { className: "rl-agent-model__description", children: option.description }), reason && _jsx("span", { className: "rl-agent-model__reason", children: reason })] })] }), selected && _jsx(AgentIcon, { name: "check", className: "rl-agent-model__check" })] }) }));
114
+ }
115
+ //# sourceMappingURL=ModelPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelPicker.js","sourceRoot":"","sources":["../../../src/components/composer/ModelPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import * as React from 'react';
2
+ import type { PermissionModeView } from '@wzrhine/agent-core';
3
+ export interface PermissionPickerProps {
4
+ modes: readonly PermissionModeView[];
5
+ /** Current mode id (controlled). */
6
+ value: string;
7
+ /**
8
+ * Called with the chosen mode. Elevated modes call it only after the AlertDialog is confirmed.
9
+ * Return a Promise to keep the confirmation open (loading) until it settles; a rejection keeps
10
+ * it open with the AlertDialog error text. Without it the trigger is rendered disabled.
11
+ */
12
+ onChange?: (modeId: string, mode: PermissionModeView) => void | Promise<unknown>;
13
+ disabled?: boolean;
14
+ /** Override the confirmation copy for elevated modes. */
15
+ confirmTitle?: (mode: PermissionModeView) => React.ReactNode;
16
+ confirmDescription?: (mode: PermissionModeView) => React.ReactNode;
17
+ confirmLabel?: (mode: PermissionModeView) => React.ReactNode;
18
+ side?: 'top' | 'bottom';
19
+ align?: 'start' | 'center' | 'end';
20
+ className?: string;
21
+ }
22
+ /**
23
+ * Permission mode picker. Trigger (shield icon + label) opens a `@wzrhine/react` Menu with a radio
24
+ * group of modes (descriptions under each label). Choosing a mode with `risk: 'elevated'` does
25
+ * not switch: it opens an AlertDialog (role="alertdialog", focus on 取消) and `onChange` runs
26
+ * only on confirm. Focus returns to the trigger after the menu or the dialog closes.
27
+ * Elevated modes use the danger tone *and* the text "需确认" on the menu item and a warning
28
+ * glyph on the trigger, never colour alone. Motion: inherited from Menu / AlertDialog.
29
+ */
30
+ export declare function PermissionPicker({ modes, value, onChange, disabled, confirmTitle, confirmDescription, confirmLabel, side, align, className, }: PermissionPickerProps): React.JSX.Element;
31
+ //# sourceMappingURL=PermissionPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPicker.d.ts","sourceRoot":"","sources":["../../../src/components/composer/PermissionPicker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACrC,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7D,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC;IACnE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7D,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,IAAY,EACZ,KAAe,EACf,SAAS,GACV,EAAE,qBAAqB,qBAiFvB"}
@@ -0,0 +1,43 @@
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 { AlertDialog, Button, Menu, MenuRadioGroup, MenuRadioItem } 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
+ /**
9
+ * Permission mode picker. Trigger (shield icon + label) opens a `@wzrhine/react` Menu with a radio
10
+ * group of modes (descriptions under each label). Choosing a mode with `risk: 'elevated'` does
11
+ * not switch: it opens an AlertDialog (role="alertdialog", focus on 取消) and `onChange` runs
12
+ * only on confirm. Focus returns to the trigger after the menu or the dialog closes.
13
+ * Elevated modes use the danger tone *and* the text "需确认" on the menu item and a warning
14
+ * glyph on the trigger, never colour alone. Motion: inherited from Menu / AlertDialog.
15
+ */
16
+ export function PermissionPicker({ modes, value, onChange, disabled = false, confirmTitle, confirmDescription, confirmLabel, side = 'top', align = 'start', className, }) {
17
+ const messages = useAgentMessages().composer;
18
+ const triggerRef = React.useRef(null);
19
+ // The mode awaiting confirmation stays set while the dialog animates out.
20
+ const [pending, setPending] = React.useState(null);
21
+ const [confirmOpen, setConfirmOpen] = React.useState(false);
22
+ const current = modes.find((m) => m.id === value);
23
+ const elevated = current?.risk === 'elevated';
24
+ const label = current?.label ?? value;
25
+ const [menuOpen, setMenuOpen] = React.useState(false);
26
+ const pick = (id) => {
27
+ setMenuOpen(false);
28
+ const mode = modes.find((m) => m.id === id);
29
+ if (!mode || id === value || !onChange)
30
+ return;
31
+ if (mode.risk === 'elevated') {
32
+ setPending(mode);
33
+ setConfirmOpen(true);
34
+ return;
35
+ }
36
+ void onChange(id, mode);
37
+ };
38
+ return (_jsxs(_Fragment, { children: [_jsx(Menu, { open: menuOpen, onOpenChange: setMenuOpen, side: side, align: align, disabled: disabled || !onChange, className: cx('rl-agent-permission-menu', className), trigger: _jsx(Button, { ref: triggerRef, variant: "ghost", size: "sm", className: "rl-agent-picker-trigger rl-agent-permission", "data-risk": elevated ? 'elevated' : 'normal', disabled: disabled || !onChange, "aria-label": messages.permissionTriggerLabel(label), iconStart: _jsx(AgentIcon, { name: elevated ? 'warning' : 'shield' }), iconEnd: _jsx(AgentIcon, { name: "chevron-down" }), children: _jsx("span", { className: "rl-agent-picker-trigger__text", children: label }) }), children: _jsx(MenuRadioGroup, { label: messages.permissionMenu, value: value, onValueChange: pick, children: modes.map((mode) => (_jsx(MenuRadioItem, { value: mode.id, children: _jsxs("span", { className: "rl-agent-permission__item", "data-risk": mode.risk ?? 'normal', children: [_jsxs("span", { className: "rl-agent-permission__label", children: [mode.label, mode.risk === 'elevated' && _jsx("span", { className: "rl-agent-permission__flag", children: messages.permissionElevated })] }), mode.description && _jsx("span", { className: "rl-agent-permission__description", children: mode.description })] }) }, mode.id))) }) }), pending && onChange && (_jsx(AlertDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onClosed: () => {
39
+ setPending(null);
40
+ triggerRef.current?.focus();
41
+ }, tone: "danger", title: confirmTitle ? confirmTitle(pending) : messages.permissionConfirmTitle(pending.label), description: confirmDescription ? confirmDescription(pending) : (pending.description ?? messages.permissionConfirmDescription), confirmLabel: confirmLabel ? confirmLabel(pending) : messages.permissionConfirm(pending.label), onConfirm: () => onChange(pending.id, pending), children: pending.description && confirmDescription === undefined && _jsx("p", { className: "rl-agent-permission__warning", children: messages.permissionConfirmDescription }) }))] }));
42
+ }
43
+ //# sourceMappingURL=PermissionPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPicker.js","sourceRoot":"","sources":["../../../src/components/composer/PermissionPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import * as React from 'react';
2
+ import type { ActionReceipt, ActionStatus, DraftStatus, RunStatus } from '@wzrhine/agent-core';
3
+ import type { SendStopState } from './composer-utils.js';
4
+ type MotionConflictingProps = 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart' | 'onAnimationEnd' | 'onAnimationIteration';
5
+ export type SendStopButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'disabled' | 'aria-label' | 'type' | MotionConflictingProps> & {
6
+ /** There is something to send (non-empty text, nothing uploading, within limits). */
7
+ canSend: boolean;
8
+ /** Force a mode. Default: `stop` while `canStopRun(runStatus)` or `cancelling`, else `send`. */
9
+ mode?: 'send' | 'stop';
10
+ runStatus?: RunStatus;
11
+ /** Receipt of the last send (`submitting` → inert, `unknown` → 结果待确认). */
12
+ sendReceipt?: ActionReceipt | ActionStatus;
13
+ /** Receipt of the last stop request (`submitting` / `accepted` while the run still runs → 停止待确认). */
14
+ stopReceipt?: ActionReceipt | ActionStatus;
15
+ draftStatus?: DraftStatus;
16
+ onSend?: () => void;
17
+ onStop?: () => void;
18
+ /**
19
+ * Retry an `unknown` action with its original `actionId` (ADR-0011 §4). Without it, or when the
20
+ * receipt says `retryable: false`, the unknown state is inert so no duplicate action is created.
21
+ */
22
+ onRetry?: (kind: 'send' | 'stop', actionId: string | undefined) => void;
23
+ /** Draft save failed: the button becomes 重试保存. */
24
+ onRetrySave?: () => void;
25
+ /** Why sending is not possible; shown in the tooltip and linked with aria-describedby. */
26
+ disabledReason?: string;
27
+ /** Override labels per state. */
28
+ labels?: Partial<Record<SendStopState | 'send-retry' | 'stop-retry', string>>;
29
+ className?: string;
30
+ };
31
+ /**
32
+ * One persistent button for send ↔ stop (atlas 18). It is the same `<button>` element in every
33
+ * state, so focus is never lost when it switches; inert states use `aria-disabled` (still
34
+ * focusable, announced) instead of the native `disabled` attribute.
35
+ *
36
+ * States: 发送 (enabled when `canSend`), 正在发送 (inert, aria-busy), 停止生成, 停止待确认 (stop
37
+ * sent ≠ stopped: inert until the run status changes), 结果待确认 (unknown receipt: inert, or
38
+ * 重试同一发送 / 重试同一停止 with the original actionId), 重试保存.
39
+ *
40
+ * Motion: the send arrow and stop square are stacked and cross-fade with motion/react opacity
41
+ * (`useSwapTransition`: in `base`, out `fast`); a fast toggle continues from the current
42
+ * opacity. Reduced motion → instant swap. Press feedback matches IconButton.
43
+ */
44
+ export declare const SendStopButton: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "aria-label" | "onClick" | "disabled" | MotionConflictingProps> & {
45
+ /** There is something to send (non-empty text, nothing uploading, within limits). */
46
+ canSend: boolean;
47
+ /** Force a mode. Default: `stop` while `canStopRun(runStatus)` or `cancelling`, else `send`. */
48
+ mode?: "send" | "stop";
49
+ runStatus?: RunStatus;
50
+ /** Receipt of the last send (`submitting` → inert, `unknown` → 结果待确认). */
51
+ sendReceipt?: ActionReceipt | ActionStatus;
52
+ /** Receipt of the last stop request (`submitting` / `accepted` while the run still runs → 停止待确认). */
53
+ stopReceipt?: ActionReceipt | ActionStatus;
54
+ draftStatus?: DraftStatus;
55
+ onSend?: () => void;
56
+ onStop?: () => void;
57
+ /**
58
+ * Retry an `unknown` action with its original `actionId` (ADR-0011 §4). Without it, or when the
59
+ * receipt says `retryable: false`, the unknown state is inert so no duplicate action is created.
60
+ */
61
+ onRetry?: (kind: "send" | "stop", actionId: string | undefined) => void;
62
+ /** Draft save failed: the button becomes 重试保存. */
63
+ onRetrySave?: () => void;
64
+ /** Why sending is not possible; shown in the tooltip and linked with aria-describedby. */
65
+ disabledReason?: string;
66
+ /** Override labels per state. */
67
+ labels?: Partial<Record<SendStopState | "send-retry" | "stop-retry", string>>;
68
+ className?: string;
69
+ } & React.RefAttributes<HTMLButtonElement>>;
70
+ export {};
71
+ //# sourceMappingURL=SendStopButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendStopButton.d.ts","sourceRoot":"","sources":["../../../src/components/composer/SendStopButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAM/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,KAAK,sBAAsB,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,sBAAsB,CAAC;AAEtI,MAAM,MAAM,mBAAmB,GAAG,IAAI,CACpC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,sBAAsB,CACrF,GAAG;IACF,qFAAqF;IACrF,OAAO,EAAE,OAAO,CAAC;IACjB,gGAAgG;IAChG,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAC3C,qGAAqG;IACrG,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACxE,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,GAAG,YAAY,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc;IA5CzB,qFAAqF;aAC5E,OAAO;IAChB,gGAAgG;WACzF,MAAM,GAAG,MAAM;gBACV,SAAS;IACrB,0EAA0E;kBAC5D,aAAa,GAAG,YAAY;IAC1C,qGAAqG;kBACvF,aAAa,GAAG,YAAY;kBAC5B,WAAW;aAChB,MAAM,IAAI;aACV,MAAM,IAAI;IACnB;;;OAGG;cACO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI;IACvE,kDAAkD;kBACpC,MAAM,IAAI;IACxB,0FAA0F;qBACzE,MAAM;IACvB,iCAAiC;aACxB,OAAO,CAAC,MAAM,CAAC,aAAa,GAAG,YAAY,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC;gBACjE,MAAM;2CAsIlB,CAAC"}
@@ -0,0 +1,87 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { motion } from 'motion/react';
5
+ import { Tooltip, pressScale, useRhineMotion } from '@wzrhine/react';
6
+ import { useSwapTransition } from '../../motion/agent-motion.js';
7
+ import { AgentIcon } from '../../primitives/icons.js';
8
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
9
+ import { cx } from '../../utils/cx.js';
10
+ import { resolveSendStop } from './composer-utils.js';
11
+ function toReceipt(input) {
12
+ if (input === undefined)
13
+ return undefined;
14
+ return typeof input === 'string' ? { status: input } : input;
15
+ }
16
+ /**
17
+ * One persistent button for send ↔ stop (atlas 18). It is the same `<button>` element in every
18
+ * state, so focus is never lost when it switches; inert states use `aria-disabled` (still
19
+ * focusable, announced) instead of the native `disabled` attribute.
20
+ *
21
+ * States: 发送 (enabled when `canSend`), 正在发送 (inert, aria-busy), 停止生成, 停止待确认 (stop
22
+ * sent ≠ stopped: inert until the run status changes), 结果待确认 (unknown receipt: inert, or
23
+ * 重试同一发送 / 重试同一停止 with the original actionId), 重试保存.
24
+ *
25
+ * Motion: the send arrow and stop square are stacked and cross-fade with motion/react opacity
26
+ * (`useSwapTransition`: in `base`, out `fast`); a fast toggle continues from the current
27
+ * opacity. Reduced motion → instant swap. Press feedback matches IconButton.
28
+ */
29
+ export const SendStopButton = React.forwardRef(function SendStopButton({ canSend, mode, runStatus, sendReceipt, stopReceipt, draftStatus, onSend, onStop, onRetry, onRetrySave, disabledReason, labels, className, 'aria-describedby': describedByProp, ...rest }, ref) {
30
+ const messages = useAgentMessages().composer;
31
+ const { enter, exit } = useSwapTransition();
32
+ const { reduced, get } = useRhineMotion();
33
+ const reasonId = React.useId();
34
+ const send = toReceipt(sendReceipt);
35
+ const stop = toReceipt(stopReceipt);
36
+ const unknown = stop?.status === 'unknown' ? stop : send;
37
+ const resolved = resolveSendStop({
38
+ canSend,
39
+ mode,
40
+ runStatus,
41
+ sendStatus: send?.status,
42
+ stopStatus: stop?.status,
43
+ draftStatus,
44
+ hasSend: onSend !== undefined,
45
+ hasStop: onStop !== undefined,
46
+ hasRetry: onRetry !== undefined,
47
+ retryable: unknown?.retryable,
48
+ hasRetrySave: onRetrySave !== undefined,
49
+ });
50
+ const { state, enabled, action, icon } = resolved;
51
+ const label = state === 'send'
52
+ ? (labels?.send ?? messages.send)
53
+ : state === 'sending'
54
+ ? (labels?.sending ?? messages.sending)
55
+ : state === 'send-unknown'
56
+ ? action
57
+ ? (labels?.['send-retry'] ?? messages.retrySameSend)
58
+ : (labels?.['send-unknown'] ?? messages.resultPending)
59
+ : state === 'retry-save'
60
+ ? (labels?.['retry-save'] ?? messages.retrySave)
61
+ : state === 'stop'
62
+ ? (labels?.stop ?? messages.stop)
63
+ : state === 'stop-pending'
64
+ ? (labels?.['stop-pending'] ?? messages.stopPending)
65
+ : action
66
+ ? (labels?.['stop-retry'] ?? messages.retrySameStop)
67
+ : (labels?.['stop-unknown'] ?? messages.resultPending);
68
+ const reason = state === 'send' && !enabled ? disabledReason : undefined;
69
+ const shownIcon = action === 'retry' || action === 'retry-save' ? 'retry' : icon;
70
+ const handleClick = () => {
71
+ if (!enabled)
72
+ return;
73
+ if (action === 'send')
74
+ onSend?.();
75
+ else if (action === 'stop')
76
+ onStop?.();
77
+ else if (action === 'retry') {
78
+ const kind = state === 'stop-unknown' ? 'stop' : 'send';
79
+ onRetry?.(kind, (kind === 'stop' ? stop : send)?.actionId);
80
+ }
81
+ else if (action === 'retry-save')
82
+ onRetrySave?.();
83
+ };
84
+ const button = (_jsxs(motion.button, { ...rest, ref: ref, type: "button", className: cx('rl-agent-send', className), "data-state": state, "data-icon": shownIcon, "aria-label": label, "aria-disabled": enabled ? undefined : true, "aria-busy": state === 'sending' || state === 'stop-pending' || undefined, "aria-describedby": cx(describedByProp, reason && reasonId) || undefined, onClick: handleClick, whileTap: enabled && !reduced ? { scale: pressScale } : undefined, transition: get('press'), children: [_jsx("span", { className: "rl-agent-send__icons", "aria-hidden": "true", children: ['send', 'stop', 'retry'].map((name) => (_jsx(motion.span, { className: "rl-agent-send__icon", "data-visible": shownIcon === name || undefined, initial: false, animate: { opacity: shownIcon === name ? 1 : 0 }, transition: shownIcon === name ? enter : exit, children: _jsx(AgentIcon, { name: name }) }, name))) }), reason && (_jsx("span", { id: reasonId, className: "rl-agent-sr", children: reason }))] }));
85
+ return _jsx(Tooltip, { content: reason ? `${label} · ${reason}` : label, children: button });
86
+ });
87
+ //# sourceMappingURL=SendStopButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SendStopButton.js","sourceRoot":"","sources":["../../../src/components/composer/SendStopButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import type { CommandOption } from '@wzrhine/agent-core';
3
+ export interface SlashCommandMenuProps {
4
+ open: boolean;
5
+ /** Text typed after `/`. */
6
+ query: string;
7
+ /** Options in display order. Composer orders them commands first, then skills (`orderCommandOptions`). */
8
+ options: readonly CommandOption[];
9
+ activeIndex: number;
10
+ onActiveIndexChange: (index: number) => void;
11
+ /** Click on an enabled option. The host decides: insert a token or dispatch an action. */
12
+ onSelect: (option: CommandOption) => void;
13
+ /** Click on a disabled option: nothing is dispatched, the host may show the reason. */
14
+ onDisabledSelect?: (option: CommandOption) => void;
15
+ loading?: boolean;
16
+ id?: string;
17
+ /** `top` / `bottom` = absolutely positioned against the composer; `inline` = in normal flow (standalone use). */
18
+ side?: 'top' | 'bottom' | 'inline';
19
+ title?: React.ReactNode;
20
+ className?: string;
21
+ }
22
+ /**
23
+ * `/` command and skill picker (atlas 16). Same mechanics as MentionMenu: listbox panel above the
24
+ * composer, focus stays in the textarea, ↑ / ↓ clamp, Enter / Tab choose, Esc closes and
25
+ * remembers the query. Rows show `/name`, aliases, description, the shortcut (`<kbd>`, visual
26
+ * only) and, for disabled entries, the reason. Selected skills carry a check and "已选用".
27
+ *
28
+ * The menu never executes anything: choosing calls `onSelect`; a disabled entry calls
29
+ * `onDisabledSelect` instead. Groups: `option.group`, else 命令 / 技能 by kind.
30
+ * Motion: MotionPresence `fade` (reduced → instant).
31
+ */
32
+ export declare function SlashCommandMenu({ open, query, options, activeIndex, onActiveIndexChange, onSelect, onDisabledSelect, loading, id, side, title, className, }: SlashCommandMenuProps): React.JSX.Element;
33
+ //# sourceMappingURL=SlashCommandMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlashCommandMenu.d.ts","sourceRoot":"","sources":["../../../src/components/composer/SlashCommandMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0GAA0G;IAC1G,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,0FAA0F;IAC1F,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iHAAiH;IACjH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,OAAe,EACf,EAAE,EACF,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,qBAAqB,qBA8FvB"}
@@ -0,0 +1,43 @@
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 { Spinner } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { groupOptions } from './composer-utils.js';
8
+ import { Highlight, MenuGroup, MenuOption, MenuPanel } from './MenuPanel.js';
9
+ /**
10
+ * `/` command and skill picker (atlas 16). Same mechanics as MentionMenu: listbox panel above the
11
+ * composer, focus stays in the textarea, ↑ / ↓ clamp, Enter / Tab choose, Esc closes and
12
+ * remembers the query. Rows show `/name`, aliases, description, the shortcut (`<kbd>`, visual
13
+ * only) and, for disabled entries, the reason. Selected skills carry a check and "已选用".
14
+ *
15
+ * The menu never executes anything: choosing calls `onSelect`; a disabled entry calls
16
+ * `onDisabledSelect` instead. Groups: `option.group`, else 命令 / 技能 by kind.
17
+ * Motion: MotionPresence `fade` (reduced → instant).
18
+ */
19
+ export function SlashCommandMenu({ open, query, options, activeIndex, onActiveIndexChange, onSelect, onDisabledSelect, loading = false, id, side, title, className, }) {
20
+ const messages = useAgentMessages().composer;
21
+ const autoId = React.useId();
22
+ const base = id ?? autoId;
23
+ const listboxId = `${base}-listbox`;
24
+ const choose = (index) => {
25
+ const option = options[index];
26
+ if (!option)
27
+ return;
28
+ if (option.disabled)
29
+ onDisabledSelect?.(option);
30
+ else
31
+ onSelect(option);
32
+ };
33
+ let status = null;
34
+ if (loading) {
35
+ status = (_jsxs("p", { className: "rl-agent-menu__status", role: "status", children: [_jsx(Spinner, { size: "sm" }), messages.commandLoading] }));
36
+ }
37
+ else if (options.length === 0) {
38
+ status = (_jsx("p", { className: "rl-agent-menu__status", role: "status", children: messages.commandEmpty }));
39
+ }
40
+ const groupLabel = (o) => o.group ?? (o.kind === 'skill' ? messages.skillGroup : messages.commandGroup);
41
+ return (_jsx(MenuPanel, { open: open, panelId: `${base}-panel`, listboxId: listboxId, label: messages.commandTitle, title: title ?? messages.commandTitle, keys: messages.commandKeys, icon: _jsx(AgentIcon, { name: "slash" }), side: side, status: status, count: loading ? 0 : options.length, activeIndex: activeIndex, className: className, children: groupOptions(options, groupLabel).map((group) => (_jsx(MenuGroup, { label: group.label, children: group.items.map(({ option, index }) => (_jsxs(MenuOption, { listboxId: listboxId, index: index, active: index === activeIndex, disabled: option.disabled, onActivate: onActiveIndexChange, onChoose: choose, "data-kind": option.kind, children: [_jsx(AgentIcon, { name: option.kind === 'skill' ? 'spark' : option.kind === 'action' ? 'tool' : 'slash', className: "rl-agent-menu__icon" }), _jsxs("span", { className: "rl-agent-menu__body", children: [_jsxs("span", { className: "rl-agent-menu__label", children: [_jsx("span", { children: _jsx(Highlight, { text: option.label, query: query }) }), _jsxs("span", { className: "rl-agent-menu__command", children: ["/", _jsx(Highlight, { text: option.name, query: query })] }), option.aliases && option.aliases.length > 0 && (_jsx("span", { className: "rl-agent-menu__aliases", children: option.aliases.map((a) => `/${a}`).join(' ') }))] }), option.disabled ? (_jsx("span", { className: "rl-agent-menu__reason", children: messages.optionUnavailable(option.disabledReason) })) : (option.description && _jsx("span", { className: "rl-agent-menu__detail", children: option.description }))] }), option.shortcut && (_jsx("kbd", { className: "rl-agent-menu__kbd", "aria-hidden": "true", children: option.shortcut })), option.selected && (_jsxs(_Fragment, { children: [_jsx(AgentIcon, { name: "check", className: "rl-agent-menu__trail" }), _jsx("span", { className: "rl-agent-sr", children: messages.skillSelected })] }))] }, option.id))) }, group.key))) }));
42
+ }
43
+ //# sourceMappingURL=SlashCommandMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlashCommandMenu.js","sourceRoot":"","sources":["../../../src/components/composer/SlashCommandMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `stripStray` that also maps the caret: isolate characters left over from partial edits (e.g. a
3
+ * selection that cut half a token) are removed, and the caret moves left by the number of removed
4
+ * characters before it. Returns the input untouched when nothing is stray.
5
+ */
6
+ export declare function stripStrayWithCaret(value: string, caret: number): {
7
+ value: string;
8
+ caret: number;
9
+ };
10
+ //# sourceMappingURL=composer-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-text.d.ts","sourceRoot":"","sources":["../../../src/components/composer/composer-text.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAelG"}
@@ -0,0 +1,26 @@
1
+ import { TOKEN_CLOSE, TOKEN_OPEN, parseTokens, stripStray } from '@wzrhine/agent-core';
2
+ /**
3
+ * `stripStray` that also maps the caret: isolate characters left over from partial edits (e.g. a
4
+ * selection that cut half a token) are removed, and the caret moves left by the number of removed
5
+ * characters before it. Returns the input untouched when nothing is stray.
6
+ */
7
+ export function stripStrayWithCaret(value, caret) {
8
+ if (!value.includes(TOKEN_OPEN) && !value.includes(TOKEN_CLOSE))
9
+ return { value, caret };
10
+ const next = stripStray(value);
11
+ if (next === value)
12
+ return { value, caret };
13
+ const keep = new Set();
14
+ for (const token of parseTokens(value)) {
15
+ keep.add(token.start);
16
+ keep.add(token.end - 1);
17
+ }
18
+ let removedBefore = 0;
19
+ for (let i = 0; i < Math.min(caret, value.length); i += 1) {
20
+ const ch = value[i];
21
+ if ((ch === TOKEN_OPEN || ch === TOKEN_CLOSE) && !keep.has(i))
22
+ removedBefore += 1;
23
+ }
24
+ return { value: next, caret: Math.max(0, caret - removedBefore) };
25
+ }
26
+ //# sourceMappingURL=composer-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-text.js","sourceRoot":"","sources":["../../../src/components/composer/composer-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,EAAE,KAAK,UAAU,IAAI,EAAE,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,aAAa,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC;AACpE,CAAC"}