@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,11 @@
1
+ /** Three-stop fold intensity persisted on `dsh.reader.v1`. Default is standard. */
2
+ export type FoldIntensity = 0 | 1 | 2;
3
+ export declare const FOLD_INTENSITY_DEFAULT: FoldIntensity;
4
+ /** Level 0: nothing auto-folds. Level 1: current-main choreography. Level 2: process summaries. */
5
+ export declare function foldIntensityOf(state: unknown): FoldIntensity;
6
+ export declare function frostedGlassOf(state: unknown): boolean;
7
+ /** Bubbles default on: snapshots persisted before the preference read as on. */
8
+ export declare function bubblesOf(state: unknown): boolean;
9
+ export declare function autoFoldFromIntensity(intensity: FoldIntensity): boolean;
10
+ export declare function processOnlyFromIntensity(intensity: FoldIntensity): boolean;
11
+ //# sourceMappingURL=fold-intensity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fold-intensity.d.ts","sourceRoot":"","sources":["../../../src/client/fold-intensity.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEtC,eAAO,MAAM,sBAAsB,EAAE,aAAiB,CAAC;AAEvD,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAM7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKtD;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKjD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,32 @@
1
+ export const FOLD_INTENSITY_DEFAULT = 1;
2
+ /** Level 0: nothing auto-folds. Level 1: current-main choreography. Level 2: process summaries. */
3
+ export function foldIntensityOf(state) {
4
+ const rec = state && typeof state === 'object' ? state : {};
5
+ if (rec.foldIntensity === 0 || rec.foldIntensity === 1 || rec.foldIntensity === 2)
6
+ return rec.foldIntensity;
7
+ if (rec.processOnly === true)
8
+ return 2;
9
+ if (rec.autoFold === false)
10
+ return 0;
11
+ return FOLD_INTENSITY_DEFAULT;
12
+ }
13
+ export function frostedGlassOf(state) {
14
+ if (state && typeof state === 'object' && 'frostedGlass' in state) {
15
+ return state.frostedGlass === true;
16
+ }
17
+ return state === true;
18
+ }
19
+ /** Bubbles default on: snapshots persisted before the preference read as on. */
20
+ export function bubblesOf(state) {
21
+ if (state && typeof state === 'object' && 'bubbles' in state) {
22
+ return state.bubbles !== false;
23
+ }
24
+ return true;
25
+ }
26
+ export function autoFoldFromIntensity(intensity) {
27
+ return intensity !== 0;
28
+ }
29
+ export function processOnlyFromIntensity(intensity) {
30
+ return intensity === 2;
31
+ }
32
+ //# sourceMappingURL=fold-intensity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fold-intensity.js","sourceRoot":"","sources":["../../../src/client/fold-intensity.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,sBAAsB,GAAkB,CAAC,CAAC;AAEvD,mGAAmG;AACnG,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,GAAG,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,aAAa,CAAC;IAC5G,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,EAAE,CAAC;QAClE,OAAQ,KAAoC,CAAC,YAAY,KAAK,IAAI,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QAC7D,OAAQ,KAA+B,CAAC,OAAO,KAAK,KAAK,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAwB;IAC5D,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAwB;IAC/D,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ export type { ReaderBlockOwner } from './types.js';
3
+ export { McpAppFrame } from './McpAppFrame.js';
4
+ export declare const name = "dsh-better-display-client";
5
+ export declare const inject: string[];
6
+ export declare function apply(ctx: Context): void;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAsDnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,eAAO,MAAM,IAAI,8BAA8B,CAAC;AAChD,eAAO,MAAM,MAAM,UAAsF,CAAC;AAE1G,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkKxC"}
@@ -0,0 +1,195 @@
1
+ import { resolveWorkspacePath } from '@deepseek-ai/dsh-util-workspace-path';
2
+ import * as workspacePathPkg from '@deepseek-ai/dsh-util-workspace-path';
3
+ import { dirname } from './deliverables.js';
4
+ import { Reader } from './Reader.js';
5
+ import { createReaderStore } from './store.js';
6
+ import { installReaderEntry } from './entry.js';
7
+ import { installBetterDisplaySettings } from './settings.js';
8
+ import { fillComposerDom } from './mcp-app.js';
9
+ import { fileAddressFor, modeFromSnapshot, openDeliverableFile } from './open-file.js';
10
+ import { installOfficialSlots, officialChildren } from './official-slots.js';
11
+ const officialFileAddressFor = workspacePathPkg.fileAddressFor;
12
+ async function openWorkspacePath(ctx, path) {
13
+ const remote = ctx.remote;
14
+ const remoteSession = remote?.session
15
+ ?? ctx.get?.('remote.session')
16
+ ?? (ctx.get?.('remote')?.session);
17
+ if (remoteSession?.openWorkspacePath) {
18
+ const result = await remoteSession.openWorkspacePath({ path });
19
+ if (!result?.ok) {
20
+ console.warn('[dsh-better-display] openWorkspacePath failed:', result?.error?.message);
21
+ }
22
+ }
23
+ else {
24
+ console.warn('[dsh-better-display] remote.session is not available');
25
+ }
26
+ }
27
+ export { McpAppFrame } from './McpAppFrame.js';
28
+ export const name = 'dsh-better-display-client';
29
+ export const inject = ['slots', 'sessions', 'conversation', 'uiConversation', 'remote', 'remote.session'];
30
+ export function apply(ctx) {
31
+ const store = createReaderStore();
32
+ // conversation.view is session-scoped, so session persist keys are
33
+ // `dsh.reader.v1.<sessionId>`. One root instance keeps glass, fold
34
+ // intensity, and open-mode on the unsuffixed `dsh.reader.v1` key.
35
+ const prefs = store.create();
36
+ installBetterDisplaySettings(ctx, prefs);
37
+ ctx.slots.inject('conversation.chat.node', function* () {
38
+ yield ctx.slots.register({
39
+ name: 'conversation.view',
40
+ id: 'reader',
41
+ order: -5,
42
+ label: () => '阅读',
43
+ locale: 'chat',
44
+ children: {
45
+ 'dsh-better-display.block': { kind: 'chain', scope: 'session' },
46
+ ...officialChildren(ctx.slots),
47
+ },
48
+ store,
49
+ inject: (sessionId) => {
50
+ const session = () => {
51
+ const current = ctx.sessions.binding(sessionId)?.session;
52
+ if (!current)
53
+ throw new Error('阅读页对应的会话已关闭。');
54
+ return current;
55
+ };
56
+ return {
57
+ openPrefs: prefs,
58
+ officialImageLoader: Object.assign((attachment) => ctx.uiConversation.imageUrl(sessionId, attachment), { peek: (attachment) => ctx.uiConversation.peekImageUrl(sessionId, attachment) }),
59
+ officialFileMentions: owner => ctx.get('chatFileMentions')?.forClosing(owner, sessionId),
60
+ officialPreviewFile: path => {
61
+ const cwd = ctx.sessions.list.getSnapshot().byId[sessionId]?.cwd;
62
+ const sidebar = ctx.get('sidebarRight');
63
+ if (!sidebar?.openResource)
64
+ throw new Error('文件预览面板不可用。');
65
+ sidebar.openResource((officialFileAddressFor ?? fileAddressFor)(sessionId, cwd, path));
66
+ },
67
+ officialHost: {
68
+ getSnapshot: () => ctx.remote.$host,
69
+ subscribe: listener => ctx.on('connection/reset', listener),
70
+ },
71
+ loadOlder: async () => { await session().loadOlder(); },
72
+ loadImage: async (attachment) => {
73
+ const receipt = await session().readAttachment(attachment.attachmentId);
74
+ if (!receipt.ok)
75
+ throw new Error(receipt.error.message);
76
+ return { data: Uint8Array.from(receipt.value.data), mediaType: receipt.value.attachment.mediaType };
77
+ },
78
+ openFile: async (path, options) => {
79
+ try {
80
+ const cwd = ctx.sessions?.list?.getSnapshot?.()?.byId[sessionId]?.cwd;
81
+ const sidebar = (ctx.get?.('sidebarRight')
82
+ ?? ctx.sidebarRight);
83
+ await openDeliverableFile({
84
+ path,
85
+ mode: modeFromSnapshot(prefs),
86
+ sessionId,
87
+ cwd,
88
+ resolveWorkspacePath,
89
+ openExternal: async (absolutePath) => { await openWorkspacePath(ctx, absolutePath); },
90
+ openSidebar: typeof sidebar?.openResource === 'function'
91
+ ? (address) => { sidebar.openResource(address, options?.line === undefined ? undefined : { params: { line: options.line } }); }
92
+ : undefined,
93
+ fileAddressFor: officialFileAddressFor ?? fileAddressFor,
94
+ warn: (message, extra) => { console.warn(message, extra); },
95
+ });
96
+ }
97
+ catch (error) {
98
+ console.warn('[dsh-better-display] openFile error:', error);
99
+ }
100
+ },
101
+ revealFile: async (path) => {
102
+ try {
103
+ const cwd = ctx.sessions?.list?.getSnapshot?.()?.byId[sessionId]?.cwd;
104
+ const targetPath = resolveWorkspacePath(cwd, path);
105
+ // 1. Try dedicated host endpoint for native file highlighting (open -R / explorer /select)
106
+ try {
107
+ const res = await fetch('/better-display/reveal', {
108
+ method: 'POST',
109
+ headers: { 'Content-Type': 'application/json' },
110
+ body: JSON.stringify({ path: targetPath }),
111
+ });
112
+ if (res.ok) {
113
+ const data = await res.json();
114
+ if (data.ok)
115
+ return;
116
+ }
117
+ }
118
+ catch {
119
+ // Server endpoint not yet available, fallback to directory open
120
+ }
121
+ // 2. Fallback to official opener with parent directory
122
+ const parentDir = dirname(targetPath);
123
+ const remote = ctx.remote;
124
+ const remoteSession = remote?.session
125
+ ?? ctx.get?.('remote.session');
126
+ if (remoteSession?.openWorkspacePath) {
127
+ await remoteSession.openWorkspacePath({ path: parentDir });
128
+ }
129
+ }
130
+ catch (error) {
131
+ console.warn('[dsh-better-display] revealFile error:', error);
132
+ }
133
+ },
134
+ forkAt: (seq) => {
135
+ // A missing anchor would silently fork the whole session instead of
136
+ // the intended turn prefix, so refuse it loudly rather than guessing.
137
+ if (typeof seq !== 'number' || !Number.isFinite(seq)) {
138
+ console.warn('[dsh-better-display] fork refused: missing anchor seq');
139
+ return;
140
+ }
141
+ try {
142
+ const sessionsApi = ctx.sessions;
143
+ if (sessionsApi?.fork) {
144
+ sessionsApi.fork({ sessionId, atSeq: seq, increaseTitle: true })
145
+ .then(childId => { sessionsApi.open?.(childId); })
146
+ .catch(err => { console.warn('[dsh-better-display] fork failed:', err); });
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.warn('[dsh-better-display] forkAt error:', error);
151
+ }
152
+ },
153
+ loadThrough: async (seq) => {
154
+ try {
155
+ const current = session();
156
+ if (typeof current?.loadThrough === 'function') {
157
+ await current.loadThrough(seq);
158
+ }
159
+ else {
160
+ await session().loadOlder();
161
+ }
162
+ }
163
+ catch (error) {
164
+ console.warn('[dsh-better-display] loadThrough error:', error);
165
+ }
166
+ },
167
+ fillComposer: (text) => {
168
+ // Sanctioned path: the conversation input shell owns the Lexical
169
+ // editor, so setDraft lands in the draft store deterministically.
170
+ try {
171
+ const conversation = ctx.conversation;
172
+ const shell = conversation?.input?.shell?.(sessionId);
173
+ if (shell && typeof shell.setDraft === 'function') {
174
+ shell.setDraft(text);
175
+ return true;
176
+ }
177
+ }
178
+ catch {
179
+ // Fall through to the DOM path below.
180
+ }
181
+ try {
182
+ return fillComposerDom(text);
183
+ }
184
+ catch {
185
+ return false;
186
+ }
187
+ },
188
+ };
189
+ },
190
+ }, Reader);
191
+ yield installOfficialSlots(ctx);
192
+ yield installReaderEntry(ctx);
193
+ });
194
+ }
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ import type { AssistantBlock } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ import type { TurnBoundary } from './projection.js';
4
+ import type { ReaderFlowEntry, ToolActivityEntry } from './tool-activity.js';
5
+ export type LiveStep = {
6
+ kind: 'reasoning';
7
+ key: string;
8
+ nodeKey: string;
9
+ start: number;
10
+ blocks: AssistantBlock[];
11
+ step: number;
12
+ } | {
13
+ kind: 'body';
14
+ key: string;
15
+ nodeKey: string;
16
+ start: number;
17
+ blocks: AssistantBlock[];
18
+ step: number;
19
+ } | {
20
+ kind: 'tool';
21
+ key: string;
22
+ entry: ToolActivityEntry;
23
+ } | {
24
+ kind: 'user';
25
+ key: string;
26
+ nodeKey: string;
27
+ } | {
28
+ kind: 'other';
29
+ key: string;
30
+ nodeKey: string;
31
+ };
32
+ export type LiveTurnItem = {
33
+ kind: 'user';
34
+ key: string;
35
+ step: Extract<LiveStep, {
36
+ kind: 'user';
37
+ }>;
38
+ } | {
39
+ kind: 'fold';
40
+ key: string;
41
+ steps: readonly LiveStep[];
42
+ summary: string;
43
+ } | {
44
+ kind: 'open';
45
+ key: string;
46
+ step: LiveStep;
47
+ };
48
+ export declare function liveFoldEnabled(boundary: TurnBoundary): boolean;
49
+ export declare function foldSummary(steps: readonly LiveStep[]): string;
50
+ /** One chain: fold only when a new reasoning step has prior body/tool/reasoning. */
51
+ export declare function splitChain(chain: readonly LiveStep[]): {
52
+ fold: readonly LiveStep[] | null;
53
+ open: readonly LiveStep[];
54
+ };
55
+ /** Expand readerFlow into source-ordered live steps using existing block boundaries. */
56
+ export declare function segmentLiveTurn(flow: readonly ReaderFlowEntry[], get: (key: string) => ChatConversationViewNode | undefined): LiveStep[];
57
+ export declare function presentLiveTurn(steps: readonly LiveStep[], boundary: TurnBoundary, autoFold?: boolean): LiveTurnItem[];
58
+ //# sourceMappingURL=live-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-turn.d.ts","sourceRoot":"","sources":["../../../src/client/live-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAC1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAElD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAiB9D;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG;IAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAQtH;AA0CD,wFAAwF;AACxF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,eAAe,EAAE,EAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,GACzD,QAAQ,EAAE,CA4BZ;AA4CD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,UAAO,GAAG,YAAY,EAAE,CA4BnH"}
@@ -0,0 +1,190 @@
1
+ import { assistantSegments, hasVisibleBody } from './projection.js';
2
+ import { activitySummary, stringValue } from './tool-activity.js';
3
+ export function liveFoldEnabled(boundary) {
4
+ return boundary.status === 'open';
5
+ }
6
+ export function foldSummary(steps) {
7
+ let reasoning = 0;
8
+ let body = 0;
9
+ let tool = 0;
10
+ let extra = 0;
11
+ for (const step of steps) {
12
+ if (step.kind === 'reasoning')
13
+ reasoning += 1;
14
+ else if (step.kind === 'body')
15
+ body += 1;
16
+ else if (step.kind === 'tool')
17
+ tool += 1;
18
+ else if (step.kind !== 'user')
19
+ extra += 1;
20
+ }
21
+ const parts = [];
22
+ if (reasoning)
23
+ parts.push(`思考×${reasoning}`);
24
+ if (body)
25
+ parts.push(`输出×${body}`);
26
+ if (tool)
27
+ parts.push(`工具×${tool}`);
28
+ if (extra)
29
+ parts.push(`记录×${extra}`);
30
+ return parts.join(' · ') || '此前步骤';
31
+ }
32
+ /** One chain: fold only when a new reasoning step has prior body/tool/reasoning. */
33
+ export function splitChain(chain) {
34
+ const lastReasoning = chain.findLastIndex(step => step.kind === 'reasoning');
35
+ if (lastReasoning < 0)
36
+ return { fold: null, open: chain };
37
+ const prior = chain.slice(0, lastReasoning);
38
+ if (!prior.length)
39
+ return { fold: null, open: chain };
40
+ const trigger = prior.some(step => step.kind === 'reasoning' || step.kind === 'body' || step.kind === 'tool');
41
+ if (!trigger)
42
+ return { fold: null, open: chain };
43
+ return { fold: prior, open: chain.slice(lastReasoning) };
44
+ }
45
+ function skipReasoning(part) {
46
+ return part.kind === 'reasoning' && !part.blocks.some(block => block.kind === 'reasoning' && block.text.trim() !== '');
47
+ }
48
+ function skipBody(part) {
49
+ return part.kind === 'body' && !hasVisibleBody(part.blocks);
50
+ }
51
+ function stepsFromAssistant(nodeKey, data, toolsByCallId, consumed) {
52
+ const marks = [];
53
+ for (const part of assistantSegments(data.blocks)) {
54
+ if (skipReasoning(part) || skipBody(part))
55
+ continue;
56
+ marks.push({
57
+ at: part.start,
58
+ step: {
59
+ kind: part.kind,
60
+ key: `${nodeKey}:${part.kind}:${part.start}`,
61
+ nodeKey,
62
+ start: part.start,
63
+ blocks: part.blocks,
64
+ step: data.step,
65
+ },
66
+ });
67
+ }
68
+ data.blocks.forEach((block, index) => {
69
+ if (block.kind !== 'tool-call' || !block.callId)
70
+ return;
71
+ const tool = toolsByCallId.get(block.callId);
72
+ if (!tool || consumed.has(tool.callId))
73
+ return;
74
+ consumed.add(tool.callId);
75
+ marks.push({ at: index, step: { kind: 'tool', key: tool.key, entry: tool } });
76
+ });
77
+ marks.sort((left, right) => left.at - right.at || left.step.key.localeCompare(right.step.key));
78
+ return marks.map(mark => mark.step);
79
+ }
80
+ /** Expand readerFlow into source-ordered live steps using existing block boundaries. */
81
+ export function segmentLiveTurn(flow, get) {
82
+ const steps = [];
83
+ const consumed = new Set();
84
+ const toolsByCallId = new Map();
85
+ for (const entry of flow) {
86
+ if (entry.kind === 'tool')
87
+ toolsByCallId.set(entry.callId, entry);
88
+ }
89
+ for (const entry of flow) {
90
+ if (entry.kind === 'tool') {
91
+ if (!consumed.has(entry.callId)) {
92
+ steps.push({ kind: 'tool', key: entry.key, entry });
93
+ consumed.add(entry.callId);
94
+ }
95
+ continue;
96
+ }
97
+ const node = get(entry.nodeKey);
98
+ if (!node || node.visibility === 'hidden' || node.kind === 'turn-tail')
99
+ continue;
100
+ if (node.kind === 'user' || node.kind === 'steering') {
101
+ steps.push({ kind: 'user', key: entry.key, nodeKey: entry.nodeKey });
102
+ continue;
103
+ }
104
+ if (node.kind === 'assistant-step') {
105
+ steps.push(...stepsFromAssistant(entry.nodeKey, node.data, toolsByCallId, consumed));
106
+ continue;
107
+ }
108
+ steps.push({ kind: 'other', key: entry.key, nodeKey: entry.nodeKey });
109
+ }
110
+ return steps;
111
+ }
112
+ /** One finished tool call, described by what it actually did. */
113
+ function toolSummary(entry) {
114
+ const info = activitySummary(entry);
115
+ const clip = (value, max = 38) => {
116
+ if (!value)
117
+ return undefined;
118
+ const flat = value.replace(/\s+/gu, ' ').trim();
119
+ if (!flat)
120
+ return undefined;
121
+ return flat.length > max ? flat.slice(0, max - 1) + '\u2026' : flat;
122
+ };
123
+ const base = info.target ? clip(info.target.split(/[/\\]/u).at(-1), 28) : undefined;
124
+ const said = clip(stringValue(info.args, 'description'), 40);
125
+ switch (info.category) {
126
+ case 'read': return '读取 ' + (base ?? '文件');
127
+ case 'write': return clip(info.title, 40) ?? '写入文件';
128
+ case 'terminal': {
129
+ const cmd = clip(info.command, 32);
130
+ return said ?? (cmd ? '运行 ' + cmd : '运行命令');
131
+ }
132
+ case 'search': {
133
+ const needle = clip(stringValue(info.args, 'pattern', 'query'), 26);
134
+ return info.name === 'glob' ? '查找 ' + (needle ?? '文件') : '搜索 ' + (needle ?? '内容');
135
+ }
136
+ case 'web': {
137
+ const query = clip(info.target, 30);
138
+ return (info.name === 'web_search' ? '搜索网页' : '读取网页') + (query ? ' ' + query : '');
139
+ }
140
+ default: {
141
+ // Schema-less tools (run_code and friends) describe themselves in an
142
+ // argument rather than a known field: prefer the model's own
143
+ // description, then the first meaningful line of the code it ran.
144
+ if (said)
145
+ return said;
146
+ const code = stringValue(info.args, 'code', 'source', 'script');
147
+ if (code) {
148
+ const line = code.split('\n').map(part => part.trim())
149
+ .find(part => part && !/^[)\]}]/.test(part) && !/^(\/\/|\*|\/\*|#)/.test(part));
150
+ if (line)
151
+ return clip(line.replace(/\s+/gu, ' '), 44) ?? '运行代码';
152
+ }
153
+ return clip(info.title ?? info.name, 32) ?? '工具调用';
154
+ }
155
+ }
156
+ }
157
+ export function presentLiveTurn(steps, boundary, autoFold = true) {
158
+ const live = autoFold && liveFoldEnabled(boundary);
159
+ const items = [];
160
+ let chain = [];
161
+ const flush = () => {
162
+ if (!chain.length)
163
+ return;
164
+ if (!live) {
165
+ for (const step of chain)
166
+ items.push({ kind: 'open', key: step.key, step });
167
+ chain = [];
168
+ return;
169
+ }
170
+ const { fold, open } = splitChain(chain);
171
+ if (fold?.length) {
172
+ items.push({ kind: 'fold', key: `live-fold:${chain[0].key}`, steps: fold, summary: foldSummary(fold) });
173
+ }
174
+ for (const step of open)
175
+ items.push({ kind: 'open', key: step.key, step });
176
+ chain = [];
177
+ };
178
+ for (const step of steps) {
179
+ if (step.kind === 'user') {
180
+ flush();
181
+ items.push({ kind: 'user', key: step.key, step });
182
+ }
183
+ else {
184
+ chain.push(step);
185
+ }
186
+ }
187
+ flush();
188
+ return items;
189
+ }
190
+ //# sourceMappingURL=live-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-turn.js","sourceRoot":"","sources":["../../../src/client/live-turn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Untrusted assistant-Markdown renderer over the direct mdast pipeline:
3
+ * `parse.ts` grammars, the incremental streaming parser, and `render.tsx`.
4
+ * While a message streams, all but the trailing two blocks freeze as cached
5
+ * React elements and only the source tail behind them re-parses per chunk,
6
+ * so per-chunk work tracks the tail size instead of the whole reply. Frozen
7
+ * blocks keep their source-offset keys when they cross the freeze boundary,
8
+ * so React reconciles instead of remounting. Known deviation while
9
+ * streaming: a reference-style link or footnote whose definition sits on the
10
+ * other side of the freeze boundary renders literally until the settled
11
+ * full parse self-heals it.
12
+ */
13
+ import type { MarkdownPathImages } from '@deepseek-ai/dsh-client-ui-primitives';
14
+ import type { MarkdownCodeLabels, MarkdownFileMentions, MarkdownRenderContext } from './render.js';
15
+ export type { MarkdownCodeLabels, MarkdownFileMentions } from './render.js';
16
+ /**
17
+ * Render untrusted assistant-authored Markdown as semantic React elements.
18
+ * @param props - Markdown source text preserved by the session projection;
19
+ * `streaming` renders fences and TeX plain (highlighting and KaTeX land on
20
+ * the finalize swap) and parses incrementally across chunks; `codeLabels`
21
+ * forwards localized copy-button labels to fence CodeBlocks — pass a
22
+ * reference-stable object (memoized per locale revision), because a new
23
+ * identity discards the streaming render cache mid-message. `fileMentions`
24
+ * links inline-code tokens its resolver recognizes as real files; this is
25
+ * the single streaming gate — it applies to settled renders only, because a
26
+ * streaming message's vocabulary is not final and frozen cached elements
27
+ * must not bake in handlers that could go stale.
28
+ * @returns A GFM document with TeX math rendered through KaTeX; raw HTML,
29
+ * relative links, and unsafe protocols are disabled, while absolute HTTP(S)
30
+ * images render directly.
31
+ */
32
+ export declare const MarkdownText: import("react").MemoExoticComponent<({ text, streaming, codeLabels, fileMentions, pathImages, renderText, renderAtom }: {
33
+ text: string;
34
+ streaming?: boolean;
35
+ codeLabels?: MarkdownCodeLabels | undefined;
36
+ fileMentions?: MarkdownFileMentions | undefined;
37
+ pathImages?: MarkdownPathImages | undefined;
38
+ renderText?: MarkdownRenderContext["renderText"];
39
+ renderAtom?: MarkdownRenderContext["renderAtom"];
40
+ }) => import("react").JSX.Element>;
41
+ //# sourceMappingURL=MarkdownText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownText.d.ts","sourceRoot":"","sources":["../../../../src/client/markdown/MarkdownText.tsx"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAO/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,EAAoB,MAAM,aAAa,CAAA;AAIpH,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AA8H3E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY,0HAAyH;IAChJ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAC3C,YAAY,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAA;IAC/C,UAAU,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAA;IAC3C,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAA;IAChD,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAA;CACjD,iCAiBC,CAAA"}