@drscrewdriver/dsh-better-display 0.3.3-fork.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/DESIGN.md +72 -0
  3. package/LICENSE +24 -0
  4. package/README.en.md +55 -0
  5. package/README.md +55 -0
  6. package/THIRD_PARTY_NOTICES.md +65 -0
  7. package/compat/harness-rc2.json +99 -0
  8. package/cordis.patch.yml +5 -0
  9. package/cordis.yml +4 -0
  10. package/docs/official-rendering-bridge.md +65 -0
  11. package/dshx.yml +5 -0
  12. package/lib/client.js +49292 -0
  13. package/lib/client.js.map +1 -0
  14. package/lib/dsh-better-display.js +101 -0
  15. package/lib/types/client/Blocks.d.ts +49 -0
  16. package/lib/types/client/Blocks.d.ts.map +1 -0
  17. package/lib/types/client/Blocks.js +143 -0
  18. package/lib/types/client/Blocks.js.map +1 -0
  19. package/lib/types/client/ChoreographedFlow.d.ts +22 -0
  20. package/lib/types/client/ChoreographedFlow.d.ts.map +1 -0
  21. package/lib/types/client/ChoreographedFlow.js +218 -0
  22. package/lib/types/client/ChoreographedFlow.js.map +1 -0
  23. package/lib/types/client/ClosedProcessSummary.d.ts +9 -0
  24. package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -0
  25. package/lib/types/client/ClosedProcessSummary.js +16 -0
  26. package/lib/types/client/ClosedProcessSummary.js.map +1 -0
  27. package/lib/types/client/DiffPanel.d.ts +13 -0
  28. package/lib/types/client/DiffPanel.d.ts.map +1 -0
  29. package/lib/types/client/DiffPanel.js +115 -0
  30. package/lib/types/client/DiffPanel.js.map +1 -0
  31. package/lib/types/client/LiveFold.d.ts +10 -0
  32. package/lib/types/client/LiveFold.d.ts.map +1 -0
  33. package/lib/types/client/LiveFold.js +39 -0
  34. package/lib/types/client/LiveFold.js.map +1 -0
  35. package/lib/types/client/McpAppFrame.d.ts +32 -0
  36. package/lib/types/client/McpAppFrame.d.ts.map +1 -0
  37. package/lib/types/client/McpAppFrame.js +193 -0
  38. package/lib/types/client/McpAppFrame.js.map +1 -0
  39. package/lib/types/client/OfficialContent.d.ts +25 -0
  40. package/lib/types/client/OfficialContent.d.ts.map +1 -0
  41. package/lib/types/client/OfficialContent.js +53 -0
  42. package/lib/types/client/OfficialContent.js.map +1 -0
  43. package/lib/types/client/Reader.d.ts +3 -0
  44. package/lib/types/client/Reader.d.ts.map +1 -0
  45. package/lib/types/client/Reader.js +603 -0
  46. package/lib/types/client/Reader.js.map +1 -0
  47. package/lib/types/client/ReasoningCard.d.ts +11 -0
  48. package/lib/types/client/ReasoningCard.d.ts.map +1 -0
  49. package/lib/types/client/ReasoningCard.js +322 -0
  50. package/lib/types/client/ReasoningCard.js.map +1 -0
  51. package/lib/types/client/SettingsSection.d.ts +37 -0
  52. package/lib/types/client/SettingsSection.d.ts.map +1 -0
  53. package/lib/types/client/SettingsSection.js +63 -0
  54. package/lib/types/client/SettingsSection.js.map +1 -0
  55. package/lib/types/client/StickyLane.d.ts +8 -0
  56. package/lib/types/client/StickyLane.d.ts.map +1 -0
  57. package/lib/types/client/StickyLane.js +39 -0
  58. package/lib/types/client/StickyLane.js.map +1 -0
  59. package/lib/types/client/TimelineRail.d.ts +10 -0
  60. package/lib/types/client/TimelineRail.d.ts.map +1 -0
  61. package/lib/types/client/TimelineRail.js +168 -0
  62. package/lib/types/client/TimelineRail.js.map +1 -0
  63. package/lib/types/client/ToolActivity.d.ts +17 -0
  64. package/lib/types/client/ToolActivity.d.ts.map +1 -0
  65. package/lib/types/client/ToolActivity.js +244 -0
  66. package/lib/types/client/ToolActivity.js.map +1 -0
  67. package/lib/types/client/TurnMetrics.d.ts +11 -0
  68. package/lib/types/client/TurnMetrics.d.ts.map +1 -0
  69. package/lib/types/client/TurnMetrics.js +44 -0
  70. package/lib/types/client/TurnMetrics.js.map +1 -0
  71. package/lib/types/client/WaitClock.d.ts +16 -0
  72. package/lib/types/client/WaitClock.d.ts.map +1 -0
  73. package/lib/types/client/WaitClock.js +29 -0
  74. package/lib/types/client/WaitClock.js.map +1 -0
  75. package/lib/types/client/WaitingClock.d.ts +15 -0
  76. package/lib/types/client/WaitingClock.d.ts.map +1 -0
  77. package/lib/types/client/WaitingClock.js +30 -0
  78. package/lib/types/client/WaitingClock.js.map +1 -0
  79. package/lib/types/client/WaitingStatus.d.ts +6 -0
  80. package/lib/types/client/WaitingStatus.d.ts.map +1 -0
  81. package/lib/types/client/WaitingStatus.js +9 -0
  82. package/lib/types/client/WaitingStatus.js.map +1 -0
  83. package/lib/types/client/conversation-scroll.d.ts +19 -0
  84. package/lib/types/client/conversation-scroll.d.ts.map +1 -0
  85. package/lib/types/client/conversation-scroll.js +25 -0
  86. package/lib/types/client/conversation-scroll.js.map +1 -0
  87. package/lib/types/client/deliverables.d.ts +24 -0
  88. package/lib/types/client/deliverables.d.ts.map +1 -0
  89. package/lib/types/client/deliverables.js +104 -0
  90. package/lib/types/client/deliverables.js.map +1 -0
  91. package/lib/types/client/entry-policy.d.ts +10 -0
  92. package/lib/types/client/entry-policy.d.ts.map +1 -0
  93. package/lib/types/client/entry-policy.js +24 -0
  94. package/lib/types/client/entry-policy.js.map +1 -0
  95. package/lib/types/client/entry.d.ts +4 -0
  96. package/lib/types/client/entry.d.ts.map +1 -0
  97. package/lib/types/client/entry.js +34 -0
  98. package/lib/types/client/entry.js.map +1 -0
  99. package/lib/types/client/fold-choreography.d.ts +40 -0
  100. package/lib/types/client/fold-choreography.d.ts.map +1 -0
  101. package/lib/types/client/fold-choreography.js +48 -0
  102. package/lib/types/client/fold-choreography.js.map +1 -0
  103. package/lib/types/client/fold-intensity.d.ts +11 -0
  104. package/lib/types/client/fold-intensity.d.ts.map +1 -0
  105. package/lib/types/client/fold-intensity.js +32 -0
  106. package/lib/types/client/fold-intensity.js.map +1 -0
  107. package/lib/types/client/index.d.ts +7 -0
  108. package/lib/types/client/index.d.ts.map +1 -0
  109. package/lib/types/client/index.js +195 -0
  110. package/lib/types/client/index.js.map +1 -0
  111. package/lib/types/client/live-turn.d.ts +58 -0
  112. package/lib/types/client/live-turn.d.ts.map +1 -0
  113. package/lib/types/client/live-turn.js +190 -0
  114. package/lib/types/client/live-turn.js.map +1 -0
  115. package/lib/types/client/markdown/MarkdownText.d.ts +41 -0
  116. package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
  117. package/lib/types/client/markdown/MarkdownText.js +178 -0
  118. package/lib/types/client/markdown/MarkdownText.js.map +1 -0
  119. package/lib/types/client/markdown/cjkFriendlyStrong.d.ts +9 -0
  120. package/lib/types/client/markdown/cjkFriendlyStrong.d.ts.map +1 -0
  121. package/lib/types/client/markdown/cjkFriendlyStrong.js +73 -0
  122. package/lib/types/client/markdown/cjkFriendlyStrong.js.map +1 -0
  123. package/lib/types/client/markdown/incremental.d.ts +69 -0
  124. package/lib/types/client/markdown/incremental.d.ts.map +1 -0
  125. package/lib/types/client/markdown/incremental.js +108 -0
  126. package/lib/types/client/markdown/incremental.js.map +1 -0
  127. package/lib/types/client/markdown/katex.d.ts +27 -0
  128. package/lib/types/client/markdown/katex.d.ts.map +1 -0
  129. package/lib/types/client/markdown/katex.js +88 -0
  130. package/lib/types/client/markdown/katex.js.map +1 -0
  131. package/lib/types/client/markdown/mathCompatibility.d.ts +11 -0
  132. package/lib/types/client/markdown/mathCompatibility.d.ts.map +1 -0
  133. package/lib/types/client/markdown/mathCompatibility.js +293 -0
  134. package/lib/types/client/markdown/mathCompatibility.js.map +1 -0
  135. package/lib/types/client/markdown/parse.d.ts +25 -0
  136. package/lib/types/client/markdown/parse.d.ts.map +1 -0
  137. package/lib/types/client/markdown/parse.js +42 -0
  138. package/lib/types/client/markdown/parse.js.map +1 -0
  139. package/lib/types/client/markdown/render.d.ts +121 -0
  140. package/lib/types/client/markdown/render.d.ts.map +1 -0
  141. package/lib/types/client/markdown/render.js +452 -0
  142. package/lib/types/client/markdown/render.js.map +1 -0
  143. package/lib/types/client/mcp-app.d.ts +50 -0
  144. package/lib/types/client/mcp-app.d.ts.map +1 -0
  145. package/lib/types/client/mcp-app.js +328 -0
  146. package/lib/types/client/mcp-app.js.map +1 -0
  147. package/lib/types/client/message-chrome.d.ts +19 -0
  148. package/lib/types/client/message-chrome.d.ts.map +1 -0
  149. package/lib/types/client/message-chrome.js +42 -0
  150. package/lib/types/client/message-chrome.js.map +1 -0
  151. package/lib/types/client/motion.d.ts +38 -0
  152. package/lib/types/client/motion.d.ts.map +1 -0
  153. package/lib/types/client/motion.js +453 -0
  154. package/lib/types/client/motion.js.map +1 -0
  155. package/lib/types/client/native/ContextBody.d.ts +130 -0
  156. package/lib/types/client/native/ContextBody.d.ts.map +1 -0
  157. package/lib/types/client/native/ContextBody.js +398 -0
  158. package/lib/types/client/native/ContextBody.js.map +1 -0
  159. package/lib/types/client/native/ContextInjectionRow.d.ts +35 -0
  160. package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
  161. package/lib/types/client/native/ContextInjectionRow.js +42 -0
  162. package/lib/types/client/native/ContextInjectionRow.js.map +1 -0
  163. package/lib/types/client/native/ReferenceIcon.d.ts +16 -0
  164. package/lib/types/client/native/ReferenceIcon.d.ts.map +1 -0
  165. package/lib/types/client/native/ReferenceIcon.js +16 -0
  166. package/lib/types/client/native/ReferenceIcon.js.map +1 -0
  167. package/lib/types/client/native/tool-call-model.d.ts +58 -0
  168. package/lib/types/client/native/tool-call-model.d.ts.map +1 -0
  169. package/lib/types/client/native/tool-call-model.js +219 -0
  170. package/lib/types/client/native/tool-call-model.js.map +1 -0
  171. package/lib/types/client/native/tool-update.d.ts +23 -0
  172. package/lib/types/client/native/tool-update.d.ts.map +1 -0
  173. package/lib/types/client/native/tool-update.js +22 -0
  174. package/lib/types/client/native/tool-update.js.map +1 -0
  175. package/lib/types/client/official-slots.d.ts +71 -0
  176. package/lib/types/client/official-slots.d.ts.map +1 -0
  177. package/lib/types/client/official-slots.js +183 -0
  178. package/lib/types/client/official-slots.js.map +1 -0
  179. package/lib/types/client/open-file.d.ts +29 -0
  180. package/lib/types/client/open-file.d.ts.map +1 -0
  181. package/lib/types/client/open-file.js +71 -0
  182. package/lib/types/client/open-file.js.map +1 -0
  183. package/lib/types/client/pending-submission.d.ts +28 -0
  184. package/lib/types/client/pending-submission.d.ts.map +1 -0
  185. package/lib/types/client/pending-submission.js +28 -0
  186. package/lib/types/client/pending-submission.js.map +1 -0
  187. package/lib/types/client/platform-media.d.ts +6 -0
  188. package/lib/types/client/platform-media.d.ts.map +1 -0
  189. package/lib/types/client/platform-media.js +18 -0
  190. package/lib/types/client/platform-media.js.map +1 -0
  191. package/lib/types/client/primitive-labels.d.ts +10 -0
  192. package/lib/types/client/primitive-labels.d.ts.map +1 -0
  193. package/lib/types/client/primitive-labels.js +38 -0
  194. package/lib/types/client/primitive-labels.js.map +1 -0
  195. package/lib/types/client/projection.d.ts +41 -0
  196. package/lib/types/client/projection.d.ts.map +1 -0
  197. package/lib/types/client/projection.js +112 -0
  198. package/lib/types/client/projection.js.map +1 -0
  199. package/lib/types/client/reasoning-follow.d.ts +10 -0
  200. package/lib/types/client/reasoning-follow.d.ts.map +1 -0
  201. package/lib/types/client/reasoning-follow.js +21 -0
  202. package/lib/types/client/reasoning-follow.js.map +1 -0
  203. package/lib/types/client/resource-address.d.ts +3 -0
  204. package/lib/types/client/resource-address.d.ts.map +1 -0
  205. package/lib/types/client/resource-address.js +33 -0
  206. package/lib/types/client/resource-address.js.map +1 -0
  207. package/lib/types/client/settings-copy.d.ts +7 -0
  208. package/lib/types/client/settings-copy.d.ts.map +1 -0
  209. package/lib/types/client/settings-copy.js +53 -0
  210. package/lib/types/client/settings-copy.js.map +1 -0
  211. package/lib/types/client/settings-slots.d.ts +23 -0
  212. package/lib/types/client/settings-slots.d.ts.map +1 -0
  213. package/lib/types/client/settings-slots.js +2 -0
  214. package/lib/types/client/settings-slots.js.map +1 -0
  215. package/lib/types/client/settings.d.ts +4 -0
  216. package/lib/types/client/settings.d.ts.map +1 -0
  217. package/lib/types/client/settings.js +60 -0
  218. package/lib/types/client/settings.js.map +1 -0
  219. package/lib/types/client/skill-status.d.ts +25 -0
  220. package/lib/types/client/skill-status.d.ts.map +1 -0
  221. package/lib/types/client/skill-status.js +44 -0
  222. package/lib/types/client/skill-status.js.map +1 -0
  223. package/lib/types/client/store.d.ts +35 -0
  224. package/lib/types/client/store.d.ts.map +1 -0
  225. package/lib/types/client/store.js +37 -0
  226. package/lib/types/client/store.js.map +1 -0
  227. package/lib/types/client/stream-buffer.d.ts +37 -0
  228. package/lib/types/client/stream-buffer.d.ts.map +1 -0
  229. package/lib/types/client/stream-buffer.js +150 -0
  230. package/lib/types/client/stream-buffer.js.map +1 -0
  231. package/lib/types/client/streaming.d.ts +18 -0
  232. package/lib/types/client/streaming.d.ts.map +1 -0
  233. package/lib/types/client/streaming.js +84 -0
  234. package/lib/types/client/streaming.js.map +1 -0
  235. package/lib/types/client/timeline.d.ts +26 -0
  236. package/lib/types/client/timeline.d.ts.map +1 -0
  237. package/lib/types/client/timeline.js +48 -0
  238. package/lib/types/client/timeline.js.map +1 -0
  239. package/lib/types/client/tool-activity.d.ts +98 -0
  240. package/lib/types/client/tool-activity.d.ts.map +1 -0
  241. package/lib/types/client/tool-activity.js +301 -0
  242. package/lib/types/client/tool-activity.js.map +1 -0
  243. package/lib/types/client/types.d.ts +91 -0
  244. package/lib/types/client/types.d.ts.map +1 -0
  245. package/lib/types/client/types.js +2 -0
  246. package/lib/types/client/types.js.map +1 -0
  247. package/lib/types/client/waiting-clock.d.ts +49 -0
  248. package/lib/types/client/waiting-clock.d.ts.map +1 -0
  249. package/lib/types/client/waiting-clock.js +80 -0
  250. package/lib/types/client/waiting-clock.js.map +1 -0
  251. package/lib/types/client/word-motion.d.ts +16 -0
  252. package/lib/types/client/word-motion.d.ts.map +1 -0
  253. package/lib/types/client/word-motion.js +90 -0
  254. package/lib/types/client/word-motion.js.map +1 -0
  255. package/lib/types/client/word-timeline.d.ts +32 -0
  256. package/lib/types/client/word-timeline.d.ts.map +1 -0
  257. package/lib/types/client/word-timeline.js +119 -0
  258. package/lib/types/client/word-timeline.js.map +1 -0
  259. package/lib/types/dsh-better-display.d.ts +17 -0
  260. package/lib/types/dsh-better-display.d.ts.map +1 -0
  261. package/lib/types/dsh-better-display.js +93 -0
  262. package/lib/types/dsh-better-display.js.map +1 -0
  263. package/lib/types/skill-roots.d.ts +22 -0
  264. package/lib/types/skill-roots.d.ts.map +1 -0
  265. package/lib/types/skill-roots.js +126 -0
  266. package/lib/types/skill-roots.js.map +1 -0
  267. package/lib/types/skill-status.d.ts +36 -0
  268. package/lib/types/skill-status.d.ts.map +1 -0
  269. package/lib/types/skill-status.js +51 -0
  270. package/lib/types/skill-status.js.map +1 -0
  271. package/package.json +133 -0
  272. package/scripts/build-motion-fixture.mjs +26 -0
  273. package/scripts/check-harness-compat.mjs +71 -0
  274. package/scripts/link-harness-dependencies.mjs +54 -0
  275. package/scripts/verify-auto-fold.mjs +114 -0
  276. package/scripts/verify-official-bridge.mjs +121 -0
  277. package/scripts/verify-tool-shimmer.mjs +62 -0
  278. package/skills/generative-mcpapps/SKILL.md +47 -0
  279. package/skills/generative-mcpapps/examples/interactive_quiz.html +153 -0
  280. package/skills/generative-mcpapps/references/html_boilerplate.md +122 -0
  281. package/skills/generative-mcpapps/references/sep1865_protocol.md +54 -0
  282. package/src/client/Blocks.tsx +213 -0
  283. package/src/client/ChoreographedFlow.tsx +232 -0
  284. package/src/client/ClosedProcessSummary.tsx +23 -0
  285. package/src/client/DiffPanel.tsx +124 -0
  286. package/src/client/LiveFold.tsx +43 -0
  287. package/src/client/McpAppFrame.module.css +210 -0
  288. package/src/client/McpAppFrame.tsx +317 -0
  289. package/src/client/OfficialContent.tsx +69 -0
  290. package/src/client/Reader.module.css +692 -0
  291. package/src/client/Reader.tsx +878 -0
  292. package/src/client/ReasoningCard.tsx +306 -0
  293. package/src/client/SettingsSection.module.css +184 -0
  294. package/src/client/SettingsSection.tsx +194 -0
  295. package/src/client/StickyLane.tsx +34 -0
  296. package/src/client/TimelineRail.module.css +170 -0
  297. package/src/client/TimelineRail.tsx +262 -0
  298. package/src/client/ToolActivity.tsx +274 -0
  299. package/src/client/TurnMetrics.module.css +139 -0
  300. package/src/client/TurnMetrics.tsx +160 -0
  301. package/src/client/WaitClock.tsx +33 -0
  302. package/src/client/WaitingStatus.tsx +13 -0
  303. package/src/client/conversation-scroll.ts +28 -0
  304. package/src/client/deliverables.ts +122 -0
  305. package/src/client/entry-policy.ts +20 -0
  306. package/src/client/entry.tsx +40 -0
  307. package/src/client/fold-choreography.ts +55 -0
  308. package/src/client/fold-intensity.ts +36 -0
  309. package/src/client/index.tsx +222 -0
  310. package/src/client/live-turn.ts +198 -0
  311. package/src/client/markdown/MarkdownText.module.css +304 -0
  312. package/src/client/markdown/MarkdownText.tsx +195 -0
  313. package/src/client/markdown/cjkFriendlyStrong.ts +84 -0
  314. package/src/client/markdown/incremental.ts +131 -0
  315. package/src/client/markdown/katex.tsx +91 -0
  316. package/src/client/markdown/mathCompatibility.ts +350 -0
  317. package/src/client/markdown/parse.ts +45 -0
  318. package/src/client/markdown/render.tsx +647 -0
  319. package/src/client/markdown/upstream.json +14 -0
  320. package/src/client/mcp-app.ts +323 -0
  321. package/src/client/message-chrome.ts +47 -0
  322. package/src/client/motion.tsx +410 -0
  323. package/src/client/native/ContextBody.module.css +161 -0
  324. package/src/client/native/ContextBody.tsx +591 -0
  325. package/src/client/native/ContextInjectionRow.module.css +66 -0
  326. package/src/client/native/ContextInjectionRow.tsx +106 -0
  327. package/src/client/native/ReferenceIcon.tsx +35 -0
  328. package/src/client/native/tool-call-model.ts +248 -0
  329. package/src/client/native/tool-update.ts +32 -0
  330. package/src/client/native/upstream.json +41 -0
  331. package/src/client/official-slots.tsx +211 -0
  332. package/src/client/open-file.ts +94 -0
  333. package/src/client/pending-submission.ts +49 -0
  334. package/src/client/platform-media.ts +17 -0
  335. package/src/client/primitive-labels.ts +54 -0
  336. package/src/client/projection.ts +118 -0
  337. package/src/client/reasoning-follow.ts +28 -0
  338. package/src/client/settings-copy.ts +80 -0
  339. package/src/client/settings-slots.ts +20 -0
  340. package/src/client/settings.tsx +73 -0
  341. package/src/client/skill-status.ts +78 -0
  342. package/src/client/store.ts +75 -0
  343. package/src/client/stream-buffer.ts +136 -0
  344. package/src/client/streaming.tsx +70 -0
  345. package/src/client/style.d.ts +4 -0
  346. package/src/client/timeline.ts +77 -0
  347. package/src/client/tool-activity.ts +298 -0
  348. package/src/client/types.ts +89 -0
  349. package/src/client/waiting-clock.ts +83 -0
  350. package/src/client/word-motion.tsx +92 -0
  351. package/src/client/word-timeline.ts +113 -0
  352. package/src/dsh-better-display.ts +108 -0
  353. package/src/skill-roots.ts +138 -0
  354. package/src/skill-status.ts +81 -0
  355. package/tests/browser-auto-fold.tsx +64 -0
  356. package/tests/browser-closed-gap.tsx +20 -0
  357. package/tests/browser-motion.tsx +65 -0
  358. package/tests/browser-official-bridge.tsx +152 -0
  359. package/tests/browser-sticky-lanes.tsx +22 -0
  360. package/tests/browser-waiting-clock.tsx +14 -0
  361. package/tests/chat-flow-hook.test.ts +66 -0
  362. package/tests/cloud-gate.test.ts +34 -0
  363. package/tests/context-tool-update.test.ts +33 -0
  364. package/tests/conversation-scroll.test.ts +47 -0
  365. package/tests/deliverables.test.ts +128 -0
  366. package/tests/entry.test.ts +42 -0
  367. package/tests/fixtures/maid-composer-hide.html +31 -0
  368. package/tests/fold-choreography.test.ts +54 -0
  369. package/tests/fold-intensity.test.ts +94 -0
  370. package/tests/footer-precedence.test.ts +129 -0
  371. package/tests/history-word-regression.test.ts +16 -0
  372. package/tests/live-turn.test.ts +218 -0
  373. package/tests/mcp-apps.test.ts +157 -0
  374. package/tests/message-chrome.test.ts +29 -0
  375. package/tests/official-slots.test.ts +112 -0
  376. package/tests/open-file.test.ts +114 -0
  377. package/tests/pending-submission.test.ts +45 -0
  378. package/tests/platform-media.test.ts +23 -0
  379. package/tests/projection.test.ts +184 -0
  380. package/tests/reasoning-follow.test.ts +34 -0
  381. package/tests/settings-copy.test.ts +63 -0
  382. package/tests/skill-status.test.ts +137 -0
  383. package/tests/stock-install.test.ts +58 -0
  384. package/tests/stream-buffer.test.ts +102 -0
  385. package/tests/timeline.test.ts +59 -0
  386. package/tests/tool-diff.test.ts +57 -0
  387. package/tests/waiting-clock.test.ts +83 -0
  388. package/tests/word-timeline.test.ts +146 -0
  389. package/tsconfig.json +11 -0
  390. package/tsdown.config.ts +51 -0
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useLayoutEffect, useRef } from 'react';
3
+ /** Publish real lane geometry; wrapped labels must not collide with statistics. */
4
+ export function StickyLane({ kind, className, children }) {
5
+ const ref = useRef(null);
6
+ useLayoutEffect(() => {
7
+ const el = ref.current;
8
+ const scope = el?.closest(kind === 'toolbar' ? '[data-dsh-better-display]' : '[data-reader-turn]');
9
+ if (!el || !scope)
10
+ return;
11
+ const property = kind === 'toolbar' ? '--reader-toolbar-height' : '--reader-status-height';
12
+ const update = () => {
13
+ scope.style.setProperty(property, `${el.getBoundingClientRect().height}px`);
14
+ if (kind !== 'toolbar')
15
+ return;
16
+ // The status lane is sized as calc(100% - --reader-control-width), so this
17
+ // must reserve the WHOLE control group. Measuring only the first button
18
+ // left every later control painted over by the status lane.
19
+ const controls = el.querySelectorAll('button');
20
+ let width = 80;
21
+ if (controls.length > 0) {
22
+ const first = controls[0].getBoundingClientRect();
23
+ const last = controls[controls.length - 1].getBoundingClientRect();
24
+ width = last.right - first.left;
25
+ }
26
+ scope.style.setProperty('--reader-control-width', `${width + 28}px`);
27
+ };
28
+ update();
29
+ const observer = new ResizeObserver(update);
30
+ observer.observe(el);
31
+ if (kind === 'toolbar')
32
+ for (const control of el.querySelectorAll('button'))
33
+ observer.observe(control);
34
+ return () => { observer.disconnect(); scope.style.removeProperty(property); if (kind === 'toolbar')
35
+ scope.style.removeProperty('--reader-control-width'); };
36
+ }, [kind]);
37
+ return _jsx("div", { ref: ref, className: className, "data-reader-lane": kind, "data-ud-check": kind === 'toolbar' ? 'reader-toolbar' : undefined, children: children });
38
+ }
39
+ //# sourceMappingURL=StickyLane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StickyLane.js","sourceRoot":"","sources":["../../../src/client/StickyLane.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGhD,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAA0E;IAC9H,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,MAAM,KAAK,GAAG,EAAE,EAAE,OAAO,CAAc,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAChH,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK;YAAE,OAAO;QAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAC3F,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;YAC5E,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO;YAC/B,2EAA2E;YAC3E,wEAAwE;YACxE,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,qBAAqB,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,qBAAqB,EAAE,CAAC;gBACpE,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;YAClC,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC;QACF,MAAM,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvG,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9J,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,OAAO,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,sBAAoB,IAAI,mBAAiB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,YAAG,QAAQ,GAAO,CAAC;AACzJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { TimelineItem } from './timeline.js';
2
+ interface TimelineRailProps {
3
+ items: readonly TimelineItem[];
4
+ activeTurn: number | null;
5
+ busyTurn?: number | null;
6
+ onNavigate: (item: TimelineItem) => void;
7
+ }
8
+ export declare const TimelineRail: import("react").MemoExoticComponent<({ items, activeTurn, busyTurn, onNavigate, }: TimelineRailProps) => import("react").JSX.Element | null>;
9
+ export {};
10
+ //# sourceMappingURL=TimelineRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineRail.d.ts","sourceRoot":"","sources":["../../../src/client/TimelineRail.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,UAAU,iBAAiB;IACzB,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C;AAwDD,eAAO,MAAM,YAAY,qFAKtB,iBAAiB,wCA4LlB,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useEffect, useId, useRef, useState, } from 'react';
3
+ import css from './TimelineRail.module.css';
4
+ const TURN_SPACING_PX = 12;
5
+ const RAIL_INSET_PX = 6;
6
+ const FADE_PX = 24;
7
+ function itemPosition(index) {
8
+ return { '--turn-natural-position': `${index * TURN_SPACING_PX}px` };
9
+ }
10
+ function frameStyle(count, scrollTop) {
11
+ return {
12
+ '--turn-natural-height': `${(count - 1) * TURN_SPACING_PX + 2 * RAIL_INSET_PX}px`,
13
+ '--turn-rail-inset': `${RAIL_INSET_PX}px`,
14
+ '--turn-scroll-top': `${scrollTop}px`,
15
+ };
16
+ }
17
+ function itemIndexAtPointer(items, frame, scrollTop, clientY) {
18
+ const rect = frame.getBoundingClientRect();
19
+ const offset = clientY - rect.top + scrollTop - RAIL_INSET_PX;
20
+ return Math.max(0, Math.min(items.length - 1, Math.round(offset / TURN_SPACING_PX)));
21
+ }
22
+ const RAIL_AT_REST = { top: 0, canScrollUp: false, canScrollDown: false };
23
+ function railScrollState(scroller) {
24
+ const top = scroller.scrollTop;
25
+ return {
26
+ top,
27
+ canScrollUp: top > 1,
28
+ canScrollDown: top < scroller.scrollHeight - scroller.clientHeight - 1,
29
+ };
30
+ }
31
+ export const TimelineRail = memo(function TimelineRail({ items, activeTurn, busyTurn, onNavigate, }) {
32
+ const [hoveredIndex, setHoveredIndex] = useState(null);
33
+ const [scrollState, setScrollState] = useState(RAIL_AT_REST);
34
+ const scrollerRef = useRef(null);
35
+ const pointerInsideRef = useRef(false);
36
+ const previewId = useId();
37
+ const syncScrollState = () => {
38
+ const scroller = scrollerRef.current;
39
+ if (!scroller)
40
+ return;
41
+ const next = railScrollState(scroller);
42
+ setScrollState(cur => (cur.top === next.top && cur.canScrollUp === next.canScrollUp && cur.canScrollDown === next.canScrollDown ? cur : next));
43
+ };
44
+ useEffect(() => {
45
+ const scroller = scrollerRef.current;
46
+ if (!scroller || typeof ResizeObserver === 'undefined')
47
+ return;
48
+ const observer = new ResizeObserver(syncScrollState);
49
+ observer.observe(scroller);
50
+ return () => observer.disconnect();
51
+ }, []);
52
+ useEffect(syncScrollState, [items.length]);
53
+ // Keep active mark visible
54
+ useEffect(() => {
55
+ const scroller = scrollerRef.current;
56
+ const index = items.findIndex(item => item.turn === activeTurn);
57
+ if (!scroller || index < 0 || pointerInsideRef.current)
58
+ return;
59
+ const markTop = index * TURN_SPACING_PX + RAIL_INSET_PX;
60
+ const viewTop = scroller.scrollTop;
61
+ const viewHeight = scroller.clientHeight;
62
+ if (viewHeight <= 0 || (markTop >= viewTop + FADE_PX && markTop <= viewTop + viewHeight - FADE_PX))
63
+ return;
64
+ const target = Math.max(0, markTop - viewHeight / 2);
65
+ if (typeof scroller.scrollTo === 'function') {
66
+ scroller.scrollTo({ top: target, behavior: 'smooth' });
67
+ }
68
+ else {
69
+ scroller.scrollTop = target;
70
+ }
71
+ syncScrollState();
72
+ }, [activeTurn, items]);
73
+ if (items.length < 2)
74
+ return null;
75
+ const preview = hoveredIndex !== null && hoveredIndex >= 0 ? items[hoveredIndex] : undefined;
76
+ const previewPosition = hoveredIndex !== null && hoveredIndex >= 0 ? itemPosition(hoveredIndex) : undefined;
77
+ const onPointerMove = (event) => {
78
+ const scroller = scrollerRef.current;
79
+ const scrollTop = scroller?.scrollTop ?? 0;
80
+ const idx = itemIndexAtPointer(items, event.currentTarget, scrollTop, event.clientY);
81
+ setHoveredIndex(idx);
82
+ };
83
+ const onPointerLeave = () => {
84
+ pointerInsideRef.current = false;
85
+ setHoveredIndex(null);
86
+ };
87
+ const navigateAtPointer = (event) => {
88
+ const scroller = scrollerRef.current;
89
+ const scrollTop = scroller?.scrollTop ?? 0;
90
+ const idx = itemIndexAtPointer(items, event.currentTarget, scrollTop, event.clientY);
91
+ const item = items[idx];
92
+ if (item !== undefined)
93
+ onNavigate(item);
94
+ };
95
+ const fadeClasses = [css.scroller];
96
+ if (scrollState.canScrollUp)
97
+ fadeClasses.push(css.fadeTop);
98
+ if (scrollState.canScrollDown)
99
+ fadeClasses.push(css.fadeBottom);
100
+ return (_jsx("div", { className: css.slot, children: _jsxs("nav", { className: css.frame, style: frameStyle(items.length, scrollState.top), "aria-label": "\u8F6E\u6B21\u5BFC\u822A\u65F6\u95F4\u8F74", onClick: navigateAtPointer, onPointerMove: onPointerMove, onPointerEnter: () => { pointerInsideRef.current = true; }, onPointerLeave: onPointerLeave, onMouseDown: event => { event.preventDefault(); }, children: [_jsx("div", { ref: scrollerRef, className: fadeClasses.join(' '), onScroll: syncScrollState, children: _jsx("div", { className: css.marks, children: items.map((item, index) => {
101
+ const isBusy = busyTurn === item.turn;
102
+ const isActive = activeTurn === item.turn;
103
+ const isUnloaded = item.anchor.kind === 'unloaded';
104
+ // Wave calculation: peak at cursor, smoothly tapering off in width and height
105
+ let width = isUnloaded ? 6 : 8;
106
+ let height = 2;
107
+ let opacity = isUnloaded ? 0.3 : 0.45;
108
+ let background = 'var(--dsw-alias-label-tertiary)';
109
+ if (hoveredIndex !== null) {
110
+ const diff = Math.abs(index - hoveredIndex);
111
+ if (diff === 0) {
112
+ // Cursor peak (最长最高)
113
+ width = 26;
114
+ height = 2.8;
115
+ opacity = 1.0;
116
+ background = 'var(--dsw-alias-label-primary)';
117
+ }
118
+ else if (diff === 1) {
119
+ // 旁边第 1 阶 (次长次高)
120
+ width = 18;
121
+ height = 2.2;
122
+ opacity = 0.8;
123
+ background = 'var(--dsw-alias-label-primary)';
124
+ }
125
+ else if (diff === 2) {
126
+ // 旁边第 2 阶 (继续变矮变短)
127
+ width = 13;
128
+ height = 1.8;
129
+ opacity = 0.6;
130
+ background = 'var(--dsw-alias-label-secondary)';
131
+ }
132
+ else if (diff === 3) {
133
+ // 旁边第 3 阶 (平缓过渡)
134
+ width = 9;
135
+ height = 1.6;
136
+ opacity = 0.45;
137
+ background = 'var(--dsw-alias-label-tertiary)';
138
+ }
139
+ else {
140
+ // 远离光标的基线
141
+ width = 8;
142
+ height = 2;
143
+ opacity = 0.35;
144
+ background = 'var(--dsw-alias-label-tertiary)';
145
+ }
146
+ }
147
+ else if (isActive) {
148
+ width = 20;
149
+ height = 2.4;
150
+ opacity = 0.95;
151
+ background = 'var(--dsw-alias-label-primary)';
152
+ }
153
+ const tickStyle = {
154
+ width: `${width}px`,
155
+ height: `${height}px`,
156
+ opacity,
157
+ backgroundColor: background,
158
+ };
159
+ const markClasses = [css.mark];
160
+ if (isBusy)
161
+ markClasses.push(css.markBusy);
162
+ return (_jsx("div", { className: css.markPosition, style: itemPosition(index), children: _jsx("button", { type: "button", className: markClasses.join(' '), "aria-label": `第 ${item.turn + 1} 轮`, "aria-current": isActive ? 'true' : undefined, "aria-busy": isBusy ? 'true' : undefined, "aria-describedby": hoveredIndex === index ? previewId : undefined, onMouseDown: event => { event.preventDefault(); }, onClick: (e) => {
163
+ e.stopPropagation();
164
+ onNavigate(item);
165
+ }, onFocus: () => setHoveredIndex(index), onBlur: () => setHoveredIndex(null), children: _jsx("span", { className: css.tick, style: tickStyle }) }) }, item.turn));
166
+ }) }) }), preview !== undefined && previewPosition !== undefined && (_jsxs("div", { id: previewId, role: "tooltip", className: css.preview, style: previewPosition, children: [_jsx("div", { className: css.previewPrompt, children: preview.prompt || `第 ${preview.turn + 1} 轮` }), preview.response !== '' && (_jsx("div", { className: css.previewResponse, children: preview.response }))] }))] }) }));
167
+ });
168
+ //# sourceMappingURL=TimelineRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineRail.js","sourceRoot":"","sources":["../../../src/client/TimelineRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
+ import type { ToolActivityEntry } from './tool-activity.js';
3
+ import type { BlockRenderProps } from './types.js';
4
+ /** One occurrence, keyed by call id all the way from generation to result. */
5
+ export declare const ToolActivity: import("react").MemoExoticComponent<({ entry, motion, turnClosed, onRead, depth, ...render }: BlockRenderProps & {
6
+ entry: ToolActivityEntry;
7
+ motion: boolean;
8
+ turnClosed: boolean;
9
+ onRead: () => void;
10
+ depth?: number;
11
+ }) => import("react").JSX.Element>;
12
+ /** Rich media (images, MCP widgets) rendered outside the folded tool ledger. */
13
+ export declare function ToolMedia({ block, depth, ...render }: BlockRenderProps & {
14
+ block: ToolCallBlock;
15
+ depth?: number;
16
+ }): import("react").JSX.Element | null;
17
+ //# sourceMappingURL=ToolActivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolActivity.d.ts","sourceRoot":"","sources":["../../../src/client/ToolActivity.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,gDAAgD,CAAC;AAQpG,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkJnD,8EAA8E;AAC9E,eAAO,MAAM,YAAY,gGAA+F,gBAAgB,GAAG;IACzI,KAAK,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACpG,iCAuG4G,CAAC;AAE9G,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAS,EAAE,GAAG,MAAM,EAAE,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,sCAQrH"}
@@ -0,0 +1,244 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo, useEffect, useId, useMemo, useRef, useState } from 'react';
3
+ import { DiffBlock, DisclosureRow, JsonTree, ReadBlock, SearchBlock, TerminalBlock, WebBlock, IconApiOutlineRegular, IconBrowseOutlineRegular, IconEditOutlineRegular, IconSearchOutlineRegular, IconSkillOutlineRegular, IconSparkleRegular } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { Blocks, contentBlocks } from './Blocks.js';
5
+ import { OfficialTool } from './OfficialContent.js';
6
+ import { ProcessFragment } from './motion.js';
7
+ import { activityPhase, activitySummary, callDiffHunks, diffTotals, executionFacts, objectValue } from './tool-activity.js';
8
+ import { classifyTool, toolRowModel, VARIANT_TITLES } from './native/tool-call-model.js';
9
+ import { McpAppFrame, StreamingMcpAppPlaceholder } from './McpAppFrame.js';
10
+ import { diffBlockLabels, jsonTreeLabels, readBlockLabels, searchBlockLabels, terminalBlockLabels, webBlockLabels } from './primitive-labels.js';
11
+ import css from './Reader.module.css';
12
+ const LABEL = { preparing: '输入生成中', running: '执行中', returned: '已返回', succeeded: '已完成', failed: '失败', interrupted: '已中断' };
13
+ const ICONS = { write: IconEditOutlineRegular, read: IconBrowseOutlineRegular, terminal: IconApiOutlineRegular, search: IconSearchOutlineRegular, web: IconSearchOutlineRegular, code: IconApiOutlineRegular, other: IconSparkleRegular };
14
+ const number = new Intl.NumberFormat('zh-CN');
15
+ const language = (path) => path?.split('.').at(-1);
16
+ const duration = (ms) => ms < 1000 ? `${Math.round(ms)} 毫秒` : `${(ms / 1000).toFixed(ms < 10000 ? 1 : 0)} 秒`;
17
+ function generatedInput(content, target, preparing) {
18
+ const lines = content.split('\n').map((text, index) => ({ number: index + 1, text }));
19
+ const visible = preparing ? lines.slice(-12) : lines.slice(0, 1600);
20
+ return _jsxs("div", { "data-reader-tool-file": true, children: [_jsxs("p", { className: css.toolDetailNote, children: [preparing ? '正在生成的输入 · 尚未执行 · 末尾 12 行' : '工具输入中的文件内容', !preparing && lines.length > visible.length ? ' · 预览前 1,600 行,完整内容在原始数据中' : ''] }), _jsx(ReadBlock, { label: target ?? '文件内容', lang: language(target), lines: visible, totalLines: lines.length, maxLines: 16, labels: readBlockLabels })] });
21
+ }
22
+ function InputView({ model, preparing, fillComposer }) {
23
+ if ((model.name === 'render_ui' || model.name === 'show_widget') && typeof model.args?.html === 'string') {
24
+ return preparing
25
+ ? _jsx(StreamingMcpAppPlaceholder, { title: typeof model.args.title === 'string' ? model.args.title : undefined })
26
+ : _jsx(McpAppFrame, { html: model.args.html, title: typeof model.args.title === 'string' ? model.args.title : undefined, fillComposer: fillComposer });
27
+ }
28
+ if (model.content)
29
+ return generatedInput(model.content, model.target, preparing);
30
+ if (model.command)
31
+ return _jsxs("div", { "data-reader-tool-terminal": true, children: [_jsx("p", { className: css.toolDetailNote, children: preparing ? '正在生成命令 · 尚未执行' : '提交的命令' }), _jsx(TerminalBlock, { command: model.command, cwd: model.cwd, labels: terminalBlockLabels })] });
32
+ return _jsx(JsonTree, { data: model.args, label: preparing ? '已收到的输入字段' : '工具输入', labels: jsonTreeLabels });
33
+ }
34
+ function readLines(value) {
35
+ if (!Array.isArray(value))
36
+ return null;
37
+ const lines = [];
38
+ for (const item of value) {
39
+ const row = objectValue(item);
40
+ if (typeof row?.number !== 'number' || !Number.isInteger(row.number) || typeof row.text !== 'string')
41
+ return null;
42
+ lines.push({ number: row.number, text: row.text });
43
+ }
44
+ return lines;
45
+ }
46
+ /** A step past this reads as slow rather than merely in progress. */
47
+ const SLOW_TOOL_MS = 10_000;
48
+ function diffHunks(value) {
49
+ if (!Array.isArray(value) || value.length === 0)
50
+ return null;
51
+ const diffs = [];
52
+ for (const item of value) {
53
+ const row = objectValue(item);
54
+ if (typeof row?.path !== 'string' || (row.oldText !== null && typeof row.oldText !== 'string') || typeof row.newText !== 'string')
55
+ return null;
56
+ diffs.push({ path: row.path, oldText: row.oldText, newText: row.newText });
57
+ }
58
+ return diffs;
59
+ }
60
+ function searchFiles(value) {
61
+ if (!Array.isArray(value))
62
+ return null;
63
+ const files = [];
64
+ for (const item of value) {
65
+ const row = objectValue(item);
66
+ if (typeof row?.path !== 'string' || !Array.isArray(row.matches))
67
+ return null;
68
+ const matches = [];
69
+ for (const itemMatch of row.matches) {
70
+ const match = objectValue(itemMatch);
71
+ if (typeof match?.lineNumber !== 'number' || !Number.isInteger(match.lineNumber) || typeof match.line !== 'string')
72
+ return null;
73
+ matches.push({ lineNumber: match.lineNumber, line: match.line });
74
+ }
75
+ files.push({ path: row.path, matches });
76
+ }
77
+ return files;
78
+ }
79
+ function ResultView(props) {
80
+ const { official, entry, model } = props;
81
+ const fallback = _jsx(ResultFallback, { ...props });
82
+ if (!official || !entry.block || model.name === 'render_ui' || model.name === 'show_widget')
83
+ return fallback;
84
+ return _jsx(OfficialTool, { ...props, official: official, block: entry.block, toolName: model.name, cwd: props.cwd ?? model.cwd, fallback: fallback });
85
+ }
86
+ function ResultFallback({ entry, model, phase, ...render }) {
87
+ if ((model.name === 'render_ui' || model.name === 'show_widget') && typeof model.args?.html === 'string') {
88
+ return _jsx(McpAppFrame, { html: model.args.html, title: typeof model.args.title === 'string' ? model.args.title : undefined, fillComposer: render.fillComposer });
89
+ }
90
+ const block = entry.block;
91
+ if (!block || !('kind' in block))
92
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: phase === 'interrupted' ? '已中断,没有工具结果。已生成的输入仍可查看。' : phase === 'preparing' ? '模型正在生成工具输入,工具还未开始执行。' : '工具已开始执行,正在等待结果。' }), _jsx(InputView, { model: model, preparing: phase === 'preparing', fillComposer: render.fillComposer })] });
93
+ const meta = objectValue(block.meta);
94
+ const text = block.content.filter(item => item.type === 'text').map(item => item.text).join('\n');
95
+ if (phase === 'interrupted')
96
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u5DE5\u5177\u5DF2\u53D6\u6D88\uFF0C\u672A\u6B63\u5E38\u5B8C\u6210\u3002\u8F93\u5165\u548C\u539F\u59CB\u8FD4\u56DE\u8BB0\u5F55\u4ECD\u53EF\u67E5\u770B\u3002" }), _jsx(InputView, { model: model, preparing: false, fillComposer: render.fillComposer }), _jsx("pre", { className: css.toolRaw, children: text })] });
97
+ if (model.category === 'terminal') {
98
+ const facts = executionFacts(block);
99
+ const output = text.replace(/\n\[(?:exit code: \d+|killed by signal: [^\]\n]+)\]$/, '');
100
+ return _jsx("div", { "data-reader-tool-terminal": true, children: _jsx(TerminalBlock, { command: model.command ?? model.name, cwd: model.cwd, output: output, exitCode: facts.exitCode, signal: facts.signal, maxLines: 18, labels: terminalBlockLabels }) });
101
+ }
102
+ const lines = readLines(meta?.lines);
103
+ if (model.category === 'read' && typeof meta?.path === 'string' && typeof meta.totalLines === 'number' && lines)
104
+ return _jsx("div", { "data-reader-tool-file": true, children: _jsx(ReadBlock, { label: meta.path, lang: typeof meta.lang === 'string' ? meta.lang : undefined, lines: lines, totalLines: meta.totalLines, maxLines: 18, labels: readBlockLabels }) });
105
+ // The host's own hunks when it sent them; otherwise derive them from the call's
106
+ // arguments, which is also what the official row does while a write is pending.
107
+ // Both the counts and this card read the same source, so they cannot disagree.
108
+ const diffs = diffHunks(meta?.diffs) ?? callDiffHunks(block, model.args, model.name);
109
+ if (diffs.length)
110
+ return _jsx("div", { "data-reader-tool-diff": true, children: _jsx(DiffBlock, { diffs: diffs, maxLines: 18, labels: diffBlockLabels }) });
111
+ if (model.category === 'search' && typeof meta?.total === 'number' && typeof meta.truncated === 'boolean') {
112
+ if (meta.shape === 'paths' && Array.isArray(meta.paths) && meta.paths.every((path) => typeof path === 'string'))
113
+ return _jsx("div", { "data-reader-tool-search": true, children: _jsx(SearchBlock, { kind: "paths", paths: meta.paths, total: meta.total, truncated: meta.truncated, maxLines: 18, labels: searchBlockLabels }) });
114
+ const files = searchFiles(meta.files);
115
+ if (meta.shape === 'matches' && files)
116
+ return _jsx("div", { "data-reader-tool-search": true, children: _jsx(SearchBlock, { kind: "matches", files: files, total: meta.total, truncated: meta.truncated, maxLines: 18, labels: searchBlockLabels }) });
117
+ }
118
+ if (model.category === 'web' && typeof meta?.truncated === 'boolean') {
119
+ if (model.name === 'web_fetch' && typeof meta.url === 'string' && typeof meta.statusCode === 'number')
120
+ return _jsx("div", { "data-reader-tool-web": true, children: _jsx(WebBlock, { kind: "fetch", url: meta.url, statusCode: meta.statusCode, truncated: meta.truncated, labels: webBlockLabels }) });
121
+ if (model.name === 'web_search' && Array.isArray(meta.sources)) {
122
+ const sources = meta.sources.flatMap(source => {
123
+ const item = objectValue(source);
124
+ return typeof item?.url === 'string' ? [{ url: item.url, ...(typeof item.title === 'string' ? { title: item.title } : {}), ...(typeof item.snippet === 'string' ? { snippet: item.snippet } : {}), ...(typeof item.publishedAt === 'string' ? { publishedAt: item.publishedAt } : {}) }] : [];
125
+ });
126
+ if (sources.length === meta.sources.length)
127
+ return _jsx("div", { "data-reader-tool-web": true, children: _jsx(WebBlock, { kind: "search", sources: sources, answer: typeof meta.answer === 'string' ? meta.answer : undefined, truncated: meta.truncated, labels: webBlockLabels }) });
128
+ }
129
+ }
130
+ // A trace/export may omit wire presentation. Keep the generated input clearly
131
+ // labelled; it is not proof of an applied diff or a successful file mutation.
132
+ if (model.category === 'write' && model.content && !block.isError)
133
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u6587\u4EF6\u5DE5\u5177\u5DF2\u8FD4\u56DE\u3002\u4EE5\u4E0B\u4E3A\u63D0\u4EA4\u7684\u5185\u5BB9\uFF1B\u5B8C\u6574\u8FD4\u56DE\u8BB0\u5F55\u53EF\u5728\u300C\u539F\u59CB\u6570\u636E\u300D\u67E5\u770B\u3002" }), generatedInput(model.content, model.target, false)] });
134
+ const content = block.content;
135
+ // A code interpreter's product is its result, not prose. Without this branch
136
+ // the output fell through to the generic document path below, which emits it
137
+ // as reader answer text — so a run_code card sat in the transcript outside
138
+ // every fold, the exact block the reader wanted to be able to close.
139
+ if (model.category === 'code') {
140
+ const output = content.filter(item => item.type === 'text').map(item => item.text).join('\n');
141
+ const facts = executionFacts(block);
142
+ if (output.trim())
143
+ return _jsx("div", { "data-reader-tool-code": true, children: _jsx(TerminalBlock, { command: model.command ?? model.name, cwd: model.cwd, output: output, exitCode: facts.exitCode, signal: facts.signal, maxLines: 18, labels: terminalBlockLabels }) });
144
+ return _jsx("p", { className: css.toolDetailNote, children: "\u4EE3\u7801\u5DF2\u6267\u884C\uFF0C\u6CA1\u6709\u53EF\u5C55\u793A\u7684\u8F93\u51FA\u3002" });
145
+ }
146
+ if (content.some(item => item.type === 'text'))
147
+ return _jsx("div", { className: css.toolDocument, children: _jsx(Blocks, { ...render, blocks: contentBlocks(content).filter(item => item.kind === 'text'), source: "tool" }) });
148
+ if (content.length)
149
+ return _jsx("p", { className: css.toolDetailNote, children: "\u56FE\u7247\u6216\u6269\u5C55\u5185\u5BB9\u5DF2\u5728\u5BF9\u8BDD\u4E2D\u5355\u72EC\u5C55\u793A\u3002" });
150
+ return _jsx("p", { className: css.toolDetailNote, children: "\u5DE5\u5177\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u5185\u5BB9\u3002" });
151
+ }
152
+ /** One occurrence, keyed by call id all the way from generation to result. */
153
+ export const ToolActivity = memo(function ToolActivityView({ entry, motion, turnClosed, onRead, depth = 0, ...render }) {
154
+ const [open, setOpen] = useState(false);
155
+ const [tab, setTab] = useState('result');
156
+ const control = useRef(null);
157
+ const panel = useRef(null);
158
+ const [selected, setSelected] = useState(false);
159
+ const detailId = useId();
160
+ const tabRefs = useRef([]);
161
+ const model = useMemo(() => activitySummary(entry), [entry.block, entry.draft]);
162
+ const phase = activityPhase(entry, turnClosed);
163
+ const heldPreview = useRef({ entry, model, phase });
164
+ if (!selected)
165
+ heldPreview.current = { entry, model, phase };
166
+ const preview = heldPreview.current;
167
+ useEffect(() => {
168
+ const track = () => {
169
+ const selection = document.getSelection();
170
+ setSelected(!!selection && !selection.isCollapsed && !!selection.anchorNode && !!panel.current?.contains(selection.anchorNode));
171
+ };
172
+ document.addEventListener('selectionchange', track);
173
+ return () => document.removeEventListener('selectionchange', track);
174
+ }, []);
175
+ const facts = executionFacts(entry.block);
176
+ const Icon = model.name === 'skill' ? IconSkillOutlineRegular : ICONS[model.category];
177
+ const block = entry.block;
178
+ const native = block ? toolRowModel(model.name, block) : null;
179
+ const skillName = typeof model.args?.name === 'string' ? model.args.name.split('\n')[0] : model.raw.split('\n')[0];
180
+ const rowTitle = model.name === 'skill' ? 'Skill' : native?.title ?? VARIANT_TITLES[classifyTool(model.name)];
181
+ const rowSummary = phase === 'interrupted' ? '已停止 · 调用记录保留' : model.name === 'skill' ? skillName : native?.errorSummary ?? native?.summary
182
+ ?? (classifyTool(model.name) === 'others' ? `${model.name} · ${model.target ?? model.title}` : model.target ?? model.title);
183
+ // Files that changed get the same +/- line counts the official tool row shows,
184
+ // read straight from the diff the host attached to the result.
185
+ const diff = useMemo(() => diffTotals(block, model.args, model.name), [block, model.args, model.name]);
186
+ // The changed lines ride in the row's own expansion, the way the official tool
187
+ // row shows them — one disclosure, not a second floating widget.
188
+ const showState = phase === 'preparing' || phase === 'running' || phase === 'failed' || phase === 'interrupted';
189
+ const running = phase === 'preparing' || phase === 'running';
190
+ // A step that has not returned yet counts its own seconds, so a long command
191
+ // reads as progress rather than as a stall. The clock is idle-rendered off the
192
+ // row's own call time, and disappears the moment the result arrives.
193
+ const [liveMs, setLiveMs] = useState(null);
194
+ const openedAt = useRef(null);
195
+ useEffect(() => {
196
+ if (!running) {
197
+ openedAt.current = null;
198
+ setLiveMs(null);
199
+ return;
200
+ }
201
+ const stamped = block && 'kind' in block && block.callTime != null ? block.callTime : null;
202
+ const base = stamped ?? (openedAt.current ??= Date.now());
203
+ const tick = () => setLiveMs(Math.max(0, Date.now() - base));
204
+ tick();
205
+ const timer = setInterval(tick, 200);
206
+ return () => clearInterval(timer);
207
+ }, [running, block]);
208
+ const elapsed = block && 'kind' in block && block.callTime != null ? Math.max(0, block.time - block.callTime) : null;
209
+ // A step that ran long keeps showing how long it took after it returns: the
210
+ // number is the point of the readout. A fast step shows nothing once it is done.
211
+ const shownMs = liveMs ?? (elapsed !== null && elapsed >= SLOW_TOOL_MS ? elapsed : null);
212
+ const rawResult = useMemo(() => {
213
+ const value = preview.entry.block;
214
+ return value && 'kind' in value ? JSON.stringify({ content: value.content, isError: value.isError, meta: value.meta }, null, 2) : '';
215
+ }, [preview.entry.block]);
216
+ const tabs = [['result', phase === 'preparing' ? '生成预览' : '结果'], ['input', '输入'], ['raw', '原始数据']];
217
+ const activate = (index) => { const item = tabs[(index + tabs.length) % tabs.length]; setTab(item[0]); tabRefs.current[(index + tabs.length) % tabs.length]?.focus(); };
218
+ if (depth > 6)
219
+ return _jsx("p", { className: css.meta, children: "\u66F4\u6DF1\u7684\u5D4C\u5957\u8C03\u7528\u53EF\u5728\u539F\u5BF9\u8BDD\u67E5\u770B\u3002" });
220
+ return _jsxs("div", { ref: element => { control.current = element?.querySelector('[data-disclosure-row]') ?? null; }, className: css.toolActivity, "data-reader-tool-call": entry.callId, "data-tool-phase": phase, "data-tool-args-length": model.raw.length, "data-tool-category": model.category, "data-expanded": open, "data-ud-check": "reader-tool-activity", children: [_jsx(DisclosureRow, { icon: _jsx(Icon, { size: 14 }), title: rowTitle, open: open, expandable: true, expandOnRowClick: true, keepContentWhenOpen: true, onToggle: () => { onRead(); setOpen(value => !value); }, rowClassName: css.nativeToolRow, collapsedContent: _jsxs(_Fragment, { children: [_jsx("span", { className: css.rowSeparator, "aria-hidden": true }), _jsx("span", { className: css.nativeToolSummary, title: rowSummary, "data-reader-tool-summary": true, ...(running ? { 'data-running': '' } : {}), children: rowSummary }), shownMs !== null && _jsxs("span", { className: css.toolElapsed, "data-reader-tool-elapsed": true, ...(shownMs >= SLOW_TOOL_MS ? { 'data-slow': '' } : {}), children: [(shownMs / 1000).toFixed(shownMs < 10000 ? 1 : 0), "s"] }), diff && _jsxs("span", { className: css.diffStat, "data-reader-diff-stat": true, children: [diff.added > 0 && _jsxs("span", { className: css.diffAdded, children: ["+", number.format(diff.added)] }), diff.removed > 0 && _jsxs("span", { className: css.diffRemoved, children: ["-", number.format(diff.removed)] })] }), showState && _jsx("span", { className: css.toolState, "data-phase": phase, children: LABEL[phase] })] }) }), _jsx(ProcessFragment, { open: open, motion: motion, onRead: onRead, returnFocusTo: control, nodeKey: `${entry.key}:detail`, framed: true, children: _jsxs("div", { id: detailId, className: css.toolDetails, children: [_jsxs("div", { className: css.toolLedger, "aria-live": "off", children: [_jsxs("span", { children: ["\u5DE5\u5177 \u00B7 ", _jsx("span", { className: css.toolEngine, children: model.name })] }), _jsx("span", { "data-reader-tool-progress": true, children: phase === 'preparing' ? `已接收 ${number.format(model.raw.length)} 字符输入` : phase === 'running' ? '已提交 · 等待工具返回' : phase === 'interrupted' ? '已停止 · 输入记录保留' : elapsed !== null ? `执行 ${duration(elapsed)}` : '结果已记录' }), facts.exitCode !== undefined && _jsxs("span", { children: ["\u9000\u51FA\u7801 ", facts.exitCode] }), facts.signal && _jsxs("span", { children: ["\u4FE1\u53F7 ", facts.signal] })] }), _jsx("div", { className: css.toolTabs, role: "tablist", "aria-label": `${model.title}的执行数据`, onKeyDown: event => {
221
+ const index = tabs.findIndex(item => item[0] === tab);
222
+ if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {
223
+ event.preventDefault();
224
+ activate(index + (event.key === 'ArrowRight' ? 1 : -1));
225
+ }
226
+ else if (event.key === 'Home' || event.key === 'End') {
227
+ event.preventDefault();
228
+ activate(event.key === 'Home' ? 0 : tabs.length - 1);
229
+ }
230
+ }, children: tabs.map(([id, title], index) => _jsx("button", { ref: element => { tabRefs.current[index] = element; }, type: "button", role: "tab", id: `${detailId}-${id}`, "aria-selected": tab === id, "aria-controls": `${detailId}-panel`, tabIndex: tab === id ? 0 : -1, onClick: () => setTab(id), children: title }, id)) }), _jsxs("div", { ref: panel, id: `${detailId}-panel`, className: css.toolPanel, role: "tabpanel", "aria-labelledby": `${detailId}-${tab}`, tabIndex: 0, children: [selected && _jsx("p", { className: css.toolDetailNote, children: "\u4E3A\u4FDD\u7559\u9009\u533A\uFF0C\u9884\u89C8\u6682\u505C\u66F4\u65B0\uFF1B\u5F53\u524D\u72B6\u6001\u89C1\u5361\u7247\u6807\u9898\u3002" }), tab === 'result' && _jsx(ResultView, { ...render, ...preview }), tab === 'input' && _jsxs(_Fragment, { children: [_jsx(InputView, { model: preview.model, preparing: preview.phase === 'preparing', fillComposer: render.fillComposer }), _jsxs("details", { className: css.detail, children: [_jsx("summary", { children: "\u5168\u90E8\u8F93\u5165\u5B57\u6BB5" }), _jsx(JsonTree, { data: preview.model.args, label: "\u8F93\u5165\u5B57\u6BB5", labels: jsonTreeLabels })] })] }), tab === 'raw' && _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u5B8C\u6574\u8BB0\u5F55 \u00B7 \u53EA\u8BFB \u00B7 \u4E0D\u6267\u884C\u5176\u4E2D\u7684\u4EE3\u7801" }), _jsx("h4", { className: css.toolRawLabel, children: "\u5DE5\u5177\u8F93\u5165" }), _jsx("pre", { className: css.toolRaw, children: preview.model.raw || '输入尚未到达' }), rawResult && _jsxs(_Fragment, { children: [_jsx("h4", { className: css.toolRawLabel, children: "\u5DE5\u5177\u7ED3\u679C" }), _jsx("pre", { className: css.toolRaw, children: rawResult })] })] })] })] }) }), !!block?.subCalls.length && _jsx("div", { className: css.toolChildren, "aria-label": "\u5B50\u8C03\u7528", children: block.subCalls.map((child, index) => _jsx(ToolActivity, { ...render, entry: { kind: 'tool', key: `reader-tool:${child.callId}`, callId: child.callId, step: entry.step, order: index, block: child }, motion: motion, turnClosed: turnClosed, onRead: onRead, depth: depth + 1 }, child.callId)) })] });
231
+ }, (previous, next) => previous.entry.callId === next.entry.callId && previous.entry.block === next.entry.block
232
+ && previous.entry.draft === next.entry.draft && previous.entry.step === next.entry.step
233
+ && previous.motion === next.motion && previous.turnClosed === next.turnClosed && previous.depth === next.depth
234
+ && previous.onRead === next.onRead && previous.renderSlotChain === next.renderSlotChain && previous.loadImage === next.loadImage && previous.fillComposer === next.fillComposer
235
+ && previous.official === next.official && previous.cwd === next.cwd && previous.openFile === next.openFile);
236
+ /** Rich media (images, MCP widgets) rendered outside the folded tool ledger. */
237
+ export function ToolMedia({ block, depth = 0, ...render }) {
238
+ if (depth > 6)
239
+ return null;
240
+ const settled = 'kind' in block;
241
+ const visible = settled ? contentBlocks(block.content).filter(item => item.kind === 'image' || item.kind === 'other') : [];
242
+ return _jsxs(_Fragment, { children: [visible.length > 0 && _jsx(Blocks, { ...render, blocks: visible, source: "tool" }), block.subCalls.map(child => _jsx(ToolMedia, { ...render, block: child, depth: depth + 1 }, child.callId))] });
243
+ }
244
+ //# sourceMappingURL=ToolActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolActivity.js","sourceRoot":"","sources":["../../../src/client/ToolActivity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { TurnTailChatData } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ type TurnTokenUsage = NonNullable<TurnTailChatData['tokenUsage']>;
3
+ export interface TurnMetricsProps {
4
+ usage?: TurnTokenUsage;
5
+ runMs?: number;
6
+ tokensPerSecond?: number;
7
+ ttftMs?: number;
8
+ }
9
+ export declare const TurnMetrics: import("react").MemoExoticComponent<({ usage, runMs, tokensPerSecond, ttftMs, }: TurnMetricsProps) => import("react").JSX.Element | null>;
10
+ export {};
11
+ //# sourceMappingURL=TurnMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnMetrics.d.ts","sourceRoot":"","sources":["../../../src/client/TurnMetrics.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI/E,KAAK,cAAc,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,eAAO,MAAM,WAAW,mFAKrB,gBAAgB,wCAsIjB,CAAC"}