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,71 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/MessageIconActions.tsx(0.1.7-rc.2 lib/client.js:1098-1163)
2
+ // data-clock=start|end;start 时时钟在行首,end 时「用量 + 时钟」一起放进 endInfo(右对齐)
3
+ // > 复制(Tooltip「复制 / 已复制」,成功 1 秒后复位,用官方 writeClipboard)
4
+ // > extraActions(官方留给 👍👎 之类的插槽,弹窗没有 ⇒ 不传)
5
+ // > 分支(Tooltip「在新对话中分支 / 仅可从已完成轮次的最后一条消息分支」,unavailable 时 aria-disabled)
6
+ // > endInfo:usageAction + time(官方 formatMessageClock)
7
+ import { createElement as h, useEffect, useRef, useState } from 'react';
8
+ import { IconBranchOutlineRegular, IconCheckOutlineRegular, IconCopyOutlineRegular, Tooltip, writeClipboard, } from '../../ui/official.js';
9
+ import { officialClass } from '../official-classes.js';
10
+ import { formatMessageClock } from './message-chrome.js';
11
+ /** 官方「已复制」复位时间。 */
12
+ const COPIED_RESET_MS = 1000;
13
+ /** 消息操作行(复制 / 分支 / 用量 / 时钟)。 */
14
+ export function MessageIconActionsMirror(props) {
15
+ const { text, time, clock, onBranch, branchUnavailable = false, className, extraActions, usageAction, t } = props;
16
+ const [copied, setCopied] = useState(false);
17
+ const [pending, setPending] = useState(false);
18
+ const timerRef = useRef(undefined);
19
+ useEffect(() => () => { if (timerRef.current !== undefined)
20
+ clearTimeout(timerRef.current); }, []);
21
+ const copyLabel = copied ? t('copiedLabel') : t('copyLabel');
22
+ const onCopy = () => {
23
+ if (copied || pending)
24
+ return;
25
+ setPending(true);
26
+ void writeClipboard(text).then((ok) => {
27
+ setPending(false);
28
+ if (!ok)
29
+ return;
30
+ setCopied(true);
31
+ timerRef.current = setTimeout(() => { setCopied(false); }, COPIED_RESET_MS);
32
+ });
33
+ };
34
+ // 官方语义名是 timeStart / timeEnd(assistant 尾部 = timeEnd,字号 13px-1px)——**没有 .clock**。
35
+ // 之前写 'clock' 恒取不到 ⇒ 空类 ⇒ 时间吃浏览器默认 16px(真机 2026-10-23「时间偏大」)。
36
+ // 老版本若叫 clock 也做候选兼容(都是官方语义名,不是自绘样式)。
37
+ const clockClass = (clock === 'end'
38
+ ? officialClass('MessageIconActions', 'timeEnd') ?? officialClass('MessageIconActions', 'clock')
39
+ : officialClass('MessageIconActions', 'timeStart') ?? officialClass('MessageIconActions', 'clock')) ?? '';
40
+ const clockEl = time === undefined ? null : h('time', {
41
+ className: clockClass,
42
+ dateTime: new Date(time).toISOString(),
43
+ }, formatMessageClock(time, t));
44
+ const reasonId = 'dshpc-sv-branch-unavailable';
45
+ return h('div', {
46
+ className: `${officialClass('MessageIconActions', 'actions') ?? ''}${className === undefined ? '' : ` ${className}`}`,
47
+ 'data-clock': clock,
48
+ }, clock === 'start' ? clockEl : null, h(Tooltip, { label: copyLabel, side: 'bottom' }, h('button', {
49
+ type: 'button',
50
+ className: officialClass('MessageIconActions', 'action') ?? '',
51
+ 'aria-label': copyLabel,
52
+ onClick: onCopy,
53
+ }, copied
54
+ ? h(IconCheckOutlineRegular, null)
55
+ : h(IconCopyOutlineRegular, null))), extraActions, onBranch === undefined
56
+ ? null
57
+ : h(Tooltip, { label: branchUnavailable ? t('branchUnavailableLabel') : t('branchLabel'), side: 'bottom' }, h('button', {
58
+ type: 'button',
59
+ className: officialClass('MessageIconActions', 'action') ?? '',
60
+ 'aria-label': t('branchLabel'),
61
+ 'aria-disabled': branchUnavailable || undefined,
62
+ 'aria-describedby': branchUnavailable ? reasonId : undefined,
63
+ 'data-unavailable': branchUnavailable || undefined,
64
+ onClick: branchUnavailable ? undefined : onBranch,
65
+ }, h(IconBranchOutlineRegular, null))), onBranch === undefined || !branchUnavailable
66
+ ? null
67
+ : h('span', { id: reasonId, className: officialClass('accessibility', 'visuallyHidden') ?? '' }, t('branchUnavailableLabel')), clock === 'end'
68
+ ? h('span', { className: officialClass('MessageIconActions', 'endInfo') ?? '' }, usageAction, clockEl)
69
+ : usageAction);
70
+ }
71
+ //# sourceMappingURL=MessageIconActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageIconActions.js","sourceRoot":"","sources":["../../../src/session/mirror/MessageIconActions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { createElement as h } from 'react';
2
+ import type { Translate } from '../../utils/i18n.js';
3
+ /** 助手正文:官方 MarkdownText 渲染 + 官方 AssistantMarkdown.root 类(fallback 自绘)。
4
+ * U11:fileMentions 词表就位时行内 code 文件引用渲成可点链接(官方语义:resolve 不出保持惰性 code)。 */
5
+ export declare function AssistantMarkdown(props: {
6
+ text: string;
7
+ fileMentions?: {
8
+ resolve(value: string): {
9
+ open(): void;
10
+ label: string;
11
+ title: string;
12
+ } | undefined;
13
+ };
14
+ }): ReturnType<typeof h>;
15
+ /** 用户消息里的官方附件(file 块):`FileAttachmentRef` 只有 id / 名字 / 字节数,**没有路径**。 */
16
+ export interface UserFileFace {
17
+ name: string;
18
+ bytes: number;
19
+ }
20
+ /**
21
+ * 用户消息:官方 MessageItem userRow > userStack > bubble(右对齐气泡)
22
+ * + 气泡下方的 **attachmentRow / fileCard**(官方 MessageItem 的附件行)。
23
+ *
24
+ * 官方附件卡 = 图标 + 文件名 + 大小;**不可点开**——引用里没有路径,宿主也没给出
25
+ * 「按 attachmentId 打开」的公开面 ⇒ 如实降级为只读展示,不伪造打开行为。
26
+ */
27
+ export declare function UserMessage(props: {
28
+ text: string;
29
+ files?: readonly UserFileFace[];
30
+ }): ReturnType<typeof h>;
31
+ /** 重试节点消费面(官方 ModelRetryNode = LlmRetryEventData & {retryState},records.d.ts:112)。 */
32
+ export interface RetryAttemptFace {
33
+ retryState?: 'scheduled' | 'started' | 'cancelled';
34
+ mode?: string;
35
+ retry?: number;
36
+ maxRetries?: number;
37
+ delayMs?: number;
38
+ failure?: {
39
+ message?: string;
40
+ code?: string;
41
+ } | null;
42
+ }
43
+ /** 轮次失败节点消费面(官方 TurnErrorNode,records.d.ts:127)。 */
44
+ export interface TurnErrorFace {
45
+ message?: string;
46
+ code?: string;
47
+ }
48
+ /**
49
+ * 重试行(官方 ModelRetryItem):折叠 = 「已重试模型请求 (5/5) · 9s ⌄」摘要;
50
+ * 展开 = 重试延迟 / 失败原因 两行。active(等待重试)时官方走 250ms 倒计时 + 渐隐 shimmer。
51
+ */
52
+ export declare function ModelRetryItemMirror(props: {
53
+ node: RetryAttemptFace;
54
+ active: boolean;
55
+ t: Translate;
56
+ }): ReturnType<typeof h>;
57
+ /** 轮次失败行(官方 TurnErrorItem):红点 + 红标题「本轮运行失败」+ 灰原因 + 右侧机器码标签。 */
58
+ export declare function TurnErrorItemMirror(props: {
59
+ node: TurnErrorFace;
60
+ t: Translate;
61
+ }): ReturnType<typeof h>;
62
+ /** 限长行(官方 TurnMaxTokensItem):黄点 + 警示标题 + 截断提示。 */
63
+ export declare function TurnMaxTokensItemMirror(props: {
64
+ t: Translate;
65
+ }): ReturnType<typeof h>;
66
+ //# sourceMappingURL=MessageItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageItem.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/MessageItem.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAgC,MAAM,OAAO,CAAA;AAKxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD;yEACyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE;QAAE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG;YAAE,IAAI,IAAI,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAA;CACtG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CASvB;AAED,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CA2B1G;AAID,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACrD;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAyD3H;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAmBtG;AAED,kDAAkD;AAClD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAAE,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAYrF"}
@@ -0,0 +1,135 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/MessageItem.tsx(0.1.7-rc.2)
2
+ // 用户消息:userRow(右对齐,gap 6px)> userStack(宽 ≤ min(内容宽×.702, 82%),gap 8px)
3
+ // > bubble(background:--dsw-specific-bubble; radius-xl; padding:10px 16px; 14px/22px 行高)。
4
+ // 助手正文不走气泡:AssistantMarkdown(root 14px/24px,body 块间 gap 16px)。
5
+ // 重试/轮次失败/限长三件套同在官方 MessageItem.tsx(lib/client.js:1235-1338):
6
+ // ModelRetryItem = <details.retryRow data-active> > summary.retrySummary > span.retryText
7
+ // + div.retryDetails(重试延迟 / 失败原因 两行,retryDetailLabel 标签);
8
+ // active(retryState==='scheduled')时摘要走渐隐 shimmer + 250ms 倒计时。
9
+ // TurnErrorItem = div.turnErrorRow(grid 10px/1fr/auto)> StateDot(error) + turnErrorCopy
10
+ // (标题红 600 + 原因灰)+ code.turnErrorCode(右侧机器路由码,如 SERVER)。
11
+ // TurnMaxTokensItem= 同行结构,StateDot(warning) + maxTokensTitle(警示色)+ 提示语。
12
+ // 文案逐字抄官方词典(message.retry.* / message.turnError / message.maxTokens*,zh+en)。
13
+ import { createElement as h, useEffect, useMemo, useState } from 'react';
14
+ import { FileTypeIcon, MarkdownText, StateDot } from '../../ui/official.js';
15
+ import { officialClass } from '../official-classes.js';
16
+ import { markdownLabels } from '../../explorer/preview/md-labels.js';
17
+ import { formatBytes } from '../../utils/number.js';
18
+ /** 助手正文:官方 MarkdownText 渲染 + 官方 AssistantMarkdown.root 类(fallback 自绘)。
19
+ * U11:fileMentions 词表就位时行内 code 文件引用渲成可点链接(官方语义:resolve 不出保持惰性 code)。 */
20
+ export function AssistantMarkdown(props) {
21
+ if (props.text.trim() === '')
22
+ return h('span', null);
23
+ return h('div', { className: officialClass('AssistantMarkdown', 'root') ?? '' }, h(MarkdownText, {
24
+ text: props.text,
25
+ labels: markdownLabels(),
26
+ fileMentions: props.fileMentions,
27
+ }));
28
+ }
29
+ /**
30
+ * 用户消息:官方 MessageItem userRow > userStack > bubble(右对齐气泡)
31
+ * + 气泡下方的 **attachmentRow / fileCard**(官方 MessageItem 的附件行)。
32
+ *
33
+ * 官方附件卡 = 图标 + 文件名 + 大小;**不可点开**——引用里没有路径,宿主也没给出
34
+ * 「按 attachmentId 打开」的公开面 ⇒ 如实降级为只读展示,不伪造打开行为。
35
+ */
36
+ export function UserMessage(props) {
37
+ const { text, files } = props;
38
+ const chips = files ?? [];
39
+ return h('div', { className: officialClass('MessageItem', 'userRow') ?? '' }, h('div', { className: officialClass('MessageItem', 'userStack') ?? '' }, text === ''
40
+ ? null
41
+ : h('div', { className: officialClass('MessageItem', 'bubble') ?? '' }, h(MarkdownText, { text, labels: markdownLabels() })), chips.length === 0
42
+ ? null
43
+ : h('div', { className: officialClass('MessageItem', 'attachmentRow') ?? '' }, chips.map((file, index) => h('div', {
44
+ key: `${file.name}:${index}`,
45
+ className: officialClass('MessageItem', 'fileCard') ?? '',
46
+ title: file.name,
47
+ }, h('span', { className: officialClass('MessageItem', 'fileIcon') ?? '' }, h(FileTypeIcon, { path: file.name, size: 16 })), h('span', { className: officialClass('MessageItem', 'fileContent') ?? '' }, h('span', { className: officialClass('MessageItem', 'fileName') ?? '' }, file.name), h('span', { className: officialClass('MessageItem', 'fileMeta') ?? '' }, formatBytes(file.bytes))))))));
48
+ }
49
+ /** 官方 retrySeconds(lib/client.js:1215):下限 1 秒。 */
50
+ function retrySeconds(milliseconds) {
51
+ return Math.max(1, Math.ceil(milliseconds / 1000));
52
+ }
53
+ /**
54
+ * 官方 failureMessage(lib/client.js:1219):已知机器码走本地化文案,其余原样展示。
55
+ * 官方判定顺序逐字:ACCOUNT_SIGNED_OUT / ACCOUNT_SIGN_IN_REQUIRED / QUOTA|ACCOUNT_QUOTA / AUTH。
56
+ */
57
+ function failureMessage(message, code, t) {
58
+ if (code === 'ACCOUNT_SIGNED_OUT')
59
+ return t('failureAccountSignedOut');
60
+ if (code === 'ACCOUNT_SIGN_IN_REQUIRED')
61
+ return t('failureAccountSignInRequired');
62
+ if (code === 'QUOTA' || code === 'ACCOUNT_QUOTA')
63
+ return t('failureQuota');
64
+ return code === 'AUTH' ? t('failureAuth') : (message ?? '');
65
+ }
66
+ /**
67
+ * 重试行(官方 ModelRetryItem):折叠 = 「已重试模型请求 (5/5) · 9s ⌄」摘要;
68
+ * 展开 = 重试延迟 / 失败原因 两行。active(等待重试)时官方走 250ms 倒计时 + 渐隐 shimmer。
69
+ */
70
+ export function ModelRetryItemMirror(props) {
71
+ const { active, t } = props;
72
+ const node = props.node;
73
+ const delayMs = typeof node.delayMs === 'number' ? node.delayMs : 0;
74
+ // 官方 maximum:mode==='normal' 给 maxRetries,否则 ∞(mode 缺失且无 maxRetries 时按 ∞ 兜底)。
75
+ const maximum = node.mode === 'normal' && typeof node.maxRetries === 'number'
76
+ ? node.maxRetries
77
+ : '∞';
78
+ const deadline = useMemo(() => Date.now() + delayMs, [delayMs, node.retryState]);
79
+ const scheduledSeconds = retrySeconds(delayMs);
80
+ const [countdown, setCountdown] = useState(() => ({ deadline, seconds: retrySeconds(deadline - Date.now()) }));
81
+ const remainingSeconds = countdown.deadline === deadline
82
+ ? countdown.seconds
83
+ : retrySeconds(deadline - Date.now());
84
+ useEffect(() => {
85
+ if (!active)
86
+ return;
87
+ const updateCountdown = () => {
88
+ const next = retrySeconds(deadline - Date.now());
89
+ setCountdown(current => current.deadline === deadline && current.seconds === next
90
+ ? current
91
+ : { deadline, seconds: next });
92
+ return next;
93
+ };
94
+ if (updateCountdown() === 1)
95
+ return;
96
+ const timer = window.setInterval(() => {
97
+ if (updateCountdown() === 1)
98
+ window.clearInterval(timer);
99
+ }, 250);
100
+ return () => { window.clearInterval(timer); };
101
+ }, [active, deadline]);
102
+ const label = active
103
+ ? t('retryActive')
104
+ : node.retryState === 'cancelled'
105
+ ? t('retryCancelled')
106
+ : node.retryState === 'started' ? t('retryStarted') : t('retryScheduled');
107
+ const seconds = active ? remainingSeconds : scheduledSeconds;
108
+ const failure = node.failure;
109
+ return h('details', {
110
+ className: officialClass('MessageItem', 'retryRow') ?? '',
111
+ 'data-active': active || undefined,
112
+ }, h('summary', { className: officialClass('MessageItem', 'retrySummary') ?? '' }, h('span', {
113
+ className: officialClass('MessageItem', 'retryText') ?? '',
114
+ role: 'status',
115
+ }, t('retryStatus', { label, retry: node.retry ?? 0, maximum, seconds }))), h('div', { className: officialClass('MessageItem', 'retryDetails') ?? '' }, h('div', null, h('span', { className: officialClass('MessageItem', 'retryDetailLabel') ?? '' }, t('retryDelay')), t('durationMilliseconds', { milliseconds: Math.round(delayMs) })), h('div', null, h('span', { className: officialClass('MessageItem', 'retryDetailLabel') ?? '' }, t('retryFailure')), failureMessage(failure?.message, failure?.code, t))));
116
+ }
117
+ /** 轮次失败行(官方 TurnErrorItem):红点 + 红标题「本轮运行失败」+ 灰原因 + 右侧机器码标签。 */
118
+ export function TurnErrorItemMirror(props) {
119
+ const { node, t } = props;
120
+ return h('div', { className: officialClass('MessageItem', 'turnErrorRow') ?? '', role: 'status' }, h(StateDot, {
121
+ state: 'error',
122
+ className: officialClass('MessageItem', 'turnErrorDot') ?? '',
123
+ }), h('div', { className: officialClass('MessageItem', 'turnErrorCopy') ?? '' }, h('span', { className: officialClass('MessageItem', 'turnErrorTitle') ?? '' }, node.code === 'ACCOUNT_SIGNED_OUT' ? t('accountStopped') : t('turnErrorTitle')), h('span', { className: officialClass('MessageItem', 'turnErrorMessage') ?? '' }, failureMessage(node.message, node.code, t))), node.code !== undefined && node.code !== ''
124
+ ? h('code', { className: officialClass('MessageItem', 'turnErrorCode') ?? '' }, node.code)
125
+ : null);
126
+ }
127
+ /** 限长行(官方 TurnMaxTokensItem):黄点 + 警示标题 + 截断提示。 */
128
+ export function TurnMaxTokensItemMirror(props) {
129
+ const { t } = props;
130
+ return h('div', { className: officialClass('MessageItem', 'turnErrorRow') ?? '', role: 'status' }, h(StateDot, {
131
+ state: 'warning',
132
+ className: officialClass('MessageItem', 'turnErrorDot') ?? '',
133
+ }), h('div', { className: officialClass('MessageItem', 'turnErrorCopy') ?? '' }, h('span', { className: officialClass('MessageItem', 'maxTokensTitle') ?? '' }, t('maxTokensTitle')), h('span', { className: officialClass('MessageItem', 'turnErrorMessage') ?? '' }, t('maxTokensHint'))));
134
+ }
135
+ //# sourceMappingURL=MessageItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageItem.js","sourceRoot":"","sources":["../../../src/session/mirror/MessageItem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { createElement as h } from 'react';
2
+ import type { Translate } from '../../utils/i18n.js';
3
+ /** 思考行:折叠 = 「思考 · 首行预览 ⌄」;展开 = thinkBody 全文(MarkdownText compact)。 */
4
+ export declare function ReasoningRowMirror(props: {
5
+ text: string;
6
+ running?: boolean;
7
+ /** 官方 preview 政策(settledReasoningPreview):完成后是否仍显示首行预览。 */
8
+ preview?: boolean;
9
+ t: Translate;
10
+ }): ReturnType<typeof h> | null;
11
+ //# sourceMappingURL=ReasoningRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReasoningRow.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ReasoningRow.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,aAAa,IAAI,CAAC,EAAY,MAAM,OAAO,CAAA;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAQpD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAoC9B"}
@@ -0,0 +1,49 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/ReasoningRow.tsx(0.1.7-rc.2 lib/client.js:5718-5778)
2
+ // root[data-variant=think][data-state=running|ok][data-expanded][data-preview]
3
+ // > DisclosureRow(icon=IconThinkOutlineRegular 14px,title=t("message.think")=「思考」,
4
+ // collapsedContent = separator(2×2px) + summary(首行、去 **),content = thinkBody MarkdownText compact)
5
+ // 折叠态 root 固定一行高(contain:size layout + height 24px+delta);预览受 settledReasoningPreview 政策控制。
6
+ // 官方截图里组内思考行 = 「思考 · Let me submit the receipt now.」——标题是「思考」,不是「思考过程」。
7
+ import { Fragment, createElement as h, useState } from 'react';
8
+ import { DisclosureRow, IconThinkOutlineRegular, MarkdownText } from '../../ui/official.js';
9
+ import { officialClass } from '../official-classes.js';
10
+ import { markdownLabels } from '../../explorer/preview/md-labels.js';
11
+ /** 官方 firstLine(lib/client.js:5687):首行。 */
12
+ function firstLine(text) {
13
+ const newline = text.indexOf('\n');
14
+ return newline === -1 ? text : text.slice(0, newline);
15
+ }
16
+ /** 思考行:折叠 = 「思考 · 首行预览 ⌄」;展开 = thinkBody 全文(MarkdownText compact)。 */
17
+ export function ReasoningRowMirror(props) {
18
+ const { text, running = false, preview = true, t } = props;
19
+ const [open, setOpen] = useState(false);
20
+ if (text.trim() === '')
21
+ return null;
22
+ // lib 目标是 ES2020(无 String.replaceAll)⇒ split/join 等价去 `**`。
23
+ const summary = firstLine(text).split('**').join('');
24
+ return h('div', {
25
+ className: officialClass('ReasoningRow', 'root') ?? '',
26
+ 'data-variant': 'think',
27
+ 'data-state': running ? 'running' : 'ok',
28
+ 'data-expanded': open || undefined,
29
+ 'data-preview': preview && summary !== '' || undefined,
30
+ }, h(DisclosureRow, {
31
+ icon: h(IconThinkOutlineRegular, { size: 14 }),
32
+ title: t('thinkLabel'),
33
+ open,
34
+ expandable: true,
35
+ expandOnRowClick: true,
36
+ onToggle: () => { setOpen(value => !value); },
37
+ rowClassName: officialClass('ReasoningRow', 'row') ?? '',
38
+ leadingClassName: officialClass('ReasoningRow', 'leading') ?? '',
39
+ titleClassName: officialClass('ReasoningRow', 'title') ?? '',
40
+ chevronClassName: officialClass('ReasoningRow', 'chevron') ?? '',
41
+ collapsedContent: h(Fragment, null, h('span', { className: officialClass('ReasoningRow', 'separator') ?? '', 'aria-hidden': true }),
42
+ // 官方是 summary > summaryText 两层:外层 nowrap 截断、内层 text-overflow:ellipsis(省略号)。
43
+ h('span', { className: officialClass('ReasoningRow', 'summary') ?? '' }, h('span', { className: officialClass('ReasoningRow', 'summaryText') ?? '' }, summary))),
44
+ children: open
45
+ ? h('div', { className: officialClass('ReasoningRow', 'thinkBody') ?? '' }, h(MarkdownText, { text, labels: markdownLabels(), variant: 'compact' }))
46
+ : undefined,
47
+ }));
48
+ }
49
+ //# sourceMappingURL=ReasoningRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReasoningRow.js","sourceRoot":"","sources":["../../../src/session/mirror/ReasoningRow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CSSProperties, RefObject } from 'react';
2
+ /**
3
+ * 官方 stat-dialog.ts 的 MEASURE_STYLE:首趟(pos 未定)时面板「隐藏但仍布局」,
4
+ * 好让 useAnchoredPosition 量到真实尺寸。官方要求面板铺 `pos ?? MEASURE_STYLE`;
5
+ * 漏了它 ⇒ 首趟完全无定位、面板落进文档流撑长页面(真机 2026-10-23:点用量无反应 + 滚动条变长)。
6
+ */
7
+ export declare const STAT_MEASURE_STYLE: CSSProperties;
8
+ export interface StatDialogSeat {
9
+ open: boolean;
10
+ setOpen(open: boolean): void;
11
+ rootRef: RefObject<HTMLSpanElement | null>;
12
+ panelRef: RefObject<HTMLDivElement | null>;
13
+ pos: CSSProperties | undefined;
14
+ }
15
+ /** 官方 useStatDialog:把弹层挂在触发器上方(side: 'top'),点外 / Esc 关闭。 */
16
+ export declare function useStatDialog(controlled?: {
17
+ open?: boolean;
18
+ setOpen?(open: boolean): void;
19
+ }): StatDialogSeat;
20
+ //# sourceMappingURL=StatDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatDialog.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/StatDialog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMrD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAyD,CAAA;AAE1F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;IAC1C,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC1C,GAAG,EAAE,aAAa,GAAG,SAAS,CAAA;CAC/B;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAAG,cAAc,CAiB5G"}
@@ -0,0 +1,36 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/stat-dialog.js(0.1.7-rc.2 lib/client.js:6278-6350)
2
+ // PANEL_MARGIN = 12 / PANEL_GAP = 8(lib/client.js:6281-6283)
3
+ // useStatDialog = 受控开关 + useAnchoredPosition(side:'top') + useDismissOnOutsidePointer + Escape 关闭。
4
+ // 官方用的是 primitives 的同名 hook,这里直接复用同一份实现(不是自绘定位)。
5
+ import { useEffect, useRef, useState } from 'react';
6
+ import { useAnchoredPosition, useDismissOnOutsidePointer } from '../../ui/official.js';
7
+ const PANEL_MARGIN = 12;
8
+ const PANEL_GAP = 8;
9
+ /**
10
+ * 官方 stat-dialog.ts 的 MEASURE_STYLE:首趟(pos 未定)时面板「隐藏但仍布局」,
11
+ * 好让 useAnchoredPosition 量到真实尺寸。官方要求面板铺 `pos ?? MEASURE_STYLE`;
12
+ * 漏了它 ⇒ 首趟完全无定位、面板落进文档流撑长页面(真机 2026-10-23:点用量无反应 + 滚动条变长)。
13
+ */
14
+ export const STAT_MEASURE_STYLE = { visibility: 'hidden', left: 0, top: 0 };
15
+ /** 官方 useStatDialog:把弹层挂在触发器上方(side: 'top'),点外 / Esc 关闭。 */
16
+ export function useStatDialog(controlled) {
17
+ const [ownOpen, setOwnOpen] = useState(false);
18
+ const open = controlled?.open ?? ownOpen;
19
+ const setOpen = controlled?.setOpen ?? setOwnOpen;
20
+ const rootRef = useRef(null);
21
+ const panelRef = useRef(null);
22
+ const pos = useAnchoredPosition({ open, anchorRef: rootRef, panelRef, side: 'top', gap: PANEL_GAP, margin: PANEL_MARGIN });
23
+ useDismissOnOutsidePointer(rootRef, open, setOpen, panelRef);
24
+ useEffect(() => {
25
+ if (!open)
26
+ return;
27
+ const onKeyDown = (event) => {
28
+ if (event.key === 'Escape')
29
+ setOpen(false);
30
+ };
31
+ document.addEventListener('keydown', onKeyDown);
32
+ return () => { document.removeEventListener('keydown', onKeyDown); };
33
+ }, [open, setOpen]);
34
+ return { open, setOpen, rootRef, panelRef, pos };
35
+ }
36
+ //# sourceMappingURL=StatDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatDialog.js","sourceRoot":"","sources":["../../../src/session/mirror/StatDialog.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,+DAA+D;AAC/D,qGAAqG;AACrG,iDAAiD;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,YAAY,GAAG,EAAE,CAAA;AACvB,MAAM,SAAS,GAAG,CAAC,CAAA;AAEnB;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;AAU1F,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,UAA8D;IAC1F,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,OAAO,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,IAAI,UAAU,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;IAC1H,0BAA0B,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5C,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC/C,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA,CAAC,CAAC,CAAA;IACrE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;AAClD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { createElement as h } from 'react';
2
+ import type { Translate } from '../../utils/i18n.js';
3
+ import type { TurnLocationFace, TurnProcessHandle } from './ChatNodeSeat.js';
4
+ /** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
5
+ export declare function TurnProcessNodeViewMirror(props: {
6
+ turn: TurnLocationFace | undefined;
7
+ turnProcess: TurnProcessHandle;
8
+ t: Translate;
9
+ }): ReturnType<typeof h> | null;
10
+ //# sourceMappingURL=TurnProcessNodeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnProcessNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,aAAa,IAAI,CAAC,EAAuB,MAAM,OAAO,CAAA;AAGzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAM5E,qDAAqD;AACrD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAClC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAuD9B"}
@@ -0,0 +1,68 @@
1
+ // 官方对照:packages/client/ui-chat/src/client/chat/TurnProcessNodeView.tsx(0.1.7-rc.2 lib/client.js:6129-6196)
2
+ // root(button,高 calc(33px + delta)、border-bottom .5px border-l2、padding 0 0 8px、flex)
3
+ // :disabled{cursor:default} / :not(:disabled):hover{color:primary} / :not([data-open]){margin-bottom:8px}
4
+ // > label(13px,ellipsis)> chevron(14px caption,[data-open] 旋转 180°)
5
+ // label 官方文案(源码 6167-6170 逐字):
6
+ // running → 「深度求索中,用时D」;aborted → 「已停止」;error → 「处理失败」;
7
+ // 其余 → 有时长「用时 D」、无时长「已完成工作」。D 由 turn 位置(start/end)算出,下限 1 秒。
8
+ // 这就是官方原图里那行「用时 34 秒 ⌄」——它把整个 turn 的过程(工具调用 / 中间文本 / 思考)折在下面。
9
+ import { Fragment, createElement as h, useEffect, useState } from 'react';
10
+ import { IconChevronDownOutlineRegular } from '../../ui/official.js';
11
+ import { officialClass } from '../official-classes.js';
12
+ import { formatLiveRunDuration, formatRunDuration } from './message-chrome.js';
13
+ /** 官方 LIVE_RUN_CLOCK_INTERVAL_MS(lib/client.js:979)。 */
14
+ const LIVE_RUN_CLOCK_INTERVAL_MS = 1000;
15
+ /** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
16
+ export function TurnProcessNodeViewMirror(props) {
17
+ const { turn, turnProcess, t } = props;
18
+ const open = !turnProcess.foldable || turnProcess.open;
19
+ const [now, setNow] = useState(() => Date.now());
20
+ const ticking = turn?.status === 'open' && turn.start !== undefined;
21
+ useEffect(() => {
22
+ if (!ticking)
23
+ return;
24
+ setNow(Date.now());
25
+ const timer = setInterval(() => { setNow(Date.now()); }, LIVE_RUN_CLOCK_INTERVAL_MS);
26
+ return () => { clearInterval(timer); };
27
+ }, [ticking]);
28
+ if (turn === undefined || (turn.start === undefined && turn.status !== 'closed'))
29
+ return null;
30
+ const canCollapse = turnProcess.foldable && turnProcess.hasContent && !turnProcess.alwaysOpen;
31
+ const running = turn.status === 'open';
32
+ const reason = turn.end?.data?.reason?.kind;
33
+ const elapsedMs = turn.start === undefined ? undefined : Math.max(1000, (turn.end?.time ?? now) - turn.start.time);
34
+ const duration = elapsedMs === undefined
35
+ ? undefined
36
+ : running ? formatLiveRunDuration(elapsedMs, t) : formatRunDuration(elapsedMs, t);
37
+ const label = running
38
+ ? (duration === undefined ? t('chatDeepDiving') : t('turnProcessDeepDiving', { duration }))
39
+ : reason === 'aborted' ? t('turnStopped')
40
+ : reason === 'error' ? t('turnProcessFailed')
41
+ : duration === undefined ? t('turnProcessWorked') : t('turnProcessTook', { duration });
42
+ const announcement = running
43
+ ? t('chatDeepDiving')
44
+ : reason === 'aborted' ? t('turnStopped')
45
+ : reason === 'error' ? t('turnProcessFailed')
46
+ : t('turnProcessWorked');
47
+ const spec = turnProcess.spec;
48
+ return h(Fragment, null, h('span', {
49
+ className: officialClass('accessibility', 'visuallyHidden') ?? '',
50
+ role: 'status',
51
+ 'aria-live': 'polite',
52
+ 'aria-atomic': 'true',
53
+ }, announcement), h('button', {
54
+ type: 'button',
55
+ className: officialClass('TurnProcessNodeView', 'root') ?? '',
56
+ 'data-open': open || undefined,
57
+ 'data-turn-process': spec?.turn,
58
+ 'data-turn-process-messages': spec?.messageCount,
59
+ 'data-turn-process-tool-calls': spec?.toolCallCount,
60
+ 'data-turn-process-subagents': spec?.subagentCount,
61
+ disabled: !canCollapse,
62
+ 'aria-expanded': turnProcess.hasContent ? open : undefined,
63
+ onClick: () => { turnProcess.setOpen(!open); },
64
+ }, h('span', { className: officialClass('TurnProcessNodeView', 'label') ?? '' }, label), canCollapse
65
+ ? h(IconChevronDownOutlineRegular, { className: officialClass('TurnProcessNodeView', 'chevron') ?? '' })
66
+ : null));
67
+ }
68
+ //# sourceMappingURL=TurnProcessNodeView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnProcessNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { createElement as h, type ReactNode } from 'react';
2
+ import type { Translate } from '../../utils/i18n.js';
3
+ import { type TurnTokenUsageFace } from './TurnUsagePanel.js';
4
+ /** 官方 AssistantContentBlock 的消费面(只用到 kind / text)。 */
5
+ interface ContentBlockFace {
6
+ kind?: string;
7
+ text?: string;
8
+ }
9
+ /** 官方 TurnTailChatData 的消费面(ui-chat contract/chat-nodes.d.ts:137)。 */
10
+ export interface TurnTailDataFace {
11
+ turn: number;
12
+ seq: number;
13
+ closing: {
14
+ time: number;
15
+ blocks: ReadonlyArray<ContentBlockFace>;
16
+ } | null;
17
+ branchUnavailable?: boolean;
18
+ tokenUsage?: TurnTokenUsageFace;
19
+ }
20
+ /** 官方 hasAssistantReplyContent。 */
21
+ export declare function hasAssistantReplyContent(blocks: ReadonlyArray<ContentBlockFace>): boolean;
22
+ /** Turn 尾部操作行:复制 / 分支 / 用量 / 结束时钟。 */
23
+ export declare function TurnTailNodeViewMirror(props: {
24
+ data: TurnTailDataFace;
25
+ /** 分支:以该轮 tail seq 截断开分支(undefined = 不渲染分支按钮)。 */
26
+ onBranchAt?: (seq: number) => void;
27
+ /** 官方 conversation.chat.turnTail 插槽内容(如 DeliverablesTail),渲染在操作行之前。 */
28
+ tailSlot?: ReactNode;
29
+ t: Translate;
30
+ }): ReturnType<typeof h> | null;
31
+ export {};
32
+ //# sourceMappingURL=TurnTailNodeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnTailNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAEnF,sDAAsD;AACtD,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;KAAE,GAAG,IAAI,CAAA;IACzE,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED,mCAAmC;AACnC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAMzF;AAOD,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,gBAAgB,CAAA;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAuB9B"}