dsh-plugin-core 0.2.13 → 0.3.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 (431) hide show
  1. package/README.md +52 -83
  2. package/dist/design/tokens-css.d.ts +1 -1
  3. package/dist/design/tokens-css.d.ts.map +1 -1
  4. package/dist/design/tokens-css.generated.d.ts +2 -0
  5. package/dist/design/tokens-css.generated.d.ts.map +1 -0
  6. package/dist/design/tokens-css.generated.js +4 -0
  7. package/dist/design/tokens-css.generated.js.map +1 -0
  8. package/dist/design/tokens-css.js +1 -252
  9. package/dist/design/tokens-css.js.map +1 -1
  10. package/dist/explorer/FileBrowser.d.ts +41 -0
  11. package/dist/explorer/FileBrowser.d.ts.map +1 -0
  12. package/dist/explorer/FileBrowser.js +659 -0
  13. package/dist/explorer/FileBrowser.js.map +1 -0
  14. package/dist/explorer/explorer-css.d.ts +1 -1
  15. package/dist/explorer/explorer-css.d.ts.map +1 -1
  16. package/dist/explorer/explorer-css.generated.d.ts +2 -0
  17. package/dist/explorer/explorer-css.generated.d.ts.map +1 -0
  18. package/dist/explorer/explorer-css.generated.js +4 -0
  19. package/dist/explorer/explorer-css.generated.js.map +1 -0
  20. package/dist/explorer/explorer-css.js +1 -31
  21. package/dist/explorer/explorer-css.js.map +1 -1
  22. package/dist/explorer/index.d.ts +4 -2
  23. package/dist/explorer/index.d.ts.map +1 -1
  24. package/dist/explorer/index.js +4 -2
  25. package/dist/explorer/index.js.map +1 -1
  26. package/dist/explorer/open.d.ts +103 -0
  27. package/dist/explorer/open.d.ts.map +1 -0
  28. package/dist/explorer/open.js +282 -0
  29. package/dist/explorer/open.js.map +1 -0
  30. package/dist/explorer/preview/BytesPreview.d.ts +13 -0
  31. package/dist/explorer/preview/BytesPreview.d.ts.map +1 -0
  32. package/dist/explorer/preview/BytesPreview.js +56 -0
  33. package/dist/explorer/preview/BytesPreview.js.map +1 -0
  34. package/dist/explorer/preview/HtmlPreview.d.ts +18 -0
  35. package/dist/explorer/preview/HtmlPreview.d.ts.map +1 -0
  36. package/dist/explorer/preview/HtmlPreview.js +112 -0
  37. package/dist/explorer/preview/HtmlPreview.js.map +1 -0
  38. package/dist/explorer/preview/OfficePreview.d.ts +11 -0
  39. package/dist/explorer/preview/OfficePreview.d.ts.map +1 -0
  40. package/dist/explorer/preview/OfficePreview.js +53 -0
  41. package/dist/explorer/preview/OfficePreview.js.map +1 -0
  42. package/dist/explorer/preview/TextPreview.d.ts +17 -0
  43. package/dist/explorer/preview/TextPreview.d.ts.map +1 -0
  44. package/dist/explorer/preview/TextPreview.js +95 -0
  45. package/dist/explorer/preview/TextPreview.js.map +1 -0
  46. package/dist/explorer/preview/index.d.ts +10 -3
  47. package/dist/explorer/preview/index.d.ts.map +1 -1
  48. package/dist/explorer/preview/index.js +52 -55
  49. package/dist/explorer/preview/index.js.map +1 -1
  50. package/dist/explorer/preview/md-labels.d.ts +3 -0
  51. package/dist/explorer/preview/md-labels.d.ts.map +1 -0
  52. package/dist/explorer/preview/md-labels.js +12 -0
  53. package/dist/explorer/preview/md-labels.js.map +1 -0
  54. package/dist/explorer/types.d.ts +186 -4
  55. package/dist/explorer/types.d.ts.map +1 -1
  56. package/dist/explorer/types.js +401 -14
  57. package/dist/explorer/types.js.map +1 -1
  58. package/dist/host/index.d.ts +66 -0
  59. package/dist/host/index.d.ts.map +1 -0
  60. package/dist/host/index.js +60 -0
  61. package/dist/host/index.js.map +1 -0
  62. package/dist/session/SessionViewModal.d.ts +42 -0
  63. package/dist/session/SessionViewModal.d.ts.map +1 -0
  64. package/dist/session/SessionViewModal.js +997 -0
  65. package/dist/session/SessionViewModal.js.map +1 -0
  66. package/dist/session/changes.d.ts +73 -0
  67. package/dist/session/changes.d.ts.map +1 -0
  68. package/dist/session/changes.js +134 -0
  69. package/dist/session/changes.js.map +1 -0
  70. package/dist/session/faces.d.ts +198 -0
  71. package/dist/session/faces.d.ts.map +1 -0
  72. package/dist/session/faces.js +17 -0
  73. package/dist/session/faces.js.map +1 -0
  74. package/dist/session/index.d.ts +5 -23
  75. package/dist/session/index.d.ts.map +1 -1
  76. package/dist/session/index.js +25 -70
  77. package/dist/session/index.js.map +1 -1
  78. package/dist/session/mirror/ChangedFileDiff.d.ts +22 -0
  79. package/dist/session/mirror/ChangedFileDiff.d.ts.map +1 -0
  80. package/dist/session/mirror/ChangedFileDiff.js +157 -0
  81. package/dist/session/mirror/ChangedFileDiff.js.map +1 -0
  82. package/dist/session/mirror/ChangedFilesCard.d.ts +18 -0
  83. package/dist/session/mirror/ChangedFilesCard.d.ts.map +1 -0
  84. package/dist/session/mirror/ChangedFilesCard.js +158 -0
  85. package/dist/session/mirror/ChangedFilesCard.js.map +1 -0
  86. package/dist/session/mirror/ChatGroupSeat.d.ts +24 -0
  87. package/dist/session/mirror/ChatGroupSeat.d.ts.map +1 -0
  88. package/dist/session/mirror/ChatGroupSeat.js +134 -0
  89. package/dist/session/mirror/ChatGroupSeat.js.map +1 -0
  90. package/dist/session/mirror/ChatNodeSeat.d.ts +43 -0
  91. package/dist/session/mirror/ChatNodeSeat.d.ts.map +1 -0
  92. package/dist/session/mirror/ChatNodeSeat.js +133 -0
  93. package/dist/session/mirror/ChatNodeSeat.js.map +1 -0
  94. package/dist/session/mirror/ChatView.d.ts +47 -0
  95. package/dist/session/mirror/ChatView.d.ts.map +1 -0
  96. package/dist/session/mirror/ChatView.js +127 -0
  97. package/dist/session/mirror/ChatView.js.map +1 -0
  98. package/dist/session/mirror/CommandCard.d.ts +20 -0
  99. package/dist/session/mirror/CommandCard.d.ts.map +1 -0
  100. package/dist/session/mirror/CommandCard.js +69 -0
  101. package/dist/session/mirror/CommandCard.js.map +1 -0
  102. package/dist/session/mirror/Deliverables.d.ts +24 -0
  103. package/dist/session/mirror/Deliverables.d.ts.map +1 -0
  104. package/dist/session/mirror/Deliverables.js +134 -0
  105. package/dist/session/mirror/Deliverables.js.map +1 -0
  106. package/dist/session/mirror/GenericCommandCard.d.ts +25 -0
  107. package/dist/session/mirror/GenericCommandCard.d.ts.map +1 -0
  108. package/dist/session/mirror/GenericCommandCard.js +567 -0
  109. package/dist/session/mirror/GenericCommandCard.js.map +1 -0
  110. package/dist/session/mirror/MessageIconActions.d.ts +16 -0
  111. package/dist/session/mirror/MessageIconActions.d.ts.map +1 -0
  112. package/dist/session/mirror/MessageIconActions.js +71 -0
  113. package/dist/session/mirror/MessageIconActions.js.map +1 -0
  114. package/dist/session/mirror/MessageItem.d.ts +66 -0
  115. package/dist/session/mirror/MessageItem.d.ts.map +1 -0
  116. package/dist/session/mirror/MessageItem.js +135 -0
  117. package/dist/session/mirror/MessageItem.js.map +1 -0
  118. package/dist/session/mirror/ReasoningRow.d.ts +11 -0
  119. package/dist/session/mirror/ReasoningRow.d.ts.map +1 -0
  120. package/dist/session/mirror/ReasoningRow.js +49 -0
  121. package/dist/session/mirror/ReasoningRow.js.map +1 -0
  122. package/dist/session/mirror/StatDialog.d.ts +20 -0
  123. package/dist/session/mirror/StatDialog.d.ts.map +1 -0
  124. package/dist/session/mirror/StatDialog.js +36 -0
  125. package/dist/session/mirror/StatDialog.js.map +1 -0
  126. package/dist/session/mirror/TurnProcessNodeView.d.ts +10 -0
  127. package/dist/session/mirror/TurnProcessNodeView.d.ts.map +1 -0
  128. package/dist/session/mirror/TurnProcessNodeView.js +68 -0
  129. package/dist/session/mirror/TurnProcessNodeView.js.map +1 -0
  130. package/dist/session/mirror/TurnTailNodeView.d.ts +32 -0
  131. package/dist/session/mirror/TurnTailNodeView.d.ts.map +1 -0
  132. package/dist/session/mirror/TurnTailNodeView.js +48 -0
  133. package/dist/session/mirror/TurnTailNodeView.js.map +1 -0
  134. package/dist/session/mirror/TurnTriggerNodeView.d.ts +14 -0
  135. package/dist/session/mirror/TurnTriggerNodeView.d.ts.map +1 -0
  136. package/dist/session/mirror/TurnTriggerNodeView.js +87 -0
  137. package/dist/session/mirror/TurnTriggerNodeView.js.map +1 -0
  138. package/dist/session/mirror/TurnUsagePanel.d.ts +21 -0
  139. package/dist/session/mirror/TurnUsagePanel.d.ts.map +1 -0
  140. package/dist/session/mirror/TurnUsagePanel.js +41 -0
  141. package/dist/session/mirror/TurnUsagePanel.js.map +1 -0
  142. package/dist/session/mirror/message-chrome.d.ts +33 -0
  143. package/dist/session/mirror/message-chrome.d.ts.map +1 -0
  144. package/dist/session/mirror/message-chrome.js +158 -0
  145. package/dist/session/mirror/message-chrome.js.map +1 -0
  146. package/dist/session/mirror/process-groups.d.ts +56 -0
  147. package/dist/session/mirror/process-groups.d.ts.map +1 -0
  148. package/dist/session/mirror/process-groups.js +202 -0
  149. package/dist/session/mirror/process-groups.js.map +1 -0
  150. package/dist/session/official-classes.d.ts +28 -0
  151. package/dist/session/official-classes.d.ts.map +1 -0
  152. package/dist/session/official-classes.js +146 -0
  153. package/dist/session/official-classes.js.map +1 -0
  154. package/dist/session/open-session-view.d.ts +17 -0
  155. package/dist/session/open-session-view.d.ts.map +1 -0
  156. package/dist/session/open-session-view.js +136 -0
  157. package/dist/session/open-session-view.js.map +1 -0
  158. package/dist/session/session-css.d.ts +1 -1
  159. package/dist/session/session-css.d.ts.map +1 -1
  160. package/dist/session/session-css.generated.d.ts +2 -0
  161. package/dist/session/session-css.generated.d.ts.map +1 -0
  162. package/dist/session/session-css.generated.js +4 -0
  163. package/dist/session/session-css.generated.js.map +1 -0
  164. package/dist/session/session-css.js +1 -17
  165. package/dist/session/session-css.js.map +1 -1
  166. package/dist/ui/AlertModal.d.ts +28 -0
  167. package/dist/ui/AlertModal.d.ts.map +1 -0
  168. package/dist/ui/AlertModal.js +29 -0
  169. package/dist/ui/AlertModal.js.map +1 -0
  170. package/dist/ui/Button.d.ts.map +1 -1
  171. package/dist/ui/Button.js +14 -1
  172. package/dist/ui/Button.js.map +1 -1
  173. package/dist/ui/Card.d.ts +4 -2
  174. package/dist/ui/Card.d.ts.map +1 -1
  175. package/dist/ui/Card.js +12 -6
  176. package/dist/ui/Card.js.map +1 -1
  177. package/dist/ui/Chip.d.ts +9 -1
  178. package/dist/ui/Chip.d.ts.map +1 -1
  179. package/dist/ui/Chip.js +8 -2
  180. package/dist/ui/Chip.js.map +1 -1
  181. package/dist/ui/CodeViewer.d.ts +36 -0
  182. package/dist/ui/CodeViewer.d.ts.map +1 -0
  183. package/dist/ui/CodeViewer.js +90 -0
  184. package/dist/ui/CodeViewer.js.map +1 -0
  185. package/dist/ui/ConfirmModal.d.ts +30 -0
  186. package/dist/ui/ConfirmModal.d.ts.map +1 -0
  187. package/dist/ui/ConfirmModal.js +23 -0
  188. package/dist/ui/ConfirmModal.js.map +1 -0
  189. package/dist/ui/DateTimePicker.d.ts +45 -0
  190. package/dist/ui/DateTimePicker.d.ts.map +1 -0
  191. package/dist/ui/DateTimePicker.js +447 -0
  192. package/dist/ui/DateTimePicker.js.map +1 -0
  193. package/dist/ui/Field.d.ts +11 -2
  194. package/dist/ui/Field.d.ts.map +1 -1
  195. package/dist/ui/Field.js +15 -5
  196. package/dist/ui/Field.js.map +1 -1
  197. package/dist/ui/MarqueeText.d.ts.map +1 -1
  198. package/dist/ui/MarqueeText.js +3 -1
  199. package/dist/ui/MarqueeText.js.map +1 -1
  200. package/dist/ui/Modal.d.ts +25 -3
  201. package/dist/ui/Modal.d.ts.map +1 -1
  202. package/dist/ui/Modal.js +41 -7
  203. package/dist/ui/Modal.js.map +1 -1
  204. package/dist/ui/ModelPicker.d.ts +25 -12
  205. package/dist/ui/ModelPicker.d.ts.map +1 -1
  206. package/dist/ui/ModelPicker.js +67 -19
  207. package/dist/ui/ModelPicker.js.map +1 -1
  208. package/dist/ui/PanelDock.d.ts +127 -0
  209. package/dist/ui/PanelDock.d.ts.map +1 -0
  210. package/dist/ui/PanelDock.js +297 -0
  211. package/dist/ui/PanelDock.js.map +1 -0
  212. package/dist/ui/Picker.d.ts +8 -2
  213. package/dist/ui/Picker.d.ts.map +1 -1
  214. package/dist/ui/Picker.js +86 -18
  215. package/dist/ui/Picker.js.map +1 -1
  216. package/dist/ui/SectionHead.d.ts +3 -3
  217. package/dist/ui/SectionHead.d.ts.map +1 -1
  218. package/dist/ui/SectionHead.js +4 -4
  219. package/dist/ui/SectionHead.js.map +1 -1
  220. package/dist/ui/Segmented.d.ts +2 -0
  221. package/dist/ui/Segmented.d.ts.map +1 -1
  222. package/dist/ui/Segmented.js +3 -1
  223. package/dist/ui/Segmented.js.map +1 -1
  224. package/dist/ui/Textarea.d.ts +2 -0
  225. package/dist/ui/Textarea.d.ts.map +1 -1
  226. package/dist/ui/Textarea.js +6 -1
  227. package/dist/ui/Textarea.js.map +1 -1
  228. package/dist/ui/Toast.d.ts +41 -8
  229. package/dist/ui/Toast.d.ts.map +1 -1
  230. package/dist/ui/Toast.js +216 -28
  231. package/dist/ui/Toast.js.map +1 -1
  232. package/dist/ui/WorkspacePicker.d.ts +15 -28
  233. package/dist/ui/WorkspacePicker.d.ts.map +1 -1
  234. package/dist/ui/WorkspacePicker.js +18 -27
  235. package/dist/ui/WorkspacePicker.js.map +1 -1
  236. package/dist/ui/card-css.d.ts +1 -1
  237. package/dist/ui/card-css.d.ts.map +1 -1
  238. package/dist/ui/card-css.generated.d.ts +2 -0
  239. package/dist/ui/card-css.generated.d.ts.map +1 -0
  240. package/dist/ui/card-css.generated.js +4 -0
  241. package/dist/ui/card-css.generated.js.map +1 -0
  242. package/dist/ui/card-css.js +1 -35
  243. package/dist/ui/card-css.js.map +1 -1
  244. package/dist/ui/chip-css.d.ts +1 -1
  245. package/dist/ui/chip-css.d.ts.map +1 -1
  246. package/dist/ui/chip-css.generated.d.ts +2 -0
  247. package/dist/ui/chip-css.generated.d.ts.map +1 -0
  248. package/dist/ui/chip-css.generated.js +4 -0
  249. package/dist/ui/chip-css.generated.js.map +1 -0
  250. package/dist/ui/chip-css.js +1 -17
  251. package/dist/ui/chip-css.js.map +1 -1
  252. package/dist/ui/code-viewer-css.d.ts +2 -0
  253. package/dist/ui/code-viewer-css.d.ts.map +1 -0
  254. package/dist/ui/code-viewer-css.generated.d.ts +2 -0
  255. package/dist/ui/code-viewer-css.generated.d.ts.map +1 -0
  256. package/dist/ui/code-viewer-css.generated.js +4 -0
  257. package/dist/ui/code-viewer-css.generated.js.map +1 -0
  258. package/dist/ui/code-viewer-css.js +3 -0
  259. package/dist/ui/code-viewer-css.js.map +1 -0
  260. package/dist/ui/code-viewer-lang.d.ts +15 -0
  261. package/dist/ui/code-viewer-lang.d.ts.map +1 -0
  262. package/dist/ui/code-viewer-lang.js +190 -0
  263. package/dist/ui/code-viewer-lang.js.map +1 -0
  264. package/dist/ui/code-viewer-theme.d.ts +5 -0
  265. package/dist/ui/code-viewer-theme.d.ts.map +1 -0
  266. package/dist/ui/code-viewer-theme.js +138 -0
  267. package/dist/ui/code-viewer-theme.js.map +1 -0
  268. package/dist/ui/controls/back-to-top-css.generated.d.ts +2 -0
  269. package/dist/ui/controls/back-to-top-css.generated.d.ts.map +1 -0
  270. package/dist/ui/controls/back-to-top-css.generated.js +4 -0
  271. package/dist/ui/controls/back-to-top-css.generated.js.map +1 -0
  272. package/dist/ui/controls/button-css.generated.d.ts +2 -0
  273. package/dist/ui/controls/button-css.generated.d.ts.map +1 -0
  274. package/dist/ui/controls/button-css.generated.js +4 -0
  275. package/dist/ui/controls/button-css.generated.js.map +1 -0
  276. package/dist/ui/controls/datetime-css.generated.d.ts +2 -0
  277. package/dist/ui/controls/datetime-css.generated.d.ts.map +1 -0
  278. package/dist/ui/controls/datetime-css.generated.js +4 -0
  279. package/dist/ui/controls/datetime-css.generated.js.map +1 -0
  280. package/dist/ui/controls/field-css.generated.d.ts +2 -0
  281. package/dist/ui/controls/field-css.generated.d.ts.map +1 -0
  282. package/dist/ui/controls/field-css.generated.js +4 -0
  283. package/dist/ui/controls/field-css.generated.js.map +1 -0
  284. package/dist/ui/controls/hint-css.generated.d.ts +2 -0
  285. package/dist/ui/controls/hint-css.generated.d.ts.map +1 -0
  286. package/dist/ui/controls/hint-css.generated.js +4 -0
  287. package/dist/ui/controls/hint-css.generated.js.map +1 -0
  288. package/dist/ui/controls/loading-css.generated.d.ts +2 -0
  289. package/dist/ui/controls/loading-css.generated.d.ts.map +1 -0
  290. package/dist/ui/controls/loading-css.generated.js +4 -0
  291. package/dist/ui/controls/loading-css.generated.js.map +1 -0
  292. package/dist/ui/controls/segmented-css.generated.d.ts +2 -0
  293. package/dist/ui/controls/segmented-css.generated.d.ts.map +1 -0
  294. package/dist/ui/controls/segmented-css.generated.js +4 -0
  295. package/dist/ui/controls/segmented-css.generated.js.map +1 -0
  296. package/dist/ui/controls-css.d.ts +7 -8
  297. package/dist/ui/controls-css.d.ts.map +1 -1
  298. package/dist/ui/controls-css.js +13 -8
  299. package/dist/ui/controls-css.js.map +1 -1
  300. package/dist/ui/css.d.ts +5 -0
  301. package/dist/ui/css.d.ts.map +1 -1
  302. package/dist/ui/css.js +13 -4
  303. package/dist/ui/css.js.map +1 -1
  304. package/dist/ui/datetime-logic.d.ts +100 -0
  305. package/dist/ui/datetime-logic.d.ts.map +1 -0
  306. package/dist/ui/datetime-logic.js +193 -0
  307. package/dist/ui/datetime-logic.js.map +1 -0
  308. package/dist/ui/feedback-css.d.ts +1 -1
  309. package/dist/ui/feedback-css.d.ts.map +1 -1
  310. package/dist/ui/feedback-css.generated.d.ts +2 -0
  311. package/dist/ui/feedback-css.generated.d.ts.map +1 -0
  312. package/dist/ui/feedback-css.generated.js +4 -0
  313. package/dist/ui/feedback-css.generated.js.map +1 -0
  314. package/dist/ui/feedback-css.js +1 -53
  315. package/dist/ui/feedback-css.js.map +1 -1
  316. package/dist/ui/host-data.d.ts +103 -0
  317. package/dist/ui/host-data.d.ts.map +1 -0
  318. package/dist/ui/host-data.js +106 -0
  319. package/dist/ui/host-data.js.map +1 -0
  320. package/dist/ui/host-toast.d.ts +23 -0
  321. package/dist/ui/host-toast.d.ts.map +1 -0
  322. package/dist/ui/host-toast.js +34 -0
  323. package/dist/ui/host-toast.js.map +1 -0
  324. package/dist/ui/index.d.ts +12 -6
  325. package/dist/ui/index.d.ts.map +1 -1
  326. package/dist/ui/index.js +10 -4
  327. package/dist/ui/index.js.map +1 -1
  328. package/dist/ui/marquee-css.d.ts +2 -0
  329. package/dist/ui/marquee-css.d.ts.map +1 -0
  330. package/dist/ui/marquee-css.generated.d.ts +2 -0
  331. package/dist/ui/marquee-css.generated.d.ts.map +1 -0
  332. package/dist/ui/marquee-css.generated.js +4 -0
  333. package/dist/ui/marquee-css.generated.js.map +1 -0
  334. package/dist/ui/marquee-css.js +4 -0
  335. package/dist/ui/marquee-css.js.map +1 -0
  336. package/dist/ui/modal-host.d.ts +30 -0
  337. package/dist/ui/modal-host.d.ts.map +1 -0
  338. package/dist/ui/modal-host.js +101 -0
  339. package/dist/ui/modal-host.js.map +1 -0
  340. package/dist/ui/official.d.ts.map +1 -1
  341. package/dist/ui/official.js +45 -1
  342. package/dist/ui/official.js.map +1 -1
  343. package/dist/ui/panel-dock-css.d.ts +2 -0
  344. package/dist/ui/panel-dock-css.d.ts.map +1 -0
  345. package/dist/ui/panel-dock-css.generated.d.ts +2 -0
  346. package/dist/ui/panel-dock-css.generated.d.ts.map +1 -0
  347. package/dist/ui/panel-dock-css.generated.js +4 -0
  348. package/dist/ui/panel-dock-css.generated.js.map +1 -0
  349. package/dist/ui/panel-dock-css.js +4 -0
  350. package/dist/ui/panel-dock-css.js.map +1 -0
  351. package/dist/ui/panel-dock-logic.d.ts +50 -0
  352. package/dist/ui/panel-dock-logic.d.ts.map +1 -0
  353. package/dist/ui/panel-dock-logic.js +64 -0
  354. package/dist/ui/panel-dock-logic.js.map +1 -0
  355. package/dist/ui/picker-css.d.ts +1 -1
  356. package/dist/ui/picker-css.d.ts.map +1 -1
  357. package/dist/ui/picker-css.generated.d.ts +2 -0
  358. package/dist/ui/picker-css.generated.d.ts.map +1 -0
  359. package/dist/ui/picker-css.generated.js +4 -0
  360. package/dist/ui/picker-css.generated.js.map +1 -0
  361. package/dist/ui/picker-css.js +1 -48
  362. package/dist/ui/picker-css.js.map +1 -1
  363. package/dist/ui/picker-icons.d.ts +12 -0
  364. package/dist/ui/picker-icons.d.ts.map +1 -0
  365. package/dist/ui/picker-icons.js +29 -0
  366. package/dist/ui/picker-icons.js.map +1 -0
  367. package/dist/ui/picker-logic.d.ts +4 -1
  368. package/dist/ui/picker-logic.d.ts.map +1 -1
  369. package/dist/ui/picker-logic.js +1 -2
  370. package/dist/ui/picker-logic.js.map +1 -1
  371. package/dist/ui/resizer.d.ts +3 -1
  372. package/dist/ui/resizer.d.ts.map +1 -1
  373. package/dist/ui/resizer.js +1 -1
  374. package/dist/ui/resizer.js.map +1 -1
  375. package/dist/ui/toast-host.d.ts +24 -0
  376. package/dist/ui/toast-host.d.ts.map +1 -0
  377. package/dist/ui/toast-host.js +20 -0
  378. package/dist/ui/toast-host.js.map +1 -0
  379. package/dist/utils/date.d.ts +8 -0
  380. package/dist/utils/date.d.ts.map +1 -1
  381. package/dist/utils/date.js +16 -0
  382. package/dist/utils/date.js.map +1 -1
  383. package/dist/utils/i18n.d.ts +1 -1
  384. package/dist/utils/i18n.d.ts.map +1 -1
  385. package/dist/utils/i18n.js +437 -18
  386. package/dist/utils/i18n.js.map +1 -1
  387. package/dist/utils/index.d.ts +1 -1
  388. package/dist/utils/index.d.ts.map +1 -1
  389. package/dist/utils/index.js +1 -1
  390. package/dist/utils/index.js.map +1 -1
  391. package/dist/utils/path.d.ts.map +1 -1
  392. package/dist/utils/path.js +1 -0
  393. package/dist/utils/path.js.map +1 -1
  394. package/docs/README.md +12 -5
  395. package/docs/design/architecture.md +38 -8
  396. package/docs/design/copywriting.md +95 -0
  397. package/docs/design/doc-format.md +80 -0
  398. package/docs/design/doc-format.ts +39 -0
  399. package/docs/design/external/dsh-host.md +150 -1
  400. package/docs/design/features.md +4 -17
  401. package/docs/design/methods.md +13 -34
  402. package/docs/design/structure.md +25 -22
  403. package/docs/design/style.md +24 -50
  404. package/docs/help/design.doc.ts +112 -0
  405. package/docs/help/design.md +88 -0
  406. package/docs/help/explorer.doc.ts +136 -0
  407. package/docs/help/explorer.md +68 -0
  408. package/docs/help/index.doc.ts +79 -0
  409. package/docs/help/index.md +28 -0
  410. package/docs/help/integration.doc.ts +114 -0
  411. package/docs/help/integration.md +127 -0
  412. package/docs/help/methods.md +58 -0
  413. package/docs/help/session.doc.ts +154 -0
  414. package/docs/help/session.md +91 -0
  415. package/docs/help/style.md +80 -0
  416. package/docs/help/ui.doc.ts +404 -0
  417. package/docs/help/ui.md +342 -0
  418. package/docs/help/utils.doc.ts +133 -0
  419. package/docs/help/utils.md +96 -0
  420. package/docs/requirements.md +33 -12
  421. package/package.json +44 -3
  422. package/dist/ui/ErrorBoundary.d.ts +0 -22
  423. package/dist/ui/ErrorBoundary.d.ts.map +0 -1
  424. package/dist/ui/ErrorBoundary.js +0 -30
  425. package/dist/ui/ErrorBoundary.js.map +0 -1
  426. package/docs/design/features/design.md +0 -55
  427. package/docs/design/features/explorer.md +0 -73
  428. package/docs/design/features/session.md +0 -70
  429. package/docs/design/features/ui.md +0 -225
  430. package/docs/design/features/utils.md +0 -64
  431. package/docs/examples/integration.md +0 -103
