dsh-better-display 0.1.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 (300) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/DESIGN.md +72 -0
  3. package/LICENSE +24 -0
  4. package/README.en.md +41 -0
  5. package/README.md +41 -0
  6. package/THIRD_PARTY_NOTICES.md +65 -0
  7. package/cordis.patch.yml +5 -0
  8. package/cordis.yml +4 -0
  9. package/dshx.yml +5 -0
  10. package/lib/client.js +49923 -0
  11. package/lib/client.js.map +1 -0
  12. package/lib/dsh-better-display.js +256 -0
  13. package/lib/types/client/Blocks.d.ts +45 -0
  14. package/lib/types/client/Blocks.d.ts.map +1 -0
  15. package/lib/types/client/Blocks.js +136 -0
  16. package/lib/types/client/Blocks.js.map +1 -0
  17. package/lib/types/client/ChoreographedFlow.d.ts +22 -0
  18. package/lib/types/client/ChoreographedFlow.d.ts.map +1 -0
  19. package/lib/types/client/ChoreographedFlow.js +170 -0
  20. package/lib/types/client/ChoreographedFlow.js.map +1 -0
  21. package/lib/types/client/ClosedProcessSummary.d.ts +9 -0
  22. package/lib/types/client/ClosedProcessSummary.d.ts.map +1 -0
  23. package/lib/types/client/ClosedProcessSummary.js +15 -0
  24. package/lib/types/client/ClosedProcessSummary.js.map +1 -0
  25. package/lib/types/client/LiveFold.d.ts +10 -0
  26. package/lib/types/client/LiveFold.d.ts.map +1 -0
  27. package/lib/types/client/LiveFold.js +39 -0
  28. package/lib/types/client/LiveFold.js.map +1 -0
  29. package/lib/types/client/McpAppFrame.d.ts +32 -0
  30. package/lib/types/client/McpAppFrame.d.ts.map +1 -0
  31. package/lib/types/client/McpAppFrame.js +193 -0
  32. package/lib/types/client/McpAppFrame.js.map +1 -0
  33. package/lib/types/client/Reader.d.ts +3 -0
  34. package/lib/types/client/Reader.d.ts.map +1 -0
  35. package/lib/types/client/Reader.js +537 -0
  36. package/lib/types/client/Reader.js.map +1 -0
  37. package/lib/types/client/ReasoningCard.d.ts +11 -0
  38. package/lib/types/client/ReasoningCard.d.ts.map +1 -0
  39. package/lib/types/client/ReasoningCard.js +301 -0
  40. package/lib/types/client/ReasoningCard.js.map +1 -0
  41. package/lib/types/client/StickyLane.d.ts +8 -0
  42. package/lib/types/client/StickyLane.d.ts.map +1 -0
  43. package/lib/types/client/StickyLane.js +28 -0
  44. package/lib/types/client/StickyLane.js.map +1 -0
  45. package/lib/types/client/TimelineRail.d.ts +10 -0
  46. package/lib/types/client/TimelineRail.d.ts.map +1 -0
  47. package/lib/types/client/TimelineRail.js +168 -0
  48. package/lib/types/client/TimelineRail.js.map +1 -0
  49. package/lib/types/client/ToolActivity.d.ts +17 -0
  50. package/lib/types/client/ToolActivity.d.ts.map +1 -0
  51. package/lib/types/client/ToolActivity.js +192 -0
  52. package/lib/types/client/ToolActivity.js.map +1 -0
  53. package/lib/types/client/TurnMetrics.d.ts +11 -0
  54. package/lib/types/client/TurnMetrics.d.ts.map +1 -0
  55. package/lib/types/client/TurnMetrics.js +44 -0
  56. package/lib/types/client/TurnMetrics.js.map +1 -0
  57. package/lib/types/client/WaitingStatus.d.ts +6 -0
  58. package/lib/types/client/WaitingStatus.d.ts.map +1 -0
  59. package/lib/types/client/WaitingStatus.js +19 -0
  60. package/lib/types/client/WaitingStatus.js.map +1 -0
  61. package/lib/types/client/conversation-scroll.d.ts +19 -0
  62. package/lib/types/client/conversation-scroll.d.ts.map +1 -0
  63. package/lib/types/client/conversation-scroll.js +25 -0
  64. package/lib/types/client/conversation-scroll.js.map +1 -0
  65. package/lib/types/client/deliverables.d.ts +24 -0
  66. package/lib/types/client/deliverables.d.ts.map +1 -0
  67. package/lib/types/client/deliverables.js +104 -0
  68. package/lib/types/client/deliverables.js.map +1 -0
  69. package/lib/types/client/entry-policy.d.ts +10 -0
  70. package/lib/types/client/entry-policy.d.ts.map +1 -0
  71. package/lib/types/client/entry-policy.js +24 -0
  72. package/lib/types/client/entry-policy.js.map +1 -0
  73. package/lib/types/client/entry.d.ts +4 -0
  74. package/lib/types/client/entry.d.ts.map +1 -0
  75. package/lib/types/client/entry.js +34 -0
  76. package/lib/types/client/entry.js.map +1 -0
  77. package/lib/types/client/fold-choreography.d.ts +28 -0
  78. package/lib/types/client/fold-choreography.d.ts.map +1 -0
  79. package/lib/types/client/fold-choreography.js +31 -0
  80. package/lib/types/client/fold-choreography.js.map +1 -0
  81. package/lib/types/client/index.d.ts +7 -0
  82. package/lib/types/client/index.d.ts.map +1 -0
  83. package/lib/types/client/index.js +153 -0
  84. package/lib/types/client/index.js.map +1 -0
  85. package/lib/types/client/live-turn.d.ts +58 -0
  86. package/lib/types/client/live-turn.d.ts.map +1 -0
  87. package/lib/types/client/live-turn.js +144 -0
  88. package/lib/types/client/live-turn.js.map +1 -0
  89. package/lib/types/client/markdown/MarkdownText.d.ts +39 -0
  90. package/lib/types/client/markdown/MarkdownText.d.ts.map +1 -0
  91. package/lib/types/client/markdown/MarkdownText.js +171 -0
  92. package/lib/types/client/markdown/MarkdownText.js.map +1 -0
  93. package/lib/types/client/markdown/cjkFriendlyStrong.d.ts +9 -0
  94. package/lib/types/client/markdown/cjkFriendlyStrong.d.ts.map +1 -0
  95. package/lib/types/client/markdown/cjkFriendlyStrong.js +73 -0
  96. package/lib/types/client/markdown/cjkFriendlyStrong.js.map +1 -0
  97. package/lib/types/client/markdown/incremental.d.ts +69 -0
  98. package/lib/types/client/markdown/incremental.d.ts.map +1 -0
  99. package/lib/types/client/markdown/incremental.js +108 -0
  100. package/lib/types/client/markdown/incremental.js.map +1 -0
  101. package/lib/types/client/markdown/katex.d.ts +27 -0
  102. package/lib/types/client/markdown/katex.d.ts.map +1 -0
  103. package/lib/types/client/markdown/katex.js +88 -0
  104. package/lib/types/client/markdown/katex.js.map +1 -0
  105. package/lib/types/client/markdown/mathCompatibility.d.ts +11 -0
  106. package/lib/types/client/markdown/mathCompatibility.d.ts.map +1 -0
  107. package/lib/types/client/markdown/mathCompatibility.js +293 -0
  108. package/lib/types/client/markdown/mathCompatibility.js.map +1 -0
  109. package/lib/types/client/markdown/parse.d.ts +25 -0
  110. package/lib/types/client/markdown/parse.d.ts.map +1 -0
  111. package/lib/types/client/markdown/parse.js +42 -0
  112. package/lib/types/client/markdown/parse.js.map +1 -0
  113. package/lib/types/client/markdown/render.d.ts +119 -0
  114. package/lib/types/client/markdown/render.d.ts.map +1 -0
  115. package/lib/types/client/markdown/render.js +435 -0
  116. package/lib/types/client/markdown/render.js.map +1 -0
  117. package/lib/types/client/mcp-app.d.ts +50 -0
  118. package/lib/types/client/mcp-app.d.ts.map +1 -0
  119. package/lib/types/client/mcp-app.js +328 -0
  120. package/lib/types/client/mcp-app.js.map +1 -0
  121. package/lib/types/client/message-chrome.d.ts +19 -0
  122. package/lib/types/client/message-chrome.d.ts.map +1 -0
  123. package/lib/types/client/message-chrome.js +42 -0
  124. package/lib/types/client/message-chrome.js.map +1 -0
  125. package/lib/types/client/motion.d.ts +38 -0
  126. package/lib/types/client/motion.d.ts.map +1 -0
  127. package/lib/types/client/motion.js +367 -0
  128. package/lib/types/client/motion.js.map +1 -0
  129. package/lib/types/client/native/ContextBody.d.ts +130 -0
  130. package/lib/types/client/native/ContextBody.d.ts.map +1 -0
  131. package/lib/types/client/native/ContextBody.js +398 -0
  132. package/lib/types/client/native/ContextBody.js.map +1 -0
  133. package/lib/types/client/native/ContextInjectionRow.d.ts +26 -0
  134. package/lib/types/client/native/ContextInjectionRow.d.ts.map +1 -0
  135. package/lib/types/client/native/ContextInjectionRow.js +27 -0
  136. package/lib/types/client/native/ContextInjectionRow.js.map +1 -0
  137. package/lib/types/client/native/ReferenceIcon.d.ts +16 -0
  138. package/lib/types/client/native/ReferenceIcon.d.ts.map +1 -0
  139. package/lib/types/client/native/ReferenceIcon.js +16 -0
  140. package/lib/types/client/native/ReferenceIcon.js.map +1 -0
  141. package/lib/types/client/native/tool-call-model.d.ts +58 -0
  142. package/lib/types/client/native/tool-call-model.d.ts.map +1 -0
  143. package/lib/types/client/native/tool-call-model.js +219 -0
  144. package/lib/types/client/native/tool-call-model.js.map +1 -0
  145. package/lib/types/client/open-file.d.ts +24 -0
  146. package/lib/types/client/primitive-labels.d.ts +10 -0
  147. package/lib/types/client/primitive-labels.d.ts.map +1 -0
  148. package/lib/types/client/primitive-labels.js +37 -0
  149. package/lib/types/client/primitive-labels.js.map +1 -0
  150. package/lib/types/client/projection.d.ts +41 -0
  151. package/lib/types/client/projection.d.ts.map +1 -0
  152. package/lib/types/client/projection.js +112 -0
  153. package/lib/types/client/projection.js.map +1 -0
  154. package/lib/types/client/reasoning-follow.d.ts +6 -0
  155. package/lib/types/client/reasoning-follow.d.ts.map +1 -0
  156. package/lib/types/client/reasoning-follow.js +12 -0
  157. package/lib/types/client/reasoning-follow.js.map +1 -0
  158. package/lib/types/client/settings-copy.d.ts +6 -0
  159. package/lib/types/client/settings-slots.d.ts +16 -0
  160. package/lib/types/client/store.d.ts +17 -0
  161. package/lib/types/client/store.d.ts.map +1 -0
  162. package/lib/types/client/store.js +13 -0
  163. package/lib/types/client/store.js.map +1 -0
  164. package/lib/types/client/stream-buffer.d.ts +29 -0
  165. package/lib/types/client/stream-buffer.d.ts.map +1 -0
  166. package/lib/types/client/stream-buffer.js +113 -0
  167. package/lib/types/client/stream-buffer.js.map +1 -0
  168. package/lib/types/client/streaming.d.ts +18 -0
  169. package/lib/types/client/streaming.d.ts.map +1 -0
  170. package/lib/types/client/streaming.js +77 -0
  171. package/lib/types/client/streaming.js.map +1 -0
  172. package/lib/types/client/timeline.d.ts +26 -0
  173. package/lib/types/client/timeline.d.ts.map +1 -0
  174. package/lib/types/client/timeline.js +48 -0
  175. package/lib/types/client/timeline.js.map +1 -0
  176. package/lib/types/client/tool-activity.d.ts +52 -0
  177. package/lib/types/client/tool-activity.d.ts.map +1 -0
  178. package/lib/types/client/tool-activity.js +178 -0
  179. package/lib/types/client/tool-activity.js.map +1 -0
  180. package/lib/types/client/types.d.ts +66 -0
  181. package/lib/types/client/types.d.ts.map +1 -0
  182. package/lib/types/client/types.js +2 -0
  183. package/lib/types/client/types.js.map +1 -0
  184. package/lib/types/client/waiting-clock.d.ts +17 -0
  185. package/lib/types/client/waiting-clock.d.ts.map +1 -0
  186. package/lib/types/client/waiting-clock.js +24 -0
  187. package/lib/types/client/waiting-clock.js.map +1 -0
  188. package/lib/types/client/word-motion.d.ts +16 -0
  189. package/lib/types/client/word-motion.d.ts.map +1 -0
  190. package/lib/types/client/word-motion.js +89 -0
  191. package/lib/types/client/word-motion.js.map +1 -0
  192. package/lib/types/client/word-timeline.d.ts +28 -0
  193. package/lib/types/client/word-timeline.d.ts.map +1 -0
  194. package/lib/types/client/word-timeline.js +100 -0
  195. package/lib/types/client/word-timeline.js.map +1 -0
  196. package/lib/types/dsh-better-display.d.ts +17 -0
  197. package/lib/types/dsh-better-display.d.ts.map +1 -0
  198. package/lib/types/dsh-better-display.js +53 -0
  199. package/lib/types/dsh-better-display.js.map +1 -0
  200. package/package.json +121 -0
  201. package/scripts/build-motion-fixture.mjs +26 -0
  202. package/scripts/link-harness-dependencies.mjs +51 -0
  203. package/skills/generative-mcpapps/SKILL.md +47 -0
  204. package/skills/generative-mcpapps/examples/interactive_quiz.html +153 -0
  205. package/skills/generative-mcpapps/references/html_boilerplate.md +122 -0
  206. package/skills/generative-mcpapps/references/sep1865_protocol.md +54 -0
  207. package/src/client/Blocks.tsx +205 -0
  208. package/src/client/ChoreographedFlow.tsx +182 -0
  209. package/src/client/ClosedProcessSummary.tsx +19 -0
  210. package/src/client/LiveFold.tsx +43 -0
  211. package/src/client/McpAppFrame.module.css +210 -0
  212. package/src/client/McpAppFrame.tsx +317 -0
  213. package/src/client/Reader.module.css +329 -0
  214. package/src/client/Reader.tsx +814 -0
  215. package/src/client/ReasoningCard.tsx +285 -0
  216. package/src/client/SettingsSection.module.css +147 -0
  217. package/src/client/SettingsSection.tsx +117 -0
  218. package/src/client/StickyLane.tsx +24 -0
  219. package/src/client/TimelineRail.module.css +170 -0
  220. package/src/client/TimelineRail.tsx +262 -0
  221. package/src/client/ToolActivity.tsx +214 -0
  222. package/src/client/TurnMetrics.module.css +139 -0
  223. package/src/client/TurnMetrics.tsx +160 -0
  224. package/src/client/WaitingStatus.tsx +22 -0
  225. package/src/client/conversation-scroll.ts +28 -0
  226. package/src/client/deliverables.ts +122 -0
  227. package/src/client/entry-policy.ts +20 -0
  228. package/src/client/entry.tsx +40 -0
  229. package/src/client/fold-choreography.ts +38 -0
  230. package/src/client/index.tsx +198 -0
  231. package/src/client/live-turn.ts +155 -0
  232. package/src/client/markdown/MarkdownText.module.css +304 -0
  233. package/src/client/markdown/MarkdownText.tsx +187 -0
  234. package/src/client/markdown/cjkFriendlyStrong.ts +84 -0
  235. package/src/client/markdown/incremental.ts +131 -0
  236. package/src/client/markdown/katex.tsx +91 -0
  237. package/src/client/markdown/mathCompatibility.ts +350 -0
  238. package/src/client/markdown/parse.ts +45 -0
  239. package/src/client/markdown/render.tsx +630 -0
  240. package/src/client/markdown/upstream.json +14 -0
  241. package/src/client/mcp-app.ts +323 -0
  242. package/src/client/message-chrome.ts +47 -0
  243. package/src/client/motion.tsx +338 -0
  244. package/src/client/native/ContextBody.module.css +161 -0
  245. package/src/client/native/ContextBody.tsx +591 -0
  246. package/src/client/native/ContextInjectionRow.module.css +62 -0
  247. package/src/client/native/ContextInjectionRow.tsx +72 -0
  248. package/src/client/native/ReferenceIcon.tsx +35 -0
  249. package/src/client/native/tool-call-model.ts +248 -0
  250. package/src/client/native/upstream.json +41 -0
  251. package/src/client/open-file.ts +94 -0
  252. package/src/client/pending-submission.ts +49 -0
  253. package/src/client/primitive-labels.ts +53 -0
  254. package/src/client/projection.ts +118 -0
  255. package/src/client/reasoning-follow.ts +12 -0
  256. package/src/client/settings-copy.ts +53 -0
  257. package/src/client/settings-slots.ts +20 -0
  258. package/src/client/settings.tsx +73 -0
  259. package/src/client/skill-status.ts +78 -0
  260. package/src/client/store.ts +30 -0
  261. package/src/client/stream-buffer.ts +100 -0
  262. package/src/client/streaming.tsx +62 -0
  263. package/src/client/style.d.ts +4 -0
  264. package/src/client/timeline.ts +77 -0
  265. package/src/client/tool-activity.ts +152 -0
  266. package/src/client/types.ts +66 -0
  267. package/src/client/waiting-clock.ts +25 -0
  268. package/src/client/word-motion.tsx +91 -0
  269. package/src/client/word-timeline.ts +96 -0
  270. package/src/dsh-better-display.ts +108 -0
  271. package/src/skill-roots.ts +138 -0
  272. package/src/skill-status.ts +81 -0
  273. package/tests/browser-closed-gap.tsx +20 -0
  274. package/tests/browser-motion.tsx +65 -0
  275. package/tests/browser-sticky-lanes.tsx +22 -0
  276. package/tests/browser-waiting-clock.tsx +14 -0
  277. package/tests/chat-flow-hook.test.ts +66 -0
  278. package/tests/cloud-gate.test.ts +34 -0
  279. package/tests/conversation-scroll.test.ts +47 -0
  280. package/tests/deliverables.test.ts +128 -0
  281. package/tests/entry.test.ts +42 -0
  282. package/tests/fixtures/maid-composer-hide.html +31 -0
  283. package/tests/fold-choreography.test.ts +38 -0
  284. package/tests/history-word-regression.test.ts +16 -0
  285. package/tests/live-turn.test.ts +218 -0
  286. package/tests/mcp-apps.test.ts +157 -0
  287. package/tests/message-chrome.test.ts +29 -0
  288. package/tests/open-file.test.ts +103 -0
  289. package/tests/pending-submission.test.ts +45 -0
  290. package/tests/projection.test.ts +184 -0
  291. package/tests/reasoning-follow.test.ts +34 -0
  292. package/tests/settings-copy.test.ts +63 -0
  293. package/tests/skill-status.test.ts +137 -0
  294. package/tests/stock-install.test.ts +50 -0
  295. package/tests/stream-buffer.test.ts +97 -0
  296. package/tests/timeline.test.ts +59 -0
  297. package/tests/waiting-clock.test.ts +24 -0
  298. package/tests/word-timeline.test.ts +136 -0
  299. package/tsconfig.json +11 -0
  300. package/tsdown.config.ts +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAIhH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;CACvC;AAED,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf,yFAAyF;QACzF,0BAA0B,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,SAAS,CAAC;YAAC,KAAK,EAAE,gBAAgB,CAAA;SAAE,CAAC;KAC1F;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,kFAAkF;IAClF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,iFAAiF;IACjF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AACD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC,GACvD,WAAW,CAAC,MAAM,CAAC,GACnB,gBAAgB,CAAC,0BAA0B,CAAC,GAC5C,UAAU,CAAC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,GAChD,cAAc,CAAC;AACnB,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,WAAW,GAAG,cAAc,CAAC,GAAG;IACnG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,wCAAwC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;QACrG,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iEAAiE;QACjE,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC"}
