dsh-plugin-core 0.32.0 → 0.33.1

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 (634) hide show
  1. package/README.md +197 -64
  2. package/README.zh-CN.md +242 -0
  3. package/dist/adv/explorer/FileBrowser.d.ts +58 -0
  4. package/dist/adv/explorer/FileBrowser.d.ts.map +1 -0
  5. package/dist/adv/explorer/FileBrowser.js +632 -0
  6. package/dist/adv/explorer/FileBrowser.js.map +1 -0
  7. package/dist/adv/explorer/crumb-nav.d.ts +45 -0
  8. package/dist/adv/explorer/crumb-nav.d.ts.map +1 -0
  9. package/dist/adv/explorer/crumb-nav.js +78 -0
  10. package/dist/adv/explorer/crumb-nav.js.map +1 -0
  11. package/dist/adv/explorer/crumbs-menu.d.ts +37 -0
  12. package/dist/adv/explorer/crumbs-menu.d.ts.map +1 -0
  13. package/dist/adv/explorer/crumbs-menu.js +102 -0
  14. package/dist/adv/explorer/crumbs-menu.js.map +1 -0
  15. package/dist/adv/explorer/explorer-css.d.ts +2 -0
  16. package/dist/adv/explorer/explorer-css.d.ts.map +1 -0
  17. package/dist/adv/explorer/explorer-css.generated.d.ts +2 -0
  18. package/dist/adv/explorer/explorer-css.generated.d.ts.map +1 -0
  19. package/dist/adv/explorer/explorer-css.generated.js +4 -0
  20. package/dist/adv/explorer/explorer-css.generated.js.map +1 -0
  21. package/dist/adv/explorer/explorer-css.js +3 -0
  22. package/dist/adv/explorer/explorer-css.js.map +1 -0
  23. package/dist/adv/explorer/fs-face.d.ts +36 -0
  24. package/dist/adv/explorer/fs-face.d.ts.map +1 -0
  25. package/dist/adv/explorer/fs-face.js +74 -0
  26. package/dist/adv/explorer/fs-face.js.map +1 -0
  27. package/dist/adv/explorer/index.d.ts +6 -0
  28. package/dist/adv/explorer/index.d.ts.map +1 -0
  29. package/dist/adv/explorer/index.js +6 -0
  30. package/dist/adv/explorer/index.js.map +1 -0
  31. package/dist/adv/explorer/landing.d.ts +26 -0
  32. package/dist/adv/explorer/landing.d.ts.map +1 -0
  33. package/dist/adv/explorer/landing.js +43 -0
  34. package/dist/adv/explorer/landing.js.map +1 -0
  35. package/dist/adv/explorer/open.d.ts +137 -0
  36. package/dist/adv/explorer/open.d.ts.map +1 -0
  37. package/dist/adv/explorer/open.js +350 -0
  38. package/dist/adv/explorer/open.js.map +1 -0
  39. package/dist/adv/explorer/picker-placement.d.ts +69 -0
  40. package/dist/adv/explorer/picker-placement.d.ts.map +1 -0
  41. package/dist/adv/explorer/picker-placement.js +122 -0
  42. package/dist/adv/explorer/picker-placement.js.map +1 -0
  43. package/dist/adv/explorer/preview/BytesPreview.d.ts +12 -0
  44. package/dist/adv/explorer/preview/BytesPreview.d.ts.map +1 -0
  45. package/dist/adv/explorer/preview/BytesPreview.js +60 -0
  46. package/dist/adv/explorer/preview/BytesPreview.js.map +1 -0
  47. package/dist/adv/explorer/preview/HtmlPreview.d.ts +17 -0
  48. package/dist/adv/explorer/preview/HtmlPreview.d.ts.map +1 -0
  49. package/dist/adv/explorer/preview/HtmlPreview.js +113 -0
  50. package/dist/adv/explorer/preview/HtmlPreview.js.map +1 -0
  51. package/dist/adv/explorer/preview/OfficePreview.d.ts +12 -0
  52. package/dist/adv/explorer/preview/OfficePreview.d.ts.map +1 -0
  53. package/dist/adv/explorer/preview/OfficePreview.js +63 -0
  54. package/dist/adv/explorer/preview/OfficePreview.js.map +1 -0
  55. package/dist/adv/explorer/preview/TextPreview.d.ts +18 -0
  56. package/dist/adv/explorer/preview/TextPreview.d.ts.map +1 -0
  57. package/dist/adv/explorer/preview/TextPreview.js +122 -0
  58. package/dist/adv/explorer/preview/TextPreview.js.map +1 -0
  59. package/dist/adv/explorer/preview/index.d.ts +24 -0
  60. package/dist/adv/explorer/preview/index.d.ts.map +1 -0
  61. package/dist/adv/explorer/preview/index.js +58 -0
  62. package/dist/adv/explorer/preview/index.js.map +1 -0
  63. package/dist/adv/explorer/preview/md-labels.d.ts +3 -0
  64. package/dist/adv/explorer/preview/md-labels.d.ts.map +1 -0
  65. package/dist/adv/explorer/preview/md-labels.js +12 -0
  66. package/dist/adv/explorer/preview/md-labels.js.map +1 -0
  67. package/dist/adv/explorer/preview-title-bar.d.ts +26 -0
  68. package/dist/adv/explorer/preview-title-bar.d.ts.map +1 -0
  69. package/dist/adv/explorer/preview-title-bar.js +48 -0
  70. package/dist/adv/explorer/preview-title-bar.js.map +1 -0
  71. package/dist/adv/explorer/types.d.ts +259 -0
  72. package/dist/adv/explorer/types.d.ts.map +1 -0
  73. package/dist/adv/explorer/types.js +379 -0
  74. package/dist/adv/explorer/types.js.map +1 -0
  75. package/dist/adv/session/SessionViewModal.d.ts +37 -0
  76. package/dist/adv/session/SessionViewModal.d.ts.map +1 -0
  77. package/dist/adv/session/SessionViewModal.js +1133 -0
  78. package/dist/adv/session/SessionViewModal.js.map +1 -0
  79. package/dist/adv/session/changes.d.ts +73 -0
  80. package/dist/adv/session/changes.d.ts.map +1 -0
  81. package/dist/adv/session/changes.js +134 -0
  82. package/dist/adv/session/changes.js.map +1 -0
  83. package/dist/adv/session/faces.d.ts +244 -0
  84. package/dist/adv/session/faces.d.ts.map +1 -0
  85. package/dist/adv/session/faces.js +17 -0
  86. package/dist/adv/session/faces.js.map +1 -0
  87. package/dist/adv/session/index.d.ts +7 -0
  88. package/dist/adv/session/index.d.ts.map +1 -0
  89. package/dist/adv/session/index.js +27 -0
  90. package/dist/adv/session/index.js.map +1 -0
  91. package/dist/adv/session/mirror/AskCard.d.ts +35 -0
  92. package/dist/adv/session/mirror/AskCard.d.ts.map +1 -0
  93. package/dist/adv/session/mirror/AskCard.js +131 -0
  94. package/dist/adv/session/mirror/AskCard.js.map +1 -0
  95. package/dist/adv/session/mirror/BashRow.d.ts +14 -0
  96. package/dist/adv/session/mirror/BashRow.d.ts.map +1 -0
  97. package/dist/adv/session/mirror/BashRow.js +143 -0
  98. package/dist/adv/session/mirror/BashRow.js.map +1 -0
  99. package/dist/adv/session/mirror/ChangedFileDiff.d.ts +25 -0
  100. package/dist/adv/session/mirror/ChangedFileDiff.d.ts.map +1 -0
  101. package/dist/adv/session/mirror/ChangedFileDiff.js +178 -0
  102. package/dist/adv/session/mirror/ChangedFileDiff.js.map +1 -0
  103. package/dist/adv/session/mirror/ChangedFilesCard.d.ts +18 -0
  104. package/dist/adv/session/mirror/ChangedFilesCard.d.ts.map +1 -0
  105. package/dist/adv/session/mirror/ChangedFilesCard.js +165 -0
  106. package/dist/adv/session/mirror/ChangedFilesCard.js.map +1 -0
  107. package/dist/adv/session/mirror/ChatGroupSeat.d.ts +24 -0
  108. package/dist/adv/session/mirror/ChatGroupSeat.d.ts.map +1 -0
  109. package/dist/adv/session/mirror/ChatGroupSeat.js +135 -0
  110. package/dist/adv/session/mirror/ChatGroupSeat.js.map +1 -0
  111. package/dist/adv/session/mirror/ChatNodeSeat.d.ts +43 -0
  112. package/dist/adv/session/mirror/ChatNodeSeat.d.ts.map +1 -0
  113. package/dist/adv/session/mirror/ChatNodeSeat.js +133 -0
  114. package/dist/adv/session/mirror/ChatNodeSeat.js.map +1 -0
  115. package/dist/adv/session/mirror/ChatView.d.ts +47 -0
  116. package/dist/adv/session/mirror/ChatView.d.ts.map +1 -0
  117. package/dist/adv/session/mirror/ChatView.js +138 -0
  118. package/dist/adv/session/mirror/ChatView.js.map +1 -0
  119. package/dist/adv/session/mirror/CommandCard.d.ts +20 -0
  120. package/dist/adv/session/mirror/CommandCard.d.ts.map +1 -0
  121. package/dist/adv/session/mirror/CommandCard.js +69 -0
  122. package/dist/adv/session/mirror/CommandCard.js.map +1 -0
  123. package/dist/adv/session/mirror/ContextInjectionRow.d.ts +18 -0
  124. package/dist/adv/session/mirror/ContextInjectionRow.d.ts.map +1 -0
  125. package/dist/adv/session/mirror/ContextInjectionRow.js +50 -0
  126. package/dist/adv/session/mirror/ContextInjectionRow.js.map +1 -0
  127. package/dist/adv/session/mirror/Deliverables.d.ts +24 -0
  128. package/dist/adv/session/mirror/Deliverables.d.ts.map +1 -0
  129. package/dist/adv/session/mirror/Deliverables.js +175 -0
  130. package/dist/adv/session/mirror/Deliverables.js.map +1 -0
  131. package/dist/adv/session/mirror/GenericCommandCard.d.ts +136 -0
  132. package/dist/adv/session/mirror/GenericCommandCard.d.ts.map +1 -0
  133. package/dist/adv/session/mirror/GenericCommandCard.js +948 -0
  134. package/dist/adv/session/mirror/GenericCommandCard.js.map +1 -0
  135. package/dist/adv/session/mirror/MessageIconActions.d.ts +16 -0
  136. package/dist/adv/session/mirror/MessageIconActions.d.ts.map +1 -0
  137. package/dist/adv/session/mirror/MessageIconActions.js +69 -0
  138. package/dist/adv/session/mirror/MessageIconActions.js.map +1 -0
  139. package/dist/adv/session/mirror/MessageItem.d.ts +93 -0
  140. package/dist/adv/session/mirror/MessageItem.d.ts.map +1 -0
  141. package/dist/adv/session/mirror/MessageItem.js +194 -0
  142. package/dist/adv/session/mirror/MessageItem.js.map +1 -0
  143. package/dist/adv/session/mirror/ReasoningRow.d.ts +11 -0
  144. package/dist/adv/session/mirror/ReasoningRow.d.ts.map +1 -0
  145. package/dist/adv/session/mirror/ReasoningRow.js +111 -0
  146. package/dist/adv/session/mirror/ReasoningRow.js.map +1 -0
  147. package/dist/adv/session/mirror/RunningStatus.d.ts +12 -0
  148. package/dist/adv/session/mirror/RunningStatus.d.ts.map +1 -0
  149. package/dist/adv/session/mirror/RunningStatus.js +57 -0
  150. package/dist/adv/session/mirror/RunningStatus.js.map +1 -0
  151. package/dist/adv/session/mirror/StatDialog.d.ts +20 -0
  152. package/dist/adv/session/mirror/StatDialog.d.ts.map +1 -0
  153. package/dist/adv/session/mirror/StatDialog.js +49 -0
  154. package/dist/adv/session/mirror/StatDialog.js.map +1 -0
  155. package/dist/adv/session/mirror/ToolDetails.d.ts +65 -0
  156. package/dist/adv/session/mirror/ToolDetails.d.ts.map +1 -0
  157. package/dist/adv/session/mirror/ToolDetails.js +268 -0
  158. package/dist/adv/session/mirror/ToolDetails.js.map +1 -0
  159. package/dist/adv/session/mirror/TurnProcessNodeView.d.ts +10 -0
  160. package/dist/adv/session/mirror/TurnProcessNodeView.d.ts.map +1 -0
  161. package/dist/adv/session/mirror/TurnProcessNodeView.js +57 -0
  162. package/dist/adv/session/mirror/TurnProcessNodeView.js.map +1 -0
  163. package/dist/adv/session/mirror/TurnTailNodeView.d.ts +57 -0
  164. package/dist/adv/session/mirror/TurnTailNodeView.d.ts.map +1 -0
  165. package/dist/adv/session/mirror/TurnTailNodeView.js +106 -0
  166. package/dist/adv/session/mirror/TurnTailNodeView.js.map +1 -0
  167. package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts +16 -0
  168. package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts.map +1 -0
  169. package/dist/adv/session/mirror/TurnTriggerNodeView.js +103 -0
  170. package/dist/adv/session/mirror/TurnTriggerNodeView.js.map +1 -0
  171. package/dist/adv/session/mirror/TurnUsagePanel.d.ts +21 -0
  172. package/dist/adv/session/mirror/TurnUsagePanel.d.ts.map +1 -0
  173. package/dist/adv/session/mirror/TurnUsagePanel.js +41 -0
  174. package/dist/adv/session/mirror/TurnUsagePanel.js.map +1 -0
  175. package/dist/adv/session/mirror/control-details.d.ts +9 -0
  176. package/dist/adv/session/mirror/control-details.d.ts.map +1 -0
  177. package/dist/adv/session/mirror/control-details.js +549 -0
  178. package/dist/adv/session/mirror/control-details.js.map +1 -0
  179. package/dist/adv/session/mirror/detail-i18n.d.ts +4 -0
  180. package/dist/adv/session/mirror/detail-i18n.d.ts.map +1 -0
  181. package/dist/adv/session/mirror/detail-i18n.js +153 -0
  182. package/dist/adv/session/mirror/detail-i18n.js.map +1 -0
  183. package/dist/adv/session/mirror/message-chrome.d.ts +39 -0
  184. package/dist/adv/session/mirror/message-chrome.d.ts.map +1 -0
  185. package/dist/adv/session/mirror/message-chrome.js +153 -0
  186. package/dist/adv/session/mirror/message-chrome.js.map +1 -0
  187. package/dist/adv/session/mirror/process-groups.d.ts +56 -0
  188. package/dist/adv/session/mirror/process-groups.d.ts.map +1 -0
  189. package/dist/adv/session/mirror/process-groups.js +204 -0
  190. package/dist/adv/session/mirror/process-groups.js.map +1 -0
  191. package/dist/adv/session/official-classes.d.ts +28 -0
  192. package/dist/adv/session/official-classes.d.ts.map +1 -0
  193. package/dist/adv/session/official-classes.js +152 -0
  194. package/dist/adv/session/official-classes.js.map +1 -0
  195. package/dist/adv/session/open-review.d.ts +13 -0
  196. package/dist/adv/session/open-review.d.ts.map +1 -0
  197. package/dist/adv/session/open-review.js +32 -0
  198. package/dist/adv/session/open-review.js.map +1 -0
  199. package/dist/adv/session/open-session-view.d.ts +19 -0
  200. package/dist/adv/session/open-session-view.d.ts.map +1 -0
  201. package/dist/adv/session/open-session-view.js +147 -0
  202. package/dist/adv/session/open-session-view.js.map +1 -0
  203. package/dist/adv/session/pending-inputs.d.ts +33 -0
  204. package/dist/adv/session/pending-inputs.d.ts.map +1 -0
  205. package/dist/adv/session/pending-inputs.js +130 -0
  206. package/dist/adv/session/pending-inputs.js.map +1 -0
  207. package/dist/adv/session/session-css.d.ts +2 -0
  208. package/dist/adv/session/session-css.d.ts.map +1 -0
  209. package/dist/adv/session/session-css.generated.d.ts +2 -0
  210. package/dist/adv/session/session-css.generated.d.ts.map +1 -0
  211. package/dist/adv/session/session-css.generated.js +4 -0
  212. package/dist/adv/session/session-css.generated.js.map +1 -0
  213. package/dist/adv/session/session-css.js +3 -0
  214. package/dist/adv/session/session-css.js.map +1 -0
  215. package/dist/adv/session/tail-follow.d.ts +29 -0
  216. package/dist/adv/session/tail-follow.d.ts.map +1 -0
  217. package/dist/adv/session/tail-follow.js +106 -0
  218. package/dist/adv/session/tail-follow.js.map +1 -0
  219. package/dist/ui/actions/Button.d.ts +102 -0
  220. package/dist/ui/actions/Button.d.ts.map +1 -0
  221. package/dist/ui/actions/Button.js +233 -0
  222. package/dist/ui/actions/Button.js.map +1 -0
  223. package/dist/ui/actions/button-css.generated.d.ts +2 -0
  224. package/dist/ui/actions/button-css.generated.d.ts.map +1 -0
  225. package/dist/ui/actions/button-css.generated.js +4 -0
  226. package/dist/ui/actions/button-css.generated.js.map +1 -0
  227. package/dist/ui/display/Card.d.ts +65 -0
  228. package/dist/ui/display/Card.d.ts.map +1 -0
  229. package/dist/ui/display/Card.js +109 -0
  230. package/dist/ui/display/Card.js.map +1 -0
  231. package/dist/ui/display/Chip.d.ts +28 -0
  232. package/dist/ui/display/Chip.d.ts.map +1 -0
  233. package/dist/ui/display/Chip.js +36 -0
  234. package/dist/ui/display/Chip.js.map +1 -0
  235. package/dist/ui/display/CodeViewer.d.ts +38 -0
  236. package/dist/ui/display/CodeViewer.d.ts.map +1 -0
  237. package/dist/ui/display/CodeViewer.js +107 -0
  238. package/dist/ui/display/CodeViewer.js.map +1 -0
  239. package/dist/ui/display/FieldHint.d.ts +18 -0
  240. package/dist/ui/display/FieldHint.d.ts.map +1 -0
  241. package/dist/ui/display/FieldHint.js +40 -0
  242. package/dist/ui/display/FieldHint.js.map +1 -0
  243. package/dist/ui/display/FlipText.d.ts +43 -0
  244. package/dist/ui/display/FlipText.d.ts.map +1 -0
  245. package/dist/ui/display/FlipText.js +59 -0
  246. package/dist/ui/display/FlipText.js.map +1 -0
  247. package/dist/ui/display/LiveText.d.ts +13 -0
  248. package/dist/ui/display/LiveText.d.ts.map +1 -0
  249. package/dist/ui/display/LiveText.js +19 -0
  250. package/dist/ui/display/LiveText.js.map +1 -0
  251. package/dist/ui/display/MarqueeText.d.ts +22 -0
  252. package/dist/ui/display/MarqueeText.d.ts.map +1 -0
  253. package/dist/ui/display/MarqueeText.js +52 -0
  254. package/dist/ui/display/MarqueeText.js.map +1 -0
  255. package/dist/ui/display/SectionHead.d.ts +35 -0
  256. package/dist/ui/display/SectionHead.d.ts.map +1 -0
  257. package/dist/ui/display/SectionHead.js +45 -0
  258. package/dist/ui/display/SectionHead.js.map +1 -0
  259. package/dist/ui/display/Surface.d.ts +43 -0
  260. package/dist/ui/display/Surface.d.ts.map +1 -0
  261. package/dist/ui/display/Surface.js +39 -0
  262. package/dist/ui/display/Surface.js.map +1 -0
  263. package/dist/ui/display/Table.d.ts +30 -0
  264. package/dist/ui/display/Table.d.ts.map +1 -0
  265. package/dist/ui/display/Table.js +96 -0
  266. package/dist/ui/display/Table.js.map +1 -0
  267. package/dist/ui/display/card-css.d.ts +2 -0
  268. package/dist/ui/display/card-css.d.ts.map +1 -0
  269. package/dist/ui/display/card-css.generated.d.ts +2 -0
  270. package/dist/ui/display/card-css.generated.d.ts.map +1 -0
  271. package/dist/ui/display/card-css.generated.js +4 -0
  272. package/dist/ui/display/card-css.generated.js.map +1 -0
  273. package/dist/ui/display/card-css.js +5 -0
  274. package/dist/ui/display/card-css.js.map +1 -0
  275. package/dist/ui/display/chip-css.d.ts +2 -0
  276. package/dist/ui/display/chip-css.d.ts.map +1 -0
  277. package/dist/ui/display/chip-css.generated.d.ts +2 -0
  278. package/dist/ui/display/chip-css.generated.d.ts.map +1 -0
  279. package/dist/ui/display/chip-css.generated.js +4 -0
  280. package/dist/ui/display/chip-css.generated.js.map +1 -0
  281. package/dist/ui/display/chip-css.js +12 -0
  282. package/dist/ui/display/chip-css.js.map +1 -0
  283. package/dist/ui/display/code-viewer-css.d.ts +2 -0
  284. package/dist/ui/display/code-viewer-css.d.ts.map +1 -0
  285. package/dist/ui/display/code-viewer-css.generated.d.ts +2 -0
  286. package/dist/ui/display/code-viewer-css.generated.d.ts.map +1 -0
  287. package/dist/ui/display/code-viewer-css.generated.js +4 -0
  288. package/dist/ui/display/code-viewer-css.generated.js.map +1 -0
  289. package/dist/ui/display/code-viewer-css.js +3 -0
  290. package/dist/ui/display/code-viewer-css.js.map +1 -0
  291. package/dist/ui/display/code-viewer-lang.d.ts +15 -0
  292. package/dist/ui/display/code-viewer-lang.d.ts.map +1 -0
  293. package/dist/ui/display/code-viewer-lang.js +190 -0
  294. package/dist/ui/display/code-viewer-lang.js.map +1 -0
  295. package/dist/ui/display/code-viewer-theme.d.ts +5 -0
  296. package/dist/ui/display/code-viewer-theme.d.ts.map +1 -0
  297. package/dist/ui/display/code-viewer-theme.js +138 -0
  298. package/dist/ui/display/code-viewer-theme.js.map +1 -0
  299. package/dist/ui/display/flip-css.d.ts +2 -0
  300. package/dist/ui/display/flip-css.d.ts.map +1 -0
  301. package/dist/ui/display/flip-css.generated.d.ts +2 -0
  302. package/dist/ui/display/flip-css.generated.d.ts.map +1 -0
  303. package/dist/ui/display/flip-css.generated.js +4 -0
  304. package/dist/ui/display/flip-css.generated.js.map +1 -0
  305. package/dist/ui/display/flip-css.js +4 -0
  306. package/dist/ui/display/flip-css.js.map +1 -0
  307. package/dist/ui/display/hint-css.generated.d.ts +2 -0
  308. package/dist/ui/display/hint-css.generated.d.ts.map +1 -0
  309. package/dist/ui/display/hint-css.generated.js +4 -0
  310. package/dist/ui/display/hint-css.generated.js.map +1 -0
  311. package/dist/ui/display/marquee-css.d.ts +2 -0
  312. package/dist/ui/display/marquee-css.d.ts.map +1 -0
  313. package/dist/ui/display/marquee-css.generated.d.ts +2 -0
  314. package/dist/ui/display/marquee-css.generated.d.ts.map +1 -0
  315. package/dist/ui/display/marquee-css.generated.js +4 -0
  316. package/dist/ui/display/marquee-css.generated.js.map +1 -0
  317. package/dist/ui/display/marquee-css.js +4 -0
  318. package/dist/ui/display/marquee-css.js.map +1 -0
  319. package/dist/ui/display/section-head-css.generated.d.ts +2 -0
  320. package/dist/ui/display/section-head-css.generated.d.ts.map +1 -0
  321. package/dist/ui/display/section-head-css.generated.js +4 -0
  322. package/dist/ui/display/section-head-css.generated.js.map +1 -0
  323. package/dist/ui/display/surface-css.d.ts +2 -0
  324. package/dist/ui/display/surface-css.d.ts.map +1 -0
  325. package/dist/ui/display/surface-css.generated.d.ts +2 -0
  326. package/dist/ui/display/surface-css.generated.d.ts.map +1 -0
  327. package/dist/ui/display/surface-css.generated.js +4 -0
  328. package/dist/ui/display/surface-css.generated.js.map +1 -0
  329. package/dist/ui/display/surface-css.js +7 -0
  330. package/dist/ui/display/surface-css.js.map +1 -0
  331. package/dist/ui/display/table-css.generated.d.ts +2 -0
  332. package/dist/ui/display/table-css.generated.d.ts.map +1 -0
  333. package/dist/ui/display/table-css.generated.js +4 -0
  334. package/dist/ui/display/table-css.generated.js.map +1 -0
  335. package/dist/ui/display/table-logic.d.ts +110 -0
  336. package/dist/ui/display/table-logic.d.ts.map +1 -0
  337. package/dist/ui/display/table-logic.js +81 -0
  338. package/dist/ui/display/table-logic.js.map +1 -0
  339. package/dist/ui/display/table-plain-css.generated.d.ts +2 -0
  340. package/dist/ui/display/table-plain-css.generated.d.ts.map +1 -0
  341. package/dist/ui/display/table-plain-css.generated.js +4 -0
  342. package/dist/ui/display/table-plain-css.generated.js.map +1 -0
  343. package/dist/ui/display/table-shared.d.ts +101 -0
  344. package/dist/ui/display/table-shared.d.ts.map +1 -0
  345. package/dist/ui/display/table-shared.js +229 -0
  346. package/dist/ui/display/table-shared.js.map +1 -0
  347. package/dist/ui/feedback/AlertModal.d.ts +41 -0
  348. package/dist/ui/feedback/AlertModal.d.ts.map +1 -0
  349. package/dist/ui/feedback/AlertModal.js +45 -0
  350. package/dist/ui/feedback/AlertModal.js.map +1 -0
  351. package/dist/ui/feedback/ConfirmModal.d.ts +50 -0
  352. package/dist/ui/feedback/ConfirmModal.d.ts.map +1 -0
  353. package/dist/ui/feedback/ConfirmModal.js +47 -0
  354. package/dist/ui/feedback/ConfirmModal.js.map +1 -0
  355. package/dist/ui/feedback/Loader.d.ts +49 -0
  356. package/dist/ui/feedback/Loader.d.ts.map +1 -0
  357. package/dist/ui/feedback/Loader.js +79 -0
  358. package/dist/ui/feedback/Loader.js.map +1 -0
  359. package/dist/ui/feedback/LoaderBar.d.ts +38 -0
  360. package/dist/ui/feedback/LoaderBar.d.ts.map +1 -0
  361. package/dist/ui/feedback/LoaderBar.js +79 -0
  362. package/dist/ui/feedback/LoaderBar.js.map +1 -0
  363. package/dist/ui/feedback/Loading.d.ts +69 -0
  364. package/dist/ui/feedback/Loading.d.ts.map +1 -0
  365. package/dist/ui/feedback/Loading.js +164 -0
  366. package/dist/ui/feedback/Loading.js.map +1 -0
  367. package/dist/ui/feedback/Modal.d.ts +73 -0
  368. package/dist/ui/feedback/Modal.d.ts.map +1 -0
  369. package/dist/ui/feedback/Modal.js +83 -0
  370. package/dist/ui/feedback/Modal.js.map +1 -0
  371. package/dist/ui/feedback/SideSheet.d.ts +70 -0
  372. package/dist/ui/feedback/SideSheet.d.ts.map +1 -0
  373. package/dist/ui/feedback/SideSheet.js +130 -0
  374. package/dist/ui/feedback/SideSheet.js.map +1 -0
  375. package/dist/ui/feedback/Toast.d.ts +45 -0
  376. package/dist/ui/feedback/Toast.d.ts.map +1 -0
  377. package/dist/ui/feedback/Toast.js +225 -0
  378. package/dist/ui/feedback/Toast.js.map +1 -0
  379. package/dist/ui/feedback/feedback-css.d.ts +2 -0
  380. package/dist/ui/feedback/feedback-css.d.ts.map +1 -0
  381. package/dist/ui/feedback/feedback-css.generated.d.ts +2 -0
  382. package/dist/ui/feedback/feedback-css.generated.d.ts.map +1 -0
  383. package/dist/ui/feedback/feedback-css.generated.js +4 -0
  384. package/dist/ui/feedback/feedback-css.generated.js.map +1 -0
  385. package/dist/ui/feedback/feedback-css.js +4 -0
  386. package/dist/ui/feedback/feedback-css.js.map +1 -0
  387. package/dist/ui/feedback/host-toast.d.ts +23 -0
  388. package/dist/ui/feedback/host-toast.d.ts.map +1 -0
  389. package/dist/ui/feedback/host-toast.js +34 -0
  390. package/dist/ui/feedback/host-toast.js.map +1 -0
  391. package/dist/ui/feedback/loader-bar-art.d.ts +6 -0
  392. package/dist/ui/feedback/loader-bar-art.d.ts.map +1 -0
  393. package/dist/ui/feedback/loader-bar-art.js +6 -0
  394. package/dist/ui/feedback/loader-bar-art.js.map +1 -0
  395. package/dist/ui/feedback/loader-bar-css.generated.d.ts +2 -0
  396. package/dist/ui/feedback/loader-bar-css.generated.d.ts.map +1 -0
  397. package/dist/ui/feedback/loader-bar-css.generated.js +4 -0
  398. package/dist/ui/feedback/loader-bar-css.generated.js.map +1 -0
  399. package/dist/ui/feedback/loader-css.generated.d.ts +2 -0
  400. package/dist/ui/feedback/loader-css.generated.d.ts.map +1 -0
  401. package/dist/ui/feedback/loader-css.generated.js +4 -0
  402. package/dist/ui/feedback/loader-css.generated.js.map +1 -0
  403. package/dist/ui/feedback/loading-css.generated.d.ts +2 -0
  404. package/dist/ui/feedback/loading-css.generated.d.ts.map +1 -0
  405. package/dist/ui/feedback/loading-css.generated.js +4 -0
  406. package/dist/ui/feedback/loading-css.generated.js.map +1 -0
  407. package/dist/ui/feedback/loading-host.d.ts +49 -0
  408. package/dist/ui/feedback/loading-host.d.ts.map +1 -0
  409. package/dist/ui/feedback/loading-host.js +57 -0
  410. package/dist/ui/feedback/loading-host.js.map +1 -0
  411. package/dist/ui/feedback/modal-host.d.ts +51 -0
  412. package/dist/ui/feedback/modal-host.d.ts.map +1 -0
  413. package/dist/ui/feedback/modal-host.js +170 -0
  414. package/dist/ui/feedback/modal-host.js.map +1 -0
  415. package/dist/ui/feedback/side-sheet-css.d.ts +2 -0
  416. package/dist/ui/feedback/side-sheet-css.d.ts.map +1 -0
  417. package/dist/ui/feedback/side-sheet-css.generated.d.ts +2 -0
  418. package/dist/ui/feedback/side-sheet-css.generated.d.ts.map +1 -0
  419. package/dist/ui/feedback/side-sheet-css.generated.js +4 -0
  420. package/dist/ui/feedback/side-sheet-css.generated.js.map +1 -0
  421. package/dist/ui/feedback/side-sheet-css.js +2 -0
  422. package/dist/ui/feedback/side-sheet-css.js.map +1 -0
  423. package/dist/ui/feedback/toast-host.d.ts +24 -0
  424. package/dist/ui/feedback/toast-host.d.ts.map +1 -0
  425. package/dist/ui/feedback/toast-host.js +20 -0
  426. package/dist/ui/feedback/toast-host.js.map +1 -0
  427. package/dist/ui/index.d.ts +44 -44
  428. package/dist/ui/index.d.ts.map +1 -1
  429. package/dist/ui/index.js +44 -44
  430. package/dist/ui/index.js.map +1 -1
  431. package/dist/ui/infra/chevron.d.ts +22 -0
  432. package/dist/ui/infra/chevron.d.ts.map +1 -0
  433. package/dist/ui/infra/chevron.js +33 -0
  434. package/dist/ui/infra/chevron.js.map +1 -0
  435. package/dist/ui/infra/controls-css.d.ts +16 -0
  436. package/dist/ui/infra/controls-css.d.ts.map +1 -0
  437. package/dist/ui/infra/controls-css.js +26 -0
  438. package/dist/ui/infra/controls-css.js.map +1 -0
  439. package/dist/ui/infra/css.d.ts +35 -0
  440. package/dist/ui/infra/css.d.ts.map +1 -0
  441. package/dist/ui/infra/css.js +52 -0
  442. package/dist/ui/infra/css.js.map +1 -0
  443. package/dist/ui/infra/host-data.d.ts +119 -0
  444. package/dist/ui/infra/host-data.d.ts.map +1 -0
  445. package/dist/ui/infra/host-data.js +122 -0
  446. package/dist/ui/infra/host-data.js.map +1 -0
  447. package/dist/ui/infra/locale.d.ts +4 -0
  448. package/dist/ui/infra/locale.d.ts.map +1 -0
  449. package/dist/ui/infra/locale.js +17 -0
  450. package/dist/ui/infra/locale.js.map +1 -0
  451. package/dist/ui/infra/overlay-css.d.ts +2 -0
  452. package/dist/ui/infra/overlay-css.d.ts.map +1 -0
  453. package/dist/ui/infra/overlay-css.generated.d.ts +2 -0
  454. package/dist/ui/infra/overlay-css.generated.d.ts.map +1 -0
  455. package/dist/ui/infra/overlay-css.generated.js +4 -0
  456. package/dist/ui/infra/overlay-css.generated.js.map +1 -0
  457. package/dist/ui/infra/overlay-css.js +2 -0
  458. package/dist/ui/infra/overlay-css.js.map +1 -0
  459. package/dist/ui/infra/overlay.d.ts +62 -0
  460. package/dist/ui/infra/overlay.d.ts.map +1 -0
  461. package/dist/ui/infra/overlay.js +94 -0
  462. package/dist/ui/infra/overlay.js.map +1 -0
  463. package/dist/ui/infra/panel-css.d.ts +2 -0
  464. package/dist/ui/infra/panel-css.d.ts.map +1 -0
  465. package/dist/ui/infra/panel-css.generated.d.ts +2 -0
  466. package/dist/ui/infra/panel-css.generated.d.ts.map +1 -0
  467. package/dist/ui/infra/panel-css.generated.js +4 -0
  468. package/dist/ui/infra/panel-css.generated.js.map +1 -0
  469. package/dist/ui/infra/panel-css.js +2 -0
  470. package/dist/ui/infra/panel-css.js.map +1 -0
  471. package/dist/ui/infra/panel.d.ts +41 -0
  472. package/dist/ui/infra/panel.d.ts.map +1 -0
  473. package/dist/ui/infra/panel.js +37 -0
  474. package/dist/ui/infra/panel.js.map +1 -0
  475. package/dist/ui/infra/side-panel-css.d.ts +2 -0
  476. package/dist/ui/infra/side-panel-css.d.ts.map +1 -0
  477. package/dist/ui/infra/side-panel-css.generated.d.ts +2 -0
  478. package/dist/ui/infra/side-panel-css.generated.d.ts.map +1 -0
  479. package/dist/ui/infra/side-panel-css.generated.js +4 -0
  480. package/dist/ui/infra/side-panel-css.generated.js.map +1 -0
  481. package/dist/ui/infra/side-panel-css.js +2 -0
  482. package/dist/ui/infra/side-panel-css.js.map +1 -0
  483. package/dist/ui/infra/thenable.d.ts +9 -0
  484. package/dist/ui/infra/thenable.d.ts.map +1 -0
  485. package/dist/ui/infra/thenable.js +15 -0
  486. package/dist/ui/infra/thenable.js.map +1 -0
  487. package/dist/ui/infra/ticker.d.ts +8 -0
  488. package/dist/ui/infra/ticker.d.ts.map +1 -0
  489. package/dist/ui/infra/ticker.js +49 -0
  490. package/dist/ui/infra/ticker.js.map +1 -0
  491. package/dist/ui/infra/tooltip.d.ts +29 -0
  492. package/dist/ui/infra/tooltip.d.ts.map +1 -0
  493. package/dist/ui/infra/tooltip.js +10 -0
  494. package/dist/ui/infra/tooltip.js.map +1 -0
  495. package/dist/ui/inputs/Checkbox.d.ts +24 -0
  496. package/dist/ui/inputs/Checkbox.d.ts.map +1 -0
  497. package/dist/ui/inputs/Checkbox.js +35 -0
  498. package/dist/ui/inputs/Checkbox.js.map +1 -0
  499. package/dist/ui/inputs/DateTimePicker.d.ts +45 -0
  500. package/dist/ui/inputs/DateTimePicker.d.ts.map +1 -0
  501. package/dist/ui/inputs/DateTimePicker.js +462 -0
  502. package/dist/ui/inputs/DateTimePicker.js.map +1 -0
  503. package/dist/ui/inputs/Field.d.ts +125 -0
  504. package/dist/ui/inputs/Field.d.ts.map +1 -0
  505. package/dist/ui/inputs/Field.js +175 -0
  506. package/dist/ui/inputs/Field.js.map +1 -0
  507. package/dist/ui/inputs/InputGroup.d.ts +91 -0
  508. package/dist/ui/inputs/InputGroup.d.ts.map +1 -0
  509. package/dist/ui/inputs/InputGroup.js +125 -0
  510. package/dist/ui/inputs/InputGroup.js.map +1 -0
  511. package/dist/ui/inputs/ModelPicker.d.ts +48 -0
  512. package/dist/ui/inputs/ModelPicker.d.ts.map +1 -0
  513. package/dist/ui/inputs/ModelPicker.js +101 -0
  514. package/dist/ui/inputs/ModelPicker.js.map +1 -0
  515. package/dist/ui/inputs/Picker.d.ts +56 -0
  516. package/dist/ui/inputs/Picker.d.ts.map +1 -0
  517. package/dist/ui/inputs/Picker.js +244 -0
  518. package/dist/ui/inputs/Picker.js.map +1 -0
  519. package/dist/ui/inputs/Segmented.d.ts +99 -0
  520. package/dist/ui/inputs/Segmented.d.ts.map +1 -0
  521. package/dist/ui/inputs/Segmented.js +135 -0
  522. package/dist/ui/inputs/Segmented.js.map +1 -0
  523. package/dist/ui/inputs/Textarea.d.ts +36 -0
  524. package/dist/ui/inputs/Textarea.d.ts.map +1 -0
  525. package/dist/ui/inputs/Textarea.js +35 -0
  526. package/dist/ui/inputs/Textarea.js.map +1 -0
  527. package/dist/ui/inputs/WorkspacePicker.d.ts +35 -0
  528. package/dist/ui/inputs/WorkspacePicker.d.ts.map +1 -0
  529. package/dist/ui/inputs/WorkspacePicker.js +39 -0
  530. package/dist/ui/inputs/WorkspacePicker.js.map +1 -0
  531. package/dist/ui/inputs/datetime-css.generated.d.ts +2 -0
  532. package/dist/ui/inputs/datetime-css.generated.d.ts.map +1 -0
  533. package/dist/ui/inputs/datetime-css.generated.js +4 -0
  534. package/dist/ui/inputs/datetime-css.generated.js.map +1 -0
  535. package/dist/ui/inputs/datetime-logic.d.ts +102 -0
  536. package/dist/ui/inputs/datetime-logic.d.ts.map +1 -0
  537. package/dist/ui/inputs/datetime-logic.js +200 -0
  538. package/dist/ui/inputs/datetime-logic.js.map +1 -0
  539. package/dist/ui/inputs/field-css.generated.d.ts +2 -0
  540. package/dist/ui/inputs/field-css.generated.d.ts.map +1 -0
  541. package/dist/ui/inputs/field-css.generated.js +4 -0
  542. package/dist/ui/inputs/field-css.generated.js.map +1 -0
  543. package/dist/ui/inputs/input-group-css.generated.d.ts +2 -0
  544. package/dist/ui/inputs/input-group-css.generated.d.ts.map +1 -0
  545. package/dist/ui/inputs/input-group-css.generated.js +4 -0
  546. package/dist/ui/inputs/input-group-css.generated.js.map +1 -0
  547. package/dist/ui/inputs/picker-css.d.ts +2 -0
  548. package/dist/ui/inputs/picker-css.d.ts.map +1 -0
  549. package/dist/ui/inputs/picker-css.generated.d.ts +2 -0
  550. package/dist/ui/inputs/picker-css.generated.d.ts.map +1 -0
  551. package/dist/ui/inputs/picker-css.generated.js +4 -0
  552. package/dist/ui/inputs/picker-css.generated.js.map +1 -0
  553. package/dist/ui/inputs/picker-css.js +4 -0
  554. package/dist/ui/inputs/picker-css.js.map +1 -0
  555. package/dist/ui/inputs/picker-icons.d.ts +12 -0
  556. package/dist/ui/inputs/picker-icons.d.ts.map +1 -0
  557. package/dist/ui/inputs/picker-icons.js +29 -0
  558. package/dist/ui/inputs/picker-icons.js.map +1 -0
  559. package/dist/ui/inputs/picker-logic.d.ts +33 -0
  560. package/dist/ui/inputs/picker-logic.d.ts.map +1 -0
  561. package/dist/ui/inputs/picker-logic.js +68 -0
  562. package/dist/ui/inputs/picker-logic.js.map +1 -0
  563. package/dist/ui/inputs/segmented-css.generated.d.ts +2 -0
  564. package/dist/ui/inputs/segmented-css.generated.d.ts.map +1 -0
  565. package/dist/ui/inputs/segmented-css.generated.js +4 -0
  566. package/dist/ui/inputs/segmented-css.generated.js.map +1 -0
  567. package/dist/ui/layout/PanelDock.d.ts +132 -0
  568. package/dist/ui/layout/PanelDock.d.ts.map +1 -0
  569. package/dist/ui/layout/PanelDock.js +390 -0
  570. package/dist/ui/layout/PanelDock.js.map +1 -0
  571. package/dist/ui/layout/QuickToolbar.d.ts +54 -0
  572. package/dist/ui/layout/QuickToolbar.d.ts.map +1 -0
  573. package/dist/ui/layout/QuickToolbar.js +254 -0
  574. package/dist/ui/layout/QuickToolbar.js.map +1 -0
  575. package/dist/ui/layout/SplitGroup.d.ts +37 -0
  576. package/dist/ui/layout/SplitGroup.d.ts.map +1 -0
  577. package/dist/ui/layout/SplitGroup.js +36 -0
  578. package/dist/ui/layout/SplitGroup.js.map +1 -0
  579. package/dist/ui/layout/panel-dock-css.d.ts +2 -0
  580. package/dist/ui/layout/panel-dock-css.d.ts.map +1 -0
  581. package/dist/ui/layout/panel-dock-css.generated.d.ts +2 -0
  582. package/dist/ui/layout/panel-dock-css.generated.d.ts.map +1 -0
  583. package/dist/ui/layout/panel-dock-css.generated.js +4 -0
  584. package/dist/ui/layout/panel-dock-css.generated.js.map +1 -0
  585. package/dist/ui/layout/panel-dock-css.js +4 -0
  586. package/dist/ui/layout/panel-dock-css.js.map +1 -0
  587. package/dist/ui/layout/panel-dock-logic.d.ts +67 -0
  588. package/dist/ui/layout/panel-dock-logic.d.ts.map +1 -0
  589. package/dist/ui/layout/panel-dock-logic.js +110 -0
  590. package/dist/ui/layout/panel-dock-logic.js.map +1 -0
  591. package/dist/ui/layout/quick-toolbar-css.generated.d.ts +2 -0
  592. package/dist/ui/layout/quick-toolbar-css.generated.d.ts.map +1 -0
  593. package/dist/ui/layout/quick-toolbar-css.generated.js +4 -0
  594. package/dist/ui/layout/quick-toolbar-css.generated.js.map +1 -0
  595. package/dist/ui/layout/quick-toolbar-logic.d.ts +76 -0
  596. package/dist/ui/layout/quick-toolbar-logic.d.ts.map +1 -0
  597. package/dist/ui/layout/quick-toolbar-logic.js +40 -0
  598. package/dist/ui/layout/quick-toolbar-logic.js.map +1 -0
  599. package/dist/ui/layout/resizer.d.ts +29 -0
  600. package/dist/ui/layout/resizer.d.ts.map +1 -0
  601. package/dist/ui/layout/resizer.js +42 -0
  602. package/dist/ui/layout/resizer.js.map +1 -0
  603. package/dist/ui/layout/split-group-css.generated.d.ts +2 -0
  604. package/dist/ui/layout/split-group-css.generated.d.ts.map +1 -0
  605. package/dist/ui/layout/split-group-css.generated.js +4 -0
  606. package/dist/ui/layout/split-group-css.generated.js.map +1 -0
  607. package/dist/ui/navigation/Pagination.d.ts +59 -0
  608. package/dist/ui/navigation/Pagination.d.ts.map +1 -0
  609. package/dist/ui/navigation/Pagination.js +112 -0
  610. package/dist/ui/navigation/Pagination.js.map +1 -0
  611. package/dist/ui/navigation/pagination-css.generated.d.ts +2 -0
  612. package/dist/ui/navigation/pagination-css.generated.d.ts.map +1 -0
  613. package/dist/ui/navigation/pagination-css.generated.js +4 -0
  614. package/dist/ui/navigation/pagination-css.generated.js.map +1 -0
  615. package/dist/ui/navigation/pagination-logic.d.ts +36 -0
  616. package/dist/ui/navigation/pagination-logic.d.ts.map +1 -0
  617. package/dist/ui/navigation/pagination-logic.js +73 -0
  618. package/dist/ui/navigation/pagination-logic.js.map +1 -0
  619. package/dist/ui/official.js +2 -2
  620. package/dist/ui/official.js.map +1 -1
  621. package/dist/utils/i18n.d.ts +2 -2
  622. package/dist/utils/i18n.d.ts.map +1 -1
  623. package/dist/utils/i18n.js +1 -1
  624. package/dist/utils/i18n.js.map +1 -1
  625. package/docs/README.md +2 -1
  626. package/docs/design/architecture.md +9 -8
  627. package/docs/design/copywriting.md +23 -0
  628. package/docs/design/external/dsh-host.md +5 -5
  629. package/docs/design/structure.md +132 -128
  630. package/docs/design/style.md +5 -5
  631. package/docs/help/utils.doc.ts +3 -3
  632. package/docs/help/utils.md +3 -3
  633. package/docs/requirements.md +30 -290
  634. package/package.json +1 -1
