@wzrhine/agent 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +21 -0
  3. package/README.md +29 -3
  4. package/dist/agent.css +16 -0
  5. package/dist/components/artifact/ArtifactCard.d.ts +59 -0
  6. package/dist/components/artifact/ArtifactCard.d.ts.map +1 -0
  7. package/dist/components/artifact/ArtifactCard.js +79 -0
  8. package/dist/components/artifact/ArtifactCard.js.map +1 -0
  9. package/dist/components/artifact/FilePreview.d.ts +121 -0
  10. package/dist/components/artifact/FilePreview.d.ts.map +1 -0
  11. package/dist/components/artifact/FilePreview.js +213 -0
  12. package/dist/components/artifact/FilePreview.js.map +1 -0
  13. package/dist/components/artifact/FilePreviewTabs.d.ts +51 -0
  14. package/dist/components/artifact/FilePreviewTabs.d.ts.map +1 -0
  15. package/dist/components/artifact/FilePreviewTabs.js +150 -0
  16. package/dist/components/artifact/FilePreviewTabs.js.map +1 -0
  17. package/dist/components/composer/AttachmentList.d.ts +33 -0
  18. package/dist/components/composer/AttachmentList.d.ts.map +1 -0
  19. package/dist/components/composer/AttachmentList.js +60 -0
  20. package/dist/components/composer/AttachmentList.js.map +1 -0
  21. package/dist/components/composer/Composer.d.ts +119 -0
  22. package/dist/components/composer/Composer.d.ts.map +1 -0
  23. package/dist/components/composer/Composer.js +336 -0
  24. package/dist/components/composer/Composer.js.map +1 -0
  25. package/dist/components/composer/ComposerInput.d.ts +103 -0
  26. package/dist/components/composer/ComposerInput.d.ts.map +1 -0
  27. package/dist/components/composer/ComposerInput.js +301 -0
  28. package/dist/components/composer/ComposerInput.js.map +1 -0
  29. package/dist/components/composer/ComposerNotice.d.ts +38 -0
  30. package/dist/components/composer/ComposerNotice.d.ts.map +1 -0
  31. package/dist/components/composer/ComposerNotice.js +16 -0
  32. package/dist/components/composer/ComposerNotice.js.map +1 -0
  33. package/dist/components/composer/MentionMenu.d.ts +37 -0
  34. package/dist/components/composer/MentionMenu.d.ts.map +1 -0
  35. package/dist/components/composer/MentionMenu.js +56 -0
  36. package/dist/components/composer/MentionMenu.js.map +1 -0
  37. package/dist/components/composer/MenuPanel.d.ts +49 -0
  38. package/dist/components/composer/MenuPanel.d.ts.map +1 -0
  39. package/dist/components/composer/MenuPanel.js +50 -0
  40. package/dist/components/composer/MenuPanel.js.map +1 -0
  41. package/dist/components/composer/ModelPicker.d.ts +53 -0
  42. package/dist/components/composer/ModelPicker.d.ts.map +1 -0
  43. package/dist/components/composer/ModelPicker.js +126 -0
  44. package/dist/components/composer/ModelPicker.js.map +1 -0
  45. package/dist/components/composer/PermissionPicker.d.ts +35 -0
  46. package/dist/components/composer/PermissionPicker.d.ts.map +1 -0
  47. package/dist/components/composer/PermissionPicker.js +51 -0
  48. package/dist/components/composer/PermissionPicker.js.map +1 -0
  49. package/dist/components/composer/ReferencePicker.d.ts +31 -0
  50. package/dist/components/composer/ReferencePicker.d.ts.map +1 -0
  51. package/dist/components/composer/ReferencePicker.js +50 -0
  52. package/dist/components/composer/ReferencePicker.js.map +1 -0
  53. package/dist/components/composer/SendStopButton.d.ts +73 -0
  54. package/dist/components/composer/SendStopButton.d.ts.map +1 -0
  55. package/dist/components/composer/SendStopButton.js +88 -0
  56. package/dist/components/composer/SendStopButton.js.map +1 -0
  57. package/dist/components/composer/SkillPicker.d.ts +26 -0
  58. package/dist/components/composer/SkillPicker.d.ts.map +1 -0
  59. package/dist/components/composer/SkillPicker.js +26 -0
  60. package/dist/components/composer/SkillPicker.js.map +1 -0
  61. package/dist/components/composer/SlashCommandMenu.d.ts +33 -0
  62. package/dist/components/composer/SlashCommandMenu.d.ts.map +1 -0
  63. package/dist/components/composer/SlashCommandMenu.js +43 -0
  64. package/dist/components/composer/SlashCommandMenu.js.map +1 -0
  65. package/dist/components/composer/composer-text.d.ts +10 -0
  66. package/dist/components/composer/composer-text.d.ts.map +1 -0
  67. package/dist/components/composer/composer-text.js +26 -0
  68. package/dist/components/composer/composer-text.js.map +1 -0
  69. package/dist/components/composer/composer-utils.d.ts +74 -0
  70. package/dist/components/composer/composer-utils.d.ts.map +1 -0
  71. package/dist/components/composer/composer-utils.js +133 -0
  72. package/dist/components/composer/composer-utils.js.map +1 -0
  73. package/dist/components/conversation/ConversationList.d.ts +94 -0
  74. package/dist/components/conversation/ConversationList.d.ts.map +1 -0
  75. package/dist/components/conversation/ConversationList.js +81 -0
  76. package/dist/components/conversation/ConversationList.js.map +1 -0
  77. package/dist/components/conversation/ConversationRow.d.ts +66 -0
  78. package/dist/components/conversation/ConversationRow.d.ts.map +1 -0
  79. package/dist/components/conversation/ConversationRow.js +65 -0
  80. package/dist/components/conversation/ConversationRow.js.map +1 -0
  81. package/dist/components/conversation/conversation-status.d.ts +21 -0
  82. package/dist/components/conversation/conversation-status.d.ts.map +1 -0
  83. package/dist/components/conversation/conversation-status.js +33 -0
  84. package/dist/components/conversation/conversation-status.js.map +1 -0
  85. package/dist/components/intervention/ApprovalDiff.d.ts +14 -0
  86. package/dist/components/intervention/ApprovalDiff.d.ts.map +1 -0
  87. package/dist/components/intervention/ApprovalDiff.js +25 -0
  88. package/dist/components/intervention/ApprovalDiff.js.map +1 -0
  89. package/dist/components/intervention/ApprovalPanel.d.ts +57 -0
  90. package/dist/components/intervention/ApprovalPanel.d.ts.map +1 -0
  91. package/dist/components/intervention/ApprovalPanel.js +111 -0
  92. package/dist/components/intervention/ApprovalPanel.js.map +1 -0
  93. package/dist/components/intervention/ErrorRecoveryNotice.d.ts +28 -0
  94. package/dist/components/intervention/ErrorRecoveryNotice.d.ts.map +1 -0
  95. package/dist/components/intervention/ErrorRecoveryNotice.js +31 -0
  96. package/dist/components/intervention/ErrorRecoveryNotice.js.map +1 -0
  97. package/dist/components/intervention/GrantList.d.ts +49 -0
  98. package/dist/components/intervention/GrantList.d.ts.map +1 -0
  99. package/dist/components/intervention/GrantList.js +58 -0
  100. package/dist/components/intervention/GrantList.js.map +1 -0
  101. package/dist/components/intervention/InterventionDock.d.ts +24 -0
  102. package/dist/components/intervention/InterventionDock.d.ts.map +1 -0
  103. package/dist/components/intervention/InterventionDock.js +18 -0
  104. package/dist/components/intervention/InterventionDock.js.map +1 -0
  105. package/dist/components/intervention/QuestionnaireCard.d.ts +81 -0
  106. package/dist/components/intervention/QuestionnaireCard.d.ts.map +1 -0
  107. package/dist/components/intervention/QuestionnaireCard.js +333 -0
  108. package/dist/components/intervention/QuestionnaireCard.js.map +1 -0
  109. package/dist/components/intervention/action-lock.d.ts +20 -0
  110. package/dist/components/intervention/action-lock.d.ts.map +1 -0
  111. package/dist/components/intervention/action-lock.js +65 -0
  112. package/dist/components/intervention/action-lock.js.map +1 -0
  113. package/dist/components/intervention/icons.d.ts +8 -0
  114. package/dist/components/intervention/icons.d.ts.map +1 -0
  115. package/dist/components/intervention/icons.js +11 -0
  116. package/dist/components/intervention/icons.js.map +1 -0
  117. package/dist/components/intervention/questionnaire-answers.d.ts +34 -0
  118. package/dist/components/intervention/questionnaire-answers.d.ts.map +1 -0
  119. package/dist/components/intervention/questionnaire-answers.js +97 -0
  120. package/dist/components/intervention/questionnaire-answers.js.map +1 -0
  121. package/dist/components/message/AgentMessage.d.ts +98 -0
  122. package/dist/components/message/AgentMessage.d.ts.map +1 -0
  123. package/dist/components/message/AgentMessage.js +94 -0
  124. package/dist/components/message/AgentMessage.js.map +1 -0
  125. package/dist/components/message/CitationChip.d.ts +38 -0
  126. package/dist/components/message/CitationChip.d.ts.map +1 -0
  127. package/dist/components/message/CitationChip.js +32 -0
  128. package/dist/components/message/CitationChip.js.map +1 -0
  129. package/dist/components/message/CodeBlock.d.ts +45 -0
  130. package/dist/components/message/CodeBlock.d.ts.map +1 -0
  131. package/dist/components/message/CodeBlock.js +21 -0
  132. package/dist/components/message/CodeBlock.js.map +1 -0
  133. package/dist/components/message/JumpToLatest.d.ts +27 -0
  134. package/dist/components/message/JumpToLatest.d.ts.map +1 -0
  135. package/dist/components/message/JumpToLatest.js +17 -0
  136. package/dist/components/message/JumpToLatest.js.map +1 -0
  137. package/dist/components/message/Markdown.d.ts +21 -0
  138. package/dist/components/message/Markdown.d.ts.map +1 -0
  139. package/dist/components/message/Markdown.js +21 -0
  140. package/dist/components/message/Markdown.js.map +1 -0
  141. package/dist/components/message/MessageActions.d.ts +67 -0
  142. package/dist/components/message/MessageActions.d.ts.map +1 -0
  143. package/dist/components/message/MessageActions.js +83 -0
  144. package/dist/components/message/MessageActions.js.map +1 -0
  145. package/dist/components/message/MessageList.d.ts +106 -0
  146. package/dist/components/message/MessageList.d.ts.map +1 -0
  147. package/dist/components/message/MessageList.js +327 -0
  148. package/dist/components/message/MessageList.js.map +1 -0
  149. package/dist/components/message/MessagePart.d.ts +44 -0
  150. package/dist/components/message/MessagePart.d.ts.map +1 -0
  151. package/dist/components/message/MessagePart.js +150 -0
  152. package/dist/components/message/MessagePart.js.map +1 -0
  153. package/dist/components/message/RunDetails.d.ts +26 -0
  154. package/dist/components/message/RunDetails.d.ts.map +1 -0
  155. package/dist/components/message/RunDetails.js +113 -0
  156. package/dist/components/message/RunDetails.js.map +1 -0
  157. package/dist/components/message/SkillUseList.d.ts +22 -0
  158. package/dist/components/message/SkillUseList.d.ts.map +1 -0
  159. package/dist/components/message/SkillUseList.js +20 -0
  160. package/dist/components/message/SkillUseList.js.map +1 -0
  161. package/dist/components/message/ThinkingBlock.d.ts +44 -0
  162. package/dist/components/message/ThinkingBlock.d.ts.map +1 -0
  163. package/dist/components/message/ThinkingBlock.js +34 -0
  164. package/dist/components/message/ThinkingBlock.js.map +1 -0
  165. package/dist/components/message/icons.d.ts +14 -0
  166. package/dist/components/message/icons.d.ts.map +1 -0
  167. package/dist/components/message/icons.js +16 -0
  168. package/dist/components/message/icons.js.map +1 -0
  169. package/dist/components/message/plain-text.d.ts +11 -0
  170. package/dist/components/message/plain-text.d.ts.map +1 -0
  171. package/dist/components/message/plain-text.js +58 -0
  172. package/dist/components/message/plain-text.js.map +1 -0
  173. package/dist/components/message/renderers.d.ts +30 -0
  174. package/dist/components/message/renderers.d.ts.map +1 -0
  175. package/dist/components/message/renderers.js +2 -0
  176. package/dist/components/message/renderers.js.map +1 -0
  177. package/dist/components/message/use-copy.d.ts +19 -0
  178. package/dist/components/message/use-copy.d.ts.map +1 -0
  179. package/dist/components/message/use-copy.js +67 -0
  180. package/dist/components/message/use-copy.js.map +1 -0
  181. package/dist/components/process/AgentProcess.d.ts +47 -0
  182. package/dist/components/process/AgentProcess.d.ts.map +1 -0
  183. package/dist/components/process/AgentProcess.js +78 -0
  184. package/dist/components/process/AgentProcess.js.map +1 -0
  185. package/dist/components/process/RunStatus.d.ts +60 -0
  186. package/dist/components/process/RunStatus.d.ts.map +1 -0
  187. package/dist/components/process/RunStatus.js +34 -0
  188. package/dist/components/process/RunStatus.js.map +1 -0
  189. package/dist/components/shell/AgentEmptyState.d.ts +35 -0
  190. package/dist/components/shell/AgentEmptyState.d.ts.map +1 -0
  191. package/dist/components/shell/AgentEmptyState.js +20 -0
  192. package/dist/components/shell/AgentEmptyState.js.map +1 -0
  193. package/dist/components/shell/AgentHeader.d.ts +84 -0
  194. package/dist/components/shell/AgentHeader.d.ts.map +1 -0
  195. package/dist/components/shell/AgentHeader.js +43 -0
  196. package/dist/components/shell/AgentHeader.js.map +1 -0
  197. package/dist/components/shell/AgentShell.d.ts +154 -0
  198. package/dist/components/shell/AgentShell.d.ts.map +1 -0
  199. package/dist/components/shell/AgentShell.js +210 -0
  200. package/dist/components/shell/AgentShell.js.map +1 -0
  201. package/dist/components/shell/AgentSidePane.d.ts +54 -0
  202. package/dist/components/shell/AgentSidePane.d.ts.map +1 -0
  203. package/dist/components/shell/AgentSidePane.js +26 -0
  204. package/dist/components/shell/AgentSidePane.js.map +1 -0
  205. package/dist/components/shell/ResizeHandle.d.ts +54 -0
  206. package/dist/components/shell/ResizeHandle.d.ts.map +1 -0
  207. package/dist/components/shell/ResizeHandle.js +94 -0
  208. package/dist/components/shell/ResizeHandle.js.map +1 -0
  209. package/dist/components/shell/use-controllable.d.ts +9 -0
  210. package/dist/components/shell/use-controllable.d.ts.map +1 -0
  211. package/dist/components/shell/use-controllable.js +26 -0
  212. package/dist/components/shell/use-controllable.js.map +1 -0
  213. package/dist/components/tools/ChunkPager.d.ts +48 -0
  214. package/dist/components/tools/ChunkPager.d.ts.map +1 -0
  215. package/dist/components/tools/ChunkPager.js +68 -0
  216. package/dist/components/tools/ChunkPager.js.map +1 -0
  217. package/dist/components/tools/CodeModeToolTree.d.ts +64 -0
  218. package/dist/components/tools/CodeModeToolTree.d.ts.map +1 -0
  219. package/dist/components/tools/CodeModeToolTree.js +97 -0
  220. package/dist/components/tools/CodeModeToolTree.js.map +1 -0
  221. package/dist/components/tools/DiffPreview.d.ts +83 -0
  222. package/dist/components/tools/DiffPreview.d.ts.map +1 -0
  223. package/dist/components/tools/DiffPreview.js +95 -0
  224. package/dist/components/tools/DiffPreview.js.map +1 -0
  225. package/dist/components/tools/ToolActivity.d.ts +63 -0
  226. package/dist/components/tools/ToolActivity.d.ts.map +1 -0
  227. package/dist/components/tools/ToolActivity.js +45 -0
  228. package/dist/components/tools/ToolActivity.js.map +1 -0
  229. package/dist/components/tools/ToolDetails.d.ts +118 -0
  230. package/dist/components/tools/ToolDetails.d.ts.map +1 -0
  231. package/dist/components/tools/ToolDetails.js +258 -0
  232. package/dist/components/tools/ToolDetails.js.map +1 -0
  233. package/dist/components/tools/ToolHistory.d.ts +48 -0
  234. package/dist/components/tools/ToolHistory.d.ts.map +1 -0
  235. package/dist/components/tools/ToolHistory.js +37 -0
  236. package/dist/components/tools/ToolHistory.js.map +1 -0
  237. package/dist/components/tools/ToolOutput.d.ts +61 -0
  238. package/dist/components/tools/ToolOutput.d.ts.map +1 -0
  239. package/dist/components/tools/ToolOutput.js +45 -0
  240. package/dist/components/tools/ToolOutput.js.map +1 -0
  241. package/dist/components/tools/ToolRecord.d.ts +58 -0
  242. package/dist/components/tools/ToolRecord.d.ts.map +1 -0
  243. package/dist/components/tools/ToolRecord.js +79 -0
  244. package/dist/components/tools/ToolRecord.js.map +1 -0
  245. package/dist/components/tools/shared.d.ts +93 -0
  246. package/dist/components/tools/shared.d.ts.map +1 -0
  247. package/dist/components/tools/shared.js +160 -0
  248. package/dist/components/tools/shared.js.map +1 -0
  249. package/dist/components/workspace/ActivityLedger.d.ts +44 -0
  250. package/dist/components/workspace/ActivityLedger.d.ts.map +1 -0
  251. package/dist/components/workspace/ActivityLedger.js +63 -0
  252. package/dist/components/workspace/ActivityLedger.js.map +1 -0
  253. package/dist/components/workspace/CompactionNotice.d.ts +63 -0
  254. package/dist/components/workspace/CompactionNotice.d.ts.map +1 -0
  255. package/dist/components/workspace/CompactionNotice.js +36 -0
  256. package/dist/components/workspace/CompactionNotice.js.map +1 -0
  257. package/dist/components/workspace/ContextUsage.d.ts +50 -0
  258. package/dist/components/workspace/ContextUsage.d.ts.map +1 -0
  259. package/dist/components/workspace/ContextUsage.js +106 -0
  260. package/dist/components/workspace/ContextUsage.js.map +1 -0
  261. package/dist/components/workspace/PersistentTerminal.d.ts +86 -0
  262. package/dist/components/workspace/PersistentTerminal.d.ts.map +1 -0
  263. package/dist/components/workspace/PersistentTerminal.js +155 -0
  264. package/dist/components/workspace/PersistentTerminal.js.map +1 -0
  265. package/dist/components/workspace/PinnedSummary.d.ts +43 -0
  266. package/dist/components/workspace/PinnedSummary.d.ts.map +1 -0
  267. package/dist/components/workspace/PinnedSummary.js +33 -0
  268. package/dist/components/workspace/PinnedSummary.js.map +1 -0
  269. package/dist/components/workspace/RunOverview.d.ts +29 -0
  270. package/dist/components/workspace/RunOverview.d.ts.map +1 -0
  271. package/dist/components/workspace/RunOverview.js +20 -0
  272. package/dist/components/workspace/RunOverview.js.map +1 -0
  273. package/dist/components/workspace/RunSummary.d.ts +35 -0
  274. package/dist/components/workspace/RunSummary.d.ts.map +1 -0
  275. package/dist/components/workspace/RunSummary.js +46 -0
  276. package/dist/components/workspace/RunSummary.js.map +1 -0
  277. package/dist/components/workspace/SubAgentCard.d.ts +64 -0
  278. package/dist/components/workspace/SubAgentCard.d.ts.map +1 -0
  279. package/dist/components/workspace/SubAgentCard.js +78 -0
  280. package/dist/components/workspace/SubAgentCard.js.map +1 -0
  281. package/dist/components/workspace/TerminalRow.d.ts +61 -0
  282. package/dist/components/workspace/TerminalRow.d.ts.map +1 -0
  283. package/dist/components/workspace/TerminalRow.js +65 -0
  284. package/dist/components/workspace/TerminalRow.js.map +1 -0
  285. package/dist/components/workspace/shared.d.ts +26 -0
  286. package/dist/components/workspace/shared.d.ts.map +1 -0
  287. package/dist/components/workspace/shared.js +41 -0
  288. package/dist/components/workspace/shared.js.map +1 -0
  289. package/dist/index.d.ts +136 -0
  290. package/dist/index.d.ts.map +1 -0
  291. package/dist/index.js +79 -0
  292. package/dist/index.js.map +1 -0
  293. package/dist/motion/agent-motion.d.ts +62 -0
  294. package/dist/motion/agent-motion.d.ts.map +1 -0
  295. package/dist/motion/agent-motion.js +61 -0
  296. package/dist/motion/agent-motion.js.map +1 -0
  297. package/dist/primitives/AgentSpark.d.ts +17 -0
  298. package/dist/primitives/AgentSpark.d.ts.map +1 -0
  299. package/dist/primitives/AgentSpark.js +11 -0
  300. package/dist/primitives/AgentSpark.js.map +1 -0
  301. package/dist/primitives/AgentStatus.d.ts +32 -0
  302. package/dist/primitives/AgentStatus.d.ts.map +1 -0
  303. package/dist/primitives/AgentStatus.js +13 -0
  304. package/dist/primitives/AgentStatus.js.map +1 -0
  305. package/dist/primitives/StatusGlyph.d.ts +16 -0
  306. package/dist/primitives/StatusGlyph.d.ts.map +1 -0
  307. package/dist/primitives/StatusGlyph.js +31 -0
  308. package/dist/primitives/StatusGlyph.js.map +1 -0
  309. package/dist/primitives/icons.d.ts +13 -0
  310. package/dist/primitives/icons.d.ts.map +1 -0
  311. package/dist/primitives/icons.js +55 -0
  312. package/dist/primitives/icons.js.map +1 -0
  313. package/dist/provider/AgentMessages.d.ts +61 -0
  314. package/dist/provider/AgentMessages.d.ts.map +1 -0
  315. package/dist/provider/AgentMessages.js +81 -0
  316. package/dist/provider/AgentMessages.js.map +1 -0
  317. package/dist/provider/messages/composer.d.ts +112 -0
  318. package/dist/provider/messages/composer.d.ts.map +1 -0
  319. package/dist/provider/messages/composer.js +165 -0
  320. package/dist/provider/messages/composer.js.map +1 -0
  321. package/dist/provider/messages/intervention.d.ts +136 -0
  322. package/dist/provider/messages/intervention.d.ts.map +1 -0
  323. package/dist/provider/messages/intervention.js +321 -0
  324. package/dist/provider/messages/intervention.js.map +1 -0
  325. package/dist/provider/messages/message.d.ts +119 -0
  326. package/dist/provider/messages/message.d.ts.map +1 -0
  327. package/dist/provider/messages/message.js +224 -0
  328. package/dist/provider/messages/message.js.map +1 -0
  329. package/dist/provider/messages/shell.d.ts +70 -0
  330. package/dist/provider/messages/shell.d.ts.map +1 -0
  331. package/dist/provider/messages/shell.js +109 -0
  332. package/dist/provider/messages/shell.js.map +1 -0
  333. package/dist/provider/messages/status.d.ts +21 -0
  334. package/dist/provider/messages/status.d.ts.map +1 -0
  335. package/dist/provider/messages/status.js +195 -0
  336. package/dist/provider/messages/status.js.map +1 -0
  337. package/dist/provider/messages/tools.d.ts +217 -0
  338. package/dist/provider/messages/tools.d.ts.map +1 -0
  339. package/dist/provider/messages/tools.js +496 -0
  340. package/dist/provider/messages/tools.js.map +1 -0
  341. package/dist/provider/messages/workspace.d.ts +187 -0
  342. package/dist/provider/messages/workspace.d.ts.map +1 -0
  343. package/dist/provider/messages/workspace.js +333 -0
  344. package/dist/provider/messages/workspace.js.map +1 -0
  345. package/dist/styles/artifact.css +564 -0
  346. package/dist/styles/base.css +220 -0
  347. package/dist/styles/composer.css +1001 -0
  348. package/dist/styles/conversation.css +275 -0
  349. package/dist/styles/intervention.css +929 -0
  350. package/dist/styles/message.css +917 -0
  351. package/dist/styles/process.css +207 -0
  352. package/dist/styles/shell.css +453 -0
  353. package/dist/styles/tools.css +929 -0
  354. package/dist/styles/workspace.css +1297 -0
  355. package/dist/styles/wpi-adoption.css +24 -0
  356. package/dist/utils/cx.d.ts +3 -0
  357. package/dist/utils/cx.d.ts.map +1 -0
  358. package/dist/utils/cx.js +5 -0
  359. package/dist/utils/cx.js.map +1 -0
  360. package/package.json +64 -3