@@ -0,0 +1,134 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/ChatGroupSeat.js(0.1.7-rc.2 lib/client.js:2178-2385)
2
+ // 二级收折:root[data-step-process] > title(button,activity 图标 ↔ 箭头 hover/展开互换,
3
+ // label = processTitle(summary))+ body(max-height min(400px,50vh),上下 24px 渐隐遮罩,
4
+ // --dsh-chat-flow-gap:8px)> content > 组内条目(ChatNodeSeat 逐个,三级各自展开)。
5
+ // 外层可见性沿用官方 outerHidden:foldCompleted && turn 已闭合 && 有 spec && !alwaysOpen
6
+ // && 存储的 answerStep 不匹配 ⇒ 整组 hidden(一级「用时 N 秒」行收起时组随之隐藏)。
7
+ // grouped(历史轮才收折:policy.stepGrouping === 'history' && turn 非 open)为 false 时
8
+ // 隐藏标题行、body 展开不限高(expandedBody)。
9
+ import { createElement as h, useCallback, useEffect, useRef, useState } from 'react';
10
+ import { IconAgentPresetOutlineRegular, IconApiOutlineRegular, IconBrowseOutlineRegular, IconChevronDownOutlineRegular, IconChevronUpOutlineRegular, IconCodeOutlineRegular, IconEditOutlineRegular, IconGlobeOutlineRegular, IconPlanOutlineRegular, IconQuestionOutlineRegular, IconSearchOutlineRegular, IconSparkleRegular, IconThinkOutlineRegular, } from '../../ui/official.js';
11
+ import { officialClass } from '../official-classes.js';
12
+ import { ChatNodeSeatMirror, readPresentation } from './ChatNodeSeat.js';
13
+ import { processTitle } from './process-groups.js';
14
+ /** 官方 PROCESS_ICONS(lib/client.js:2187-2201);工具行图标同源(edit/write=铅笔、generic=sparkle)。 */
15
+ export const PROCESS_ICONS = {
16
+ thinking: IconThinkOutlineRegular,
17
+ read: IconBrowseOutlineRegular,
18
+ readImage: IconBrowseOutlineRegular,
19
+ search: IconSearchOutlineRegular,
20
+ edit: IconEditOutlineRegular,
21
+ write: IconEditOutlineRegular,
22
+ commands: IconApiOutlineRegular,
23
+ code: IconCodeOutlineRegular,
24
+ webSearch: IconGlobeOutlineRegular,
25
+ webFetch: IconBrowseOutlineRegular,
26
+ subagents: IconAgentPresetOutlineRegular,
27
+ plan: IconPlanOutlineRegular,
28
+ questions: IconQuestionOutlineRegular,
29
+ tools: IconSparkleRegular,
30
+ };
31
+ /** 官方图标尺寸(14px,除 thinking/commands/webSearch/plan/questions 用默认)。 */
32
+ const SMALL_ICONS = new Set([
33
+ 'read', 'readImage', 'search', 'edit', 'write', 'code', 'webFetch', 'subagents', 'tools',
34
+ ]);
35
+ /** 过程分组(二级收折):汇总行 + 组内条目。 */
36
+ export function ChatGroupSeatMirror(props) {
37
+ const { group, grouped, store, openState, onSetOpen, foldCompleted, renderNode, t } = props;
38
+ const [open, setOpen] = useState(false);
39
+ const first = group.members[0];
40
+ const firstNode = first === undefined ? undefined : store?.get(first.key);
41
+ const presentation = first === undefined
42
+ ? undefined
43
+ : readPresentation(store, first.key);
44
+ const spec = presentation?.spec ?? undefined;
45
+ const location = firstNode?.location;
46
+ const reason = location?.kind === 'turn' || location?.kind === 'step'
47
+ ? location.turn?.end?.data?.reason?.kind
48
+ : undefined;
49
+ // 官方 ChatGroupSeat 的 alwaysOpen(2301):与 seat 的版本略有差异(多 turnClosed === false 分支)。
50
+ const alwaysOpen = presentation?.turnClosed === false
51
+ || presentation?.hasInterleavedInput === true
52
+ || reason === 'aborted'
53
+ || reason === 'error';
54
+ const storedAnswerStep = openState.get(group.data.turn);
55
+ const outerHidden = foldCompleted && presentation?.turnClosed === true && spec !== undefined
56
+ && !alwaysOpen && storedAnswerStep !== (spec.answerStep ?? 0);
57
+ useEffect(() => {
58
+ if (outerHidden)
59
+ setOpen(false);
60
+ }, [outerHidden]);
61
+ const bodyRef = useRef(null);
62
+ const [edges, setEdges] = useState({ up: false, down: false });
63
+ const measure = useCallback(() => {
64
+ const el = bodyRef.current;
65
+ if (el === null)
66
+ return;
67
+ setEdges({
68
+ up: el.scrollTop > 1,
69
+ down: el.scrollTop + el.clientHeight < el.scrollHeight - 1,
70
+ });
71
+ }, []);
72
+ useEffect(() => {
73
+ if (grouped && open)
74
+ measure();
75
+ }, [grouped, open, measure]);
76
+ if (first === undefined || firstNode === undefined)
77
+ return null;
78
+ const label = group.data.closed ? processTitle(group.data.summary, t) : t('stepProcessDoneThinking');
79
+ const activity = group.data.summary.counts[0]?.kind ?? 'thinking';
80
+ const ActivityIcon = PROCESS_ICONS[activity] ?? IconThinkOutlineRegular;
81
+ const bodyClass = [
82
+ officialClass('ChatGroupSeat', 'body') ?? '',
83
+ grouped ? '' : officialClass('ChatGroupSeat', 'expandedBody') ?? '',
84
+ grouped && edges.up ? officialClass('ChatGroupSeat', 'fadeTop') ?? '' : '',
85
+ grouped && edges.down ? officialClass('ChatGroupSeat', 'fadeBottom') ?? '' : '',
86
+ ].filter(part => part !== '').join(' ');
87
+ return h('div', {
88
+ className: officialClass('ChatGroupSeat', 'root') ?? '',
89
+ 'data-chat-group-key': group.key,
90
+ 'data-chat-flow-key': group.key,
91
+ 'data-chat-anchor-key': `group:${group.key}`,
92
+ 'data-chat-turn': group.data.turn,
93
+ 'data-step-process': true,
94
+ 'data-group-expanded-mode': !grouped || undefined,
95
+ hidden: outerHidden || undefined,
96
+ }, grouped
97
+ ? h('button', {
98
+ type: 'button',
99
+ className: officialClass('ChatGroupSeat', 'title') ?? '',
100
+ 'aria-expanded': open,
101
+ onClick: () => { setOpen(value => !value); },
102
+ }, h('span', {
103
+ className: officialClass('ChatGroupSeat', 'leading') ?? '',
104
+ 'aria-hidden': true,
105
+ }, h('span', {
106
+ className: officialClass('ChatGroupSeat', 'activityIcon') ?? '',
107
+ 'data-step-process-icon': true,
108
+ }, h(ActivityIcon, SMALL_ICONS.has(activity) ? { size: 14 } : {})), open
109
+ ? h(IconChevronUpOutlineRegular, { className: officialClass('ChatGroupSeat', 'chevron') ?? '' })
110
+ : h(IconChevronDownOutlineRegular, { className: officialClass('ChatGroupSeat', 'chevron') ?? '' })), h('span', { className: officialClass('ChatGroupSeat', 'label') ?? '' }, label))
111
+ : null, h('div', {
112
+ ref: bodyRef,
113
+ className: bodyClass,
114
+ 'data-step-process-body': true,
115
+ 'data-scroll-up': edges.up || undefined,
116
+ 'data-scroll-down': edges.down || undefined,
117
+ onScroll: measure,
118
+ hidden: grouped && !open || undefined,
119
+ }, h('div', {
120
+ className: officialClass('ChatGroupSeat', 'content') ?? '',
121
+ 'data-step-process-content': true,
122
+ 'data-chat-flow': '',
123
+ }, group.members.map(member => h(ChatNodeSeatMirror, {
124
+ key: JSON.stringify([member.key, member.groupPart ?? null]),
125
+ node: store?.get(member.key) ?? { key: member.key, kind: '', anchorSeq: 0 },
126
+ groupPart: member.groupPart,
127
+ store,
128
+ openState,
129
+ onSetOpen,
130
+ foldCompleted,
131
+ renderNode,
132
+ })))));
133
+ }
134
+ //# sourceMappingURL=ChatGroupSeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatGroupSeat.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatGroupSeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { createElement as h } from 'react';
2
+ import type { ReactNode } from 'react';
3
+ import type { ChatNodeFace, ChatNodeStoreFace, NodeLocationFace, TurnLocationFace, TurnProcessPresentationFace, TurnProcessSpecFace } from '../faces.js';
4
+ /**
5
+ * 官方 TURN_PROCESS_INDEPENDENT_KINDS(lib/client.js:1525):这些 kind 永远不进过程折叠区。
6
+ */
7
+ export declare const TURN_PROCESS_INDEPENDENT_KINDS: ReadonlySet<string>;
8
+ /**
9
+ * 读过程席位快照。宿主 API 形态变了也只降级成「不折叠」,不让整个弹窗白屏。
10
+ */
11
+ export declare function readPresentation(store: ChatNodeStoreFace | undefined, key: string): TurnProcessPresentationFace | undefined;
12
+ /** 交给节点视图的 Turn 过程席位(官方 owner.turnProcess,ChatNodeSeat.tsx:1693-1706)。 */
13
+ export interface TurnProcessHandle {
14
+ spec?: TurnProcessSpecFace;
15
+ foldable: boolean;
16
+ hasContent: boolean;
17
+ open: boolean;
18
+ /** 官方 turnProcessAlwaysOpen(node):live / 已停止 / 失败的 turn 不允许折叠。 */
19
+ alwaysOpen: boolean;
20
+ setOpen(open: boolean): void;
21
+ }
22
+ /** 节点视图渲染函数(官方 slot "conversation.chat.node" 的等价物)。 */
23
+ export type NodeRenderer = (node: ChatNodeFace, turnProcess: TurnProcessHandle | undefined,
24
+ /** 官方 groupPart:'reasoning' 只渲染思考块(组内),'response' 只渲染回复正文(组外)。 */
25
+ groupPart?: 'response' | 'reasoning') => ReactNode;
26
+ /** 取节点所属 turn(官方 turnOf,ChatNodeSeat.tsx:1660)。 */
27
+ export declare function turnOf(node: ChatNodeFace | undefined): number | undefined;
28
+ /** 官方 turnProcessAlwaysOpen(lib/client.js:1558):live / 已停止 / 失败的 turn 不折叠。 */
29
+ export declare function turnProcessAlwaysOpen(node: ChatNodeFace | undefined): boolean;
30
+ /** 一个 keyed 节点 → 一个 flowItem(官方 ChatNodeSeat 的 JSX 等价物)。 */
31
+ export declare function ChatNodeSeatMirror(props: {
32
+ node: ChatNodeFace;
33
+ groupPart?: 'response' | 'reasoning';
34
+ store?: ChatNodeStoreFace;
35
+ /** turn → 已展开的 answerStep(官方 store 的 storedTurnProcessEntry)。 */
36
+ openState: ReadonlyMap<number, number>;
37
+ onSetOpen(turn: number, answerStep: number, open: boolean): void;
38
+ /** 官方 usePresentation(policy => policy.foldCompletedTurns);历史只读视图恒 true。 */
39
+ foldCompleted: boolean;
40
+ renderNode: NodeRenderer;
41
+ }): ReturnType<typeof h> | null;
42
+ export type { NodeLocationFace, TurnLocationFace };
43
+ //# sourceMappingURL=ChatNodeSeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatNodeSeat.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ChatNodeSeat.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAEpB;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAS7D,CAAA;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS,CAS3H;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,mBAAmB,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAC7B;AAED,uDAAuD;AACvD,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,iBAAiB,GAAG,SAAS;AAC1C,kEAAkE;AAClE,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,KACjC,SAAS,CAAA;AAEd,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAK7E;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,CAAA;IACpC,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,iEAAiE;IACjE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAChE,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,YAAY,CAAA;CACzB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAgE9B;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,133 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/ChatNodeSeat.tsx(0.1.7-rc.2 lib/client.js:1668-1771)
2
+ // + 同文件里的 ChatNodeList(lib/client.js:5004-5038,order → seat 列表)。
3
+ //
4
+ // 这是「官方把一个 turn 折成一行」的全部判定,逐行照抄(源码行号见兄弟项目 ui-map §十七):
5
+ // liveProcess = presentation && !turnClosed
6
+ // alwaysOpen = liveProcess || hasInterleavedInput || turnProcessAlwaysOpen(node)
7
+ // processOpen = alwaysOpen || stored.answerStep === spec.answerStep
8
+ // processWindowReady = spec && presentation && foldCompleted && presentation.turn === spec.turn && (turnStarted || turnClosed)
9
+ // processMember = !TURN_PROCESS_INDEPENDENT_KINDS.has(kind) && anchorSeq >= spec.processStartSeq
10
+ // && (liveProcess || spec.answerAnchorSeq === null || anchorSeq < spec.answerAnchorSeq
11
+ // || groupPart === 'reasoning' && kind === 'assistant-step' && data.step === spec.answerStep)
12
+ // processAnswer = !liveProcess && groupPart !== 'reasoning' && kind === 'assistant-step' && data.step === spec.answerStep
13
+ // ownsDisclosure = kind === 'turn-process' || processAnswer
14
+ // foldable = processWindowReady && (liveProcess || processMember || ownsDisclosure)
15
+ // controllerInactive = kind === 'turn-process' && foldCompleted && !foldable
16
+ // compactAnswer = processAnswer && foldable && presentation.compactAnswer && !processOpen
17
+ // processHidden = controllerInactive || (foldable && processMember && !processOpen)
18
+ // 折叠 = 给 flowItem 写 hidden 属性(官方由 useSearchableHidden 响应式置位,这里声明式写)。
19
+ // ⚠ 与官方的两点已知偏差(只读历史场景等价,写在此处便于日后 diff):
20
+ // 1. 官方每个 seat 各自订阅 nodeStore/processSource;我们按「外层快照变化 ⇒ 整体重算」读取。
21
+ // 2. 官方 grouped('chat') 的分组项(ChatGroupSeat)由 process-groups.ts 算法移植补齐。
22
+ import { createElement as h } from 'react';
23
+ import { officialClass } from '../official-classes.js';
24
+ /**
25
+ * 官方 TURN_PROCESS_INDEPENDENT_KINDS(lib/client.js:1525):这些 kind 永远不进过程折叠区。
26
+ */
27
+ export const TURN_PROCESS_INDEPENDENT_KINDS = new Set([
28
+ 'system-prompt',
29
+ 'user',
30
+ 'steering',
31
+ 'turn-trigger',
32
+ 'turn-process',
33
+ 'turn-error',
34
+ 'turn-max-tokens',
35
+ 'turn-tail',
36
+ ]);
37
+ /**
38
+ * 读过程席位快照。宿主 API 形态变了也只降级成「不折叠」,不让整个弹窗白屏。
39
+ */
40
+ export function readPresentation(store, key) {
41
+ if (store === undefined)
42
+ return undefined;
43
+ try {
44
+ const source = store.processSource;
45
+ if (typeof source !== 'function')
46
+ return undefined;
47
+ return source.call(store, key)?.getSnapshot();
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ /** 取节点所属 turn(官方 turnOf,ChatNodeSeat.tsx:1660)。 */
54
+ export function turnOf(node) {
55
+ const location = node?.location;
56
+ return location?.kind === 'turn' || location?.kind === 'step' ? location.turn?.turn : undefined;
57
+ }
58
+ /** 官方 turnProcessAlwaysOpen(lib/client.js:1558):live / 已停止 / 失败的 turn 不折叠。 */
59
+ export function turnProcessAlwaysOpen(node) {
60
+ const location = node?.location;
61
+ if (location?.kind !== 'turn' && location?.kind !== 'step')
62
+ return false;
63
+ const reason = location.turn?.end?.data?.reason?.kind;
64
+ return location.turn?.status === 'open' || reason === 'aborted' || reason === 'error';
65
+ }
66
+ /** 一个 keyed 节点 → 一个 flowItem(官方 ChatNodeSeat 的 JSX 等价物)。 */
67
+ export function ChatNodeSeatMirror(props) {
68
+ const { node, groupPart, store, openState, onSetOpen, foldCompleted, renderNode } = props;
69
+ const turn = turnOf(node);
70
+ const presentation = readPresentation(store, node.key);
71
+ // 官方 spec 来自 presentation;弹窗读归档会话时投影可能更薄 ⇒ turn-process 自身 data 兜底。
72
+ const spec = (presentation?.spec ?? undefined)
73
+ ?? (node.kind === 'turn-process' ? node.data : undefined);
74
+ const liveProcess = presentation !== undefined && presentation.turnClosed !== true;
75
+ const interleavedInput = presentation?.hasInterleavedInput === true;
76
+ const alwaysOpen = liveProcess || interleavedInput || turnProcessAlwaysOpen(node);
77
+ const storedAnswerStep = turn === undefined ? undefined : openState.get(turn);
78
+ const processOpen = alwaysOpen || (spec !== undefined && storedAnswerStep === (spec.answerStep ?? 0));
79
+ const setOpen = (open) => {
80
+ if (spec !== undefined && !alwaysOpen && turn !== undefined)
81
+ onSetOpen(turn, spec.answerStep ?? 0, open);
82
+ };
83
+ const processWindowReady = spec !== undefined && presentation !== undefined && foldCompleted
84
+ && presentation.turn === spec.turn
85
+ && (presentation.turnStarted === true || presentation.turnClosed === true);
86
+ const dataStep = typeof node.data?.step === 'number' ? node.data.step : undefined;
87
+ const processMember = processWindowReady && spec !== undefined
88
+ && !TURN_PROCESS_INDEPENDENT_KINDS.has(node.kind)
89
+ && node.anchorSeq >= spec.processStartSeq
90
+ && (liveProcess
91
+ || spec.answerAnchorSeq === null
92
+ || node.anchorSeq < spec.answerAnchorSeq
93
+ || (groupPart === 'reasoning' && node.kind === 'assistant-step' && dataStep === spec.answerStep));
94
+ const processAnswer = processWindowReady && spec !== undefined && !liveProcess
95
+ && groupPart !== 'reasoning'
96
+ && node.kind === 'assistant-step'
97
+ && dataStep === spec.answerStep;
98
+ const ownsDisclosure = node.kind === 'turn-process' || processAnswer;
99
+ const foldable = processWindowReady && (liveProcess || processMember || ownsDisclosure);
100
+ const turnProcess = spec === undefined ? undefined : {
101
+ spec,
102
+ foldable,
103
+ hasContent: !interleavedInput && (presentation?.hasExternalProcess === true || spec.inlineReasoning),
104
+ open: processOpen,
105
+ alwaysOpen,
106
+ setOpen,
107
+ };
108
+ const controllerInactive = node.kind === 'turn-process' && foldCompleted && !foldable;
109
+ const compactAnswer = processAnswer && foldable && presentation?.compactAnswer === true && !processOpen;
110
+ const processHidden = controllerInactive || (foldable && processMember && !processOpen);
111
+ // ⚠ groupPart 必须传给节点视图:'reasoning' 只渲染思考块、'response' 只渲染回复正文
112
+ // (官方块渲染器 lib/client.js:5824-5825)。漏传会把整步(思考+文本+工具块)全画出来——
113
+ // 步内工具块再画一张 = 与独立工具节点重复(真机踩过,2026-09-27)。
114
+ const inner = renderNode(node, turnProcess, groupPart);
115
+ if (inner === null || inner === undefined)
116
+ return null;
117
+ const flowKey = groupPart === undefined || groupPart === 'response' ? node.key : JSON.stringify([node.key, groupPart]);
118
+ return h('div', {
119
+ className: officialClass('ChatView', 'flowItem') ?? '',
120
+ 'data-chat-anchor-key': flowKey,
121
+ 'data-chat-flow-key': flowKey,
122
+ 'data-chat-paging-anchor': node.kind !== 'turn-process' || undefined,
123
+ 'data-chat-node-key': node.key,
124
+ 'data-chat-group-part': groupPart,
125
+ 'data-chat-flow-kind': node.kind,
126
+ 'data-chat-turn': turn,
127
+ 'data-turn-process-member': processMember || undefined,
128
+ 'data-turn-process-hidden': processHidden || undefined,
129
+ 'data-turn-process-answer': compactAnswer || undefined,
130
+ hidden: processHidden || undefined,
131
+ }, inner);
132
+ }
133
+ //# sourceMappingURL=ChatNodeSeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatNodeSeat.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatNodeSeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { createElement as h } from 'react';
2
+ import type { ReactNode } from 'react';
3
+ import type { Translate } from '../../utils/i18n.js';
4
+ import type { ChatNodeStoreFace, TurnsFace } from '../faces.js';
5
+ import type { NodeRenderer } from './ChatNodeSeat.js';
6
+ import type { ChatEntry, ProcessGroupSnapshot } from './process-groups.js';
7
+ /** 会话区骨架:frame > root > scroll > column(类名一律取官方 ChatView.module.css,取不到 = 空类)。
8
+ *
9
+ * `dshpc-sv-frame` / `dshpc-sv-scroll` = 本包**稳定钩子类**(不走 officialClass 发现,官方类命中时也照样挂):
10
+ * 会话区**纵向间距的唯一真源**。官方 scroll 自带纵向 16px、官方 frame 的纵向值又不确定,
11
+ * 归一方案(移植自兄弟项目 2026-10-03 定尺):**scroll 钩子把官方纵向 16px 归零,
12
+ * frame 钩子独自定 17/17**,两条钩子都用双类名提高特异性压过官方 CSS module(0,2,0 > 0,1,0),
13
+ * 不依赖注入顺序 ⇒ 命中 / 未命中两条路径纵向完全一致。
14
+ */
15
+ export declare function ChatViewFrame(props: {
16
+ children?: ReactNode;
17
+ }): ReturnType<typeof h>;
18
+ /** 官方 ChatNodeList:order → seat 列表(grouped 视图 = entries + groups 路径)。 */
19
+ export declare function ChatNodeListMirror(props: {
20
+ order: readonly string[];
21
+ store?: ChatNodeStoreFace;
22
+ /** 官方 grouped('chat') 的 entries + 组快照(buildProcessGroups 产出);缺省走 order 兜底。 */
23
+ entries?: ReadonlyArray<ChatEntry>;
24
+ groups?: ReadonlyMap<string, ProcessGroupSnapshot>;
25
+ /** 官方 timeline.turns(判 turn 是否 open ⇒ grouped 政策)。 */
26
+ turns?: TurnsFace;
27
+ openState: ReadonlyMap<number, number>;
28
+ onSetOpen(turn: number, answerStep: number, open: boolean): void;
29
+ foldCompleted: boolean;
30
+ renderNode: NodeRenderer;
31
+ t: Translate;
32
+ }): Array<ReturnType<typeof h> | null>;
33
+ /** 加载 / 空态提示行(13px tertiary)。 */
34
+ export declare function ChatHint(props: {
35
+ text: string;
36
+ }): ReturnType<typeof h>;
37
+ /** 「加载更早记录」按钮(官方 older:按钮 4px 12px / 12px 字号 / radius-sm / 底色 interactive-bg-hover-solid)。 */
38
+ export declare function ChatOlderButton(props: {
39
+ label: string;
40
+ onClick: () => void;
41
+ }): ReturnType<typeof h>;
42
+ /** 「到底部」悬浮钮(官方 toBottom:34×34 圆形悬浮,仅在有更多历史时显示)。 */
43
+ export declare function ChatToBottom(props: {
44
+ label: string;
45
+ onClick: () => void;
46
+ }): ReturnType<typeof h>;
47
+ //# sourceMappingURL=ChatView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ChatView.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1E;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAQnF;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAClD,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAChE,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,YAAY,CAAA;IACxB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA8ErC;AAQD,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAEtE;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAInG;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAIhG"}
@@ -0,0 +1,127 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/ChatView.tsx(0.1.7-rc.2 lib/client.js:5004-5260)
2
+ // 骨架四层:frame(> TurnNavigator)> root[data-chat-following-tail] > scroll > column[data-chat-flow]
3
+ // column 子项:hint(loading)/ openError / older(hasMore)/ 各 flowItem(ChatNodeList)
4
+ // root 内另有 toBottomSlot(官方按「是否贴尾」显隐,弹窗恒贴尾 ⇒ 不渲染)。
5
+ // ChatNodeList:entries → seat;官方 entries 优先取 grouped('chat'),取不到时 = order.map(key)。
6
+ import { createElement as h } from 'react';
7
+ import { officialClass } from '../official-classes.js';
8
+ import { ChatGroupSeatMirror } from './ChatGroupSeat.js';
9
+ import { ChatNodeSeatMirror } from './ChatNodeSeat.js';
10
+ /** 会话区骨架:frame > root > scroll > column(类名一律取官方 ChatView.module.css,取不到 = 空类)。
11
+ *
12
+ * `dshpc-sv-frame` / `dshpc-sv-scroll` = 本包**稳定钩子类**(不走 officialClass 发现,官方类命中时也照样挂):
13
+ * 会话区**纵向间距的唯一真源**。官方 scroll 自带纵向 16px、官方 frame 的纵向值又不确定,
14
+ * 归一方案(移植自兄弟项目 2026-10-03 定尺):**scroll 钩子把官方纵向 16px 归零,
15
+ * frame 钩子独自定 17/17**,两条钩子都用双类名提高特异性压过官方 CSS module(0,2,0 > 0,1,0),
16
+ * 不依赖注入顺序 ⇒ 命中 / 未命中两条路径纵向完全一致。
17
+ */
18
+ export function ChatViewFrame(props) {
19
+ return h('div', { className: `${officialClass('ChatView', 'frame') ?? ''} dshpc-sv-frame dshpc-sv-chat` }, h('div', { className: officialClass('ChatView', 'root') ?? '' }, h('div', { className: `${officialClass('ChatView', 'scroll') ?? ''} dshpc-sv-scroll` }, h('div', { className: officialClass('ChatView', 'column') ?? '', 'data-chat-flow': '' }, props.children))));
20
+ }
21
+ /** 官方 ChatNodeList:order → seat 列表(grouped 视图 = entries + groups 路径)。 */
22
+ export function ChatNodeListMirror(props) {
23
+ const { order, store, entries, groups, turns, openState, onSetOpen, foldCompleted, renderNode, t } = props;
24
+ const rows = [];
25
+ const read = store === undefined ? undefined : store.get;
26
+ if (typeof read !== 'function' || store === undefined)
27
+ return rows;
28
+ const readSafe = (key) => {
29
+ try {
30
+ return read.call(store, key);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ };
36
+ if (entries !== undefined && groups !== undefined) {
37
+ // 官方 deferCollapse:**每一轮(turn)的最后那一个过程组**保持 flat
38
+ // (不画「已完成分析…」头、组内条目直接铺开),该轮其余组照常收折。
39
+ // 例:turn 1 切出 2 组 ⇒ 前 1 组收折、最后 1 组平铺;turn 3 切出 5 组 ⇒ 前 4 组收折、最后 1 组平铺。
40
+ // ⚠️ turn = -1 的组(command 节点无 turn location,process-groups.ts:176 `turn ?? -1`)
41
+ // **不开新轮**,并入它前面那一轮 —— 否则会被单独当成一轮、多平铺一处(真机 2026-10-23)。
42
+ const flatKeys = new Set();
43
+ {
44
+ let bucket = [];
45
+ let bucketTurn;
46
+ const closeBucket = () => {
47
+ const last = bucket[bucket.length - 1];
48
+ if (last !== undefined)
49
+ flatKeys.add(last);
50
+ bucket = [];
51
+ };
52
+ for (const entry of entries) {
53
+ if (entry.kind !== 'group')
54
+ continue;
55
+ const turn = groups.get(entry.key)?.data.turn ?? -1;
56
+ if (turn >= 1) {
57
+ if (bucketTurn !== undefined && turn !== bucketTurn)
58
+ closeBucket();
59
+ bucketTurn = turn;
60
+ }
61
+ bucket.push(entry.key);
62
+ }
63
+ closeBucket();
64
+ }
65
+ // 官方 ChatNodeList 的 entries 路径:group 条目 → ChatGroupSeat(二级收折)。
66
+ for (const entry of entries) {
67
+ if (entry.kind === 'group') {
68
+ const group = groups.get(entry.key);
69
+ if (group === undefined)
70
+ continue;
71
+ const latest = flatKeys.has(group.key);
72
+ rows.push(h(ChatGroupSeatMirror, {
73
+ key: entry.key,
74
+ group,
75
+ grouped: turnStatus(turns, group.data.turn) !== 'open' && !latest,
76
+ store,
77
+ openState,
78
+ onSetOpen,
79
+ foldCompleted,
80
+ renderNode,
81
+ t,
82
+ }));
83
+ }
84
+ else {
85
+ const node = readSafe(entry.key);
86
+ if (node === undefined)
87
+ continue;
88
+ rows.push(h(ChatNodeSeatMirror, {
89
+ key: JSON.stringify([entry.key, entry.groupPart ?? null]),
90
+ node,
91
+ groupPart: entry.groupPart,
92
+ store,
93
+ openState,
94
+ onSetOpen,
95
+ foldCompleted,
96
+ renderNode,
97
+ }));
98
+ }
99
+ }
100
+ return rows;
101
+ }
102
+ for (const key of order) {
103
+ const node = readSafe(key);
104
+ if (node === undefined)
105
+ continue;
106
+ rows.push(h(ChatNodeSeatMirror, { key, node, store, openState, onSetOpen, foldCompleted, renderNode }));
107
+ }
108
+ return rows;
109
+ }
110
+ /** turn 状态(官方 turns.get(turn)?.status)。 */
111
+ function turnStatus(turns, turn) {
112
+ const row = turns?.get(turn) ?? turns?.get(String(turn));
113
+ return row?.status;
114
+ }
115
+ /** 加载 / 空态提示行(13px tertiary)。 */
116
+ export function ChatHint(props) {
117
+ return h('div', { className: officialClass('ChatView', 'hint') ?? '' }, props.text);
118
+ }
119
+ /** 「加载更早记录」按钮(官方 older:按钮 4px 12px / 12px 字号 / radius-sm / 底色 interactive-bg-hover-solid)。 */
120
+ export function ChatOlderButton(props) {
121
+ return h('div', { className: officialClass('ChatView', 'older') ?? '' }, h('button', { type: 'button', onClick: props.onClick }, props.label));
122
+ }
123
+ /** 「到底部」悬浮钮(官方 toBottom:34×34 圆形悬浮,仅在有更多历史时显示)。 */
124
+ export function ChatToBottom(props) {
125
+ return h('div', { className: officialClass('ChatView', 'toBottomSlot') ?? '' }, h('button', { type: 'button', className: officialClass('ChatView', 'toBottom') ?? '', onClick: props.onClick, 'aria-label': props.label }, '↓'));
126
+ }
127
+ //# sourceMappingURL=ChatView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Translate } from '../../utils/i18n.js';
3
+ /** 官方 CommandNode(conversation-nodes/command.ts / records.d.ts):斜杠命令生命周期节点。 */
4
+ export interface CommandNodeFace {
5
+ readonly name?: string | null;
6
+ readonly args?: string | null;
7
+ readonly outcome?: {
8
+ readonly kind?: string;
9
+ readonly text?: string;
10
+ } | null;
11
+ }
12
+ /** 命令卡(官方 GenericCommandCard 镜像):裸命令名 + 落定摘要 + 多行输出可展开。 */
13
+ export declare function CommandCard(props: {
14
+ /** 官方 CommandNode(name/args/outcome)。 */
15
+ node: CommandNodeFace;
16
+ t: Translate;
17
+ /** 未决态运行文案;缺省用 t('commandRunning')(官方 command.running)。 */
18
+ runningSummary?: string;
19
+ }): ReactNode;
20
+ //# sourceMappingURL=CommandCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandCard.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/CommandCard.ts"],"names":[],"mappings":"AAUA,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAG3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC7E;AAaD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,yCAAyC;IACzC,IAAI,EAAE,eAAe,CAAA;IACrB,CAAC,EAAE,SAAS,CAAA;IACZ,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,SAAS,CAkDZ"}
@@ -0,0 +1,69 @@
1
+ // 官方 GenericCommandCard(ui-chat/src/client/chat/GenericCommandCard.tsx @ master,原样复刻)镜像:
2
+ // · 行标题 = 裸命令名 node.name,缺席兜底 t('commandTitle')(官方 command.title = 指令 / Command)。
3
+ // · 摘要 = outcome 落定 text:未决(outcome===null) = t('commandRunning')(执行中…);
4
+ // 已决无 text 按 kind 取 t('commandFailed')(指令失败)/ t('commandDone')(已完成)。**不用 args**。
5
+ // · state = running(未决) / error(outcome.kind==='error') / ok;running/error 各挂一个 visually-hidden 读屏状态词。
6
+ // · 展开体仅当 outcome.text 含换行(多行)才可展开;展开体 = 原文 pre-wrap。
7
+ // · 分隔符 = 2×2 小圆点;错误态 summary/body 用 error 色。
8
+ // 样式一律取宿主注入的官方 GenericCommandCard.module.css 类(officialClass),**不写自绘兜底**:
9
+ // 本包只跑在 DSH 宿主上、官方样式必在场;官方大版本更新我们跟着更,兜底既防不住「官方加东西」也无意义
10
+ // (用户 2026-10-23 定)。取不到官方类时退化为空类(裸结构、不白屏);读屏 visually-hidden 复用 ToolRow 同名工具类。
11
+ import { Fragment, createElement as h, useCallback, useState } from 'react';
12
+ import { DisclosureRow, IconApiOutlineRegular, TextShimmer } from '../../ui/official.js';
13
+ import { officialClass } from '../official-classes.js';
14
+ /** 官方 GenericCommandCard 模块类(宿主必注入;缺席 = 空串,裸结构不白屏,不写自绘兜底)。 */
15
+ const gcc = (semantic) => officialClass('GenericCommandCard', semantic) ?? '';
16
+ /** 官方 stateOf:未决 = running;outcome.kind==='error' = error;否则 ok。 */
17
+ function stateOf(outcome) {
18
+ if (outcome === null || outcome === undefined)
19
+ return 'running';
20
+ return outcome.kind === 'error' ? 'error' : 'ok';
21
+ }
22
+ /** 命令卡(官方 GenericCommandCard 镜像):裸命令名 + 落定摘要 + 多行输出可展开。 */
23
+ export function CommandCard(props) {
24
+ const { node, t, runningSummary } = props;
25
+ const [expanded, setExpanded] = useState(false);
26
+ const outcome = node.outcome ?? null;
27
+ const text = outcome?.text;
28
+ const summary = outcome === null
29
+ ? runningSummary ?? t('commandRunning')
30
+ : text ?? (outcome.kind === 'error' ? t('commandFailed') : t('commandDone'));
31
+ const title = node.name ?? t('commandTitle');
32
+ const state = stateOf(outcome);
33
+ const running = state === 'running';
34
+ // 官方:仅多行 text 才给展开体(单行摘要已够,不出 chevron)。
35
+ const body = text !== undefined && text.includes('\n') ? text : null;
36
+ const open = expanded && body !== null;
37
+ const toggle = useCallback(() => { setExpanded((value) => !value); }, []);
38
+ // 读屏 visually-hidden:复用 ToolRow 同名工具类(既有,非新写兜底)。
39
+ const hidden = officialClass('ToolRow', 'visuallyHidden') ?? '';
40
+ return h('div', { className: gcc('root'), 'data-state': state },
41
+ // 官方 a11y:running/error 的读屏状态词(visually-hidden,不占可见空间)。
42
+ state === 'running'
43
+ ? h('span', { className: hidden }, t('rowRunning'))
44
+ : state === 'error'
45
+ ? h('span', { className: hidden }, t('rowFailed'))
46
+ : null, h(DisclosureRow, {
47
+ leadingClassName: gcc('leading'),
48
+ titleClassName: gcc('title'),
49
+ icon: h(IconApiOutlineRegular, { size: 14 }),
50
+ title,
51
+ running,
52
+ open,
53
+ expandable: body !== null,
54
+ expandOnRowClick: true,
55
+ keepContentWhenOpen: true,
56
+ onToggle: toggle,
57
+ collapsedContent: h(Fragment, null, h('span', { className: gcc('separator'), 'aria-hidden': true }), h('span', {
58
+ className: gcc('summary'),
59
+ 'data-error': state === 'error' || undefined,
60
+ }, h(TextShimmer, { active: running }, summary))),
61
+ children: open && body !== null
62
+ ? h('div', {
63
+ className: gcc('body'),
64
+ 'data-error': state === 'error' || undefined,
65
+ }, body)
66
+ : undefined,
67
+ }));
68
+ }
69
+ //# sourceMappingURL=CommandCard.js.map