@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,48 @@
1
+ /**
2
+ * Merge host turn outline with loaded navigation items and turn deliverables.
3
+ * Guarantees strictly ascending turn order and dedupes entries.
4
+ */
5
+ export function mergeTimelineItems(loaded, outline, turnsWithDeliverables) {
6
+ const byTurn = new Map();
7
+ // 1. Process host whole-log outline (if available)
8
+ if (Array.isArray(outline)) {
9
+ for (const raw of outline) {
10
+ if (typeof raw !== 'object' || raw === null)
11
+ continue;
12
+ const entry = raw;
13
+ if (typeof entry.turn !== 'number' || !Number.isSafeInteger(entry.turn) || entry.turn < 0)
14
+ continue;
15
+ if (typeof entry.seq !== 'number' || !Number.isSafeInteger(entry.seq) || entry.seq < 0)
16
+ continue;
17
+ byTurn.set(entry.turn, {
18
+ turn: entry.turn,
19
+ prompt: typeof entry.prompt === 'string' ? entry.prompt.trim() : '',
20
+ response: typeof entry.response === 'string' ? entry.response.trim() : '',
21
+ hasDeliverables: turnsWithDeliverables?.has(entry.turn) ?? false,
22
+ anchor: { kind: 'unloaded', seq: entry.seq },
23
+ });
24
+ }
25
+ }
26
+ // 2. Overlay loaded items (taking loaded anchor, preferring freshest previews)
27
+ if (Array.isArray(loaded)) {
28
+ for (const item of loaded) {
29
+ if (typeof item.turn !== 'number')
30
+ continue;
31
+ const preview = byTurn.get(item.turn);
32
+ const prompt = item.prompt?.trim() || preview?.prompt || '';
33
+ const response = item.response?.trim() || preview?.response || '';
34
+ const hasDeliverables = turnsWithDeliverables?.has(item.turn) ?? preview?.hasDeliverables ?? false;
35
+ byTurn.set(item.turn, {
36
+ turn: item.turn,
37
+ prompt,
38
+ response,
39
+ hasDeliverables,
40
+ anchor: { kind: 'loaded', key: item.anchorKey },
41
+ });
42
+ }
43
+ }
44
+ if (byTurn.size === 0)
45
+ return [];
46
+ return [...byTurn.values()].sort((a, b) => a.turn - b.turn);
47
+ }
48
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/client/timeline.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAuD,EACvD,OAAgB,EAChB,qBAA2C;IAE3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE/C,mDAAmD;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;gBAAE,SAAS;YACtD,MAAM,KAAK,GAAG,GAAsB,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;gBAAE,SAAS;YACpG,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC;gBAAE,SAAS;YAEjG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;gBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;gBACnE,QAAQ,EAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;gBACzE,eAAe,EAAE,qBAAqB,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK;gBAChE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;YAClE,MAAM,eAAe,GAAG,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,eAAe,IAAI,KAAK,CAAC;YAEnG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM;gBACN,QAAQ;gBACR,eAAe;gBACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { AssistantBlock, ToolCallBlock, TurnLocation } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
+ import type { ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
3
+ import type { ReaderGroup } from './projection.js';
4
+ export type ToolDraft = Extract<AssistantBlock, {
5
+ kind: 'tool-call';
6
+ }>;
7
+ export type ToolPhase = 'preparing' | 'running' | 'returned' | 'succeeded' | 'failed' | 'interrupted';
8
+ export type ToolCategory = 'write' | 'read' | 'terminal' | 'search' | 'web' | 'code' | 'other';
9
+ export interface ToolActivityEntry {
10
+ kind: 'tool';
11
+ key: string;
12
+ callId: string;
13
+ step: number;
14
+ order: number;
15
+ draft?: ToolDraft;
16
+ block?: ToolCallBlock;
17
+ }
18
+ export type ReaderFlowEntry = ToolActivityEntry | {
19
+ kind: 'node';
20
+ key: string;
21
+ nodeKey: string;
22
+ order: number;
23
+ };
24
+ /** Public Step data includes tool-only model output before a chat node exists. */
25
+ export declare function readerFlow(group: ReaderGroup, turn: TurnLocation | undefined, get: (key: string) => ChatConversationViewNode | undefined): ReaderFlowEntry[];
26
+ export declare function objectValue(value: unknown): Record<string, unknown> | null;
27
+ export declare function stringValue(record: Record<string, unknown> | null, ...keys: string[]): string | undefined;
28
+ /** Read only top-level JSON string values, including an unfinished final string.
29
+ * This never executes input or mistakes escaped/nested content for a path field. */
30
+ export declare function inputFields(raw: string): Record<string, unknown>;
31
+ export declare function toolIdentity(entry: Pick<ToolActivityEntry, 'block' | 'draft'>): {
32
+ name: string;
33
+ raw: string;
34
+ };
35
+ export declare function executionFacts(block: ToolCallBlock | undefined): {
36
+ exitCode?: number;
37
+ signal?: string;
38
+ };
39
+ /**
40
+ * Added/removed line counts for a mutation call, or null when there is no diff
41
+ * to show.
42
+ *
43
+ * The result metadata is preferred when the host attaches one. Not every host
44
+ * build does — a session log may carry no hunk payload at all — so the call's own
45
+ * arguments are read as the fallback, which is also what the official row uses
46
+ * while a write is still pending. A call whose arguments hold none of these
47
+ * fields (a read, a listing) yields null and shows no badge.
48
+ */
49
+ /**
50
+ * One changed file, in the exact shape the official `DiffBlock` primitive takes:
51
+ * `oldText` is null for a pure insertion, and `newText` is always a string. Line
52
+ * counts are derived from these two sides, never stored alongside them.
53
+ */
54
+ export interface DiffHunk {
55
+ path: string;
56
+ oldText: string | null;
57
+ newText: string;
58
+ }
59
+ /**
60
+ * The changed files of a mutation call.
61
+ *
62
+ * Result metadata is preferred when the host attaches it. Not every host build
63
+ * does, so the call's own arguments are the fallback — the same source the
64
+ * official row reads while a write is still pending. A call whose arguments hold
65
+ * none of these fields (a read, a listing) yields nothing and shows no counts.
66
+ */
67
+ /** Only these tools change a file, so only these may fall back to their arguments. */
68
+ export declare const DIFF_FALLBACK_TOOLS: readonly ["write", "edit", "str_replace_editor"];
69
+ export declare function callDiffHunks(block: ToolCallBlock | undefined, args?: Record<string, unknown>, name?: string): DiffHunk[];
70
+ /** Added/removed line counts for one call, or null when there is nothing to show. */
71
+ export declare function diffTotals(block: ToolCallBlock | undefined, args?: Record<string, unknown>, name?: string): {
72
+ added: number;
73
+ removed: number;
74
+ } | null;
75
+ /** Counts the lines on each side, under the same rule the official block uses. */
76
+ export declare function diffLineTotals(hunks: readonly DiffHunk[]): {
77
+ added: number;
78
+ removed: number;
79
+ };
80
+ /** Every changed file across a folded run of steps, in the order they ran. */
81
+ export declare function foldDiffHunks(steps: readonly {
82
+ kind: string;
83
+ entry?: ToolActivityEntry;
84
+ }[]): DiffHunk[];
85
+ export declare function activityPhase(entry: Pick<ToolActivityEntry, 'block' | 'draft'>, turnClosed?: boolean): ToolPhase;
86
+ export declare function activitySummary(entry: Pick<ToolActivityEntry, 'block' | 'draft'>): {
87
+ name: string;
88
+ raw: string;
89
+ args: Record<string, unknown>;
90
+ category: ToolCategory;
91
+ title: string;
92
+ target: string | undefined;
93
+ command: string | undefined;
94
+ cwd: string | undefined;
95
+ content: string | undefined;
96
+ };
97
+ export declare function preparingLabel(name: string): string;
98
+ //# sourceMappingURL=tool-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-activity.d.ts","sourceRoot":"","sources":["../../../src/client/tool-activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,301 @@
1
+ /** Public Step data includes tool-only model output before a chat node exists. */
2
+ export function readerFlow(group, turn, get) {
3
+ const flow = [];
4
+ const calls = new Map();
5
+ const assistantOrder = new Map();
6
+ for (const key of group.keys) {
7
+ const node = get(key);
8
+ if (!node || node.visibility === 'hidden')
9
+ continue;
10
+ const step = node.location.kind === 'step' ? node.location.step.step : 0;
11
+ if (node.kind === 'tool-call') {
12
+ const block = node.data.root;
13
+ calls.set(block.callId, { kind: 'tool', key: `reader-tool:${block.callId}`, callId: block.callId, step, block, order: node.anchorSeq });
14
+ }
15
+ else {
16
+ flow.push({ kind: 'node', key, nodeKey: key, order: node.anchorSeq });
17
+ if (node.kind === 'assistant-step')
18
+ assistantOrder.set(step, node.anchorSeq);
19
+ }
20
+ }
21
+ for (const step of turn?.steps ?? []) {
22
+ const data = step.data.get('assistant-step');
23
+ let index = 0;
24
+ for (const draft of data?.blocks ?? []) {
25
+ if (draft.kind !== 'tool-call' || !draft.callId)
26
+ continue;
27
+ const previous = calls.get(draft.callId);
28
+ calls.set(draft.callId, previous ? { ...previous, draft } : {
29
+ kind: 'tool', key: `reader-tool:${draft.callId}`, callId: draft.callId, step: step.step, draft,
30
+ order: (assistantOrder.get(step.step) ?? step.start?.seq ?? 0) + .01 + index++ / 10000,
31
+ });
32
+ }
33
+ }
34
+ flow.push(...calls.values());
35
+ return flow.sort((left, right) => left.order - right.order);
36
+ }
37
+ export function objectValue(value) {
38
+ return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : null;
39
+ }
40
+ export function stringValue(record, ...keys) {
41
+ for (const key of keys)
42
+ if (typeof record?.[key] === 'string' && record[key])
43
+ return record[key];
44
+ return undefined;
45
+ }
46
+ /** Read only top-level JSON string values, including an unfinished final string.
47
+ * This never executes input or mistakes escaped/nested content for a path field. */
48
+ export function inputFields(raw) {
49
+ try {
50
+ return objectValue(JSON.parse(raw)) ?? {};
51
+ }
52
+ catch { /* an in-flight argument is normally incomplete */ }
53
+ const fields = Object.create(null);
54
+ const prefix = raw.slice(0, 262144);
55
+ let depth = 0;
56
+ let key;
57
+ for (let index = 0; index < prefix.length; index++) {
58
+ const char = prefix[index];
59
+ if (char === '{' || char === '[') {
60
+ depth++;
61
+ continue;
62
+ }
63
+ if (char === '}' || char === ']') {
64
+ depth--;
65
+ continue;
66
+ }
67
+ if (char !== '"')
68
+ continue;
69
+ const start = index;
70
+ let closed = false;
71
+ for (index++; index < prefix.length; index++) {
72
+ if (prefix[index] === '\\') {
73
+ index++;
74
+ continue;
75
+ }
76
+ if (prefix[index] === '"') {
77
+ closed = true;
78
+ break;
79
+ }
80
+ }
81
+ if (depth !== 1)
82
+ continue;
83
+ const token = prefix.slice(start, closed ? index + 1 : prefix.length);
84
+ let value;
85
+ try {
86
+ value = JSON.parse(token);
87
+ }
88
+ catch {
89
+ if (closed)
90
+ continue;
91
+ // Strip only an unfinished trailing escape/unicode escape, not content.
92
+ let body = token.slice(1);
93
+ const unicode = /(?<!\\)(?:\\\\)*\\u[\da-f]{0,3}$/i.exec(body);
94
+ if (unicode)
95
+ body = body.slice(0, unicode.index) + unicode[0].replace(/\\u[\da-f]{0,3}$/i, '');
96
+ let slashes = 0;
97
+ for (let end = body.length - 1; end >= 0 && body[end] === '\\'; end--)
98
+ slashes++;
99
+ if (slashes % 2)
100
+ body = body.slice(0, -1);
101
+ try {
102
+ value = JSON.parse(`"${body}"`);
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ }
108
+ if (closed && /^\s*:/.test(prefix.slice(index + 1)))
109
+ key = value;
110
+ else if (key !== undefined) {
111
+ fields[key] = value;
112
+ key = undefined;
113
+ }
114
+ }
115
+ return fields;
116
+ }
117
+ export function toolIdentity(entry) {
118
+ const block = entry.block;
119
+ return {
120
+ name: block ? 'kind' in block ? block.call?.name ?? entry.draft?.name ?? '工具调用' : block.name : entry.draft?.name ?? '工具调用',
121
+ raw: block ? 'kind' in block ? block.call?.argsRaw ?? entry.draft?.argsRaw ?? '' : ('argsRaw' in block ? block.argsRaw : '') : entry.draft?.argsRaw ?? '',
122
+ };
123
+ }
124
+ /** Name and raw arguments of any call block, whether it has landed or is pending. */
125
+ function childIdentity(block) {
126
+ if (!block || !('kind' in block))
127
+ return { name: block?.name, raw: block && 'argsRaw' in block ? block.argsRaw : '' };
128
+ return { name: block.call?.name, raw: block.call?.argsRaw ?? '' };
129
+ }
130
+ export function executionFacts(block) {
131
+ if (!block || !('kind' in block))
132
+ return {};
133
+ const meta = objectValue(block.meta);
134
+ const code = meta?.exitCode ?? meta?.exit_code;
135
+ const text = block.content.length === 1 && block.content[0]?.type === 'text' ? block.content[0].text : '';
136
+ const exit = /\n\[exit code: (\d+)\]$/.exec(text);
137
+ const signal = /\n\[killed by signal: ([^\]\n]+)\]$/.exec(text);
138
+ const parsedCode = exit?.[1] === undefined ? undefined : Number(exit[1]);
139
+ return {
140
+ exitCode: typeof code === 'number' && Number.isFinite(code) ? code : parsedCode,
141
+ signal: stringValue(meta, 'signal') ?? signal?.[1],
142
+ };
143
+ }
144
+ /** Line counts of one text side; a trailing newline does not start a line. */
145
+ function lineCount(text) {
146
+ if (text === null)
147
+ return 0;
148
+ const body = text.endsWith('\n') ? text.slice(0, -1) : text;
149
+ return body === '' ? 0 : body.split('\n').length;
150
+ }
151
+ /** Argument fields that carry the text a call is about to write. */
152
+ const NEW_TEXT_FIELDS = ['content', 'new_string', 'new_str', 'newText', 'file_text'];
153
+ /** Argument fields that carry the text a call is about to replace. */
154
+ const OLD_TEXT_FIELDS = ['old_string', 'old_str', 'oldText'];
155
+ /** Argument fields that name the file a mutation call targets. */
156
+ const PATH_FIELDS = ['file_path', 'path', 'filePath'];
157
+ function firstString(source, fields) {
158
+ if (!source)
159
+ return null;
160
+ for (const field of fields) {
161
+ const value = source[field];
162
+ if (typeof value === 'string' && value !== '')
163
+ return value;
164
+ }
165
+ return null;
166
+ }
167
+ /**
168
+ * The changed files of a mutation call.
169
+ *
170
+ * Result metadata is preferred when the host attaches it. Not every host build
171
+ * does, so the call's own arguments are the fallback — the same source the
172
+ * official row reads while a write is still pending. A call whose arguments hold
173
+ * none of these fields (a read, a listing) yields nothing and shows no counts.
174
+ */
175
+ /** Only these tools change a file, so only these may fall back to their arguments. */
176
+ export const DIFF_FALLBACK_TOOLS = ['write', 'edit', 'str_replace_editor'];
177
+ const MUTATION_TOOLS = new Set(DIFF_FALLBACK_TOOLS);
178
+ export function callDiffHunks(block, args, name) {
179
+ // A parent call owns whatever its children changed: a script that writes files
180
+ // reports those writes itself rather than through its own arguments, and the
181
+ // digest must see them too. Without this the counts only ever appeared on the
182
+ // nested row, which is what a reader noticed as a missing badge.
183
+ // Each child contributes through its own arguments, not the parent's: a nested
184
+ // write/edit records its hunks in `argsRaw`, and passing nothing here silently
185
+ // dropped them from the parent total. Errors are contained so one unreadable
186
+ // child cannot blank the whole row.
187
+ const nested = block && 'kind' in block && Array.isArray(block.subCalls)
188
+ ? block.subCalls.flatMap(child => {
189
+ try {
190
+ return callDiffHunks(child, inputFields(childIdentity(child).raw), childIdentity(child).name);
191
+ }
192
+ catch {
193
+ return [];
194
+ }
195
+ })
196
+ : [];
197
+ if (block && 'kind' in block) {
198
+ const diffs = objectValue(block.meta)?.diffs;
199
+ if (Array.isArray(diffs) && diffs.length > 0) {
200
+ const hunks = [];
201
+ for (const raw of diffs) {
202
+ const entry = objectValue(raw);
203
+ if (!entry)
204
+ continue;
205
+ const oldText = typeof entry.oldText === 'string' ? entry.oldText : null;
206
+ const newText = typeof entry.newText === 'string' ? entry.newText : '';
207
+ if (!lineCount(newText) && !lineCount(oldText))
208
+ continue;
209
+ hunks.push({ path: firstString(entry, PATH_FIELDS) ?? '', oldText, newText });
210
+ }
211
+ if (hunks.length)
212
+ return [...hunks, ...nested];
213
+ }
214
+ }
215
+ // Several unrelated tools take a field named `content` (a memory note, a typed
216
+ // message). Reading it as a file body invented counts for calls that changed no
217
+ // file at all, so the name decides whether arguments may be read this way.
218
+ if (!name || !MUTATION_TOOLS.has(name))
219
+ return nested;
220
+ const path = firstString(args, PATH_FIELDS);
221
+ if (!path)
222
+ return nested;
223
+ const oldText = firstString(args, OLD_TEXT_FIELDS);
224
+ const newText = firstString(args, NEW_TEXT_FIELDS) ?? '';
225
+ if (!lineCount(newText) && !lineCount(oldText))
226
+ return nested;
227
+ return [{ path, oldText, newText }, ...nested];
228
+ }
229
+ /** Added/removed line counts for one call, or null when there is nothing to show. */
230
+ export function diffTotals(block, args, name) {
231
+ const hunks = callDiffHunks(block, args, name);
232
+ if (!hunks.length)
233
+ return null;
234
+ return diffLineTotals(hunks);
235
+ }
236
+ /** Counts the lines on each side, under the same rule the official block uses. */
237
+ export function diffLineTotals(hunks) {
238
+ return hunks.reduce((total, hunk) => ({
239
+ added: total.added + lineCount(hunk.newText),
240
+ removed: total.removed + lineCount(hunk.oldText),
241
+ }), { added: 0, removed: 0 });
242
+ }
243
+ /** Every changed file across a folded run of steps, in the order they ran. */
244
+ export function foldDiffHunks(steps) {
245
+ const hunks = [];
246
+ for (const step of steps) {
247
+ if (step.kind !== 'tool' || !step.entry)
248
+ continue;
249
+ const model = activitySummary(step.entry);
250
+ hunks.push(...callDiffHunks(step.entry.block, model.args, model.name));
251
+ }
252
+ return hunks;
253
+ }
254
+ export function activityPhase(entry, turnClosed = false) {
255
+ if (!entry.block)
256
+ return turnClosed ? 'interrupted' : 'preparing';
257
+ if (!('kind' in entry.block))
258
+ return turnClosed ? 'interrupted' : 'running';
259
+ // RC1 publishes canonical cancellation as an error result with a typed code.
260
+ if (entry.block.error?.code === 'ABORTED' || entry.block.error?.code === 'interrupted')
261
+ return 'interrupted';
262
+ const facts = executionFacts(entry.block);
263
+ if (entry.block.isError || facts.signal || (facts.exitCode !== undefined && facts.exitCode !== 0)
264
+ || entry.block.subCalls.some(block => activityPhase({ block }, turnClosed) === 'failed'))
265
+ return 'failed';
266
+ if (facts.exitCode === 0)
267
+ return 'succeeded';
268
+ return 'returned';
269
+ }
270
+ export function activitySummary(entry) {
271
+ const { name, raw } = toolIdentity(entry);
272
+ const args = inputFields(raw);
273
+ const target = stringValue(args, 'file_path', 'path', 'filename', 'filePath');
274
+ const command = stringValue(args, 'command', 'cmd', 'script');
275
+ const description = stringValue(args, 'description');
276
+ const file = target?.split(/[/\\]/).at(-1);
277
+ const category = /^(write|edit|apply_patch|patch|str_replace_editor)$/.test(name) ? 'write'
278
+ : /^(read|read_file)$/.test(name) ? 'read'
279
+ : /^(bash|shell|terminal|terminal_send|exec_command|pwsh)$/.test(name) ? 'terminal'
280
+ : /^(grep|glob|find|search)$/.test(name) ? 'search'
281
+ : /^(web_search|web_fetch|web_open)$/.test(name) ? 'web'
282
+ // Code interpreters: no file, no shell, no query — the call is a program.
283
+ // Without this branch `run_code` fell through to `other`, which has no
284
+ // renderer of its own, so its result text was emitted as ordinary prose
285
+ // and stayed outside every fold.
286
+ : /^(run_code|execute_code|code_interpreter|python|node|eval|repl)$/.test(name) ? 'code'
287
+ : 'other';
288
+ const title = category === 'write' ? `${name === 'write' ? '写入' : '修改'}${file ? ` ${file}` : name === 'apply_patch' ? '代码补丁' : '文件'}`
289
+ : category === 'read' ? `读取${file ? ` ${file}` : '文件'}`
290
+ : category === 'terminal' ? description || '运行命令'
291
+ : category === 'search' ? name === 'glob' ? '查找文件' : '搜索内容'
292
+ : category === 'web' ? name === 'web_search' ? '搜索网页' : '读取网页'
293
+ : category === 'code' ? (description || '运行代码')
294
+ : name;
295
+ return { name, raw, args, category, title, target: target ?? command ?? stringValue(args, 'query', 'pattern', 'url'), command,
296
+ cwd: stringValue(args, 'workdir', 'cwd'), content: stringValue(args, 'content', 'new_string', 'newText', 'file_text') };
297
+ }
298
+ export function preparingLabel(name) {
299
+ return /^(write|edit|apply_patch)$/.test(name) ? '正在生成文件内容' : /^(bash|shell|exec_command|pwsh)$/.test(name) ? '正在准备命令' : '正在准备工具输入';
300
+ }
301
+ //# sourceMappingURL=tool-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-activity.js","sourceRoot":"","sources":["../../../src/client/tool-activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
2
+ import type { AssistantBlock, MessageImageLoader } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ import type { MarkdownFileMentions } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import type { PropsLocale, PropsRenderSlots, PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
5
+ import type { createReaderStore } from './store.js';
6
+ import type { OfficialSeat } from './official-slots.js';
7
+ import type { OpenFileOptions, TurnTailOwnerProps } from '@deepseek-ai/dsh-client-ui-chat/client';
8
+ export interface ReaderBlockOwner {
9
+ block: AssistantBlock;
10
+ streaming: boolean;
11
+ source: 'assistant' | 'user' | 'tool';
12
+ }
13
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
14
+ interface SlotMap {
15
+ /** Trusted installed renderers may opt in; unknown model payloads never execute code. */
16
+ 'dsh-better-display.block': {
17
+ kind: 'chain';
18
+ scope: 'session';
19
+ owner: ReaderBlockOwner;
20
+ };
21
+ }
22
+ }
23
+ export interface ReaderInjected {
24
+ loadOlder: () => Promise<void>;
25
+ loadImage: (attachment: ImageAttachmentRef) => Promise<{
26
+ data: Uint8Array;
27
+ mediaType: string;
28
+ }>;
29
+ /**
30
+ * Writes text into this session's composer draft via the sanctioned
31
+ * conversation input face, with a DOM fallback. Returns true when the
32
+ * composer accepted the text.
33
+ */
34
+ fillComposer: (text: string) => boolean;
35
+ /** Open a workspace file or directory; mode comes from the Better Display setting. */
36
+ openFile: (path: string, options?: OpenFileOptions) => Promise<void> | void;
37
+ officialImageLoader: MessageImageLoader;
38
+ officialFileMentions: (owner: TurnTailOwnerProps) => MarkdownFileMentions | undefined;
39
+ officialPreviewFile: (path: string) => void;
40
+ officialHost: {
41
+ getSnapshot: () => {
42
+ home?: string;
43
+ };
44
+ subscribe: (listener: () => void) => () => void;
45
+ };
46
+ /** Root-scoped Better Display prefs (`dsh.reader.v1`), shared with Settings. */
47
+ openPrefs?: {
48
+ getSnapshot: () => {
49
+ deliverableOpenMode?: import('./open-file.js').DeliverableOpenMode;
50
+ frostedGlass?: boolean;
51
+ bubbles?: boolean;
52
+ foldIntensity?: import('./fold-intensity.js').FoldIntensity;
53
+ autoFold?: boolean;
54
+ processOnly?: boolean;
55
+ };
56
+ subscribe: (fn: () => void) => () => void;
57
+ actions?: {
58
+ setFoldIntensity?: (value: import('./fold-intensity.js').FoldIntensity) => void;
59
+ setAutoFold?: (value: boolean) => void;
60
+ setFrostedGlass?: (value: boolean) => void;
61
+ setBubbles?: (value: boolean) => void;
62
+ setDeliverableOpenMode?: (value: import('./open-file.js').DeliverableOpenMode) => void;
63
+ };
64
+ };
65
+ /** Reveal and highlight a workspace file in macOS Finder or Windows Explorer. */
66
+ revealFile?: (path: string) => Promise<void> | void;
67
+ /** Fork the conversation at a specific message sequence into a new branch session. */
68
+ forkAt?: (seq: number) => void;
69
+ /** Load session history through a target sequence number. */
70
+ loadThrough?: (seq: unknown) => Promise<void>;
71
+ }
72
+ export type ReaderProps = PropsRuntime<'conversation.view'> & PropsLocale<'chat'> & PropsRenderSlots<'dsh-better-display.block' | OfficialSeat> & PropsStore<ReturnType<typeof createReaderStore>> & ReaderInjected;
73
+ export type BlockRenderProps = Pick<ReaderProps, 'renderSlotChain' | 'loadImage' | 'fillComposer'> & {
74
+ official?: Pick<ReaderProps, 'renderSlot' | 'renderSlotChain' | 'officialImageLoader' | 'officialFileMentions' | 'officialPreviewFile' | 'officialHost' | 'openView'>;
75
+ cwd?: string;
76
+ openFile?: (path: string, options?: OpenFileOptions) => Promise<void> | void;
77
+ revealFile?: (path: string) => Promise<void> | void;
78
+ forkAt?: (seq: number) => void;
79
+ /** Durable closing-message seq of this turn (turn-tail closing), used as the fork anchor. */
80
+ forkSeq?: number;
81
+ fileMentions?: MarkdownFileMentions;
82
+ metrics?: {
83
+ usage?: NonNullable<import('@deepseek-ai/dsh-client-ui-chat/client').TurnTailChatData['tokenUsage']>;
84
+ runMs?: number;
85
+ tokensPerSecond?: number;
86
+ ttftMs?: number;
87
+ /** Closing assistant-message time (turn-tail `closing.time`). */
88
+ endedAt?: number;
89
+ };
90
+ };
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import type { ChatNodeKind } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ export interface WaitingAnchor {
3
+ key: string;
4
+ time: number | null;
5
+ }
6
+ type InputNode = {
7
+ kind: string;
8
+ data: unknown;
9
+ };
10
+ type Submission = {
11
+ requestId: string;
12
+ time?: number;
13
+ placement?: string;
14
+ };
15
+ /**
16
+ * Chat-layer kinds that hand the turn back to the model unconditionally.
17
+ *
18
+ * These are `ChatNodeDataMap` keys, NOT conversation-layer `ConversationNode` kinds.
19
+ * The two layers name the same idea differently: a returned tool is `tool-result`
20
+ * in the conversation contract, but the row the reader sees is the `tool-call` node.
21
+ * A name copied from the wrong layer silently disables the branch it guards, so
22
+ * the `satisfies` below makes the compiler reject any name that is not a real kind.
23
+ */
24
+ export declare const WAIT_AFTER: Set<ChatNodeKind>;
25
+ /**
26
+ * Every chat-kind the handover logic reasons about, checked against the host's own
27
+ * kind union at compile time. Adding a name here that the host does not register
28
+ * fails `tsc` instead of failing silently at runtime.
29
+ */
30
+ export declare const HANDOVER_KINDS: readonly ["user", "steering", "context", "model-retry", "tool-call", "command"];
31
+ /**
32
+ * Does this node leave the model on the hook for the next move?
33
+ *
34
+ * A tool or command that is *still running* is not a wait — the tool is the one
35
+ * working. Only its returned form hands control back, which is exactly the moment
36
+ * the model can stall.
37
+ */
38
+ export declare function handsBackToModel(node: InputNode): boolean;
39
+ /**
40
+ * The moment the current wait began.
41
+ *
42
+ * This is the time of the **last** node that handed control to the model — a
43
+ * returned tool, an injected context, or the user's own message. Anchoring on the
44
+ * user's message alone made the readout count the entire turn, so a wait that had
45
+ * only just begun showed the minutes the tools had already spent.
46
+ */
47
+ export declare function waitingAnchor(order: readonly string[], get: (key: string) => InputNode | undefined, pending?: readonly Submission[]): WaitingAnchor;
48
+ export {};
49
+ //# sourceMappingURL=waiting-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiting-clock.d.ts","sourceRoot":"","sources":["../../../src/client/waiting-clock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAE3E,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AACnE,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AACjD,KAAK,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG3E;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,mBAAoD,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,cAAc,iFAEiB,CAAC;AAiB7C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAKzD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,EAAE,OAAO,GAAE,SAAS,UAAU,EAAO,GAAG,aAAa,CAkBvJ"}