@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,33 @@
1
+ import { effectivePhase, runPhaseMeta, runStatusMeta } from '@wzrhine/agent-core';
2
+ const attentionGlyph = {
3
+ approval: { glyph: 'approval', tone: 'warning' },
4
+ question: { glyph: 'waiting-user', tone: 'warning' },
5
+ children: { glyph: 'children', tone: 'info' },
6
+ error: { glyph: 'failed', tone: 'danger' },
7
+ };
8
+ /**
9
+ * Attention (needs the user) wins over the run status. Settled, uneventful runs (`idle`,
10
+ * `completed`, `cancelled`) show no glyph: the list would otherwise be a column of check marks.
11
+ * `failed` / `interrupted` stay visible. No run status = nothing (unknown is never shown as success).
12
+ */
13
+ export function conversationStatus(item, status, shell) {
14
+ if (item.attention) {
15
+ const meta = attentionGlyph[item.attention];
16
+ return { ...meta, label: shell.attention[item.attention], active: false, kind: 'attention' };
17
+ }
18
+ const run = item.runStatus;
19
+ if (!run || run === 'idle' || run === 'completed' || run === 'cancelled')
20
+ return null;
21
+ const phase = effectivePhase(run, item.runPhase);
22
+ const runMeta = runStatusMeta[run];
23
+ if (phase && runMeta.active) {
24
+ const meta = runPhaseMeta[phase];
25
+ return { glyph: meta.glyph, tone: meta.tone, label: status.phase[phase], active: meta.active, kind: 'run' };
26
+ }
27
+ return { glyph: runMeta.glyph, tone: runMeta.tone, label: status.run[run], active: runMeta.active, kind: 'run' };
28
+ }
29
+ /** Same calendar day in local time. */
30
+ export function isSameDay(a, b) {
31
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
32
+ }
33
+ //# sourceMappingURL=conversation-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-status.js","sourceRoot":"","sources":["../../../src/components/conversation/conversation-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAclF,MAAM,cAAc,GAAoG;IACtH,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;IAChD,QAAQ,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;IACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB,EAAE,MAA2B,EAAE,KAAyB;IAC/G,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAO;IACxC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7G,CAAC"}
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import type { FileDiffView } from '@wzrhine/agent-core';
3
+ /**
4
+ * Minimal read-only diff list for approval material (internal; not exported). Hosts that want
5
+ * the full tools `DiffPreview` pass it through `ApprovalPanel renderMaterial`.
6
+ *
7
+ * A11y: a `<figure>` named by the path; each hunk is an `<ol>` whose rows carry the sign as text
8
+ * (`+` / `−`, plus a visually hidden "新增 / 删除" word) so the change is never colour only.
9
+ * Long lines scroll horizontally inside the bounded frame instead of widening the page.
10
+ */
11
+ export declare function ApprovalDiff({ diff }: {
12
+ diff: FileDiffView;
13
+ }): React.JSX.Element;
14
+ //# sourceMappingURL=ApprovalDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalDiff.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalDiff.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,qBAoD5D"}
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
5
+ /**
6
+ * Minimal read-only diff list for approval material (internal; not exported). Hosts that want
7
+ * the full tools `DiffPreview` pass it through `ApprovalPanel renderMaterial`.
8
+ *
9
+ * A11y: a `<figure>` named by the path; each hunk is an `<ol>` whose rows carry the sign as text
10
+ * (`+` / `−`, plus a visually hidden "新增 / 删除" word) so the change is never colour only.
11
+ * Long lines scroll horizontally inside the bounded frame instead of widening the page.
12
+ */
13
+ export function ApprovalDiff({ diff }) {
14
+ const m = useAgentMessages().intervention;
15
+ const captionId = React.useId();
16
+ const additions = diff.additions ?? diff.hunks.reduce((n, h) => n + h.lines.filter((l) => l.kind === 'add').length, 0);
17
+ const deletions = diff.deletions ?? diff.hunks.reduce((n, h) => n + h.lines.filter((l) => l.kind === 'remove').length, 0);
18
+ const empty = diff.hunks.every((h) => h.lines.length === 0);
19
+ return (_jsxs("figure", { className: "rl-agent-approval-diff", "aria-labelledby": captionId, children: [_jsxs("figcaption", { id: captionId, className: "rl-agent-approval-diff__caption", children: [_jsx("span", { className: "rl-agent-approval-diff__change", children: m.diffChange[diff.change] }), _jsxs("span", { className: "rl-agent-approval-diff__path", children: [diff.path, diff.movedTo ? ` → ${diff.movedTo}` : ''] }), _jsx("span", { className: "rl-agent-approval-diff__stats", children: m.diffStats(additions, deletions) }), _jsx("span", { className: "rl-agent-sr", children: m.diffLabel(diff.path) })] }), diff.binary ? (_jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffBinary })) : empty ? (_jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffEmpty })) : (_jsx("div", { className: "rl-agent-approval-diff__scroll", tabIndex: 0, role: "group", "aria-labelledby": captionId, children: diff.hunks.map((hunk) => (_jsxs("div", { className: "rl-agent-approval-diff__hunk", children: [hunk.header && _jsx("p", { className: "rl-agent-approval-diff__header", children: hunk.header }), _jsx("ol", { className: "rl-agent-approval-diff__lines", children: hunk.lines.map((line, i) => {
20
+ const sign = line.kind === 'add' ? '+' : line.kind === 'remove' ? '−' : ' ';
21
+ const number = line.kind === 'remove' ? line.oldLine : (line.newLine ?? line.oldLine);
22
+ return (_jsxs("li", { className: "rl-agent-approval-diff__line", "data-kind": line.kind, children: [_jsx("span", { className: "rl-agent-approval-diff__no", "aria-hidden": "true", children: number ?? '' }), _jsx("span", { className: "rl-agent-approval-diff__sign", "aria-hidden": "true", children: sign }), line.kind === 'add' && _jsxs("span", { className: "rl-agent-sr", children: [m.diffAdded, " "] }), line.kind === 'remove' && _jsxs("span", { className: "rl-agent-sr", children: [m.diffRemoved, " "] }), _jsx("code", { className: "rl-agent-approval-diff__text", children: line.text === '' ? ' ' : line.text })] }, i));
23
+ }) })] }, hunk.id))) })), diff.truncated && _jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffTruncated })] }));
24
+ }
25
+ //# sourceMappingURL=ApprovalDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalDiff.js","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalDiff.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import * as React from 'react';
2
+ import type { AgentActionContext, AgentActionHandler, ApprovalScope, ApprovalView } from '@wzrhine/agent-core';
3
+ /**
4
+ * Tool-permission approval card (atlas 20, ADR-0011 §6).
5
+ *
6
+ * Behaviour
7
+ * - **Reject is always possible** while a decision is open (waiting, material-loading,
8
+ * unavailable, unknown): it never depends on the material. It is busy only while a decision is
9
+ * being submitted and gone once the request is approved, rejected or expired.
10
+ * - **Allow** needs `status === 'waiting'` and `availability.allowed` (the adapter verified the
11
+ * full material and revision). Otherwise it is disabled and the reason is shown as visible text
12
+ * linked with `aria-describedby`. "Trust for this session" appears only when `scopes` offers
13
+ * `'session'` and `onApprove` exists. A capability without a callback renders no button.
14
+ * - Every decision emits `AgentActionContext { actionId, targetId: operationId, baseRevision:
15
+ * revision }`. `actionId` = stable per-mount id + counter. Re-entry is blocked synchronously
16
+ * (double click) until the handler settles, and for `accepted` / `unknown` results until the
17
+ * view-model changes.
18
+ * - `unknown`: a warning explains the decision may or may not have arrived; the control that sent
19
+ * it becomes 「重试提交」, which calls the same handler with the **same** `actionId` and scope.
20
+ * No retry is offered when `receipt.retryable === false` or the attempt was made in another mount.
21
+ * - `approved` / `rejected` are static receipts; `expired` hides the decision and offers only
22
+ * `onRefresh` when given. Buttons only emit intent; the host adapter is the authority.
23
+ *
24
+ * A11y: `<section aria-labelledby>` on the title; the status pill pairs glyph + text; a visually
25
+ * hidden `role="status"` region (mounted with the card) announces submitting / unknown / receipts.
26
+ * New approvals never steal focus; `autoFocus` focuses the title (`tabIndex=-1`) once on mount.
27
+ *
28
+ * Motion: none of its own. Wrap in `AgentEntrance kind="card"` (InterventionDock does) for the
29
+ * first entrance; the evidence disclosure is the Collapsible height transition. Reduced motion
30
+ * changes nothing that carries information.
31
+ */
32
+ export interface ApprovalPanelProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
33
+ approval: ApprovalView;
34
+ onApprove?: AgentActionHandler<[ApprovalScope, AgentActionContext]>;
35
+ onReject?: AgentActionHandler<[AgentActionContext]>;
36
+ /** Shown in `unavailable`: reload the approval material. */
37
+ onRetryMaterial?: () => void;
38
+ /** Shown in `expired`: refresh the approval state from the runtime. */
39
+ onRefresh?: () => void;
40
+ /** Custom material view (e.g. tools `DiffPreview`). Default: an internal read-only diff of `approval.diff`. */
41
+ renderMaterial?: (approval: ApprovalView) => React.ReactNode;
42
+ /** `compact` docks above the composer: tighter spacing, evidence always behind a disclosure. */
43
+ density?: 'compact' | 'full';
44
+ /** Focus the title once on mount. Off by default: new approvals never steal focus. */
45
+ autoFocus?: boolean;
46
+ /** Title element level. Default 3. */
47
+ headingLevel?: 2 | 3 | 4;
48
+ /** Evidence with more items than this (or with long values) goes behind a disclosure. Default 3. */
49
+ evidenceCollapseAt?: number;
50
+ /** Overrides of the footer note and button labels. */
51
+ rejectNote?: React.ReactNode;
52
+ rejectLabel?: string;
53
+ allowLabel?: string;
54
+ allowSessionLabel?: string;
55
+ }
56
+ export declare const ApprovalPanel: React.ForwardRefExoticComponent<ApprovalPanelProps & React.RefAttributes<HTMLElement>>;
57
+ //# sourceMappingURL=ApprovalPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalPanel.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAIlB,aAAa,EAEb,YAAY,EAEb,MAAM,qBAAqB,CAAC;AAS7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACvG,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpD,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,+GAA+G;IAC/G,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7D,gGAAgG;IAChG,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,sFAAsF;IACtF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,oGAAoG;IACpG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAkDD,eAAO,MAAM,aAAa,wFAgTxB,CAAC"}
@@ -0,0 +1,111 @@
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 { Button, Callout, Collapsible, Skeleton, StatusBadge } from '@wzrhine/react';
5
+ import { AgentStatus } from '../../primitives/AgentStatus.js';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ import { useActionLock } from './action-lock.js';
10
+ import { ApprovalDiff } from './ApprovalDiff.js';
11
+ import { InterventionIcon } from './icons.js';
12
+ const statusGlyph = {
13
+ waiting: { glyph: 'approval', tone: 'warning' },
14
+ 'material-loading': { glyph: 'pending', tone: 'info', active: true },
15
+ unavailable: { glyph: 'unknown', tone: 'warning' },
16
+ submitting: { glyph: 'pending', tone: 'info', active: true },
17
+ unknown: { glyph: 'unknown', tone: 'warning' },
18
+ approved: { glyph: 'done', tone: 'success' },
19
+ rejected: { glyph: 'stopped', tone: 'danger' },
20
+ expired: { glyph: 'stopped', tone: 'neutral' },
21
+ };
22
+ const riskStatus = { low: 'neutral', medium: 'warning', high: 'danger' };
23
+ const OPEN = ['waiting', 'material-loading', 'unavailable', 'unknown'];
24
+ function isLong(item) {
25
+ return item.value.length > 160 || item.value.split('\n').length > 4;
26
+ }
27
+ function EvidenceList({ evidence }) {
28
+ return (_jsx("dl", { className: "rl-agent-approval__evidence", children: evidence.map((item) => (_jsxs("div", { className: "rl-agent-approval__evidence-row", "data-format": item.format ?? 'text', children: [_jsx("dt", { children: item.label }), _jsx("dd", { children: item.format === 'code' || item.format === 'json' ? (_jsx("pre", { className: "rl-agent-approval__pre", tabIndex: 0, children: _jsx("code", { children: item.value }) })) : item.format === 'path' ? (_jsx("code", { className: "rl-agent-approval__mono", children: item.value })) : (item.value) })] }, item.id))) }));
29
+ }
30
+ export const ApprovalPanel = React.forwardRef(function ApprovalPanel({ approval, onApprove, onReject, onRetryMaterial, onRefresh, renderMaterial, density = 'full', autoFocus = false, headingLevel = 3, evidenceCollapseAt = 3, rejectNote, rejectLabel, allowLabel, allowSessionLabel, className, ...rest }, ref) {
31
+ const m = useAgentMessages().intervention;
32
+ const fmt = useAgentFormat();
33
+ const id = React.useId();
34
+ const titleId = `${id}-title`;
35
+ const allowReasonId = `${id}-allow-reason`;
36
+ const headingRef = React.useRef(null);
37
+ const { status, operationId, revision } = approval;
38
+ const lock = useActionLock(`${operationId}:${revision}:${status}`);
39
+ const [attempt, setAttempt] = React.useState(null);
40
+ // A different operation in the same mount starts from a clean slate.
41
+ const [seenOperation, setSeenOperation] = React.useState(operationId);
42
+ if (seenOperation !== operationId) {
43
+ setSeenOperation(operationId);
44
+ setAttempt(null);
45
+ }
46
+ React.useEffect(() => {
47
+ if (autoFocus)
48
+ headingRef.current?.focus();
49
+ // Mount only: later approvals never move focus.
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, []);
52
+ const open = OPEN.includes(status);
53
+ const submitting = status === 'submitting' || (lock.locked && open);
54
+ const scopes = approval.scopes ?? ['once'];
55
+ const toolName = approval.tool.displayName ?? approval.tool.name;
56
+ const Heading = `h${headingLevel}`;
57
+ const send = (kind, scope, ctx) => {
58
+ const handler = kind === 'approve' ? onApprove : onReject;
59
+ if (!handler)
60
+ return;
61
+ lock.run(() => {
62
+ setAttempt({ kind, scope, ctx });
63
+ return kind === 'approve' ? onApprove(scope, ctx) : onReject(ctx);
64
+ });
65
+ };
66
+ const fresh = () => ({ actionId: lock.nextActionId(), targetId: operationId, baseRevision: revision });
67
+ // ----- allow gating -----
68
+ const allowEnabled = status === 'waiting' && approval.availability.allowed && !submitting;
69
+ let allowReason;
70
+ if (!allowEnabled && open) {
71
+ if (status === 'waiting')
72
+ allowReason = submitting ? m.approvalAllowBlocked.submitting : (approval.availability.reason ?? m.approvalNotAllowed);
73
+ else
74
+ allowReason = m.approvalAllowBlocked[status] ?? approval.availability.reason;
75
+ }
76
+ const retryable = approval.receipt?.retryable !== false;
77
+ const canRetry = status === 'unknown' && attempt !== null && retryable && (attempt.kind === 'approve' ? !!onApprove : !!onReject);
78
+ const sr = status === 'submitting'
79
+ ? m.approvalSubmitting
80
+ : status === 'unknown'
81
+ ? m.approvalUnknownTitle
82
+ : status === 'approved'
83
+ ? m.approvalApproved
84
+ : status === 'rejected'
85
+ ? m.approvalRejected
86
+ : status === 'expired'
87
+ ? m.approvalExpiredTitle
88
+ : '';
89
+ const evidence = approval.evidence ?? [];
90
+ const collapseEvidence = evidence.length > 0 && (density === 'compact' || evidence.length > evidenceCollapseAt || evidence.some(isLong));
91
+ // ----- material -----
92
+ let material = null;
93
+ if (status === 'material-loading') {
94
+ material = (_jsxs("div", { className: "rl-agent-approval__loading", "aria-busy": "true", children: [_jsx("p", { className: "rl-agent-approval__loading-text", children: m.approvalMaterialLoading }), _jsx(Skeleton, { lines: 3 })] }));
95
+ }
96
+ else if (status === 'unavailable') {
97
+ material = (_jsxs("div", { className: "rl-agent-approval__unavailable", children: [_jsx(Callout, { tone: "warning", title: m.approvalUnavailable, className: "rl-agent-approval__callout", children: approval.availability.reason ?? m.approvalUnavailableHint }), onRetryMaterial && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRetryMaterial, children: m.approvalRetryMaterial }))] }));
98
+ }
99
+ else {
100
+ const custom = renderMaterial?.(approval);
101
+ material = custom ?? (approval.diff ? _jsx(ApprovalDiff, { diff: approval.diff }) : null);
102
+ }
103
+ const receiptTime = approval.receipt?.at ? (_jsx("time", { className: "rl-agent-approval__receipt-time", dateTime: approval.receipt.at, children: m.approvalReceiptAt(fmt.time(approval.receipt.at)) })) : null;
104
+ const busyKind = submitting ? attempt?.kind : undefined;
105
+ const showReject = !!onReject && (open || status === 'submitting') && !(status === 'unknown' && attempt?.kind === 'reject');
106
+ const showAllow = !!onApprove && (open || status === 'submitting') && !(status === 'unknown' && attempt?.kind === 'approve');
107
+ const meta = statusGlyph[status];
108
+ return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-approval', className), "aria-labelledby": titleId, "data-status": status, "data-density": density, "data-risk": approval.risk, children: [_jsxs("header", { className: "rl-agent-approval__header", children: [_jsxs("div", { className: "rl-agent-approval__eyebrow", children: [_jsx(InterventionIcon, { name: "shield-alert", className: "rl-agent-approval__shield" }), _jsx("span", { className: "rl-agent-approval__operation", children: m.approvalOperation(operationId) }), _jsx(AgentStatus, { glyph: meta.glyph, tone: meta.tone, active: meta.active, label: m.approvalStatus[status] }), approval.risk && (_jsx(StatusBadge, { size: "sm", status: riskStatus[approval.risk], className: "rl-agent-approval__risk", children: m.approvalRisk[approval.risk] }))] }), _jsxs(Heading, { id: titleId, ref: headingRef, tabIndex: -1, className: "rl-agent-approval__title", children: [_jsx("span", { className: "rl-agent-approval__tool", children: toolName }), approval.reason && (_jsxs(_Fragment, { children: [_jsx("span", { className: "rl-agent-approval__sep", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "rl-agent-approval__reason", children: approval.reason })] }))] })] }), _jsxs("div", { className: "rl-agent-approval__body", children: [approval.tool.subject && (_jsxs("p", { className: "rl-agent-approval__line", children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalSubject }), _jsx("code", { className: "rl-agent-approval__subject", children: approval.tool.subject })] })), _jsx("p", { className: "rl-agent-approval__summary", children: approval.summary }), (approval.scope || approval.expiresAt) && (_jsxs("p", { className: "rl-agent-approval__meta", children: [approval.scope && (_jsxs("span", { children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalScope }), " ", approval.scope] })), approval.expiresAt && (_jsxs("span", { children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalExpires }), ' ', _jsx("time", { dateTime: approval.expiresAt, children: fmt.time(approval.expiresAt) })] }))] })), approval.irreversible && (_jsx(Callout, { tone: "danger", title: m.approvalIrreversibleTitle, icon: _jsx(InterventionIcon, { name: "trash-warning" }), children: approval.irreversible })), approval.unsandboxed && (_jsx(Callout, { tone: "warning", title: m.approvalUnsandboxedTitle, icon: _jsx(InterventionIcon, { name: "lock-open" }), children: m.approvalUnsandboxed })), material != null && material !== false && _jsx("div", { className: "rl-agent-approval__material", children: material }), evidence.length > 0 &&
109
+ (collapseEvidence ? (_jsx(Collapsible, { className: "rl-agent-approval__details", trigger: _jsx("span", { children: m.approvalEvidenceToggle(evidence.length) }), children: _jsx(EvidenceList, { evidence: evidence }) })) : (_jsxs("div", { className: "rl-agent-approval__details", children: [_jsx("p", { className: "rl-agent-approval__label", children: m.approvalEvidence }), _jsx(EvidenceList, { evidence: evidence })] })))] }), status === 'unknown' && (_jsx("div", { className: "rl-agent-approval__unknown", children: _jsx(Callout, { tone: "warning", title: m.approvalUnknownTitle, children: approval.receipt?.reason ?? (retryable ? m.approvalUnknownBody : m.approvalUnknownNotRetryable) }) })), status === 'approved' && (_jsxs("p", { className: "rl-agent-approval__receipt", "data-tone": "success", children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: attempt?.scope === 'session' ? m.approvalApprovedSession : m.approvalApproved }), receiptTime] })), status === 'rejected' && (_jsxs("p", { className: "rl-agent-approval__receipt", "data-tone": "danger", children: [_jsx(AgentIcon, { name: "close" }), _jsx("span", { children: approval.receipt?.reason ?? m.approvalRejected }), receiptTime] })), status === 'expired' && (_jsxs("div", { className: "rl-agent-approval__expired", children: [_jsx(Callout, { tone: "neutral", title: m.approvalExpiredTitle, icon: _jsx(AgentIcon, { name: "clock" }), className: "rl-agent-approval__callout", children: m.approvalExpiredBody }), onRefresh && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRefresh, children: m.approvalRefresh }))] })), (showReject || showAllow || canRetry) && (_jsxs("footer", { className: "rl-agent-approval__footer", children: [showReject && _jsx("p", { className: "rl-agent-approval__note", children: rejectNote ?? m.approvalRejectNote }), allowReason && showAllow && (_jsxs("p", { id: allowReasonId, className: "rl-agent-approval__allow-reason", children: [_jsx(AgentIcon, { name: "info" }), _jsx("span", { children: allowReason })] })), _jsxs("div", { className: "rl-agent-approval__actions", children: [canRetry && (_jsx(Button, { size: "sm", variant: "primary", loading: submitting, iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: () => attempt && send(attempt.kind, attempt.scope, attempt.ctx), children: m.approvalRetrySubmit })), showReject && (_jsx(Button, { size: "sm", variant: "secondary", loading: busyKind === 'reject', disabled: submitting && busyKind !== 'reject', onClick: () => send('reject', 'once', fresh()), children: rejectLabel ?? m.approvalReject })), showAllow && scopes.includes('session') && (_jsx(Button, { size: "sm", variant: "secondary", loading: busyKind === 'approve' && attempt?.scope === 'session', disabled: !allowEnabled && !(busyKind === 'approve' && attempt?.scope === 'session'), "aria-describedby": allowReason ? allowReasonId : undefined, onClick: () => send('approve', 'session', fresh()), children: allowSessionLabel ?? m.approvalAllowSession })), showAllow && (_jsx(Button, { size: "sm", variant: "accent", loading: busyKind === 'approve' && attempt?.scope !== 'session', disabled: !allowEnabled && !(busyKind === 'approve' && attempt?.scope !== 'session'), "aria-describedby": allowReason ? allowReasonId : undefined, onClick: () => send('approve', 'once', fresh()), children: allowLabel ?? m.approvalAllowOnce }))] })] })), _jsx("p", { className: "rl-agent-sr", role: "status", children: sr })] }));
110
+ });
111
+ //# sourceMappingURL=ApprovalPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalPanel.js","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ import type { RecoveryView } from '@wzrhine/agent-core';
3
+ /**
4
+ * Error and recovery notice (atlas 34). Tells the user what was kept, what is still unconfirmed
5
+ * and which recovery actions are safe.
6
+ *
7
+ * - Severity follows `kind`: `retryable` / `offline` info, `save-pending` / `cancel-unconfirmed` /
8
+ * `timeout` / `unknown` warning, `tool-side-effects` danger, `resolved` success. Each kind also
9
+ * gets a fixed consequence sentence from the copy table ("停止尚未确认,工具可能仍在运行",
10
+ * "工具可能已产生外部影响,不会自动重放", "重试保存不会再次调用模型") so the states stay distinct.
11
+ * - Actions come from the view (`actions[]`, labels must name what they act on) and call
12
+ * `onAction(id)`. Without `onAction` no button is rendered.
13
+ * - `role="alert"` only for danger kinds and only when `announce` (default true): it sits on the
14
+ * message, not on the buttons. Everything else is static. Nothing blinks or loops.
15
+ * - `onDismiss` adds a close button for `resolved` notices only; the caller moves focus.
16
+ */
17
+ export interface ErrorRecoveryNoticeProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
18
+ recovery: RecoveryView;
19
+ onAction?: (actionId: string) => void;
20
+ /** Resolved notices only. */
21
+ onDismiss?: () => void;
22
+ /** Announce danger notices with `role="alert"`. Pass `false` for notices restored from history. */
23
+ announce?: boolean;
24
+ /** Ids of actions currently running (button shows busy). */
25
+ busyActionIds?: readonly string[];
26
+ }
27
+ export declare const ErrorRecoveryNotice: React.ForwardRefExoticComponent<ErrorRecoveryNoticeProps & React.RefAttributes<HTMLElement>>;
28
+ //# sourceMappingURL=ErrorRecoveryNotice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorRecoveryNotice.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ErrorRecoveryNotice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAa,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AAMpF;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7G,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAeD,eAAO,MAAM,mBAAmB,8FAiE9B,CAAC"}
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Button, IconButton } from '@wzrhine/react';
5
+ import { AgentStatus } from '../../primitives/AgentStatus.js';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
8
+ import { cx } from '../../utils/cx.js';
9
+ const kindMeta = {
10
+ retryable: { tone: 'info', glyph: 'reconnecting' },
11
+ 'save-pending': { tone: 'warning', glyph: 'saving' },
12
+ 'cancel-unconfirmed': { tone: 'warning', glyph: 'stopping' },
13
+ 'tool-side-effects': { tone: 'danger', glyph: 'failed' },
14
+ timeout: { tone: 'warning', glyph: 'failed' },
15
+ offline: { tone: 'info', glyph: 'offline' },
16
+ unknown: { tone: 'warning', glyph: 'unknown' },
17
+ resolved: { tone: 'success', glyph: 'done' },
18
+ };
19
+ const variantOf = { primary: 'primary', secondary: 'secondary', danger: 'secondary' };
20
+ export const ErrorRecoveryNotice = React.forwardRef(function ErrorRecoveryNotice({ recovery, onAction, onDismiss, announce = true, busyActionIds, className, ...rest }, ref) {
21
+ const m = useAgentMessages().intervention;
22
+ const id = React.useId();
23
+ const titleId = `${id}-title`;
24
+ const { kind } = recovery;
25
+ const meta = kindMeta[kind];
26
+ const alert = meta.tone === 'danger' && announce;
27
+ const note = m.recoveryNote[kind];
28
+ return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-recovery', className), "aria-labelledby": titleId, "data-kind": kind, "data-tone": meta.tone, children: [_jsxs("div", { className: "rl-agent-recovery__message", role: alert ? 'alert' : undefined, children: [_jsxs("div", { className: "rl-agent-recovery__head", children: [_jsx(AgentStatus, { glyph: meta.glyph, tone: meta.tone, label: m.recoveryKind[kind], className: "rl-agent-recovery__kind" }), recovery.code && (_jsxs("span", { className: "rl-agent-recovery__code", children: [_jsxs("span", { className: "rl-agent-sr", children: [m.recoveryCode, " "] }), _jsx("code", { children: recovery.code })] }))] }), _jsx("p", { id: titleId, className: "rl-agent-recovery__title", children: recovery.title }), recovery.message && _jsx("p", { className: "rl-agent-recovery__text", children: recovery.message }), note && _jsx("p", { className: "rl-agent-recovery__note", children: note }), recovery.preserved && recovery.preserved.length > 0 && (_jsxs("div", { className: "rl-agent-recovery__preserved", children: [_jsx("span", { className: "rl-agent-recovery__preserved-label", children: m.recoveryPreserved }), _jsx("ul", { className: "rl-agent-recovery__preserved-list", children: recovery.preserved.map((item) => (_jsxs("li", { children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: item })] }, item))) })] }))] }), onAction && recovery.actions && recovery.actions.length > 0 && (_jsx("div", { className: "rl-agent-recovery__actions", children: recovery.actions.map((action) => (_jsx(Button, { size: "sm", variant: variantOf[action.tone ?? 'secondary'], "data-tone": action.tone, className: "rl-agent-recovery__action", loading: busyActionIds?.includes(action.id), onClick: () => onAction(action.id), children: action.label }, action.id))) })), onDismiss && kind === 'resolved' && (_jsx(IconButton, { className: "rl-agent-recovery__dismiss", size: "sm", variant: "ghost", icon: _jsx(AgentIcon, { name: "close" }), label: m.recoveryDismiss, onClick: onDismiss }))] }));
29
+ });
30
+ //# sourceMappingURL=ErrorRecoveryNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorRecoveryNotice.js","sourceRoot":"","sources":["../../../src/components/intervention/ErrorRecoveryNotice.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import * as React from 'react';
2
+ import type { AgentActionContext, AgentActionHandler, GrantView } from '@wzrhine/agent-core';
3
+ /**
4
+ * Standing permissions the user granted (session trust for a task, extra directory access…),
5
+ * typically in a settings pane or side panel (ADR-0011 §6, `GrantView`).
6
+ *
7
+ * Behaviour
8
+ * - Each row shows the target verbatim in mono, its detail, the scope label and availability.
9
+ * An unavailable grant shows its reason as text (never colour alone) and, when `onReselect`
10
+ * is given, a 「重新选择」 button so the host can let the user pick the target again.
11
+ * - 「撤销」 appears only when `onRevoke` is given. Every revoke emits `AgentActionContext
12
+ * { actionId, targetId: grant.id }`; `actionId` = stable per-row-mount id + counter (the shared
13
+ * intervention action lock), so double clicks never send twice and two lists never collide.
14
+ * - Receipts: `submitting` → the row is `aria-busy` and its button busy; `unknown` → 「结果待确认」
15
+ * plus 「重试撤销」 that re-sends the **same** `actionId` (from this mount or `receipt.actionId`),
16
+ * unless `receipt.retryable === false`; `rejected` → the reason, revoke available again;
17
+ * `accepted` → 「已撤销」 until the host drops the row. The host adapter is the authority.
18
+ * - `loading` shows a skeleton (list `aria-busy`), `error` an Alert with `onRetry`, no grants the
19
+ * `empty` text. `addSlot` is a host-provided chooser (e.g. a "添加目录" Button + picker) in the header.
20
+ *
21
+ * A11y: `<section aria-labelledby>`; grants are a `<ul>`; row buttons are named after their target
22
+ * (「撤销 npm test」) while the visible text stays short; a visually hidden `role="status"` announces
23
+ * revoke progress and unconfirmed results. No focus is moved.
24
+ *
25
+ * Motion: none. Rows appear and leave instantly; reduced motion changes nothing.
26
+ */
27
+ export interface GrantListProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
28
+ /** Heading (default from messages: 「会话授权」). */
29
+ title?: React.ReactNode;
30
+ grants: readonly GrantView[];
31
+ /** Revoke one grant. Without it no revoke button is rendered. */
32
+ onRevoke?: AgentActionHandler<[GrantView, AgentActionContext]>;
33
+ /** Unavailable grants: let the host re-select the target. */
34
+ onReselect?: (grant: GrantView) => void;
35
+ loading?: boolean;
36
+ /** Load failure text; shows an Alert (with 「重新读取」 when `onRetry` is given). */
37
+ error?: React.ReactNode;
38
+ onRetry?: () => void;
39
+ /** Text when there are no grants (default from messages). */
40
+ empty?: React.ReactNode;
41
+ /** Note under the list, e.g. what revoking does. */
42
+ footerNote?: React.ReactNode;
43
+ /** Host-provided chooser for adding a grant, shown in the header. */
44
+ addSlot?: React.ReactNode;
45
+ /** Title element level. Default 3. */
46
+ headingLevel?: 2 | 3 | 4;
47
+ }
48
+ export declare const GrantList: React.ForwardRefExoticComponent<GrantListProps & React.RefAttributes<HTMLElement>>;
49
+ //# sourceMappingURL=GrantList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantList.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/GrantList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAM7F;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnG,+CAA+C;IAC/C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/D,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oDAAoD;IACpD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,qEAAqE;IACrE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B;AAkHD,eAAO,MAAM,SAAS,oFAmEpB,CAAC"}
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Alert, Button, Skeleton, StatusBadge } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ import { useActionLock } from './action-lock.js';
9
+ function GrantRow({ grant, onRevoke, onReselect }) {
10
+ const m = useAgentMessages().intervention;
11
+ const id = React.useId();
12
+ const detailId = `${id}-detail`;
13
+ const status = grant.receipt?.status ?? 'idle';
14
+ const lock = useActionLock(`${grant.id}:${status}:${grant.available ? 1 : 0}`);
15
+ const attempt = React.useRef(null);
16
+ const send = (ctx) => {
17
+ if (!onRevoke)
18
+ return;
19
+ lock.run(() => {
20
+ attempt.current = ctx;
21
+ return onRevoke(grant, ctx);
22
+ });
23
+ };
24
+ // The lock also holds after a sync / accepted / unknown result until the receipt changes.
25
+ const submitting = status === 'submitting' || lock.locked;
26
+ const unknown = status === 'unknown';
27
+ const accepted = status === 'accepted';
28
+ const retryId = attempt.current?.actionId ?? grant.receipt?.actionId;
29
+ const describedBy = grant.detail || !grant.available ? detailId : undefined;
30
+ const canRetry = unknown && !!onRevoke && grant.receipt?.retryable !== false && retryId !== undefined;
31
+ return (_jsxs("li", { className: "rl-agent-grant", "data-available": grant.available || undefined, "data-receipt": status, "aria-busy": submitting || undefined, children: [_jsxs("div", { className: "rl-agent-grant__main", children: [_jsx("code", { className: "rl-agent-grant__target", children: grant.target }), _jsxs(StatusBadge, { size: "sm", status: "neutral", appearance: "outline", className: "rl-agent-grant__scope", children: [_jsxs("span", { className: "rl-agent-sr", children: [m.grantScope, " "] }), grant.scopeLabel] })] }), (grant.detail || !grant.available) && (_jsxs("div", { id: detailId, className: "rl-agent-grant__detail", children: [grant.detail && _jsx("p", { className: "rl-agent-grant__text", children: grant.detail }), !grant.available && (_jsxs("p", { className: "rl-agent-grant__unavailable", children: [_jsx(AgentIcon, { name: "warning" }), _jsxs("span", { children: [_jsx("span", { className: "rl-agent-grant__unavailable-label", children: m.grantUnavailable }), " ", grant.reason ?? m.grantUnavailableReason] })] }))] })), unknown && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "warning", children: [_jsx(AgentIcon, { name: "warning" }), _jsxs("span", { children: [_jsx("strong", { className: "rl-agent-grant__receipt-title", children: m.grantUnknownTitle }), ' ', grant.receipt?.reason ?? (grant.receipt?.retryable === false ? m.grantUnknownNotRetryable : m.grantUnknownBody)] })] })), status === 'rejected' && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "danger", children: [_jsx(AgentIcon, { name: "close" }), _jsx("span", { children: grant.receipt?.reason ?? m.grantRejected })] })), accepted && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "success", children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: m.grantRevoked })] })), !accepted && (onRevoke || (!grant.available && onReselect)) && (_jsxs("div", { className: "rl-agent-grant__actions", children: [!grant.available && onReselect && (_jsx(Button, { size: "sm", variant: "secondary", "aria-label": m.grantReselectLabel(grant.target), disabled: submitting, onClick: () => onReselect(grant), children: m.grantReselect })), onRevoke &&
32
+ (canRetry ? (_jsx(Button, { size: "sm", variant: "primary", loading: submitting, iconStart: _jsx(AgentIcon, { name: "retry" }), "aria-label": m.grantRetryRevokeLabel(grant.target), onClick: () => send({ actionId: retryId, targetId: grant.id }), children: m.grantRetryRevoke })) : (!unknown && (_jsx(Button, { size: "sm", variant: "secondary", loading: submitting, "aria-label": m.grantRevokeLabel(grant.target), "aria-describedby": describedBy, onClick: () => send({ actionId: lock.nextActionId(), targetId: grant.id }), children: m.grantRevoke }))))] }))] }));
33
+ }
34
+ export const GrantList = React.forwardRef(function GrantList({ title, grants, onRevoke, onReselect, loading = false, error, onRetry, empty, footerNote, addSlot, headingLevel = 3, className, ...rest }, ref) {
35
+ const m = useAgentMessages().intervention;
36
+ const id = React.useId();
37
+ const titleId = `${id}-title`;
38
+ const Heading = `h${headingLevel}`;
39
+ const hasError = error != null && error !== false;
40
+ const busy = grants.find((g) => g.receipt?.status === 'submitting');
41
+ const unknown = grants.find((g) => g.receipt?.status === 'unknown');
42
+ const sr = busy ? m.grantRevokingSr(busy.target) : unknown ? m.grantUnknownSr(unknown.target) : '';
43
+ let body;
44
+ if (loading) {
45
+ body = (_jsxs("div", { className: "rl-agent-grants__loading", "aria-busy": "true", children: [_jsx("p", { className: "rl-agent-grants__loading-text", children: m.grantLoading }), _jsx(Skeleton, { lines: 3 })] }));
46
+ }
47
+ else if (hasError) {
48
+ body = (_jsx(Alert, { tone: "danger", title: m.grantError, className: "rl-agent-grants__error", action: onRetry ? (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRetry, children: m.grantRetry })) : undefined, children: error === true ? null : error }));
49
+ }
50
+ else if (grants.length === 0) {
51
+ body = _jsx("p", { className: "rl-agent-grants__empty", children: empty ?? m.grantEmpty });
52
+ }
53
+ else {
54
+ body = (_jsx("ul", { className: "rl-agent-grants__list", children: grants.map((grant) => (_jsx(GrantRow, { grant: grant, onRevoke: onRevoke, onReselect: onReselect }, grant.id))) }));
55
+ }
56
+ return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-grants', className), "aria-labelledby": titleId, "aria-busy": loading || undefined, children: [_jsxs("header", { className: "rl-agent-grants__header", children: [_jsx(Heading, { id: titleId, className: "rl-agent-grants__title", children: title ?? m.grantTitle }), !loading && !hasError && grants.length > 0 && _jsx("span", { className: "rl-agent-grants__count", children: m.grantCount(grants.length) }), addSlot != null && addSlot !== false && _jsx("div", { className: "rl-agent-grants__add", children: addSlot })] }), body, footerNote != null && footerNote !== false && _jsx("p", { className: "rl-agent-grants__note", children: footerNote }), _jsx("p", { className: "rl-agent-sr", role: "status", children: sr })] }));
57
+ });
58
+ //# sourceMappingURL=GrantList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrantList.js","sourceRoot":"","sources":["../../../src/components/intervention/GrantList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Stacks the current interventions (ApprovalPanel, QuestionnaireCard, ErrorRecoveryNotice)
4
+ * directly above the composer.
5
+ *
6
+ * - Children are the cards; give each a stable `key` (operation / questionnaire id). Cards that
7
+ * arrive after the first render enter once with `AgentEntrance kind="card"` (opacity + 8px +
8
+ * scale .985, `panel`); cards present on first render are static unless `animateInitial`.
9
+ * The entrance is frozen at mount, so status updates never replay it.
10
+ * - The dock opens with a CSS `grid-template-rows: 0fr → 1fr` transition on
11
+ * `--rl-motion-base` (zero under reduced motion: it snaps open, nothing is hidden).
12
+ * - `moreCount` > 0 shows 「还有 N 个待处理」 for approvals queued behind the visible one.
13
+ * - It is a labelled region only while it has content. It never moves focus.
14
+ */
15
+ export interface InterventionDockProps extends React.HTMLAttributes<HTMLDivElement> {
16
+ /** Number of further pending interventions not shown. */
17
+ moreCount?: number;
18
+ /** Animate cards already present on the first render. Default false (restored state). */
19
+ animateInitial?: boolean;
20
+ /** Accessible name of the region. */
21
+ label?: string;
22
+ }
23
+ export declare const InterventionDock: React.ForwardRefExoticComponent<InterventionDockProps & React.RefAttributes<HTMLDivElement>>;
24
+ //# sourceMappingURL=InterventionDock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InterventionDock.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/InterventionDock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAsB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACjF,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,gBAAgB,8FAoC3B,CAAC"}
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { AgentEntrance } from '../../motion/agent-motion.js';
5
+ import { useAgentMessages } from '../../provider/AgentMessages.js';
6
+ import { cx } from '../../utils/cx.js';
7
+ export const InterventionDock = React.forwardRef(function InterventionDock({ moreCount = 0, animateInitial = false, label, className, children, ...rest }, ref) {
8
+ const m = useAgentMessages().intervention;
9
+ const items = React.Children.toArray(children).filter(React.isValidElement);
10
+ const open = items.length > 0;
11
+ const firstRender = React.useRef(true);
12
+ React.useEffect(() => {
13
+ firstRender.current = false;
14
+ }, []);
15
+ const animate = !firstRender.current || animateInitial;
16
+ return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-dock', className), "data-open": open || undefined, role: open ? 'region' : undefined, "aria-label": open ? (label ?? m.dockLabel) : undefined, children: _jsx("div", { className: "rl-agent-dock__inner", children: open && (_jsxs("div", { className: "rl-agent-dock__stack", children: [moreCount > 0 && _jsx("p", { className: "rl-agent-dock__more", children: m.dockMore(moreCount) }), items.map((item) => (_jsx(AgentEntrance, { kind: "card", animate: animate, className: "rl-agent-dock__item", children: item }, item.key ?? undefined)))] })) }) }));
17
+ });
18
+ //# sourceMappingURL=InterventionDock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InterventionDock.js","sourceRoot":"","sources":["../../../src/components/intervention/InterventionDock.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAwBvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAwC,SAAS,gBAAgB,CAC/G,EAAE,SAAS,GAAG,CAAC,EAAE,cAAc,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC9E,GAAG;IAEH,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,IAAI,cAAc,CAAC;IAEvD,OAAO,CACL,iBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,eAC9B,IAAI,IAAI,SAAS,EAC5B,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBACrB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,YAErD,cAAK,SAAS,EAAC,sBAAsB,YAClC,IAAI,IAAI,CACP,eAAK,SAAS,EAAC,sBAAsB,aAClC,SAAS,GAAG,CAAC,IAAI,YAAG,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAK,EAC/E,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IAA6B,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,qBAAqB,YACrG,IAAI,IADa,IAAI,CAAC,GAAG,IAAI,SAAS,CAEzB,CACjB,CAAC,IACE,CACP,GACG,GACF,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}