package/README.md CHANGED
@@ -1,109 +1,242 @@
1
1
  # dsh-plugin-core
2
2
 
3
- DSH(DeepSeek Harness)插件共享底座:把跨插件复用的样式、控件、通用方法、工作区浏览、会话预览收敛到一处,写新插件时按文档 `npm i` 引用,不再一个个仓库抄。
3
+ **English** · [简体中文](https://github.com/cq-guojia/dsh-plugin-core/blob/main/README.zh-CN.md)
4
4
 
5
- 服务对象:以后要写的每一个 DSH 插件(不只是现有的几个)。
5
+ The shared UI foundation for **DSH (DeepSeek Harness)** plugins: design tokens, a complete React control set, pure helpers, workspace file browsing, and read-only session preview — in one package, imported subpath by subpath.
6
6
 
7
- ## 先看效果:装上预览插件
7
+ It exists so that every plugin does not re-implement the same button, date picker, toast, file preview and conversation playback. Everything here is built on the host's own tokens and theme switch, so a plugin assembled from these parts looks native without any per-plugin skinning.
8
8
 
9
- 最快的方式——直接把预览插件装进 DSH 宿主,看真实渲染(明暗、token 全部跟随宿主,**不走任何独立网页**):
9
+ - **Follows the host, not the OS.** Light and dark come from the host's `body[data-ds-dark-theme]`; the 12 accent colors are the same ones the host uses.
10
+ - **Nothing here fetches data.** Values, options, workspaces and sessions arrive through props or a small injected interface — the components never reach into the host behind your back.
11
+ - **Runs everywhere the code runs.** The `design`, `ui` and `utils` entries carry zero `@deepseek-ai/*` imports, so they import cleanly in Node and in tests, not just inside the host.
10
12
 
11
- ```bash
12
- dsh plugin --profile web add dsh-plugin-core-demo
13
- ```
13
+ ## Screenshots
14
+
15
+ Real rendering inside a DSH host, dark theme:
16
+
17
+ Design tokens, the theme predicate and the style injector:
18
+
19
+ ![Design tokens and theme predicate](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/01-tokens.png)
20
+
21
+ Buttons — 18 appearance tiers, three heights, icons, automatic loading:
22
+
23
+ ![Button tiers](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/02-buttons.png)
24
+
25
+ Inputs — field hints, switches, checkboxes, segmented controls:
26
+
27
+ ![Inputs](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/03-inputs.png)
28
+
29
+ Workspace browsing — right-docked file browser and preview, not limited to workspaces:
30
+
31
+ ![Workspace explorer](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/04-explorer.png)
32
+
33
+ Session preview — a read-only dialog that mirrors the official conversation page:
14
34
 
15
- 装好后:插件列表 → 找到 `dsh-plugin-core-demo` → 进插件详情页就有「组件预览」入口,点开即整页预览;详情页下方还有配置区(侧栏入口开关、查看 demo、访问 GitHub)。
35
+ ![Session preview](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/05-session.png)
16
36
 
17
- > 预览插件是仓库里的独立包 `packages/demo/`(包名 `dsh-plugin-core-demo`)。它把 core 的构建产物打进自己的 bundle,自包含、不需要 core 先发 npm,预览的永远是当前这份代码。
37
+ All five screenshots are taken from [`dsh-plugin-core-demo`](#see-it-running-the-demo-plugin), the preview plugin shipped from the same repository.
18
38
 
19
- ## 用这个包写插件
39
+ ## Install
20
40
 
21
41
  ```bash
22
42
  pnpm add dsh-plugin-core
43
+ # or
44
+ npm install dsh-plugin-core
23
45
  ```
24
46
 
25
- (npm 也行;推荐 pnpm。)包里带预编译 `dist`——宿主以 git/npm 装插件不跑构建脚本,产物必须随包发布。`react` 是 optional peer:只用 `utils` / `design` 的插件不必装。
47
+ The published package already contains compiled `dist/` output and type declarations — the host never runs build scripts when installing a plugin. `react` / `react-dom` (`>= 18`) are **optional peers**: skip them if you only use `design` or `utils`.
26
48
 
27
- ```ts
28
- import { createStyleKit } from 'dsh-plugin-core/design'
29
- import { Button, setStyleKit } from 'dsh-plugin-core/ui'
49
+ ## Quick start
30
50
 
31
- setStyleKit(createStyleKit({ id: 'dsh-task-reminder-ui' })) // 1) 领本插件专属样式设施(id 按插件唯一)
32
- const view = <Button variant="primary" onClick={save}>保存</Button> // 2) 直接用控件,样式它自己带
51
+ ```tsx
52
+ // your plugin's client entry
53
+ import { createStyleKit } from 'dsh-plugin-core/design'
54
+ import { Button, Input, setStyleKit, showToast } from 'dsh-plugin-core/ui'
55
+
56
+ const kit = createStyleKit({ id: 'dsh-task-reminder-ui' }) // 1. one kit per plugin
57
+ setStyleKit(kit)
58
+
59
+ export function TaskEditor(props: { name: string; setName: (v: string) => void }) {
60
+ return (
61
+ <div>
62
+ <Input value={props.name} onChange={props.setName} placeholder="Task name" hint="Shown in the task list" />
63
+ <Button variant="primary" onClick={async () => { await save(); showToast('Saved', { variant: 'success' }) }}>
64
+ Save
65
+ </Button>
66
+ </div>
67
+ )
68
+ }
33
69
  ```
34
70
 
35
- 为什么必须先 `setStyleKit`:样式只能以字符串在运行时注入 `<style>`(客户端产物是 JS 闭包,`.css` 不加载)。固定 style id 在多插件同页时会互相覆盖,所以做成工厂,每个插件领一套自己的;变量前缀统一 `dshpc`,不再按插件区分。
71
+ Three things worth knowing on day one:
36
72
 
37
- **样式是按需的**:每个控件只带自己那份 CSS,首次渲染时自注入(幂等)——用不到的控件,其 CSS 不会被打进你的包(实测:只用 `Button` 时样式文本从 71.7 KB 降到 9.4 KB)。因此请**用具名导入**(`import { Button } from 'dsh-plugin-core/ui'`):写成 `import * as core from …` 或 CJS `require` 会让打包器无法摇树,这一份收益会静默归零。
73
+ 1. **Call `setStyleKit` once.** Styles reach the page as a runtime-injected `<style>` string, because a plugin's client bundle is a CJS closure and the kernel never loads `.css` assets. The `id` must be unique per plugin — several plugins share one page, and the id is what keeps their style tags from overwriting each other.
74
+ 2. **Import by name.** Each control registers only its own CSS the first time it renders (idempotent), so an unused control costs nothing in your bundle. That only holds with named imports (`import { Button } from 'dsh-plugin-core/ui'`); `import * as core` or a CJS `require` disables tree-shaking and silently gives the saving back.
75
+ 3. **Dialogs are promises.** `await confirmModal({...})` resolves to `true` / `false`, `alertModal({...})` resolves when dismissed. There are no callback-style variants.
38
76
 
39
- ## 子包
77
+ ## What's inside
40
78
 
41
- | 引入路径 | 装什么 |
42
- |---|---|
43
- | `dsh-plugin-core/design` | token 变量表(含深色段)+ `createStyleKit` 注入器工厂 + 主题判据(零 React) |
44
- | `dsh-plugin-core/ui` | 控件:Button / Input 家族 / Textarea / Checkbox / Segmented / Select / Picker / ModelPicker / DateTimePicker / Modal / toast / 空态 / 错误边界 / Loading … |
45
- | `dsh-plugin-core/utils` | 纯方法:日期 / 字符串 / 字节 / 时间区间 / HTTP 取数 + 内置中英多语言 |
46
- | `dsh-plugin-core/explorer` | 工作区浏览:`openFilePreview` / `pickWorkspaceFile` / `FileBrowser` 面板 |
47
- | `dsh-plugin-core/explorer/preview` | 文件预览体(md / 代码高亮 / HTML / PDF / Office / 图片) |
48
- | `dsh-plugin-core/session` | 会话预览(承载可换:弹窗 / 侧栏 / 整页) |
79
+ | Import | What you get | React required |
80
+ |---|---|---|
81
+ | `dsh-plugin-core/design` | Token variables (light + dark), `createStyleKit` injector factory, dark-mode predicate | no |
82
+ | `dsh-plugin-core/ui` | The whole control set — actions, inputs, display, feedback, layout, navigation | yes |
83
+ | `dsh-plugin-core/ui/official` | Direct re-exports of the host's official primitives, for the rare case you need one | yes |
84
+ | `dsh-plugin-core/ui/code-viewer` | Code viewer with per-line highlighting (also used by file preview) | yes |
85
+ | `dsh-plugin-core/ui/host` | Bridge to the host's own toast | yes |
86
+ | `dsh-plugin-core/utils` | Pure helpers: date, string, bytes, HTTP, built-in zh/en dictionary | no |
87
+ | `dsh-plugin-core/explorer` | File browser, file picker, docked file preview | yes |
88
+ | `dsh-plugin-core/explorer/preview` | Preview bodies: image, PDF, Markdown, HTML, Office, text/code | yes |
89
+ | `dsh-plugin-core/session` | Read-only session preview dialog + changed-file diff | yes |
90
+ | `dsh-plugin-core/host` | Host-side routes: read-only FS route, model catalog | no |
49
91
 
50
- 依赖方向单向:`design` ← `ui` ← `explorer` / `session`,`utils` 谁也不依赖。
92
+ Dependency direction is one-way: `design` ← `ui` ← `explorer` / `session`, while `utils` depends on nothing.
51
93
 
52
- 立包判据:有实质内容、会持续长大的功能模块才独立成包;只是一个控件就进 `ui`。
94
+ ## Feature tour
53
95
 
54
- ## 几条硬规矩
96
+ ### design — tokens and style injection
55
97
 
56
- - 不传整个 `ctx`:只传需要的那一小块能力,宿主 breaking 时改的是插件「取出」的一行。
57
- - 明暗判据是 `body[data-ds-dark-theme]`,不是 `prefers-color-scheme`。
58
- - 多语言:核心自带中英(`setLocale('zh' | 'en')` 切换),插件自己界面的文案由插件自己管。
59
- - 数据调用方给:选工作区 / 选文件 / 会话预览的数据要跨 host↔client 边界,组件取不到。
98
+ Zero React, no components: it ships values plus the mechanism that puts them on the page.
60
99
 
61
- ## 多语言
100
+ - One token table for both themes, covering surfaces (`--dshpc-surface-1/2/sunken`), text (`--dshpc-fg`, `--dshpc-fg-3`, `--dshpc-fg-4`), borders, and twelve accents: `business`, `success`, `warning`, `danger`, `purple`, `pink`, `cyan`, `teal`, `orange`, `indigo`, `rose`, `slate`.
101
+ - `createStyleKit({ id })` returns a kit with `cssVar(name)`, `registerStyle(domain, css)`, `applyStyle(domain, css)` and `ensureStyles()` — one `<style>` tag per plugin, isolated by id.
102
+ - `DARK_THEME_SELECTOR` is exported as a constant (`body[data-ds-dark-theme]`) so your own CSS never guesses the theme from the OS.
103
+ - Prefixes are fixed across the ecosystem (`--dshpc-*` / `dshpc-*`); there is no per-plugin rename. Plugins built on different core versions are kept apart by the style-tag id, not by prefixing.
62
104
 
63
- ```ts
64
- import { setLocale } from 'dsh-plugin-core/utils'
65
- setLocale('en') // 默认中文
66
- ```
105
+ Use this subpath alone if you want the palette and the theme switch but write your own components.
106
+
107
+ ### ui — the control set
108
+
109
+ Everything is built from tokens, takes its data through props, and follows the host's theme. Props are the customization surface — compose them instead of forking a component. See the [control reference](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/ui.md) for every prop.
110
+
111
+ **Actions**
112
+
113
+ - `Button` — 18 appearance tiers (solid / outline / bare: `primary`, `secondary`, `danger`, `success`, `warning`, `info`, `outline`, `danger-outline`, `ghost`, `link`, plus the eight extended colors), three heights (24 / 28 / 32), leading and trailing icons, fixed / min / max width with marquee overflow, and automatic loading: return a Promise from `onClick` and the button spins, disables and restores itself — including on rejection.
114
+ - `IconButton` — icon-only variant of the same, with the accessible name enforced.
115
+ - `Segmented` — single or multiple selection, optional 1px frame, per-item icon / count / badge, tone-colored selection.
116
+
117
+ **Inputs**
118
+
119
+ - `Input`, `PrefixedInput`, `NumberInput`, `Textarea` — one shared field metric (`fieldMetricsOf`) so every control lines up; error state, leading icon slot, search clear button, and a question-mark hint that uses the host's tooltip.
120
+ - `Checkbox`, and the official `Switch` for on/off semantics.
121
+ - `Picker` — single or multiple, search, groups, selection cap, clearable, empty state; keyboard driven (Esc / arrows / Enter). Its logic (`toGroups`, `filterGroups`, `toggleValue`) is exported separately.
122
+ - `WorkspacePicker` / `ModelPicker` — pickers that bring their own data once `connectHost(ctx)` has been called; unwired they show an empty state rather than inventing entries.
123
+ - `DateTimePicker` — one control for a single instant or a range, precision `day` / `hour` / `minute` / `second`, two independent calendars, keyboard support, start floored and end ceiled.
124
+ - `InputGroup` — input with attached actions.
125
+
126
+ **Display**
127
+
128
+ - `Surface` — the plain framed container, with tone / border / padding / radius axes.
129
+ - `Card` / `StripCard` — cards with an accent system.
130
+ - `Chip`, `SectionHead`, `MarqueeText`, `FlipText`, `LiveText`.
131
+ - `Table` — grouped (multi-row) headers, banner groups so several sections live in one table, row spanning, selection, density / striped / border switches, per-column alignment and header tone, built-in empty state, loading and loading-more states, optional built-in pagination. Data-driven: it never sorts, fetches or virtualizes.
132
+ - `FieldHint` — the standalone question mark that opens the host's tooltip.
67
133
 
68
- ## 文档
134
+ **Feedback**
69
135
 
70
- | 我想… | 看哪 |
136
+ - `Modal`, `SideSheet` — sized dialogs; `SideSheet` slides in from either side; both accept a `busy` lock.
137
+ - `AlertModal`, `ConfirmModal`, `alertModal()`, `confirmModal()` — promise-based dialogs.
138
+ - `showToast`, `notify` — Sonner-backed toasts, one host per screen shared across plugins.
139
+ - `Loader`, `LoaderBar`, `Loading`, `LoadingBlock`, `LoadingToast`, `RunningBlocks`, `showLoading` — spinners, an indeterminate bar, and a single-slot global loading card.
140
+
141
+ **Layout and navigation**
142
+
143
+ - `PanelDock` / `DockPanel` / `createPanelDock` — the right-docked column shell: a real layout member that takes width instead of floating over the page, multiple columns with draggable widths, saved widths, collapse to an edge ear.
144
+ - `QuickToolbar` — a toolbar that follows scrolling with back-to-top and visibility rules.
145
+ - `SplitGroup`, `startResizeLayoutWidth`, `Pagination`.
146
+
147
+ ### utils — pure helpers
148
+
149
+ Zero React, zero DOM, zero dependency on `design`.
150
+
151
+ - **Date / time**: `formatDateTime`, `formatYmd`, `formatClock`, `formatDurationHms`, `formatRange`, `sameCalendarDay`, `relativePast`, `relativeFuture`, `overlaps`, `pad2`. Local timezone; a parse failure falls back instead of throwing, and never invents a time. `relativePast` and `relativeFuture` are duals — use the latter for future timestamps or "in 3 minutes" collapses into "just now".
152
+ - **Strings / bytes / paths**: `baseNameOf`, `safeTrim`, `truncateBytes` (UTF-8 aware, never splits a character), `formatBytes`, `formatCount`, `joinPath`, `parentOf`, `extOf`, `mimeOf`, `crumbsOf`.
153
+ - **HTTP**: `request`, `requestJson`, `HttpError` — one options object, structured failures.
154
+ - **i18n**: `setLocale('zh' | 'en')`, `getLocale()`, `t()` — the built-in dictionary shipped with the library (field placeholders, empty states, loading copy). Your plugin's own copy stays yours.
155
+
156
+ ### explorer — workspace file browsing
157
+
158
+ - `openFilePreview({ mount, path })` — opens the right-docked file panel next to your main area. `mount` is the flex row that wraps the main area (element or selector); the dock becomes a layout member and gives the width back when closed.
159
+ - `pickWorkspaceFile({ anchor, filter })` — a Promise-based file picker; resolves to `{ path, isDir }` or `null`.
160
+ - `FileBrowser` — the browse surface on its own, if you would rather host it yourself.
161
+ - `FilePreview` — dispatches by extension to image, PDF, Markdown (rendered or source), HTML (rendered or source), Office (through the host's converter, honest "unavailable" state when it is missing), or text with syntax highlighting and open-at-line.
162
+ - Browsing is **not limited to workspaces**: one tree with workspace nodes plus the real root (`/`, or drive letters on Windows). Wiring takes two lines — `serveFsRoute({ path })` on the host side and `connectFs({ path })` on the client side with the same path constant. Browsing needs no session.
163
+
164
+ ### session — read-only session preview
165
+
166
+ - `openSessionView(sessions, uiConversation, sessionId, mountId)` builds the data chain and returns a `view`, or `null` when the session cannot be resolved; hand it to `SessionViewModal` and call `view.dispose()` on close.
167
+ - Renders a dialog that mirrors the official conversation page: user and assistant turns, tool cards, reasoning blocks, changed files, permissions.
168
+ - Archive state is live, not a prop: core subscribes to the official workspace snapshot, so the archived badge and the "Continue" button follow changes while the dialog stays open. Archived sessions stay readable.
169
+ - "Continue" never disappears: an active session jumps to the official conversation, an archived one forks a child session first — with a confirmation dialog you can veto.
170
+ - `openSessionReview({ mount, locator })` opens the changed-file diff; a single file exit (`onOpenFile`) covers tool-card paths, inline mentions and delivered cards.
171
+
172
+ ## Compatibility
173
+
174
+ | Area | Requirement |
71
175
  |---|---|
72
- | 用这个包写插件 | [`docs/help/index.md`](docs/help/index.md) |
73
- | 从零接入一个插件 | [`docs/help/integration.md`](docs/help/integration.md) |
74
- | 查为什么这么设计 | [`docs/requirements.md`](docs/requirements.md) |
75
- | 改这个仓库本身 | `AGENTS.md` → [`docs/README.md`](docs/README.md) |
176
+ | Host | DSH web client. Plugin client bundles are `window.__ModuleLoader__.load({ id, factory })` CJS closures; styles therefore arrive as runtime-injected strings. |
177
+ | Node.js | `>= 22.5` (build and install time only). |
178
+ | React / React DOM | `>= 18`, optional peers. Only `design` and `utils` work without React. |
179
+ | Theme | Follows the host: `body[data-ds-dark-theme]`. Never `prefers-color-scheme`. Tokens fall back to built-in values when the host does not provide them. |
180
+ | Naming | Variables `--dshpc-*`, class names `dshpc-*` — fixed, shared by the whole ecosystem. Nothing touches the host's own `--dsw-*` / `--dsh-*`. |
181
+ | Official primitives | Reachable only through `dsh-plugin-core/ui/official`, and only inside the host. The main entries stay free of `@deepseek-ai/*`, so importing `ui` in Node or in a test does not explode. |
182
+ | Bundling | ESM with `sideEffects: false` and per-control CSS domains — named imports keep unused controls (and their CSS) out of your bundle. |
183
+ | Data | Never fetched by a component. Workspaces, models, files and sessions come from the caller or from an interface you inject once. |
184
+
185
+ This is a **library, not a plugin**: no `main`, no `dsh` field. Whoever wants to *see* it running installs the demo plugin below.
76
186
 
77
- ## 组件预览插件(packages/demo/)
187
+ ## See it running: the demo plugin
78
188
 
79
- 库本身是纯库:只有六个子路径导出,没有 main、没有 dsh 字段、零运行时依赖。预览用的插件是仓库里的独立 npm 包 `packages/demo/`(包名 `dsh-plugin-core-demo`)。
189
+ `dsh-plugin-core-demo` ("Blue Whale Component Library") is an installable DSH plugin from the same repository. It renders every control and every composed module with real host data — the same code paths your plugin would use, not a static gallery.
80
190
 
81
- 本地改了 core 想看效果:
191
+ Install it into your DSH host with the DSH CLI:
82
192
 
83
193
  ```bash
84
- pnpm run build # 先构建库
85
- pnpm run build:demo # 构建预览插件 → packages/demo/dist/{index.js,client.js}
86
- dsh plugin --profile web add dsh-plugin-core-demo # 本地路径安装即预览当前代码
194
+ dsh plugin --profile web add dsh-plugin-core-demo
87
195
  ```
88
196
 
89
- > 旧版「双击 HTML 的独立预览站」(`demo-dist/` + `demo:build` + GitHub Pages)已废弃删除:它不走宿主,与 harness 脱节。`explorer` / `session` 的宿主数据仍是 mock 的(`packages/demo/src/mock.ts`)。
197
+ Or install the npm package itself:
90
198
 
91
- ## 发布(打 tag 即发布)
199
+ ```bash
200
+ npm install dsh-plugin-core-demo
201
+ ```
202
+
203
+ After installing, open the plugin in DSH: the plugin page carries a **Component preview** entry that opens the full-page preview, and the sidebar entry can be placed first-level, under "More", or turned off entirely in the plugin settings.
204
+
205
+ What it covers: design foundation (tokens, dark-mode predicate, injection), actions, inputs, display, feedback, layout and scrolling, navigation, workspace browsing, session preview, the utility helpers with live input/output, and every built-in i18n string in both languages.
206
+
207
+ Its `dist/` is committed to the repository and it bundles core's build output into itself, so it always previews the current code — you do not need to publish core first.
208
+
209
+ ## Documentation
92
210
 
93
- 核心与 demo 共用同一个版本号,一个 tag 同时发两个包:
211
+ | I want to… | Read |
212
+ |---|---|
213
+ | Integrate the package into a plugin | [Integration guide](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/integration.md) |
214
+ | Look up a control and its props | [Control reference](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/ui.md) |
215
+ | Use `createStyleKit`, override tokens, isolate plugins | [design](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/design.md) |
216
+ | Use tokens, colors or a custom skin | [Style guide](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/style.md) |
217
+ | Handle dates, strings, bytes, HTTP | [utils](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/utils.md) — and the shared [method conventions](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/methods.md) |
218
+ | Add workspace browsing and file preview | [explorer](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/explorer.md) |
219
+ | Render a session as a read-only preview | [session](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/session.md) |
220
+ | Understand the architecture | [Architecture](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/design/architecture.md) |
221
+ | See why a decision was made | [Requirements and decisions](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/requirements.md) |
222
+
223
+ The help documents are bilingual (Chinese prose, English abstract under each section).
224
+
225
+ ## Releasing
226
+
227
+ Core and the demo share one version number, and one git tag publishes both packages:
94
228
 
95
229
  ```bash
96
- # 1. 两个 package.json 的 version 改成同一个号
97
- # 2. 构建 + 提交(dist/ 必须入库)
230
+ # 1. set the same version in the root package.json and packages/demo/package.json
231
+ # 2. build, commit (dist/ must be committed) and push
98
232
  pnpm run build && pnpm run build:demo
99
- git add -A && git commit -m "发布 0.3.0" && git push
100
- # 3. 打 tag 即触发 GitHub Actions 自动发布
101
- git tag v0.3.0 && git push origin v0.3.0
233
+ git add -A && git commit -m "Release X.Y.Z" && git push
234
+ # 3. the tag triggers GitHub Actions, which publishes to npm
235
+ git tag vX.Y.Z && git push origin vX.Y.Z
102
236
  ```
103
237
 
104
- | tag | 谁在发 | 发到哪 |
105
- |---|---|---|
106
- | `v0.3.0` | `.github/workflows/publish.yml` | `dsh-plugin-core` |
107
- | 同上 | `.github/workflows/demo-publish.yml` | `dsh-plugin-core-demo` |
238
+ `tag vX.Y.Z` must equal both `version` fields; there is no separate `demo-v*` tag.
239
+
240
+ ## License
108
241
 
109
- 硬规则:`tag vX.Y.Z` == 根 `package.json` 的 `version` == `packages/demo/package.json` 的 `version`,三者不一致时 workflow 直接失败。**没有 `demo-v*` 这种独立 tag。** 一次性前置:npm 网页 Settings → Trusted Publisher 勾上 `npm publish`。
242
+ MIT
@@ -0,0 +1,242 @@
1
+ # dsh-plugin-core
2
+
3
+ [English](https://github.com/cq-guojia/dsh-plugin-core/blob/main/README.md) · **简体中文**
4
+
5
+ **DSH(DeepSeek Harness)** 插件的共享 UI 底座:设计 token、一整套 React 控件、纯方法、工作区文件浏览、只读会话预览——一个包,按子路径引入。
6
+
7
+ 它存在的意义是:写下一个插件时,不必再把按钮、日期选择器、toast、文件预览、会话回放各抄一遍。这里的东西全部长在宿主自己的 token 与明暗开关上,拼出来的插件天然是宿主的样子,不需要每个插件各调一遍皮肤。
8
+
9
+ - **跟宿主走,不跟系统走**:明暗判据是宿主写在 body 上的 `body[data-ds-dark-theme]`,12 个强调色也是宿主那套。
10
+ - **组件不取数**:选项、当前值、工作区、会话,一律由调用方经 props 或一次性注入的接口给进来,组件绝不自己伸手去要。
11
+ - **在哪儿都能 import**:`design`、`ui`、`utils` 三个入口零 `@deepseek-ai/*` 依赖,Node 与单测环境里直接 import 不会炸,不是只能在宿主里活。
12
+
13
+ ## 截图
14
+
15
+ 以下都是在 DSH 宿主里暗色主题下的真实渲染:
16
+
17
+ 设计基础——token 色板、明暗判据、样式注入机制:
18
+
19
+ ![设计基础](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/01-tokens.png)
20
+
21
+ 按钮——18 档外观、三档高度、图标、自动 loading:
22
+
23
+ ![按钮](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/02-buttons.png)
24
+
25
+ 录入——问号提示、Switch、Checkbox、分段选择器:
26
+
27
+ ![录入](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/03-inputs.png)
28
+
29
+ 工作区浏览——右侧停靠的文件浏览与预览,且不限工作区:
30
+
31
+ ![工作区浏览](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/04-explorer.png)
32
+
33
+ 会话预览——与官方会话页同构的只读弹窗:
34
+
35
+ ![会话预览](https://cdn.jsdelivr.net/gh/cq-guojia/dsh-plugin-core@main/assets/readme/05-session.png)
36
+
37
+ 五张截图都来自 [`dsh-plugin-core-demo`](#装上就能看预览插件),也就是同仓库发布的预览插件。
38
+
39
+ ## 安装
40
+
41
+ ```bash
42
+ pnpm add dsh-plugin-core
43
+ # 或者
44
+ npm install dsh-plugin-core
45
+ ```
46
+
47
+ 发布包里带编译好的 `dist/` 与类型声明——宿主安装插件时不跑构建脚本。`react` / `react-dom`(`>= 18`)是**可选 peer**:只用 `design` 或 `utils` 的插件不必装。
48
+
49
+ ## 快速开始
50
+
51
+ ```tsx
52
+ // 插件 client 入口
53
+ import { createStyleKit } from 'dsh-plugin-core/design'
54
+ import { Button, Input, setStyleKit, showToast } from 'dsh-plugin-core/ui'
55
+
56
+ const kit = createStyleKit({ id: 'dsh-task-reminder-ui' }) // 1. 一个插件一套
57
+ setStyleKit(kit)
58
+
59
+ export function TaskEditor(props: { name: string; setName: (v: string) => void }) {
60
+ return (
61
+ <div>
62
+ <Input value={props.name} onChange={props.setName} placeholder="任务名" hint="会显示在任务列表里" />
63
+ <Button variant="primary" onClick={async () => { await save(); showToast('已保存', { variant: 'success' }) }}>
64
+ 保存
65
+ </Button>
66
+ </div>
67
+ )
68
+ }
69
+ ```
70
+
71
+ 第一天就该知道的三件事:
72
+
73
+ 1. **`setStyleKit` 只调一次。** 样式只能以字符串在运行时注入 `<style>`——插件 client 产物是 CJS 闭包,内核不加载 `.css` 资源。`id` 必须插件内唯一:多个插件同页时,靠它让自己的 `<style>` 不被别人覆盖。
74
+ 2. **具名引入。** 每个控件在首次渲染时才登记自己那份 CSS(幂等),用不到的控件其 CSS 不进你的包。这条收益只在具名引入时成立(`import { Button } from 'dsh-plugin-core/ui'`);写成 `import * as core` 或 CJS `require`,打包器无法摇树,收益静默归零。
75
+ 3. **弹窗是 Promise 形态。** `await confirmModal({...})` 拿 `true` / `false`,`alertModal({...})` 关闭即 resolve。没有回调式写法。
76
+
77
+ ## 包里有什么
78
+
79
+ | 引入路径 | 给你什么 | 需要 React |
80
+ |---|---|---|
81
+ | `dsh-plugin-core/design` | token 变量(明 + 暗)、`createStyleKit` 注入器工厂、明暗判据 | 否 |
82
+ | `dsh-plugin-core/ui` | 全套控件:动作、录入、展示、反馈、布局、导航 | 是 |
83
+ | `dsh-plugin-core/ui/official` | 官方 primitives 的直接再导出(少数确实要用官方原件的场景) | 是 |
84
+ | `dsh-plugin-core/ui/code-viewer` | 代码查看器(行级高亮,文件预览源码态用的也是它) | 是 |
85
+ | `dsh-plugin-core/ui/host` | 宿主自带 toast 的桥接 | 是 |
86
+ | `dsh-plugin-core/utils` | 纯方法:日期、字符串、字节、HTTP,外加内置中英字典 | 否 |
87
+ | `dsh-plugin-core/explorer` | 文件浏览、文件选择、右侧停靠的文件预览 | 是 |
88
+ | `dsh-plugin-core/explorer/preview` | 预览体:图片、PDF、Markdown、HTML、Office、文本 / 代码 | 是 |
89
+ | `dsh-plugin-core/session` | 只读会话预览弹窗 + 变更文件 diff | 是 |
90
+ | `dsh-plugin-core/host` | 宿主侧路由:只读 FS 路由、模型目录 | 否 |
91
+
92
+ 依赖方向单向:`design` ← `ui` ← `explorer` / `session`,`utils` 谁也不依赖。
93
+
94
+ ## 功能说明
95
+
96
+ ### design——token 与样式注入
97
+
98
+ 零 React、没有组件,装的是「值 + 把值弄上页面的机制」。
99
+
100
+ - 一张明暗双份的 token 表:表面(`--dshpc-surface-1/2/sunken`)、文字(`--dshpc-fg`、`--dshpc-fg-3`、`--dshpc-fg-4`)、边框,以及十二个强调色:`business`、`success`、`warning`、`danger`、`purple`、`pink`、`cyan`、`teal`、`orange`、`indigo`、`rose`、`slate`。
101
+ - `createStyleKit({ id })` 返回一套工具:`cssVar(name)`、`registerStyle(domain, css)`、`applyStyle(domain, css)`、`ensureStyles()`——一个插件一个 `<style>` 标签,按 id 隔离。
102
+ - `DARK_THEME_SELECTOR` 常量为 `body[data-ds-dark-theme]`,自己的 CSS 不必再猜系统主题。
103
+ - 变量与类名前缀全生态固定为 `--dshpc-*` / `dshpc-*`,不存在按插件改名;不同 core 版本的插件靠 style 标签 id 隔离,不靠前缀。
104
+
105
+ 只想统一配色与尺寸、但组件自己写:只引这一个子路径就够。
106
+
107
+ ### ui——控件
108
+
109
+ 全部由 token 搭出来,数据走 props,配色跟随宿主主题。props 就是定制面——组合 props,不要 fork 源码。每个参数的完整说明见[控件参考](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/ui.md)。
110
+
111
+ **动作**
112
+
113
+ - `Button`——18 档外观(实心 / 线框 / 无底:`primary`、`secondary`、`danger`、`success`、`warning`、`info`、`outline`、`danger-outline`、`ghost`、`link`,加扩展八色),三档高度(24 / 28 / 32),前置与后置图标,固定 / 最小 / 最大宽度(超长跑马灯),自动 loading:`onClick` 返回 Promise 就转圈、禁用、settle 后自恢复,reject 同样恢复。
114
+ - `IconButton`——纯图标版本,无障碍名强制给。
115
+ - `Segmented`——单选 / 多选、可选 1px 外框、段内图标 / 计数 / 角标、`tone` 换选中片配色。
116
+
117
+ **录入**
118
+
119
+ - `Input`、`PrefixedInput`、`NumberInput`、`Textarea`——共用一套字段尺寸(`fieldMetricsOf`),错误态、左侧图标槽、搜索清空键,问号提示直接走宿主 tooltip。
120
+ - `Checkbox`;开关语义用官方 `Switch`。
121
+ - `Picker`——单选 / 多选、搜索、分组、选择上限、可清空、空态;键盘可全操作(Esc / ↑↓ / Enter)。底层逻辑(`toGroups`、`filterGroups`、`toggleValue`)单独导出。
122
+ - `WorkspacePicker` / `ModelPicker`——自带数据的领域选择器:插件 `apply` 里调一次 `connectHost(ctx)` 即订阅宿主快照,没接线就是空态,不编造。
123
+ - `DateTimePicker`——一个控件覆盖「一个时刻」与「时间段」,精度 `day` / `hour` / `minute` / `second`,左右两块独立月历,键盘可用,起始端归零、结束端拉满。
124
+ - `InputGroup`——带附着动作的输入框。
125
+
126
+ **展示**
127
+
128
+ - `Surface`——纯框容器,tone / 边框 / 内距 / 圆角四轴。
129
+ - `Card` / `StripCard`——带强调色的卡片。
130
+ - `Chip`、`SectionHead`、`MarqueeText`、`FlipText`、`LiveText`。
131
+ - `Table`——多行分组表头、通栏分组(一张表装多个板块)、跨行跨列、行选中、密度 / 斑马纹 / 边框开关、列级对齐与表头语义色、内置空态、加载态与加载更多、可选内置分页。数据驱动:不排序、不取数、不虚拟滚动。
132
+ - `FieldHint`——独立的问号提示,浮层用的是宿主官方 tooltip。
133
+
134
+ **反馈**
135
+
136
+ - `Modal`、`SideSheet`——定尺寸弹窗与侧边抽屉,都支持 `busy` 锁。
137
+ - `AlertModal`、`ConfirmModal`、`alertModal()`、`confirmModal()`——Promise 形态的确认 / 提示。
138
+ - `showToast`、`notify`——Sonner 底座的 toast,全屏单例、多插件共用。
139
+ - `Loader`、`LoaderBar`、`Loading`、`LoadingBlock`、`LoadingToast`、`RunningBlocks`、`showLoading`——转圈图标、不定进度条、全局单槽加载卡。
140
+
141
+ **布局与导航**
142
+
143
+ - `PanelDock` / `DockPanel` / `createPanelDock`——右侧停靠分栏的通用壳:是布局成员而不是浮层,占宽挤窄主区;支持多栏、拖宽、宽度记忆、收起成右侧耳朵。
144
+ - `QuickToolbar`——随滚动出现的工具栏,带回到顶部与可见性规则。
145
+ - `SplitGroup`、`startResizeLayoutWidth`、`Pagination`。
146
+
147
+ ### utils——纯方法
148
+
149
+ 零 React、零 DOM、零 `design` 依赖。
150
+
151
+ - **日期时间**:`formatDateTime`、`formatYmd`、`formatClock`、`formatDurationHms`、`formatRange`、`sameCalendarDay`、`relativePast`、`relativeFuture`、`overlaps`、`pad2`。一律本机时区;解析失败按兜底返回、不抛错,也不编造时间。`relativePast` 与 `relativeFuture` 是对偶的——未来时间必须用后者,否则「3 分钟后」会显示成「刚刚」。
152
+ - **字符串 / 字节 / 路径**:`baseNameOf`、`safeTrim`、`truncateBytes`(按 UTF-8 字节截断,不切半个字)、`formatBytes`、`formatCount`、`joinPath`、`parentOf`、`extOf`、`mimeOf`、`crumbsOf`。
153
+ - **HTTP**:`request`、`requestJson`、`HttpError`——一个 options 对象,失败有结构。
154
+ - **多语言**:`setLocale('zh' | 'en')`、`getLocale()`、`t()`——管的是库自带的固定文案(占位符、空态、加载文案)。插件自己界面的文案仍归插件自己。
155
+
156
+ ### explorer——工作区文件浏览
157
+
158
+ - `openFilePreview({ mount, path })`——在主区旁边打开右侧停靠的文件面板。`mount` 是包住主区的那个 flex 行(元素或选择器都行),面板作为布局成员占宽,关闭时还原。
159
+ - `pickWorkspaceFile({ anchor, filter })`——Promise 形态的文件选择器,resolve `{ path, isDir }` 或 `null`。
160
+ - `FileBrowser`——单独使用浏览面板本体。
161
+ - `FilePreview`——按扩展名分派到图片、PDF、Markdown(渲染 / 源码)、HTML(渲染 / 源码)、Office(走宿主转换能力,缺了就如实显示「不可用」)、文本(代码高亮、可定位到行)。
162
+ - 浏览**不限工作区**:一棵树里既有工作区节点也有真实根(POSIX 是 `/`,Windows 是盘符)。接线两行——宿主侧 `serveFsRoute({ path })`,client 侧用同一个路径常量 `connectFs({ path })`。浏览本身不需要会话。
163
+
164
+ ### session——只读会话预览
165
+
166
+ - `openSessionView(sessions, uiConversation, sessionId, mountId)` 建数据链拿到 `view`(不可解析返回 `null`),交给 `SessionViewModal`,关闭时记得 `view.dispose()`。
167
+ - 渲染与官方会话页同构:用户 / 助手轮次、工具卡、思考块、变更文件、权限卡。
168
+ - 归档态实时跟随、不用调用方传:核心订阅官方工作区快照,弹窗开着期间归档徽标与「继续对话」会跟着变;归档会话同样可读。
169
+ - 「继续对话」始终保留:未归档直跳官方会话区,已归档先开分支并弹确认框(可以取消)。
170
+ - `openSessionReview({ mount, locator })` 打开变更文件的 diff;文件出口只有一个 `onOpenFile`,工具卡路径、行内引用、交付卡都走它。
171
+
172
+ ## 适配范围
173
+
174
+ | 维度 | 要求 |
175
+ |---|---|
176
+ | 宿主 | DSH web client。插件 client 产物是 `window.__ModuleLoader__.load({ id, factory })` 的 CJS 闭包,所以样式只能运行时注入。 |
177
+ | Node.js | `>= 22.5`(只影响构建与安装阶段)。 |
178
+ | React / React DOM | `>= 18`,可选 peer。只有 `design` 与 `utils` 可以完全不用 React。 |
179
+ | 主题 | 跟随宿主 `body[data-ds-dark-theme]`,绝不使用 `prefers-color-scheme`。宿主没给 token 时回落到内置值。 |
180
+ | 命名 | 变量 `--dshpc-*`、类名 `dshpc-*`,全生态固定;不碰宿主的 `--dsw-*` / `--dsh-*`。 |
181
+ | 官方 primitives | 只从 `dsh-plugin-core/ui/official` 走,且只在宿主内可解析。主入口零 `@deepseek-ai/*`,因此在 Node / 单测里 import `ui` 不会失败。 |
182
+ | 打包 | ESM、`sideEffects: false`、控件各带自己的 CSS 域——具名引入可让用不到的控件连同其 CSS 都不进包。 |
183
+ | 数据 | 组件从不取数。工作区、模型、文件、会话由调用方给,或来自一次性注入的接口。 |
184
+
185
+ 这是一个**库,不是插件**:没有 `main`、没有 `dsh` 字段。想看它跑起来,装下面的预览插件。
186
+
187
+ ## 装上就能看:预览插件
188
+
189
+ `dsh-plugin-core-demo`(蓝鲸组件库)是同仓库发布的、可安装的 DSH 插件。它用宿主真实数据把每个控件、每个组合模块跑一遍——走的是你的插件将来会走的同一条代码路径,不是静态画廊。
190
+
191
+ 用 DSH 命令装进宿主:
192
+
193
+ ```bash
194
+ dsh plugin --profile web add dsh-plugin-core-demo
195
+ ```
196
+
197
+ 或用 npm 装这个包本身:
198
+
199
+ ```bash
200
+ npm install dsh-plugin-core-demo
201
+ ```
202
+
203
+ 装好后在 DSH 里打开本插件:插件详情页有「组件预览」入口,点开即整页预览;侧栏入口的位置(第一级 / 收入「更多」/ 关闭)在插件设置里选。
204
+
205
+ 覆盖内容:设计基础(token、明暗判据、注入机制)、动作、录入、展示、反馈、布局与滚动、导航、工作区浏览、会话预览、工具方法的输入输出实测,以及内置中英双语文案。
206
+
207
+ 它的 `dist/` 随仓库入库,并把 core 的构建产物打进自己 bundle,所以预览的永远是当前这份代码——不需要先把 core 发到 npm。
208
+
209
+ ## 文档
210
+
211
+ | 我想… | 看哪 |
212
+ |---|---|
213
+ | 把包接进插件 | [接入指引](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/integration.md) |
214
+ | 查控件与全部 props | [控件参考](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/ui.md) |
215
+ | 建 style kit、覆盖 token、多插件隔离 | [design](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/design.md) |
216
+ | 用 token、配色或定制皮肤 | [样式说明](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/style.md) |
217
+ | 处理日期、字符串、字节、HTTP | [utils](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/utils.md),以及[方法统一口径](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/methods.md) |
218
+ | 加工作区文件浏览与预览 | [explorer](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/explorer.md) |
219
+ | 把会话渲染成只读预览 | [session](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/help/session.md) |
220
+ | 理解整体架构 | [架构](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/design/architecture.md) |
221
+ | 查某个决定为什么这么定 | [需求与决策](https://github.com/cq-guojia/dsh-plugin-core/blob/main/docs/requirements.md) |
222
+
223
+ 帮助文档为中英双语(正文中文,每节附英文摘要)。
224
+
225
+ ## 发布
226
+
227
+ 核心与预览插件共用同一个版本号,一个 tag 同时发布两个包:
228
+
229
+ ```bash
230
+ # 1. 根 package.json 与 packages/demo/package.json 的 version 改成同一个号
231
+ # 2. 构建、提交(dist/ 必须入库)、推送
232
+ pnpm run build && pnpm run build:demo
233
+ git add -A && git commit -m "发布 X.Y.Z" && git push
234
+ # 3. 打 tag 触发 GitHub Actions 自动发 npm
235
+ git tag vX.Y.Z && git push origin vX.Y.Z
236
+ ```
237
+
238
+ `tag vX.Y.Z` 必须等于两个 `version` 字段;没有 `demo-v*` 这种独立 tag。
239
+
240
+ ## 许可证
241
+
242
+ MIT
@@ -0,0 +1,58 @@
1
+ import { createElement as h, type CSSProperties } from 'react';
2
+ import { type Translate } from '../../utils/i18n.js';
3
+ import { type OfficeToPdfFace, type PickFilter, type PickedPath, type WorkspaceAnchorItem } from './types.js';
4
+ import type { FsFace } from './fs-face.js';
5
+ export interface FileBrowserProps {
6
+ /** 只读文件面(绝对路径;列目录 / 读文件都走它)。 */
7
+ files: FsFace;
8
+ /** 官方 remote.officeToPdf;未就位传 null ⇒ Office 文件出「不可用」空态。 */
9
+ officeToPdf?: OfficeToPdfFace | null;
10
+ /** 相对路径的基准目录(工作区根);不传 ⇒ 只认绝对路径。 */
11
+ rootPath?: string;
12
+ /** 只用来判断「默认落哪个工作区」;浏览本身不需要它。 */
13
+ sessionId?: string;
14
+ /** 起始路径:目录 ⇒ 直接列;文件 ⇒ 预览态(dir 取父目录,面包屑保留可返回)。 */
15
+ path: string;
16
+ /** 起始文件打开后定位到这一行(1 起);树里另点别的文件不沿用。 */
17
+ focusLine?: number;
18
+ /**
19
+ * 重开令牌(`openFilePreview` 每次调用递增):**同一 path 再点一次**也要回到该文件 /
20
+ * 重读内容,所以初始 effect 依赖它;它只触发重跑,**不重挂组件**(目录树、展开态、滚动位置保留)。
21
+ */
22
+ revision?: number;
23
+ /**
24
+ * 关闭回调:**只给没有自己关闭钮的容器**(picker 弹窗)用,第一排才补一枚 ✕。
25
+ * PanelDock 场景不传 —— 面板关闭归壳(用户 2026-11-04 定),内容不承担关闭。
26
+ */
27
+ onClose?: () => void;
28
+ /** 工作区根显示名(picker = 调用方选的工作区名);不传 = 用缓存根的末段。 */
29
+ rootName?: string;
30
+ /**
31
+ * ▾ 下拉顶部的工作区清单(可选覆盖);不传 = 用宿主快照里的工作区标题
32
+ * (picker 与 dock 同一份清单,用户 2026-11-03:两处显示必须一致)。
33
+ */
34
+ workspaces?: readonly string[];
35
+ /**
36
+ * 宿主工作区清单(带绝对 path,`workspaces` 服务快照的消费子集)——**路径 → 会话解析用**:
37
+ * props.path 是绝对路径时,按最长前缀匹配工作区,list 换用该工作区名下的会话 id
38
+ * (官方 list 按 sessionId 解析工作区根,默认 sessionId 的根不含该路径就会被官方判越界)。
39
+ * **可选覆盖**:不传 = 自动用宿主 workspaces 快照(connectHost 注入的 workspaceList);
40
+ * 快照也没数据(未接线 / 宿主没给)⇒ 不匹配,一切 list 回落 props.sessionId。
41
+ */
42
+ workspaceAnchors?: readonly WorkspaceAnchorItem[];
43
+ /** 从 ▾ 下拉选择其他工作区(点当前工作区 = 回其根目录)。 */
44
+ onSelectWorkspace?: (name: string) => void;
45
+ /** 工作区根缓存(可注入;不传 = 内部自建,随组件废弃——不用模块级 Map)。 */
46
+ /** 外部容器样式(嵌入浮层时撑满高度用)。 */
47
+ style?: CSSProperties;
48
+ translate?: Translate;
49
+ /** 选择器态:点文件即 onPick(不进预览);不传 = 浏览态。 */
50
+ picker?: boolean;
51
+ /** 选择器选中回调:path 为**工作区相对**路径,isDir = 选的是整个文件夹。 */
52
+ onPick?: (picked: PickedPath) => void;
53
+ /** 选择器过滤(exts = 只要这些扩展名;dirs = 只要文件夹;不传 = 不限)。 */
54
+ filter?: PickFilter;
55
+ }
56
+ /** 目录浏览器面板。详见 {@link FileBrowserProps}。 */
57
+ export declare function FileBrowser(props: FileBrowserProps): ReturnType<typeof h>;
58
+ //# sourceMappingURL=FileBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileBrowser.d.ts","sourceRoot":"","sources":["../../../src/adv/explorer/FileBrowser.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,aAAa,IAAI,CAAC,EASlB,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAA;AASd,OAAO,EAAK,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEvD,OAAO,EAkBL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EAEf,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAqB1C,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACpC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,8CAA8C;IAC9C,0BAA0B;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,SAAS,CAAC,EAAE,SAAS,CAAA;IAGrB,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,kDAAkD;IAClD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,kDAAkD;IAClD,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAwpBzE"}