@@ -0,0 +1,213 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Alert, Breadcrumb, Button, IconButton, Menu, MenuGroup, MenuItem, MenuSeparator, Skeleton, Tab, TabList, TabPanel, Tabs } from '@wzrhine/react';
5
+ import { useAgentFormat } from '../../provider/AgentMessages.js';
6
+ import { AgentIcon } from '../../primitives/icons.js';
7
+ import { cx } from '../../utils/cx.js';
8
+ import { Heading, useWorkspaceMessages } from '../workspace/shared.js';
9
+ const TEXT_KINDS = ['text', 'markdown', 'code'];
10
+ const DEFAULT_ZOOMS = [25, 50, 100, 200, 400];
11
+ /**
12
+ * FilePreview (atlas 30): read-only preview of a file the adapter loaded. Tabs (`@wzrhine/react`,
13
+ * arrow keys) switch preview / raw / metadata; text is real, selectable text in its own focusable
14
+ * scroll region, with decorative line numbers that are not copied. Images get their `alt` and a
15
+ * zoom group (`zoomLevels`, default 25–400% of the natural width, plus 「适应宽度」) inside a scroll
16
+ * container. Binary and unknown kinds say 「无法预览此类型」 and offer 「在外部打开」. Partial loads
17
+ * say how much is loaded and offer 「加载更多」; a changed file keeps the old content with
18
+ * 「文件已更新」 + 「重新加载」, and `onReload` is also always offered as 「重新读取」.
19
+ *
20
+ * The path is a `Breadcrumb` (`<nav>` + `<ol>`), workspace-relative under `breadcrumbRoot`.
21
+ * `openTargets` + `onOpenWith` draw a split control: the primary button opens with the default
22
+ * target, the menu button (`Menu`: arrow keys, Escape, focus return) lists every target plus
23
+ * 「复制路径」 and 「在对话中引用」.
24
+ *
25
+ * The component reads nothing itself; the clipboard is the only browser API it touches.
26
+ * Motion: none (tab indicator is the Tabs component's own CSS transition).
27
+ */
28
+ export const FilePreview = React.forwardRef(function FilePreview({ file, mode, defaultMode = 'preview', onModeChange, renderMarkdown, renderCode, onRetry, onReload, onLoadMore, onOpenExternal, onReference, referenceDisabled = false, reloading = false, onClose, openTargets, defaultOpenTarget, onOpenWith, onCopyPath, zoomLevels, defaultZoom, breadcrumbRoot, copyable, headingLevel = 3, messages: override, className, ...rest }, ref) {
29
+ const m = useWorkspaceMessages(override);
30
+ const format = useAgentFormat();
31
+ const id = React.useId();
32
+ const titleId = `${id}-title`;
33
+ const textual = TEXT_KINDS.includes(file.kind);
34
+ const [innerMode, setInnerMode] = React.useState(defaultMode);
35
+ const modes = textual ? ['preview', 'raw', 'metadata'] : ['preview', 'metadata'];
36
+ const requested = mode ?? innerMode;
37
+ const active = modes.includes(requested) ? requested : 'preview';
38
+ const hasContent = file.content !== undefined && file.status !== 'loading' && file.status !== 'missing' && file.status !== 'unavailable' && file.status !== 'error';
39
+ const canCopy = (copyable ?? true) && textual && hasContent && Boolean(file.content);
40
+ const crumbs = React.useMemo(() => pathCrumbs(file.path, breadcrumbRoot), [file.path, breadcrumbRoot]);
41
+ const external = Boolean(file.external) || crumbs?.outside === true;
42
+ const changeMode = (next) => {
43
+ const key = next;
44
+ if (mode === undefined)
45
+ setInnerMode(key);
46
+ onModeChange?.(key);
47
+ };
48
+ return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-file', className), "aria-labelledby": titleId, "data-kind": file.kind, "data-status": file.status, children: [_jsxs("header", { className: "rl-agent-file__header", children: [_jsx(AgentIcon, { name: file.kind === 'image' ? 'image' : file.kind === 'code' ? 'code' : 'file', className: "rl-agent-file__icon" }), _jsxs("div", { className: "rl-agent-file__identity", children: [_jsx(Heading, { level: headingLevel, id: titleId, className: "rl-agent-file__name", title: file.name, children: file.name }), crumbs && (_jsx(Breadcrumb, { className: "rl-agent-file__crumbs", items: crumbs.items, label: m.fileBreadcrumb(file.name), expandLabel: m.fileBreadcrumbExpand, title: file.path })), (external || file.version) && (_jsxs("p", { className: "rl-agent-file__path", children: [external && _jsx("span", { className: "rl-agent-file__badge", children: m.fileExternal }), file.version && _jsx("span", { className: "rl-agent-file__version", children: m.artifactVersion(file.version) })] }))] }), onClose && _jsx(IconButton, { size: "sm", variant: "ghost", icon: _jsx(AgentIcon, { name: "close" }), label: m.fileClose, onClick: onClose })] }), _jsx(FileActions, { file: file, canCopy: canCopy, onOpenExternal: onOpenExternal, onReference: referenceDisabled ? undefined : onReference, onReload: onReload, openTargets: openTargets, defaultOpenTarget: defaultOpenTarget, onOpenWith: onOpenWith, onCopyPath: onCopyPath, m: m }), _jsx(FileNotices, { file: file, onRetry: onRetry, onReload: onReload, onLoadMore: onLoadMore, m: m, format: format }), _jsxs(Tabs, { value: active, onValueChange: changeMode, size: "sm", className: "rl-agent-file__tabs", children: [_jsx(TabList, { "aria-label": m.fileModes, children: modes.map((key) => (_jsx(Tab, { value: key, children: m.fileMode[key] }, key))) }), _jsx(TabPanel, { value: "preview", className: "rl-agent-file__panel", children: _jsx(FileBody, { file: file, raw: false, renderMarkdown: renderMarkdown, renderCode: renderCode, onOpenExternal: onOpenExternal, zoomLevels: zoomLevels, defaultZoom: defaultZoom, m: m }) }), textual && (_jsx(TabPanel, { value: "raw", className: "rl-agent-file__panel", children: _jsx(FileBody, { file: file, raw: true, renderMarkdown: renderMarkdown, renderCode: renderCode, onOpenExternal: onOpenExternal, m: m }) })), _jsx(TabPanel, { value: "metadata", className: "rl-agent-file__panel", children: _jsx(FileMetadata, { file: file, m: m, format: format }) })] })] }));
49
+ });
50
+ async function writeClipboard(text) {
51
+ if (typeof navigator === 'undefined' || !navigator.clipboard)
52
+ throw new Error('clipboard');
53
+ await navigator.clipboard.writeText(text);
54
+ }
55
+ function FileActions({ file, canCopy, onOpenExternal, onReference, onReload, openTargets, defaultOpenTarget, onOpenWith, onCopyPath, m, }) {
56
+ const [copy, setCopy] = React.useState('idle');
57
+ const timer = React.useRef(undefined);
58
+ React.useEffect(() => () => clearTimeout(timer.current), []);
59
+ React.useEffect(() => setCopy('idle'), [file.content, file.path]);
60
+ const targets = onOpenWith ? (openTargets ?? []) : [];
61
+ const split = targets.length > 0;
62
+ if (!canCopy && !onOpenExternal && !onReference && !onReload && !split)
63
+ return null;
64
+ const run = async (write, ok, fail) => {
65
+ clearTimeout(timer.current);
66
+ try {
67
+ await write();
68
+ setCopy(ok);
69
+ }
70
+ catch {
71
+ setCopy(fail);
72
+ }
73
+ timer.current = setTimeout(() => setCopy('idle'), 2000);
74
+ };
75
+ const copyContent = () => run(() => writeClipboard(file.content ?? ''), 'copied', 'failed');
76
+ const copyPath = () => run(() => (onCopyPath ? onCopyPath(file.path, file) : writeClipboard(file.path)), 'path-copied', 'path-failed');
77
+ const announced = { idle: '', copied: m.fileCopied, failed: m.fileCopyFailed, 'path-copied': m.fileCopiedPath, 'path-failed': m.fileCopyPathFailed }[copy];
78
+ return (_jsxs("div", { className: "rl-agent-file__actions", children: [split && (_jsx(OpenWithSplit, { file: file, targets: targets, defaultTarget: defaultOpenTarget, onOpenWith: onOpenWith, onCopyPath: file.path ? () => void copyPath() : undefined, onReference: onReference, m: m })), canCopy && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: copy === 'copied' ? 'check' : 'copy' }), onClick: () => void copyContent(), children: copy === 'copied' ? m.fileCopied : copy === 'failed' ? m.fileCopyFailed : m.fileCopy })), onReference && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "at" }), onClick: () => onReference(file), children: m.fileReference })), onReload && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onReload, children: m.fileReread })), onOpenExternal && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "external" }), onClick: () => onOpenExternal(file), children: m.fileOpenExternal })), _jsx("span", { className: "rl-agent-sr", role: "status", children: announced })] }));
79
+ }
80
+ /**
81
+ * Local split control: the primary button opens with the default target; the adjoining menu
82
+ * button (its own accessible name) opens a `Menu` with every target grouped by app / reveal,
83
+ * then 「复制路径」 and 「在对话中引用」. Both halves are real buttons in the tab order.
84
+ */
85
+ function OpenWithSplit({ file, targets, defaultTarget, onOpenWith, onCopyPath, onReference, m, }) {
86
+ const apps = targets.filter((t) => (t.group ?? 'app') === 'app');
87
+ const reveals = targets.filter((t) => t.group === 'reveal');
88
+ const primary = targets.find((t) => t.id === defaultTarget) ?? apps[0] ?? targets[0];
89
+ const extras = Boolean(onCopyPath || onReference);
90
+ return (_jsxs("span", { className: "rl-agent-file__split", role: "group", "aria-label": m.fileOpenGroup.app, children: [_jsx(Button, { size: "sm", variant: "secondary", className: "rl-agent-file__split-main", iconStart: _jsx(AgentIcon, { name: primary.group === 'reveal' ? 'folder' : 'external' }), onClick: () => onOpenWith(primary.id, file), children: m.fileOpenWith(primary.label) }), _jsxs(Menu, { align: "end", trigger: _jsx(IconButton, { size: "sm", variant: "secondary", className: "rl-agent-file__split-menu", icon: _jsx(AgentIcon, { name: "chevron-down" }), label: m.fileOpenTargets(file.name) }), children: [apps.length > 0 && (_jsx(MenuGroup, { label: m.fileOpenGroup.app, children: apps.map((t) => (_jsx(MenuItem, { icon: _jsx(AgentIcon, { name: "external" }), onSelect: () => onOpenWith(t.id, file), children: t.label }, t.id))) })), reveals.length > 0 && (_jsx(MenuGroup, { label: m.fileOpenGroup.reveal, children: reveals.map((t) => (_jsx(MenuItem, { icon: _jsx(AgentIcon, { name: "folder" }), onSelect: () => onOpenWith(t.id, file), children: t.label }, t.id))) })), extras && _jsx(MenuSeparator, {}), onCopyPath && (_jsx(MenuItem, { icon: _jsx(AgentIcon, { name: "copy" }), onSelect: onCopyPath, children: m.fileCopyPath })), onReference && (_jsx(MenuItem, { icon: _jsx(AgentIcon, { name: "at" }), onSelect: () => onReference(file), children: m.fileReference }))] })] }));
91
+ }
92
+ /**
93
+ * Breadcrumb items for a path. Under `root` the path is shown relative to it (root's last segment
94
+ * first); outside it (or for absolute paths without a root match) `outside` is true.
95
+ */
96
+ export function pathCrumbs(path, root) {
97
+ if (!path)
98
+ return undefined;
99
+ const norm = (p) => p.replace(/\\/g, '/').replace(/\/+$/, '');
100
+ const full = norm(path);
101
+ let segments;
102
+ let outside = false;
103
+ if (root) {
104
+ const base = norm(root);
105
+ const relative = !full.startsWith('/') && !/^[a-z]:\//i.test(full);
106
+ if (relative) {
107
+ const rootName = base.split('/').filter(Boolean).pop() ?? base;
108
+ segments = [rootName, ...full.split('/').filter(Boolean)];
109
+ return { items: segments.map((label) => ({ label })), outside: false };
110
+ }
111
+ const under = full === base || full.startsWith(`${base}/`) || (/^[a-z]:/i.test(base) && full.toLowerCase().startsWith(`${base.toLowerCase()}/`));
112
+ if (under) {
113
+ const rootName = base.split('/').filter(Boolean).pop() ?? base;
114
+ segments = [rootName, ...full.slice(base.length).split('/').filter(Boolean)];
115
+ }
116
+ else {
117
+ outside = true;
118
+ segments = full.split('/').filter(Boolean);
119
+ }
120
+ }
121
+ else {
122
+ segments = full.split('/').filter(Boolean);
123
+ }
124
+ if (segments.length === 0)
125
+ segments = [full];
126
+ return { items: segments.map((label) => ({ label })), outside };
127
+ }
128
+ function FileNotices({ file, onRetry, onReload, onLoadMore, m, format, }) {
129
+ const notices = [];
130
+ if (file.status === 'error') {
131
+ notices.push(_jsx(Alert, { tone: "danger", title: m.fileError, action: onRetry && _jsx(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: m.fileRetry }), children: file.reason }, "error"));
132
+ }
133
+ if (file.status === 'missing' || file.status === 'unavailable') {
134
+ notices.push(_jsx(Alert, { tone: "warning", title: file.status === 'missing' ? m.fileMissing : m.fileUnavailable, children: file.reason }, "gone"));
135
+ }
136
+ if (file.status === 'changed') {
137
+ notices.push(_jsx(Alert, { tone: "info", title: m.fileChanged, action: onReload && _jsx(Button, { size: "sm", variant: "secondary", onClick: onReload, children: m.fileReload }), children: file.reason }, "changed"));
138
+ }
139
+ if (file.partial || file.status === 'large-file') {
140
+ const loaded = file.partial ? format.bytes(file.partial.loadedBytes) : undefined;
141
+ const total = file.partial?.totalBytes ?? file.size;
142
+ const text = loaded ? (total !== undefined ? m.fileLoaded(loaded, format.bytes(total)) : m.fileLoadedNoTotal(loaded)) : undefined;
143
+ notices.push(_jsx(Alert, { tone: "warning", title: m.fileLargeFile, action: onLoadMore && _jsx(Button, { size: "sm", variant: "secondary", onClick: onLoadMore, children: m.fileLoadMore }), children: text }, "partial"));
144
+ }
145
+ if (notices.length === 0)
146
+ return null;
147
+ return _jsx("div", { className: "rl-agent-file__notices", children: notices });
148
+ }
149
+ function FileBody({ file, raw, renderMarkdown, renderCode, onOpenExternal, zoomLevels, defaultZoom, m, }) {
150
+ if (file.status === 'loading') {
151
+ return (_jsxs("div", { className: "rl-agent-file__loading", "aria-busy": "true", children: [_jsx(Skeleton, { lines: 4 }), _jsx("span", { className: "rl-agent-sr", children: m.fileLoading })] }));
152
+ }
153
+ if (file.status === 'error' || file.status === 'missing' || file.status === 'unavailable') {
154
+ return _jsx("p", { className: "rl-agent-file__empty", children: m.fileNoContent });
155
+ }
156
+ if (file.kind === 'binary' || file.kind === 'unknown') {
157
+ return (_jsxs("div", { className: "rl-agent-file__unsupported", children: [_jsx(AgentIcon, { name: "file" }), _jsx("p", { children: m.fileUnsupported }), onOpenExternal && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "external" }), onClick: () => onOpenExternal(file), children: m.fileOpenExternal }))] }));
158
+ }
159
+ if (file.content === undefined || file.content === '')
160
+ return _jsx("p", { className: "rl-agent-file__empty", children: m.fileNoContent });
161
+ if (file.kind === 'image')
162
+ return _jsx(ImagePreview, { file: file, levels: zoomLevels, defaultZoom: defaultZoom, m: m });
163
+ const label = m.fileContent(file.name);
164
+ if (!raw && file.kind === 'markdown' && renderMarkdown) {
165
+ return (_jsx("div", { className: "rl-agent-file__scroll rl-agent-file__markdown", role: "region", "aria-label": label, tabIndex: 0, children: renderMarkdown(file.content) }));
166
+ }
167
+ if (!raw && file.kind === 'code' && renderCode) {
168
+ return (_jsx("div", { className: "rl-agent-file__scroll", role: "region", "aria-label": label, tabIndex: 0, children: renderCode(file.content, file.language) }));
169
+ }
170
+ return _jsx(NumberedText, { text: file.content, label: label, numbered: !raw });
171
+ }
172
+ /** Plain text with decorative (not copied, not read) line numbers. */
173
+ function NumberedText({ text, label, numbered }) {
174
+ const lines = React.useMemo(() => text.replace(/\n$/, '').split('\n'), [text]);
175
+ return (_jsx("div", { className: "rl-agent-file__scroll", role: "region", "aria-label": label, tabIndex: 0, children: _jsx("pre", { className: "rl-agent-file__code", "data-numbered": numbered || undefined, children: numbered
176
+ ? lines.map((line, i) => (_jsxs("span", { className: "rl-agent-file__line", children: [_jsx("span", { className: "rl-agent-file__ln", "aria-hidden": "true", children: i + 1 }), _jsx("span", { className: "rl-agent-file__text", children: line }), '\n'] }, i)))
177
+ : text }) }));
178
+ }
179
+ /**
180
+ * Image with a zoom group. Percentages are of the natural width (known after load); before the
181
+ * image has loaded, or when the browser reports no natural size, they fall back to a share of the
182
+ * preview width. `fit` scales the image down to the preview width, never up.
183
+ */
184
+ function ImagePreview({ file, levels, defaultZoom = 'fit', m }) {
185
+ const options = React.useMemo(() => {
186
+ const list = (levels && levels.length > 0 ? levels : DEFAULT_ZOOMS).filter((z) => Number.isFinite(z) && z > 0);
187
+ return [...new Set(list)].sort((a, b) => a - b);
188
+ }, [levels]);
189
+ const [zoom, setZoom] = React.useState(defaultZoom);
190
+ const [natural, setNatural] = React.useState(undefined);
191
+ const style = zoom === 'fit'
192
+ ? {}
193
+ : natural
194
+ ? { width: `${(natural * zoom) / 100}px` }
195
+ : { '--rl-agent-file-zoom': zoom / 100 };
196
+ return (_jsxs("div", { className: "rl-agent-file__image", children: [_jsxs("div", { className: "rl-agent-file__zoom", role: "group", "aria-label": m.fileZoom, children: [_jsx("button", { type: "button", className: "rl-agent-file__zoom-option", "aria-pressed": zoom === 'fit', onClick: () => setZoom('fit'), children: m.fileZoomFit }), options.map((z) => (_jsxs("button", { type: "button", className: "rl-agent-file__zoom-option", "aria-pressed": zoom === z, onClick: () => setZoom(z), children: [z, "%"] }, z)))] }), _jsx("div", { className: "rl-agent-file__scroll rl-agent-file__canvas", role: "region", "aria-label": m.fileContent(file.name), tabIndex: 0, children: _jsx("img", { className: "rl-agent-file__img", src: file.content, alt: file.alt ?? file.name, style: style, "data-zoom": zoom, onLoad: (event) => setNatural(event.currentTarget.naturalWidth || undefined) }) })] }));
197
+ }
198
+ function FileMetadata({ file, m, format }) {
199
+ const rows = [{ label: m.fileMeta.name, value: file.name }];
200
+ if (file.path)
201
+ rows.push({ label: m.fileMeta.path, value: file.path });
202
+ rows.push({ label: m.fileMeta.type, value: file.mimeType ?? m.artifactKind[file.kind === 'binary' ? 'file' : file.kind] });
203
+ if (file.language)
204
+ rows.push({ label: m.fileMeta.language, value: file.language });
205
+ if (file.size !== undefined)
206
+ rows.push({ label: m.fileMeta.size, value: format.bytes(file.size) });
207
+ if (file.version)
208
+ rows.push({ label: m.fileMeta.version, value: file.version });
209
+ for (const extra of file.metadata ?? [])
210
+ rows.push(extra);
211
+ return (_jsx("dl", { className: "rl-agent-file__meta", children: rows.map((row, i) => (_jsxs("div", { className: "rl-agent-file__meta-row", children: [_jsx("dt", { children: row.label }), _jsx("dd", { children: row.value })] }, `${row.label}-${i}`))) }));
212
+ }
213
+ //# sourceMappingURL=FilePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreview.js","sourceRoot":"","sources":["../../../src/components/artifact/FilePreview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import * as React from 'react';
2
+ import type { FilePreviewView } from '@wzrhine/agent-core';
3
+ import type { WorkspaceMessagesProp } from '../workspace/shared.js';
4
+ export interface FilePreviewTab {
5
+ id: string;
6
+ name: string;
7
+ kind?: FilePreviewView['kind'];
8
+ }
9
+ export type FilePreviewTabsProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
10
+ tabs: FilePreviewTab[];
11
+ /** The open tab (controlled). */
12
+ activeId: string;
13
+ onActivate: (id: string) => void;
14
+ onCloseTab: (id: string) => void;
15
+ /** Closes every file; Escape inside the strip and the trailing close button call it. */
16
+ onCloseAll?: () => void;
17
+ /** Panel content of the active tab (usually a `FilePreview`). */
18
+ renderPanel: (id: string) => React.ReactNode;
19
+ /** Focus target after the last tab closes (the element that opened the preview). */
20
+ returnFocusRef?: React.RefObject<HTMLElement | null>;
21
+ messages?: WorkspaceMessagesProp;
22
+ };
23
+ /**
24
+ * FilePreviewTabs: a strip of open files above one preview panel. ARIA tabs with a roving
25
+ * tabIndex: ←/→ move to the neighbour and activate it (wrapping), Home / End jump to the ends;
26
+ * Delete / Backspace close the focused tab; Escape anywhere in the strip calls `onCloseAll`.
27
+ * A middle click (`auxclick`, button 1) closes a tab. Each tab has its own close button named
28
+ * 「关闭 name」 (not inside the tab, so the tab keeps a plain name).
29
+ *
30
+ * When the active tab closes, the next neighbour (or the previous one at the end) activates and
31
+ * receives focus; when the last tab closes, focus moves to `returnFocusRef`. The active tab is
32
+ * kept in view with `scrollIntoView({ inline: 'nearest' })` (guarded for environments without
33
+ * it). Long names truncate visually; the full name is in `title` and in the accessible name.
34
+ *
35
+ * Motion: none (the active marker is a colour/border change).
36
+ */
37
+ export declare const FilePreviewTabs: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
38
+ tabs: FilePreviewTab[];
39
+ /** The open tab (controlled). */
40
+ activeId: string;
41
+ onActivate: (id: string) => void;
42
+ onCloseTab: (id: string) => void;
43
+ /** Closes every file; Escape inside the strip and the trailing close button call it. */
44
+ onCloseAll?: () => void;
45
+ /** Panel content of the active tab (usually a `FilePreview`). */
46
+ renderPanel: (id: string) => React.ReactNode;
47
+ /** Focus target after the last tab closes (the element that opened the preview). */
48
+ returnFocusRef?: React.RefObject<HTMLElement | null>;
49
+ messages?: WorkspaceMessagesProp;
50
+ } & React.RefAttributes<HTMLDivElement>>;
51
+ //# sourceMappingURL=FilePreviewTabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewTabs.d.ts","sourceRoot":"","sources":["../../../src/components/artifact/FilePreviewTabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC1F,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iEAAiE;IACjE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7C,oFAAoF;IACpF,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAWF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;UArCpB,cAAc,EAAE;IACtB,iCAAiC;cACvB,MAAM;gBACJ,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;gBACpB,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;IAChC,wFAAwF;iBAC3E,MAAM,IAAI;IACvB,iEAAiE;iBACpD,CAAC,EAAE,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS;IAC5C,oFAAoF;qBACnE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;eACzC,qBAAqB;wCAoNhC,CAAC"}
@@ -0,0 +1,150 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { IconButton } from '@wzrhine/react';
5
+ import { AgentIcon } from '../../primitives/icons.js';
6
+ import { cx } from '../../utils/cx.js';
7
+ import { useWorkspaceMessages } from '../workspace/shared.js';
8
+ const kindIcon = {
9
+ text: 'file',
10
+ markdown: 'file',
11
+ code: 'code',
12
+ image: 'image',
13
+ binary: 'database',
14
+ unknown: 'file',
15
+ };
16
+ /**
17
+ * FilePreviewTabs: a strip of open files above one preview panel. ARIA tabs with a roving
18
+ * tabIndex: ←/→ move to the neighbour and activate it (wrapping), Home / End jump to the ends;
19
+ * Delete / Backspace close the focused tab; Escape anywhere in the strip calls `onCloseAll`.
20
+ * A middle click (`auxclick`, button 1) closes a tab. Each tab has its own close button named
21
+ * 「关闭 name」 (not inside the tab, so the tab keeps a plain name).
22
+ *
23
+ * When the active tab closes, the next neighbour (or the previous one at the end) activates and
24
+ * receives focus; when the last tab closes, focus moves to `returnFocusRef`. The active tab is
25
+ * kept in view with `scrollIntoView({ inline: 'nearest' })` (guarded for environments without
26
+ * it). Long names truncate visually; the full name is in `title` and in the accessible name.
27
+ *
28
+ * Motion: none (the active marker is a colour/border change).
29
+ */
30
+ export const FilePreviewTabs = React.forwardRef(function FilePreviewTabs({ tabs, activeId, onActivate, onCloseTab, onCloseAll, renderPanel, returnFocusRef, messages: override, className, ...rest }, ref) {
31
+ const m = useWorkspaceMessages(override);
32
+ const baseId = React.useId();
33
+ const tabRefs = React.useRef(new Map());
34
+ const pendingFocus = React.useRef(null);
35
+ const active = tabs.find((t) => t.id === activeId) ?? tabs[0];
36
+ const tabId = (id) => `${baseId}-tab-${id}`;
37
+ const panelId = `${baseId}-panel`;
38
+ React.useEffect(() => {
39
+ if (!active)
40
+ return;
41
+ const el = tabRefs.current.get(active.id);
42
+ if (el && typeof el.scrollIntoView === 'function')
43
+ el.scrollIntoView({ block: 'nearest', inline: 'nearest' });
44
+ }, [active?.id]);
45
+ // Hosts often unmount the strip once nothing is open: return focus from the unmount as well.
46
+ const returnRef = React.useRef(returnFocusRef);
47
+ returnRef.current = returnFocusRef;
48
+ React.useEffect(() => () => {
49
+ if (pendingFocus.current === 'return')
50
+ returnRef.current?.current?.focus();
51
+ }, []);
52
+ // Focus moves after the host re-renders with the new tab list.
53
+ React.useEffect(() => {
54
+ const target = pendingFocus.current;
55
+ if (target === null)
56
+ return;
57
+ pendingFocus.current = null;
58
+ if (target === 'return')
59
+ returnFocusRef?.current?.focus();
60
+ else
61
+ tabRefs.current.get(target)?.focus();
62
+ });
63
+ const activate = (id, focus) => {
64
+ if (focus)
65
+ pendingFocus.current = id;
66
+ if (id !== active?.id)
67
+ onActivate(id);
68
+ else if (focus)
69
+ tabRefs.current.get(id)?.focus();
70
+ };
71
+ const close = (id) => {
72
+ const index = tabs.findIndex((t) => t.id === id);
73
+ if (index < 0)
74
+ return;
75
+ const rest = tabs.filter((t) => t.id !== id);
76
+ if (rest.length === 0) {
77
+ pendingFocus.current = 'return';
78
+ }
79
+ else if (id === active?.id) {
80
+ const next = rest[Math.min(index, rest.length - 1)];
81
+ pendingFocus.current = next.id;
82
+ onActivate(next.id);
83
+ }
84
+ else {
85
+ // Closing a background tab from its close button keeps focus on the active tab.
86
+ pendingFocus.current = active?.id ?? null;
87
+ }
88
+ onCloseTab(id);
89
+ };
90
+ const onTabKeyDown = (event, index) => {
91
+ const count = tabs.length;
92
+ let next;
93
+ switch (event.key) {
94
+ case 'ArrowRight':
95
+ next = (index + 1) % count;
96
+ break;
97
+ case 'ArrowLeft':
98
+ next = (index - 1 + count) % count;
99
+ break;
100
+ case 'Home':
101
+ next = 0;
102
+ break;
103
+ case 'End':
104
+ next = count - 1;
105
+ break;
106
+ case 'Delete':
107
+ case 'Backspace':
108
+ event.preventDefault();
109
+ close(tabs[index].id);
110
+ return;
111
+ default:
112
+ return;
113
+ }
114
+ event.preventDefault();
115
+ activate(tabs[next].id, true);
116
+ };
117
+ if (tabs.length === 0)
118
+ return null;
119
+ return (_jsxs("div", { ...rest, ref: ref, className: cx('rl-agent-file-tabs', className), children: [_jsxs("div", { className: "rl-agent-file-tabs__bar", onKeyDown: (event) => {
120
+ if (event.key === 'Escape' && onCloseAll) {
121
+ event.preventDefault();
122
+ pendingFocus.current = 'return';
123
+ onCloseAll();
124
+ }
125
+ }, children: [_jsxs("div", { className: "rl-agent-file-tabs__scroller", children: [_jsx("div", { className: "rl-agent-file-tabs__strip", role: "tablist", "aria-label": m.fileTabs, "aria-orientation": "horizontal", children: tabs.map((tab, index) => {
126
+ const selected = tab.id === active?.id;
127
+ return (_jsxs("button", { ref: (el) => {
128
+ if (el)
129
+ tabRefs.current.set(tab.id, el);
130
+ else
131
+ tabRefs.current.delete(tab.id);
132
+ }, type: "button", role: "tab", id: tabId(tab.id), className: "rl-agent-file-tabs__tab", "data-active": selected || undefined, style: { order: index * 2 }, "aria-selected": selected, "aria-controls": selected ? panelId : undefined, tabIndex: selected ? 0 : -1, title: tab.name, onClick: () => activate(tab.id, false), onMouseDown: (event) => {
133
+ // Stop the browser's middle-click autoscroll so auxclick can close the tab.
134
+ if (event.button === 1)
135
+ event.preventDefault();
136
+ }, onAuxClick: (event) => {
137
+ if (event.button !== 1)
138
+ return;
139
+ event.preventDefault();
140
+ close(tab.id);
141
+ }, onKeyDown: (event) => onTabKeyDown(event, index), children: [_jsx(AgentIcon, { name: kindIcon[tab.kind ?? 'unknown'], className: "rl-agent-file-tabs__icon" }), _jsx("span", { className: "rl-agent-file-tabs__name", children: tab.name })] }, tab.id));
142
+ }) }), tabs.map((tab, index) => {
143
+ const selected = tab.id === active?.id;
144
+ return (_jsx("button", { type: "button", className: "rl-agent-file-tabs__close", "data-active": selected || undefined, style: { order: index * 2 + 1 }, "aria-label": m.fileTabClose(tab.name), title: m.fileTabCloseTitle, tabIndex: selected ? 0 : -1, onClick: () => close(tab.id), children: _jsx(AgentIcon, { name: "close" }) }, tab.id));
145
+ })] }), onCloseAll && (_jsx(IconButton, { size: "sm", variant: "ghost", className: "rl-agent-file-tabs__close-all", icon: _jsx(AgentIcon, { name: "close" }), label: m.fileTabCloseAll, onClick: () => {
146
+ pendingFocus.current = 'return';
147
+ onCloseAll();
148
+ } }))] }), active && (_jsx("div", { id: panelId, role: "tabpanel", "aria-labelledby": tabId(active.id), className: "rl-agent-file-tabs__panel", tabIndex: -1, children: renderPanel(active.id) }))] }));
149
+ });
150
+ //# sourceMappingURL=FilePreviewTabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewTabs.js","sourceRoot":"","sources":["../../../src/components/artifact/FilePreviewTabs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import type { AttachmentView, ReferenceView } from '@wzrhine/agent-core';
3
+ export interface AttachmentListProps {
4
+ attachments?: readonly AttachmentView[];
5
+ references?: readonly ReferenceView[];
6
+ /** Removes the UI reference only; deleting remote files is the adapter's decision. No callback → no button. */
7
+ onRemove?: (item: {
8
+ type: 'attachment';
9
+ attachment: AttachmentView;
10
+ } | {
11
+ type: 'reference';
12
+ reference: ReferenceView;
13
+ }) => void;
14
+ /** Retry a failed upload. No callback → no retry button. */
15
+ onRetry?: (attachment: AttachmentView) => void;
16
+ /** Blocks remove / retry (e.g. while sending). */
17
+ disabled?: boolean;
18
+ /** Custom preview for an attachment (replaces icon / thumbnail). */
19
+ renderPreview?: (attachment: AttachmentView) => React.ReactNode;
20
+ 'aria-label'?: string;
21
+ className?: string;
22
+ }
23
+ /**
24
+ * Attachment and reference chips (atlas 17), `role="list"`. Every card has a fixed size, so
25
+ * progress and status changes never move neighbours. Names are ellipsised with the full name in
26
+ * `title` and in the accessible text; size uses `useAgentFormat().bytes`. Thumbnails are drawn
27
+ * only for `kind: 'image'` with a `data:image/`, `blob:` or same-origin URL (anything else falls
28
+ * back to the icon). Statuses are text + glyph: 正在上传 (Progress when the fraction is known,
29
+ * else Spinner), 上传失败 (+ retry), 引用已失效, 不可用.
30
+ * Motion: none beyond the Progress / Spinner primitives (reduced-motion aware).
31
+ */
32
+ export declare function AttachmentList({ attachments, references, onRemove, onRetry, disabled, renderPreview, 'aria-label': ariaLabel, className, }: AttachmentListProps): React.JSX.Element | null;
33
+ //# sourceMappingURL=AttachmentList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentList.d.ts","sourceRoot":"","sources":["../../../src/components/composer/AttachmentList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAkB,cAAc,EAAiB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA+BxG,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACtC,+GAA+G;IAC/G,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,cAAc,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,KAAK,IAAI,CAAC;IAChI,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IAC/C,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,KAAK,CAAC,SAAS,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,WAAgB,EAChB,UAAe,EACf,QAAQ,EACR,OAAO,EACP,QAAgB,EAChB,aAAa,EACb,YAAY,EAAE,SAAS,EACvB,SAAS,GACV,EAAE,mBAAmB,4BA8HrB"}
@@ -0,0 +1,60 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { IconButton, Progress, Spinner } from '@wzrhine/react';
4
+ import { AgentIcon } from '../../primitives/icons.js';
5
+ import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
6
+ import { cx } from '../../utils/cx.js';
7
+ import { isSafeThumbnail } from './composer-utils.js';
8
+ /** Icon per built-in kind; kinds outside the list fall back to `file` (ADR-0013 §2). */
9
+ const attachmentIcon = {
10
+ image: 'image',
11
+ file: 'file',
12
+ pdf: 'file',
13
+ text: 'file',
14
+ code: 'code',
15
+ unknown: 'file',
16
+ };
17
+ /** Icon per built-in kind; kinds outside the list fall back to the `custom` icon (ADR-0013 §2). */
18
+ const referenceIcon = {
19
+ file: 'file',
20
+ folder: 'folder',
21
+ skill: 'spark',
22
+ command: 'slash',
23
+ url: 'link',
24
+ symbol: 'code',
25
+ custom: 'at',
26
+ };
27
+ const attachmentIconFor = (kind) => attachmentIcon[kind] ?? 'file';
28
+ const referenceIconFor = (kind) => referenceIcon[kind] ?? referenceIcon.custom;
29
+ function useOrigin() {
30
+ return typeof window === 'undefined' ? undefined : window.location.origin;
31
+ }
32
+ /**
33
+ * Attachment and reference chips (atlas 17), `role="list"`. Every card has a fixed size, so
34
+ * progress and status changes never move neighbours. Names are ellipsised with the full name in
35
+ * `title` and in the accessible text; size uses `useAgentFormat().bytes`. Thumbnails are drawn
36
+ * only for `kind: 'image'` with a `data:image/`, `blob:` or same-origin URL (anything else falls
37
+ * back to the icon). Statuses are text + glyph: 正在上传 (Progress when the fraction is known,
38
+ * else Spinner), 上传失败 (+ retry), 引用已失效, 不可用.
39
+ * Motion: none beyond the Progress / Spinner primitives (reduced-motion aware).
40
+ */
41
+ export function AttachmentList({ attachments = [], references = [], onRemove, onRetry, disabled = false, renderPreview, 'aria-label': ariaLabel, className, }) {
42
+ const messages = useAgentMessages().composer;
43
+ const format = useAgentFormat();
44
+ const origin = useOrigin();
45
+ if (attachments.length === 0 && references.length === 0)
46
+ return null;
47
+ return (_jsxs("ul", { className: cx('rl-agent-attachments', className), "aria-label": ariaLabel ?? messages.attachmentsLabel, "data-slot": "attachment-list", children: [references.map((reference) => {
48
+ const status = reference.status ?? 'ready';
49
+ const statusText = status === 'stale' ? messages.stale : status === 'failed' ? messages.referenceFailed : status === 'loading' ? messages.referenceLoading : undefined;
50
+ const name = reference.label;
51
+ return (_jsxs("li", { className: "rl-agent-attachment", "data-type": "reference", "data-kind": reference.kind, "data-status": status, children: [_jsx("span", { className: "rl-agent-attachment__media", "aria-hidden": "true", children: status === 'loading' ? _jsx(Spinner, { size: "sm" }) : _jsx(AgentIcon, { name: referenceIconFor(reference.kind) }) }), _jsxs("span", { className: "rl-agent-attachment__body", children: [_jsx("span", { className: "rl-agent-attachment__name", title: reference.detail ?? name, children: name }), _jsx("span", { className: "rl-agent-attachment__meta", children: statusText ? (_jsxs("span", { className: "rl-agent-attachment__status", children: [status !== 'loading' && _jsx(AgentIcon, { name: "warning" }), statusText] })) : (_jsxs(_Fragment, { children: [messages.referenceKind[reference.kind] ?? reference.kind, reference.external && ` · ${messages.external}`] })) }), reference.detail && _jsx("span", { className: "rl-agent-sr", children: reference.detail }), reference.reason && _jsx("span", { className: "rl-agent-sr", children: reference.reason })] }), onRemove && (_jsx(IconButton, { size: "sm", className: "rl-agent-attachment__remove", label: messages.remove(name), icon: _jsx(AgentIcon, { name: "close" }), disabled: disabled, onClick: () => onRemove({ type: 'reference', reference }) }))] }, `r-${reference.id}`));
52
+ }), attachments.map((attachment) => {
53
+ const { status, name } = attachment;
54
+ const thumb = attachment.kind === 'image' && isSafeThumbnail(attachment.thumbnail, origin) ? attachment.thumbnail : undefined;
55
+ const meta = [messages.kind[attachment.kind] ?? attachment.kind, attachment.size !== undefined ? format.bytes(attachment.size) : undefined].filter(Boolean).join(' · ');
56
+ const known = typeof attachment.progress === 'number' && Number.isFinite(attachment.progress);
57
+ return (_jsxs("li", { className: "rl-agent-attachment", "data-type": "attachment", "data-kind": attachment.kind, "data-status": status, children: [_jsx("span", { className: "rl-agent-attachment__media", "data-thumb": thumb ? '' : undefined, children: renderPreview ? (renderPreview(attachment)) : thumb ? (_jsx("img", { className: "rl-agent-attachment__thumb", src: thumb, alt: attachment.alt ?? name, loading: "lazy", decoding: "async" })) : (_jsx(AgentIcon, { name: attachmentIconFor(attachment.kind) })) }), _jsxs("span", { className: "rl-agent-attachment__body", children: [_jsx("span", { className: "rl-agent-attachment__name", title: name, children: name }), status === 'uploading' ? (known ? (_jsx(Progress, { className: "rl-agent-attachment__progress", size: "sm", label: messages.uploadingName(name), hideLabel: true, valueText: false, value: Math.round(Math.max(0, Math.min(1, attachment.progress)) * 100) })) : (_jsxs("span", { className: "rl-agent-attachment__meta", children: [_jsx(Spinner, { size: "sm", label: messages.uploadingName(name) }), _jsx("span", { "aria-hidden": "true", children: messages.uploading })] }))) : (_jsx("span", { className: "rl-agent-attachment__meta", children: status === 'failed' || status === 'stale' || status === 'disabled' ? (_jsxs("span", { className: "rl-agent-attachment__status", children: [_jsx(AgentIcon, { name: "warning" }), status === 'failed' ? messages.uploadFailed : status === 'stale' ? messages.stale : messages.unavailable] })) : (meta) })), attachment.reason && _jsx("span", { className: "rl-agent-sr", children: attachment.reason })] }), status === 'failed' && onRetry && (_jsx(IconButton, { size: "sm", className: "rl-agent-attachment__retry", label: messages.retryUpload(name), icon: _jsx(AgentIcon, { name: "retry" }), disabled: disabled, onClick: () => onRetry(attachment) })), onRemove && (_jsx(IconButton, { size: "sm", className: "rl-agent-attachment__remove", label: messages.remove(name), icon: _jsx(AgentIcon, { name: "close" }), disabled: disabled, onClick: () => onRemove({ type: 'attachment', attachment }) }))] }, `a-${attachment.id}`));
58
+ })] }));
59
+ }
60
+ //# sourceMappingURL=AttachmentList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentList.js","sourceRoot":"","sources":["../../../src/components/composer/AttachmentList.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wFAAwF;AACxF,MAAM,cAAc,GAA0C;IAC5D,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,mGAAmG;AACnG,MAAM,aAAa,GAAyC;IAC1D,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,GAAG,EAAE,MAAM;IACX,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,IAA4B,EAAiB,EAAE,CAAC,cAAc,CAAC,IAAsB,CAAC,IAAI,MAAM,CAAC;AAC5H,MAAM,gBAAgB,GAAG,CAAC,IAA2B,EAAiB,EAAE,CAAC,aAAa,CAAC,IAAqB,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;AAiBtI,SAAS,SAAS;IAChB,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC5E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,WAAW,GAAG,EAAE,EAChB,UAAU,GAAG,EAAE,EACf,QAAQ,EACR,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,aAAa,EACb,YAAY,EAAE,SAAS,EACvB,SAAS,GACW;IACpB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC7C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErE,OAAO,CACL,cAAI,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,gBAAc,SAAS,IAAI,QAAQ,CAAC,gBAAgB,eAAY,iBAAiB,aAClI,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC;gBAC3C,MAAM,UAAU,GACd,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtJ,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;gBAC7B,OAAO,CACL,cAA8B,SAAS,EAAC,qBAAqB,eAAW,WAAW,eAAY,SAAS,CAAC,IAAI,iBAAe,MAAM,aAChI,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAC5D,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAI,GAChG,EACP,gBAAM,SAAS,EAAC,2BAA2B,aACzC,eAAM,SAAS,EAAC,2BAA2B,EAAC,KAAK,EAAE,SAAS,CAAC,MAAM,IAAI,IAAI,YACxE,IAAI,GACA,EACP,eAAM,SAAS,EAAC,2BAA2B,YACxC,UAAU,CAAC,CAAC,CAAC,CACZ,gBAAM,SAAS,EAAC,6BAA6B,aAC1C,MAAM,KAAK,SAAS,IAAI,KAAC,SAAS,IAAC,IAAI,EAAC,SAAS,GAAG,EACpD,UAAU,IACN,CACR,CAAC,CAAC,CAAC,CACF,8BACG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,EACxD,SAAS,CAAC,QAAQ,IAAI,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAC/C,CACJ,GACI,EACN,SAAS,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,aAAa,YAAE,SAAS,CAAC,MAAM,GAAQ,EAC3E,SAAS,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,aAAa,YAAE,SAAS,CAAC,MAAM,GAAQ,IACvE,EACN,QAAQ,IAAI,CACX,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,6BAA6B,EACvC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAC5B,IAAI,EAAE,KAAC,SAAS,IAAC,IAAI,EAAC,OAAO,GAAG,EAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,GACzD,CACH,KAjCM,KAAK,SAAS,CAAC,EAAE,EAAE,CAkCvB,CACN,CAAC;YACJ,CAAC,CAAC,EACD,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;gBAC9B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;gBACpC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9H,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxK,MAAM,KAAK,GAAG,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC9F,OAAO,CACL,cAA+B,SAAS,EAAC,qBAAqB,eAAW,YAAY,eAAY,UAAU,CAAC,IAAI,iBAAe,MAAM,aACnI,eAAM,SAAS,EAAC,4BAA4B,gBAAa,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,YAC5E,aAAa,CAAC,CAAC,CAAC,CACf,aAAa,CAAC,UAAU,CAAC,CAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,cAAK,SAAS,EAAC,4BAA4B,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,GAAG,CACxH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAI,CACxD,GACI,EACP,gBAAM,SAAS,EAAC,2BAA2B,aACzC,eAAM,SAAS,EAAC,2BAA2B,EAAC,KAAK,EAAE,IAAI,YACpD,IAAI,GACA,EACN,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CACxB,KAAK,CAAC,CAAC,CAAC,CACN,KAAC,QAAQ,IACP,SAAS,EAAC,+BAA+B,EACzC,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EACnC,SAAS,QACT,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,QAAS,CAAC,CAAC,GAAG,GAAG,CAAC,GACvE,CACH,CAAC,CAAC,CAAC,CACF,gBAAM,SAAS,EAAC,2BAA2B,aACzC,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAI,EAC1D,8BAAkB,MAAM,YAAE,QAAQ,CAAC,SAAS,GAAQ,IAC/C,CACR,CACF,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,2BAA2B,YACxC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CACpE,gBAAM,SAAS,EAAC,6BAA6B,aAC3C,KAAC,SAAS,IAAC,IAAI,EAAC,SAAS,GAAG,EAC3B,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,IACpG,CACR,CAAC,CAAC,CAAC,CACF,IAAI,CACL,GACI,CACR,EACA,UAAU,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,aAAa,YAAE,UAAU,CAAC,MAAM,GAAQ,IACzE,EACN,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CACjC,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EACjC,IAAI,EAAE,KAAC,SAAS,IAAC,IAAI,EAAC,OAAO,GAAG,EAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAClC,CACH,EACA,QAAQ,IAAI,CACX,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,6BAA6B,EACvC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAC5B,IAAI,EAAE,KAAC,SAAS,IAAC,IAAI,EAAC,OAAO,GAAG,EAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,GAC3D,CACH,KA/DM,KAAK,UAAU,CAAC,EAAE,EAAE,CAgExB,CACN,CAAC;YACJ,CAAC,CAAC,IACC,CACN,CAAC;AACJ,CAAC"}