@@ -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,17 @@
1
+ export interface WaitingAnchor {
2
+ key: string;
3
+ time: number | null;
4
+ }
5
+ type InputNode = {
6
+ kind: string;
7
+ data: unknown;
8
+ };
9
+ type Submission = {
10
+ requestId: string;
11
+ time: number;
12
+ placement?: string;
13
+ };
14
+ /** Waiting is scoped to the latest human input, never the enclosing turn. */
15
+ export declare function waitingAnchor(order: readonly string[], get: (key: string) => InputNode | undefined, pending?: readonly Submission[]): WaitingAnchor;
16
+ export {};
17
+ //# 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,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,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG1E,6EAA6E;AAC7E,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"}
@@ -0,0 +1,24 @@
1
+ const timestamp = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null;
2
+ /** Waiting is scoped to the latest human input, never the enclosing turn. */
3
+ export function waitingAnchor(order, get, pending = []) {
4
+ let anchor = { key: 'unresolved', time: null };
5
+ for (let i = order.length - 1; i >= 0; i--) {
6
+ const node = get(order[i]);
7
+ if (node?.kind === 'user' || node?.kind === 'steering') {
8
+ const time = node.data && typeof node.data === 'object' && 'time' in node.data && typeof node.data.time === 'number' ? node.data.time : undefined;
9
+ anchor = { key: order[i], time: timestamp(time) };
10
+ break;
11
+ }
12
+ }
13
+ for (let i = pending.length - 1; i >= 0; i--) {
14
+ const input = pending[i];
15
+ if (input.placement === 'queued')
16
+ continue;
17
+ const time = timestamp(input.time);
18
+ if (time === null || anchor.time === null || time >= anchor.time)
19
+ return { key: `pending:${input.requestId}`, time };
20
+ break;
21
+ }
22
+ return anchor;
23
+ }
24
+ //# sourceMappingURL=waiting-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waiting-clock.js","sourceRoot":"","sources":["../../../src/client/waiting-clock.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAG,CAAC,KAAyB,EAAiB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjJ,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,KAAwB,EAAE,GAA2C,EAAE,UAAiC,EAAE;IACtI,IAAI,MAAM,GAAkB,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClJ,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM;QACR,CAAC;IACH,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ;YAAE,SAAS;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;QACrH,MAAM;IACR,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { MarkdownFileMentions } from '@deepseek-ai/dsh-client-ui-primitives';
2
+ /** Native Think is literal text, not Markdown. Spans never alter its bytes. */
3
+ export declare function MotionPlainText({ text, enabled, revision }: {
4
+ text: string;
5
+ enabled: boolean;
6
+ revision: number;
7
+ }): import("react").JSX.Element;
8
+ /** Native DSH Markdown semantics with a stable text-leaf animation hook. */
9
+ export declare function MotionMarkdown({ text, streaming, enabled, revision, fileMentions }: {
10
+ text: string;
11
+ streaming: boolean;
12
+ enabled: boolean;
13
+ revision: number;
14
+ fileMentions?: MarkdownFileMentions;
15
+ }): import("react").JSX.Element;
16
+ //# sourceMappingURL=word-motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-motion.d.ts","sourceRoot":"","sources":["../../../src/client/word-motion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAkDlF,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAYhH;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;IACnF,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CAC3G,+BAoBA"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useLayoutEffect, useMemo, useRef } from 'react';
3
+ import { MarkdownText } from './markdown/MarkdownText.js';
4
+ import { WORD_MOTION, WordTimeline } from './word-timeline.js';
5
+ import css from './Reader.module.css';
6
+ const WordScope = createContext({ enabled: false, generation: 0 });
7
+ const CODE_LABELS = { copyLabel: '复制代码', copiedLabel: '已复制' };
8
+ function useSourceReveal(element, born, generation) {
9
+ const scope = useContext(WordScope);
10
+ const cancelled = useRef(false);
11
+ useLayoutEffect(() => {
12
+ const target = element.current;
13
+ if (!target)
14
+ return;
15
+ target.dataset.wordState = 'settled';
16
+ if (!scope.enabled || scope.generation !== generation) {
17
+ cancelled.current = true;
18
+ return;
19
+ }
20
+ if (cancelled.current || born === null || document.hidden)
21
+ return;
22
+ const age = Number(document.timeline.currentTime ?? performance.now()) - born;
23
+ if (age >= WORD_MOTION.duration || typeof target.animate !== 'function')
24
+ return;
25
+ // The reference opacity + blur frames, applied only to this new word.
26
+ // No color interpolation, stylesheet mutation, or whole-paragraph wipe.
27
+ const animation = target.animate([
28
+ { opacity: 0, filter: `blur(${WORD_MOTION.blur}px)` },
29
+ { opacity: 1, filter: 'blur(0px)' },
30
+ ], { duration: WORD_MOTION.duration, easing: WORD_MOTION.easing, fill: 'backwards' });
31
+ // One absolute clock prevents newly mounted/resegmented leaves from getting
32
+ // a fresh delay or running ahead because their layout effects ran later.
33
+ animation.startTime = born;
34
+ target.dataset.wordState = 'resolving';
35
+ const finish = () => { animation.cancel(); target.dataset.wordState = 'settled'; document.removeEventListener('visibilitychange', hidden); };
36
+ animation.onfinish = finish;
37
+ const hidden = () => { if (document.hidden) {
38
+ cancelled.current = true;
39
+ finish();
40
+ } };
41
+ document.addEventListener('visibilitychange', hidden);
42
+ return () => { animation.cancel(); document.removeEventListener('visibilitychange', hidden); target.dataset.wordState = 'settled'; };
43
+ }, [element, born, generation, scope.enabled, scope.generation]);
44
+ }
45
+ function Word({ children, born, generation, offset, inline }) {
46
+ const element = useRef(null);
47
+ useSourceReveal(element, born, generation);
48
+ return _jsx("span", { ref: element, className: inline ? css.streamInlineWord : css.streamWord, "data-reader-word": true, "data-source-start": offset, "data-source-birth": born ?? undefined, children: children });
49
+ }
50
+ /** A native code block enters on the same clock, without rebuilding its text. */
51
+ function MotionAtom({ children, born, generation, offset }) {
52
+ const element = useRef(null);
53
+ useSourceReveal(element, born, generation);
54
+ return _jsx("div", { ref: element, className: css.streamAtom, "data-reader-atom": true, "data-source-start": offset, "data-source-birth": born ?? undefined, children: children });
55
+ }
56
+ /** Native Think is literal text, not Markdown. Spans never alter its bytes. */
57
+ export function MotionPlainText({ text, enabled, revision }) {
58
+ const timeline = useRef();
59
+ timeline.current ??= new WordTimeline();
60
+ timeline.current.begin(text, enabled, revision, Number(document.timeline.currentTime ?? performance.now()));
61
+ const current = timeline.current;
62
+ const generation = current.generation;
63
+ const scope = useMemo(() => ({ enabled, generation }), [enabled, generation]);
64
+ return _jsx(WordScope.Provider, { value: scope, children: _jsx("div", { className: css.reasonPlain, children: current.hasLiveText ? current.words(text, 0).map(word => word.text.trim()
65
+ ? _jsx(Word, { born: word.born, generation: generation, offset: word.key, inline: true, children: word.text }, word.key)
66
+ : word.text) : text }) });
67
+ }
68
+ /** Native DSH Markdown semantics with a stable text-leaf animation hook. */
69
+ export function MotionMarkdown({ text, streaming, enabled, revision, fileMentions }) {
70
+ const timeline = useRef();
71
+ timeline.current ??= new WordTimeline();
72
+ timeline.current.begin(text, enabled, revision, Number(document.timeline.currentTime ?? performance.now()));
73
+ const generation = timeline.current.generation;
74
+ const scope = useMemo(() => ({ enabled, generation }), [enabled, generation]);
75
+ const renderText = useMemo(() => (value, offset, inline = false) => {
76
+ const current = timeline.current;
77
+ if (!current.hasLiveText)
78
+ return value;
79
+ return current.words(value, offset).map(word => word.text.trim()
80
+ ? _jsx(Word, { born: word.born, generation: current.generation, offset: word.key, inline: inline || /^\p{P}+$/u.test(word.text), children: word.text }, word.key)
81
+ : word.text);
82
+ }, []);
83
+ const renderAtom = useMemo(() => (children, offset) => {
84
+ const current = timeline.current;
85
+ return current.hasLiveText ? _jsx(MotionAtom, { born: current.bornAt(offset), generation: current.generation, offset: offset, children: children }) : children;
86
+ }, []);
87
+ return _jsx(WordScope.Provider, { value: scope, children: _jsx(MarkdownText, { text: text, streaming: streaming, codeLabels: CODE_LABELS, fileMentions: fileMentions, renderText: renderText, renderAtom: renderAtom }) });
88
+ }
89
+ //# sourceMappingURL=word-motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-motion.js","sourceRoot":"","sources":["../../../src/client/word-motion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /** Motion parameters from the public transitions.dev streaming-text recipe. */
2
+ export declare const WORD_MOTION: {
3
+ readonly duration: 350;
4
+ readonly gap: 60;
5
+ readonly blur: 1;
6
+ readonly easing: "cubic-bezier(0.22, 1, 0.36, 1)";
7
+ readonly maxDelay: 240;
8
+ };
9
+ export interface RevealingWord {
10
+ key: number;
11
+ text: string;
12
+ born: number | null;
13
+ }
14
+ /** Source-offset identity survives reparsing, frozen blocks, and final formatting. */
15
+ export declare class WordTimeline {
16
+ generation: number;
17
+ hasLiveText: boolean;
18
+ private source;
19
+ private enabled;
20
+ private revision;
21
+ private floor;
22
+ private lastBirth;
23
+ private readonly births;
24
+ begin(source: string, enabled: boolean, revision: number, now: number): void;
25
+ bornAt(offset: number): number | null;
26
+ words(value: string, offset: number): RevealingWord[];
27
+ }
28
+ //# sourceMappingURL=word-timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-timeline.d.ts","sourceRoot":"","sources":["../../../src/client/word-timeline.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AAKX,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAGjF,sFAAsF;AACtF,qBAAa,YAAY;IACvB,UAAU,SAAK;IACf,WAAW,UAAS;IACpB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAE5C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAkC5E,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYrC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE;CAuBtD"}
@@ -0,0 +1,100 @@
1
+ /** Motion parameters from the public transitions.dev streaming-text recipe. */
2
+ export const WORD_MOTION = {
3
+ duration: 350,
4
+ gap: 60,
5
+ blur: 1,
6
+ easing: 'cubic-bezier(0.22, 1, 0.36, 1)',
7
+ maxDelay: 240,
8
+ };
9
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'word' });
10
+ const closingPunctuation = /^[\p{Pe}\p{Pf},.!?:;,。!?、;:%‰…·]+$/u;
11
+ const openingPunctuation = /^[\p{Ps}\p{Pi}]+$/u;
12
+ /** Source-offset identity survives reparsing, frozen blocks, and final formatting. */
13
+ export class WordTimeline {
14
+ generation = 0;
15
+ hasLiveText = false;
16
+ source = null;
17
+ enabled = false;
18
+ revision = 0;
19
+ floor = 0;
20
+ lastBirth = -Infinity;
21
+ births = [];
22
+ begin(source, enabled, revision, now) {
23
+ if (this.source === source && this.enabled === enabled && this.revision === revision)
24
+ return;
25
+ const replaced = revision !== this.revision || (this.source !== null && !source.startsWith(this.source));
26
+ if (replaced || !enabled) {
27
+ this.births.length = 0;
28
+ this.lastBirth = -Infinity;
29
+ this.generation++;
30
+ this.floor = source.length;
31
+ }
32
+ else if (this.source === null) {
33
+ // A mounted historical prefix must not replay; a fresh live buffer mounts empty.
34
+ this.floor = source.length;
35
+ }
36
+ else {
37
+ // Allocate in source order, before Markdown can split/reorder text leaves.
38
+ // Intervals cover every offset, so resegmented CJK words inherit the time
39
+ // of their characters rather than falling through as instant "history".
40
+ const from = this.source.length;
41
+ for (const part of segmenter.segment(source.slice(from))) {
42
+ let born = Number.isFinite(this.lastBirth) ? this.lastBirth : null;
43
+ if (part.segment.trim()) {
44
+ born = Math.min(now + WORD_MOTION.maxDelay, Math.max(now, this.lastBirth + WORD_MOTION.gap));
45
+ this.lastBirth = born;
46
+ }
47
+ const end = from + part.index + part.segment.length;
48
+ const previous = this.births.at(-1);
49
+ if (previous && previous.born === born)
50
+ previous.end = end;
51
+ else
52
+ this.births.push({ end, born });
53
+ }
54
+ }
55
+ this.source = source;
56
+ this.enabled = enabled;
57
+ this.revision = revision;
58
+ this.hasLiveText = enabled && this.births.length > 0;
59
+ }
60
+ bornAt(offset) {
61
+ if (!this.enabled || offset < this.floor || this.births.length === 0)
62
+ return null;
63
+ let low = 0;
64
+ let high = this.births.length - 1;
65
+ while (low < high) {
66
+ const middle = (low + high) >>> 1;
67
+ if (this.births[middle].end <= offset)
68
+ low = middle + 1;
69
+ else
70
+ high = middle;
71
+ }
72
+ return this.births[low].born;
73
+ }
74
+ words(value, offset) {
75
+ // Atomic inline animation boxes must not turn commas into legal line starts
76
+ // or strand opening quotes at a line end. Keep source-offset identities when
77
+ // punctuation arrives in a later chunk, so the preceding word never replays.
78
+ // Already received text is one inert leaf, not thousands of React Words.
79
+ // Only the newly appended suffix needs word identities and birth times.
80
+ const prefixLength = Math.min(value.length, Math.max(0, this.floor - offset));
81
+ const prefix = prefixLength > 0
82
+ ? [{ key: offset, text: value.slice(0, prefixLength), born: null }]
83
+ : [];
84
+ const parts = [];
85
+ for (const segment of segmenter.segment(value.slice(prefixLength))) {
86
+ const part = { index: prefixLength + segment.index, segment: segment.segment };
87
+ const previous = parts.at(-1);
88
+ if (previous?.segment.trim() && (closingPunctuation.test(part.segment) || openingPunctuation.test(previous.segment))) {
89
+ previous.segment += part.segment;
90
+ }
91
+ else
92
+ parts.push({ index: part.index, segment: part.segment });
93
+ }
94
+ return prefix.concat(parts.map(part => {
95
+ const key = offset + part.index;
96
+ return { key, text: part.segment, born: this.bornAt(key) };
97
+ }));
98
+ }
99
+ }
100
+ //# sourceMappingURL=word-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-timeline.js","sourceRoot":"","sources":["../../../src/client/word-timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { Context } from '@deepseek-ai/cordis';
3
+ declare module '@deepseek-ai/cordis' {
4
+ interface Context {
5
+ webServer?: {
6
+ register: (route: {
7
+ kind: 'exact' | 'prefix';
8
+ path: string;
9
+ handler: (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
10
+ }) => () => void;
11
+ };
12
+ }
13
+ }
14
+ export declare const name = "dsh-better-display";
15
+ export declare const inject: string[];
16
+ export declare function apply(ctx: Context): void;
17
+ //# sourceMappingURL=dsh-better-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-better-display.d.ts","sourceRoot":"","sources":["../../src/dsh-better-display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,SAAS,CAAC,EAAE;YACV,QAAQ,EAAE,CAAC,KAAK,EAAE;gBAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;gBACzB,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;aAC9E,KAAK,MAAM,IAAI,CAAC;SAClB,CAAC;KACH;CACF;AAED,eAAO,MAAM,IAAI,uBAAuB,CAAC;AACzC,eAAO,MAAM,MAAM,UAAgB,CAAC;AAEpC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgDxC"}
@@ -0,0 +1,53 @@
1
+ import { spawn } from 'node:child_process';
2
+ export const name = 'dsh-better-display';
3
+ export const inject = ['webServer'];
4
+ export function apply(ctx) {
5
+ console.log('[my-plugins/dsh-better-display] loaded');
6
+ if (ctx.webServer) {
7
+ ctx.effect(() => {
8
+ return ctx.webServer.register({
9
+ kind: 'exact',
10
+ path: '/better-display/reveal',
11
+ handler: async (req, res) => {
12
+ if (req.method !== 'POST') {
13
+ res.statusCode = 405;
14
+ res.end();
15
+ return;
16
+ }
17
+ let body = '';
18
+ req.on('data', chunk => { body += chunk; });
19
+ req.on('end', () => {
20
+ try {
21
+ const data = JSON.parse(body);
22
+ const targetPath = typeof data.path === 'string' ? data.path.trim() : '';
23
+ if (!targetPath) {
24
+ res.statusCode = 400;
25
+ res.end(JSON.stringify({ ok: false, error: 'Empty path' }));
26
+ return;
27
+ }
28
+ if (process.platform === 'darwin') {
29
+ // Exact file reveal in macOS Finder with selection highlight
30
+ spawn('open', ['-R', targetPath], { detached: true, stdio: 'ignore' });
31
+ }
32
+ else if (process.platform === 'win32') {
33
+ // Exact file selection in Windows Explorer
34
+ spawn('explorer.exe', [`/select,${targetPath}`], { detached: true, stdio: 'ignore' });
35
+ }
36
+ else {
37
+ spawn('xdg-open', [targetPath], { detached: true, stdio: 'ignore' });
38
+ }
39
+ res.setHeader('Content-Type', 'application/json');
40
+ res.statusCode = 200;
41
+ res.end(JSON.stringify({ ok: true }));
42
+ }
43
+ catch (err) {
44
+ res.statusCode = 400;
45
+ res.end(JSON.stringify({ ok: false, error: String(err) }));
46
+ }
47
+ });
48
+ },
49
+ });
50
+ }, 'dsh-better-display: /api/better-display/reveal route');
51
+ }
52
+ }
53
+ //# sourceMappingURL=dsh-better-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-better-display.js","sourceRoot":"","sources":["../../src/dsh-better-display.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,121 @@
1
+ {
2
+ "name": "dsh-better-display",
3
+ "version": "0.1.1",
4
+ "description": "A calmer reading view for DeepSeek Harness: native process details, live reasoning, and clean final answers.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "main": "lib/dsh-better-display.js",
8
+ "types": "lib/types/dsh-better-display.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./lib/types/dsh-better-display.d.ts",
12
+ "default": "./lib/dsh-better-display.js"
13
+ },
14
+ "./client": {
15
+ "types": "./lib/types/client/index.d.ts",
16
+ "default": "./lib/client.js"
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "dsh": {
21
+ "bundle": {
22
+ "patch": "./cordis.patch.yml"
23
+ },
24
+ "client": {
25
+ "platform": "web",
26
+ "inject": [
27
+ "@deepseek-ai/dsh-api-session-controller",
28
+ "@deepseek-ai/dsh-client-ui-chat",
29
+ "@deepseek-ai/dsh-client-ui-conversation",
30
+ "@deepseek-ai/dsh-client-ui-renderer",
31
+ "@deepseek-ai/dsh-client-ui-session"
32
+ ]
33
+ }
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -p tsconfig.json && tsdown",
37
+ "typecheck": "tsc -p tsconfig.json --noEmit",
38
+ "test": "node --import tsx/esm --test tests/*.test.ts",
39
+ "link:harness": "node scripts/link-harness-dependencies.mjs"
40
+ },
41
+ "peerDependencies": {
42
+ "@deepseek-ai/cordis": "^4.0.2",
43
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-rc.1",
44
+ "@deepseek-ai/dsh-attachment": "^0.1.2-rc.1",
45
+ "@deepseek-ai/dsh-client-store": "^0.1.2-rc.1",
46
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-rc.1",
47
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
48
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-rc.1",
49
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-rc.1",
50
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.2-rc.1",
51
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
52
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
53
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.2-rc.1",
54
+ "react": "^18.2.0"
55
+ },
56
+ "devDependencies": {
57
+ "@deepseek-ai/dsh-api-session-controller": "0.1.2-rc.1",
58
+ "@deepseek-ai/dsh-session-turn-outline": "0.1.2-rc.1",
59
+ "@types/mdast": "^4.0.4",
60
+ "@types/node": "^22.20.0",
61
+ "@types/react": "~18.3.1",
62
+ "tsdown": "^0.22.2",
63
+ "tsx": "^4.22.4",
64
+ "typescript": "^6.0.3"
65
+ },
66
+ "dependencies": {
67
+ "clsx": "^2.0.0",
68
+ "katex": "^0.16.47",
69
+ "mdast-util-from-markdown": "^2.0.3",
70
+ "mdast-util-gfm": "^3.1.0",
71
+ "mdast-util-math": "^3.0.0",
72
+ "micromark-core-commonmark": "^2.0.3",
73
+ "micromark-extension-gfm": "^3.0.0",
74
+ "micromark-extension-math": "^3.1.0",
75
+ "micromark-factory-space": "^2.0.1",
76
+ "micromark-util-character": "^2.1.1",
77
+ "micromark-util-classify-character": "^2.0.1",
78
+ "micromark-util-sanitize-uri": "^2.0.1",
79
+ "micromark-util-symbol": "^2.0.1",
80
+ "micromark-util-types": "^2.0.2"
81
+ },
82
+ "files": [
83
+ "lib",
84
+ "skills",
85
+ "src",
86
+ "tests",
87
+ "scripts",
88
+ "cordis.yml",
89
+ "cordis.patch.yml",
90
+ "dshx.yml",
91
+ "tsconfig.json",
92
+ "tsdown.config.ts",
93
+ "README.md",
94
+ "README.en.md",
95
+ "DESIGN.md",
96
+ "LICENSE",
97
+ "THIRD_PARTY_NOTICES.md",
98
+ "CHANGELOG.md"
99
+ ],
100
+ "engines": {
101
+ "node": "^22.19.0 || >=24.0.0"
102
+ },
103
+ "repository": {
104
+ "type": "git",
105
+ "url": "git+https://github.com/aa2246740/dsh-better-display.git"
106
+ },
107
+ "homepage": "https://github.com/aa2246740/dsh-better-display#readme",
108
+ "bugs": {
109
+ "url": "https://github.com/aa2246740/dsh-better-display/issues"
110
+ },
111
+ "keywords": [
112
+ "deepseek-harness",
113
+ "dsh",
114
+ "dsh-plugin",
115
+ "dshx",
116
+ "conversation",
117
+ "reasoning",
118
+ "streaming",
119
+ "accessibility"
120
+ ]
121
+ }
@@ -0,0 +1,26 @@
1
+ import { createRequire } from 'node:module';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ const require = createRequire(import.meta.url);
6
+ const deps = createRequire(require.resolve('tsdown'));
7
+ const { rolldown } = await import(pathToFileURL(deps.resolve('rolldown')).href);
8
+ const { transform } = deps('lightningcss');
9
+ const build = await rolldown({ input: process.argv[2] ?? 'tests/browser-motion.tsx', platform: 'browser', transform: { jsx: { runtime: 'automatic' }, define: { 'process.env.NODE_ENV': JSON.stringify('production') } }, plugins: [{
10
+ name: 'fixture-css',
11
+ resolveId(source, importer) { if (source.endsWith('.module.css')) return resolve(importer ? resolve(importer,'..') : '.',source) + '.mjs'; },
12
+ async load(id) {
13
+ if (!id.endsWith('.module.css.mjs')) return;
14
+ const path = id.slice(0, -4);
15
+ const {code,exports} = transform({filename:path,code:await readFile(path),cssModules:{pattern:'[hash]_[local]'}});
16
+ const map=Object.fromEntries(Object.entries(exports).map(([key,value])=>[key,value.name]));
17
+ return `const style=document.createElement('style');style.textContent=${JSON.stringify(code.toString())};document.head.append(style);export default ${JSON.stringify(map)};`;
18
+ },
19
+ }] });
20
+ await mkdir('.delivery',{recursive:true});
21
+ const result = await build.generate({ format:'iife', name:'ReaderMotionFixture' });
22
+ const js=result.output.find(x=>x.type==='chunk').code;
23
+ await writeFile('.delivery/motion-fixture.js',js);
24
+ await writeFile('.delivery/motion-fixture.html',`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Reader transition verification</title><style>body{margin:0;font:16px/1.75 system-ui;background:#fff;color:#242424;--dsw-alias-label-primary:#242424;--dsw-alias-label-secondary:#666;--dsw-alias-label-tertiary:#888;--dsw-alias-bg-base:#fff;--dsw-alias-bg-module-platform:#f6f7f8;--dsw-alias-border-l2:#dedede}button{cursor:pointer}</style><div id="app"></div><script>${js.replaceAll('</script','<\\/script')}</script>`);
25
+ await build.close();
26
+ console.log('Built .delivery/motion-fixture.html using actual plugin components');
@@ -0,0 +1,51 @@
1
+ import { existsSync, mkdirSync, symlinkSync, realpathSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+
5
+ const root = resolve(process.argv[2] || '');
6
+ if (!process.argv[2] || !existsSync(join(root, 'tools/dshx/src/client-build.js'))) throw new Error('Pass a prepared Harness checkout.');
7
+ const local = resolve('node_modules');
8
+ mkdirSync(local, { recursive: true });
9
+ const shared = {
10
+ '@deepseek-ai/cordis': 'vendor/cordis',
11
+ '@deepseek-ai/dsh-api-session-controller': 'packages/api/session-controller',
12
+ '@deepseek-ai/dsh-session-turn-outline': 'packages/session/session-turn-outline',
13
+ '@deepseek-ai/dsh-client-store': 'packages/client/store',
14
+ '@deepseek-ai/dsh-client-ui-chat': 'packages/client/ui-chat',
15
+ '@deepseek-ai/dsh-client-ui-conversation': 'packages/client/ui-conversation',
16
+ '@deepseek-ai/dsh-client-ui-primitives': 'packages/client/ui-primitives',
17
+ '@deepseek-ai/dsh-client-ui-renderer': 'packages/client/ui-renderer',
18
+ '@deepseek-ai/dsh-client-ui-session': 'packages/client/ui-session',
19
+ '@deepseek-ai/dsh-client-ui-slots': 'packages/client/ui-slots',
20
+ '@deepseek-ai/dsh-attachment': 'packages/attachment/attachment',
21
+ '@deepseek-ai/dsh-session': 'packages/core/session',
22
+ '@deepseek-ai/dsh-util-workspace-path': 'packages/util/workspace-path',
23
+ };
24
+ function link(name, target) {
25
+ if (!existsSync(target)) throw new Error(`Missing Harness dependency target: ${name} (${target})`);
26
+ const destination = join(local, name);
27
+ mkdirSync(dirname(destination), { recursive: true });
28
+ if (existsSync(destination)) {
29
+ if (realpathSync(destination) !== realpathSync(target)) throw new Error(`Dependency mismatch: ${name}`);
30
+ return;
31
+ }
32
+ symlinkSync(target, destination);
33
+ }
34
+ for (const [name, path] of Object.entries(shared)) link(name, join(root, path));
35
+ const require = createRequire(join(root, 'packages/client/ui-conversation/package.json'));
36
+ const rootRequire = createRequire(join(root, 'package.json'));
37
+ for (const name of ['react', '@types/react']) link(name, dirname(require.resolve(`${name}/package.json`)));
38
+ for (const name of ['@types/node', 'typescript', 'tsdown', 'tsx']) link(name, dirname(rootRequire.resolve(`${name}/package.json`)));
39
+ for (const name of ['@types/mdast', 'clsx', 'katex', 'mdast-util-from-markdown', 'mdast-util-gfm', 'mdast-util-math', 'micromark-core-commonmark', 'micromark-extension-gfm', 'micromark-extension-math', 'micromark-factory-space', 'micromark-util-character', 'micromark-util-classify-character', 'micromark-util-sanitize-uri', 'micromark-util-symbol', 'micromark-util-types']) {
40
+ link(name, join(root, 'packages/client/ui-primitives/node_modules', name));
41
+ }
42
+ mkdirSync(join(local, '.bin'), { recursive: true });
43
+ for (const name of ['typescript', 'tsdown']) {
44
+ const pkg = JSON.parse(readFileSync(join(local, name, 'package.json'), 'utf8'));
45
+ const bins = typeof pkg.bin === 'string' ? { [name]: pkg.bin } : pkg.bin;
46
+ for (const [command, path] of Object.entries(bins)) {
47
+ const target = join(local, '.bin', command);
48
+ if (!existsSync(target)) symlinkSync(join(local, name, path), target);
49
+ }
50
+ }
51
+ console.log('Development dependencies linked to the selected Harness; no package download or Harness mutation.');