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,219 @@
1
+ /**
2
+ * Pure row-model derivation for tool summary rows: variant classification,
3
+ * one-line summary, expanded-body text, and flattened result output from the
4
+ * frozen call slice. Input material comes from the call ARGUMENTS; output and
5
+ * error material from the settled result node. A call whose render intent is
6
+ * a terminal card gets its expanded body from the views instead, through
7
+ * `terminalCardModel` in terminal-card-model.ts.
8
+ */
9
+ // The block union's defining home is runtime (fold-product types); this
10
+ // contract only forwards it (type-definition authority stays with the layer
11
+ // that produces the values).
12
+ import { abbreviateHomePath } from '@deepseek-ai/dsh-util-workspace-path';
13
+ /** Figma row titles per variant (design literals, not translatable copy). */
14
+ export const VARIANT_TITLES = {
15
+ search: 'Search', read: 'Read', bash: 'Bash',
16
+ write: 'Write', edit: 'Edit', code: 'Code', others: 'Tool call',
17
+ };
18
+ /**
19
+ * Known tool name -> variant.
20
+ *
21
+ * `cordis_define` is deliberately absent: ui-cordis registers a keyed
22
+ * `tool.call.toolview` entry for it, and a keyed hit REPLACES the generic row
23
+ * (this table is only reached through GenericToolCard, the dispatch fallback in
24
+ * ToolCallTree). An entry here would be unreachable, and a second title for the
25
+ * same call would be a second answer to a question the card already owns.
26
+ */
27
+ const TOOL_VARIANTS = {
28
+ bash: 'bash',
29
+ // The PowerShell twin is a shell tool: the bash row family (icon, colors)
30
+ // with its own title from TOOL_TITLES, not the generic `others` row.
31
+ pwsh: 'bash',
32
+ read: 'read',
33
+ web_fetch: 'read',
34
+ web_search: 'search',
35
+ grep: 'search',
36
+ glob: 'search',
37
+ write: 'write',
38
+ edit: 'edit',
39
+ run_code: 'code',
40
+ cordis_package_inspect: 'read',
41
+ cordis_runtime_inspect: 'read',
42
+ // The three run-control verbs take one package id and produce a receipt, so
43
+ // the generic row is the decided intent, not an unclassified default: there is
44
+ // no program to show (that is `cordis_define`'s card) and no file to open. The
45
+ // id lands in the summary slot, and the titles below name the act.
46
+ cordis_run: 'others',
47
+ cordis_stop: 'others',
48
+ cordis_undefine: 'others',
49
+ };
50
+ /** Tool-owned titles that refine a generic row variant without replacing it. */
51
+ const TOOL_TITLES = {
52
+ cordis_package_inspect: 'Inspect',
53
+ cordis_runtime_inspect: 'Inspect',
54
+ cordis_run: 'Run Cordis Plugin',
55
+ cordis_stop: 'Stop Cordis Plugin',
56
+ cordis_undefine: 'Remove Cordis Plugin',
57
+ pwsh: 'Pwsh',
58
+ };
59
+ /**
60
+ * Classify a tool name into its row variant.
61
+ * @param toolName - wire tool name.
62
+ * @returns matching variant, others when unknown.
63
+ */
64
+ export function classifyTool(toolName) {
65
+ return TOOL_VARIANTS[toolName] ?? 'others';
66
+ }
67
+ /**
68
+ * Flatten a settled result's content blocks to display text: text blocks
69
+ * verbatim, other block shapes as pretty JSON. Empty content on a failed call
70
+ * falls back to the structured error's `name: code` line.
71
+ * @param node - the settled result node.
72
+ * @returns the flattened result text (may be empty).
73
+ */
74
+ export function resultText(node) {
75
+ const parts = [];
76
+ for (const block of node.content) {
77
+ if (block.type === 'text')
78
+ parts.push(block.text);
79
+ else
80
+ parts.push(JSON.stringify(block, null, 2));
81
+ }
82
+ if (parts.length === 0 && node.error !== undefined) {
83
+ parts.push(`${node.error.name}: ${node.error.code}`);
84
+ }
85
+ return parts.join('\n');
86
+ }
87
+ function parseArgs(argsRaw) {
88
+ try {
89
+ return JSON.parse(argsRaw);
90
+ }
91
+ catch {
92
+ // Non-JSON args (mid-stream truncation): summary/body fall back to the raw string.
93
+ return undefined;
94
+ }
95
+ }
96
+ function firstLine(text) {
97
+ const nl = text.indexOf('\n');
98
+ return nl === -1 ? text : text.slice(0, nl);
99
+ }
100
+ function pickString(args, keys) {
101
+ for (const key of keys) {
102
+ const v = args[key];
103
+ if (typeof v === 'string' && v !== '')
104
+ return v;
105
+ }
106
+ return undefined;
107
+ }
108
+ /** Summary key preference per variant (args-derived; result-derived summaries are a ledger item). */
109
+ const SUMMARY_KEYS = {
110
+ bash: ['description', 'command'],
111
+ read: ['path', 'file_path', 'url'],
112
+ search: ['query', 'pattern', 'url'],
113
+ write: ['path', 'file_path'],
114
+ edit: ['path', 'file_path'],
115
+ code: ['description'],
116
+ others: [],
117
+ };
118
+ /**
119
+ * Strip the workspace root from a workspace-rooted absolute path (display only).
120
+ * @param text - the path to shorten.
121
+ * @param cwd - session workspace root; absent or empty leaves the path unchanged.
122
+ * @returns the path relative to the workspace root, or unchanged when it is not rooted there.
123
+ */
124
+ export function relativizeToCwd(text, cwd) {
125
+ if (cwd === undefined || cwd === '')
126
+ return text;
127
+ const root = cwd.replace(/[/\\]+$/, '');
128
+ if (text.startsWith(`${root}/`) || text.startsWith(`${root}\\`))
129
+ return text.slice(root.length + 1);
130
+ return text;
131
+ }
132
+ function deriveSummary(variant, argsRaw) {
133
+ const parsed = parseArgs(argsRaw);
134
+ if (typeof parsed !== 'object' || parsed === null)
135
+ return firstLine(argsRaw);
136
+ const args = parsed;
137
+ if (variant === 'search' && Array.isArray(args.queries)) {
138
+ const queries = args.queries.filter((query) => typeof query === 'string' && query !== '');
139
+ if (queries.length > 0)
140
+ return queries.map(firstLine).join(', ');
141
+ }
142
+ const picked = pickString(args, SUMMARY_KEYS[variant]);
143
+ if (picked !== undefined)
144
+ return firstLine(picked);
145
+ for (const v of Object.values(args)) {
146
+ if (typeof v === 'string' && v !== '')
147
+ return firstLine(v);
148
+ }
149
+ return firstLine(argsRaw);
150
+ }
151
+ /** Path keys only — never `url` (web_fetch lands on the read variant). */
152
+ const FILE_PATH_KEYS = ['path', 'file_path'];
153
+ /** File-tool variants whose summary may be an openable workspace path. */
154
+ const FILE_PATH_VARIANTS = new Set(['read', 'write', 'edit']);
155
+ function deriveFilePath(variant, argsRaw) {
156
+ if (!FILE_PATH_VARIANTS.has(variant))
157
+ return undefined;
158
+ const parsed = parseArgs(argsRaw);
159
+ if (typeof parsed !== 'object' || parsed === null)
160
+ return undefined;
161
+ const picked = pickString(parsed, FILE_PATH_KEYS);
162
+ return picked === undefined ? undefined : firstLine(picked);
163
+ }
164
+ function deriveBody(variant, argsRaw) {
165
+ if (argsRaw === '')
166
+ return null;
167
+ const parsed = parseArgs(argsRaw);
168
+ if (parsed === undefined)
169
+ return argsRaw;
170
+ // The code row's expanded body IS the program (monospace via the row's
171
+ // variant styling), not the args JSON envelope around it.
172
+ if (variant === 'code' && typeof parsed === 'object' && parsed !== null) {
173
+ const code = parsed.code;
174
+ if (typeof code === 'string' && code !== '')
175
+ return code;
176
+ }
177
+ return JSON.stringify(parsed, null, 2);
178
+ }
179
+ /**
180
+ * Derive the full row model from a frozen call slice.
181
+ * @param toolName - wire tool name (dispatch-supplied; survives windowless results).
182
+ * @param block - RunningToolCall or ToolResultNode off the snapshot caches.
183
+ * @param cwd - session workspace root; workspace-rooted path summaries display relative to it.
184
+ * @param home - host account home; a leftover POSIX home path displays as `~`.
185
+ * @returns the row model.
186
+ */
187
+ export function toolRowModel(toolName, block, cwd, home) {
188
+ const variant = classifyTool(toolName);
189
+ const done = 'kind' in block;
190
+ const argsRaw = (done ? block.call?.argsRaw : block.argsRaw) ?? '';
191
+ const state = !done ? 'running'
192
+ : block.error?.code === 'interrupted' ? 'stopped'
193
+ : block.isError ? 'error' : 'ok';
194
+ const base = argsRaw === ''
195
+ ? block.callId
196
+ : abbreviateHomePath(relativizeToCwd(deriveSummary(variant, argsRaw), cwd), home);
197
+ const toolTitle = TOOL_TITLES[toolName];
198
+ // Others keeps the static "Tool call" title (figma literal); the real tool
199
+ // name rides the mutable summary slot unless the tool owns a specific title.
200
+ const summary = variant === 'others' && toolName !== '' && toolTitle === undefined
201
+ ? `${toolName} · ${base}`
202
+ : base;
203
+ // The empty string is "no text" for both derived result fields: a settled
204
+ // call with blank content has nothing to expand, and a blank first line
205
+ // would erase the collapsed error row's summary slot.
206
+ const output = done ? (resultText(block) || null) : null;
207
+ const errorSummary = state === 'error' && output !== null ? firstLine(output) : null;
208
+ return {
209
+ variant,
210
+ title: toolTitle ?? VARIANT_TITLES[variant],
211
+ summary,
212
+ filePath: deriveFilePath(variant, argsRaw),
213
+ body: deriveBody(variant, argsRaw),
214
+ output,
215
+ errorSummary,
216
+ state,
217
+ };
218
+ }
219
+ //# sourceMappingURL=tool-call-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-model.js","sourceRoot":"","sources":["../../../../src/client/native/tool-call-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type DeliverableOpenMode = 'external' | 'sidebar';
2
+ export interface OpenModeSnapshot {
3
+ getSnapshot: () => {
4
+ deliverableOpenMode?: DeliverableOpenMode;
5
+ };
6
+ subscribe?: (fn: () => void) => () => void;
7
+ }
8
+ export declare function deliverableOpenModeOf(value: unknown): DeliverableOpenMode;
9
+ export declare function modeFromSnapshot(store: OpenModeSnapshot | undefined): DeliverableOpenMode;
10
+ export declare function isFolderOpenPath(path: string): boolean;
11
+ export declare function fileAddressFor(sessionId: string, cwd: string | undefined, path: string): string;
12
+ export declare function resolveOpenWorkspacePath(cwd: string | undefined, path: string, resolveWorkspacePath: (cwd: string | undefined, path: string) => string): string;
13
+ export declare function openDeliverableFile(args: {
14
+ path: string;
15
+ mode: DeliverableOpenMode;
16
+ sessionId: string;
17
+ cwd: string | undefined;
18
+ resolveWorkspacePath: (cwd: string | undefined, path: string) => string;
19
+ openExternal: (absolutePath: string) => Promise<void>;
20
+ openSidebar?: (address: string) => void;
21
+ fileAddressFor?: (sessionId: string, cwd: string | undefined, path: string) => string;
22
+ warn?: (message: string, extra?: unknown) => void;
23
+ }): Promise<'sidebar' | 'external'>;
24
+ //# sourceMappingURL=open-file.d.ts.map
@@ -0,0 +1,10 @@
1
+ import type { DiffBlockLabels, JsonTreeLabels, MarkdownLabels, ReadBlockLabels, SearchBlockLabels, TerminalBlockLabels, WebBlockLabels } from '@deepseek-ai/dsh-client-ui-primitives';
2
+ export declare const markdownLabels: MarkdownLabels;
3
+ export declare const readBlockLabels: ReadBlockLabels;
4
+ export declare const terminalBlockLabels: TerminalBlockLabels;
5
+ export declare const diffBlockLabels: DiffBlockLabels;
6
+ export declare const searchBlockLabels: SearchBlockLabels;
7
+ export declare const webBlockLabels: WebBlockLabels;
8
+ export declare const jsonTreeLabels: JsonTreeLabels;
9
+ export declare const truncatedJsonLabel: (total: number) => string;
10
+ //# sourceMappingURL=primitive-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive-labels.d.ts","sourceRoot":"","sources":["../../../src/client/primitive-labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACf,MAAM,uCAAuC,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,cAG5B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,mBAKjC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,iBAK/B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAG5B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAI5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,MAAM,KAAG,MAAoC,CAAC"}
@@ -0,0 +1,37 @@
1
+ export const markdownLabels = {
2
+ code: { copyLabel: '复制', copiedLabel: '已复制' },
3
+ footnotes: '脚注',
4
+ };
5
+ export const readBlockLabels = {
6
+ window: (shown, total) => `显示 ${shown} / ${total} 行`,
7
+ copy: '复制', copied: '已复制', collapseAria: '收起文件内容',
8
+ expandAria: hidden => `展开其余 ${hidden} 行`, collapse: '收起', expand: hidden => `展开其余 ${hidden} 行`,
9
+ };
10
+ export const terminalBlockLabels = {
11
+ signal: signal => `信号 ${signal}`, exitCode: code => `退出码 ${code}`,
12
+ running: '执行中', failed: '失败', done: '已完成', copy: '复制', copied: '已复制',
13
+ noOutput: '没有输出', collapseAria: '收起命令输出', collapse: '收起',
14
+ expandAria: hidden => `展开其余 ${hidden} 行`, expand: hidden => `展开其余 ${hidden} 行`,
15
+ };
16
+ export const diffBlockLabels = {
17
+ copy: '复制', copied: '已复制', collapseAria: '收起差异', collapse: '收起',
18
+ expandAria: hidden => `展开其余 ${hidden} 行`, expand: hidden => `展开其余 ${hidden} 行`,
19
+ files: count => `${count} 个文件`,
20
+ };
21
+ export const searchBlockLabels = {
22
+ pathsSummary: (shown, total, truncated) => `${shown} / ${total} 个路径${truncated ? '(结果已截断)' : ''}`,
23
+ matchesSummary: (shown, total, files, truncated) => `${shown} / ${total} 处匹配 · ${files} 个文件${truncated ? '(结果已截断)' : ''}`,
24
+ copy: '复制', copied: '已复制', noResults: '没有结果', collapseAria: '收起搜索结果', collapse: '收起',
25
+ expandAria: hidden => `展开其余 ${hidden} 行`, expand: hidden => `展开其余 ${hidden} 行`,
26
+ };
27
+ export const webBlockLabels = {
28
+ noResults: '没有结果', sourcesTruncated: '来源已截断', http: 'HTTP', contentTruncated: '内容已截断',
29
+ markdown: markdownLabels,
30
+ };
31
+ export const jsonTreeLabels = {
32
+ copyValue: '复制值', copyJson: '复制 JSON', copyPath: '复制路径', copyPrettyJson: '复制格式化 JSON',
33
+ copyCompactJson: '复制紧凑 JSON', copied: '已复制', copyFailed: '复制失败', collapseNode: '收起节点',
34
+ expandNode: '展开节点', copyButtonTitle: action => action,
35
+ };
36
+ export const truncatedJsonLabel = (total) => `内容过长,已截断(共 ${total} 个字符)`;
37
+ //# sourceMappingURL=primitive-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive-labels.js","sourceRoot":"","sources":["../../../src/client/primitive-labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { AssistantBlock, ToolCallBlock, TurnLocation } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
+ import type { AssistantChatData, ChatConversationViewNode } from '@deepseek-ai/dsh-client-ui-chat/client';
3
+ export interface ReaderGroup {
4
+ key: string;
5
+ turn: number | null;
6
+ keys: readonly string[];
7
+ }
8
+ export interface TurnBoundary {
9
+ status: 'open' | 'closed' | 'unknown';
10
+ reason: string | null;
11
+ latestStep: number;
12
+ closingStep: number | null;
13
+ }
14
+ export declare function groupNodes(order: readonly string[], get: (key: string) => ChatConversationViewNode | undefined): ReaderGroup[];
15
+ export declare function boundaryOf(turn: TurnLocation | undefined): TurnBoundary;
16
+ export declare function isEarlierNarration(data: AssistantChatData, boundary: TurnBoundary): boolean;
17
+ export declare function processExpanded(choice: boolean | undefined, boundary: TurnBoundary): boolean;
18
+ /** Reading while running must not pin the process open after completion. */
19
+ export declare function processChoiceKey(groupKey: string, boundary: TurnBoundary): string;
20
+ /** A body-only assistant step is not a thinking/process disclosure. */
21
+ export declare function hasProcessContent(node: ChatConversationViewNode | undefined, boundary: TurnBoundary): boolean;
22
+ export declare function hasVisibleBody(blocks: readonly AssistantBlock[]): boolean;
23
+ /** Keep native block order. In particular, never lift a later Think above text. */
24
+ export declare function assistantSegments(blocks: readonly AssistantBlock[]): {
25
+ kind: 'reasoning' | 'body';
26
+ start: number;
27
+ blocks: AssistantBlock[];
28
+ }[];
29
+ export declare function toolFailed(block: ToolCallBlock): boolean;
30
+ export declare function toolName(block: ToolCallBlock): string;
31
+ export declare function terminalLabel(reason: string | null): string | null;
32
+ /**
33
+ * Extract the first usable fork anchor seq from candidate message nodes.
34
+ * Only the durable closing message seq cuts the intended turn prefix: an
35
+ * absent anchor must surface as undefined (never as 0 or NaN), because the
36
+ * host treats a missing atSeq as a whole-session fork.
37
+ */
38
+ export declare function forkAnchorSeq(candidates: ReadonlyArray<{
39
+ seq?: unknown;
40
+ } | null | undefined>): number | undefined;
41
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/client/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAClH,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAG1G,MAAM,WAAW,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AAC1F,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAG9I,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,GAAG,WAAW,EAAE,CAgB9H;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAOvE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAK3F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE5F;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEjF;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAS7G;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAEzE;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG;IAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,EAAE,CAa9I;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAExD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAUlE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,aAAa,CAAC;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC,GAC9D,MAAM,GAAG,SAAS,CAMpB"}
@@ -0,0 +1,112 @@
1
+ import { activityPhase } from './tool-activity.js';
2
+ // Run on structural publication, not on each text delta. Node seats subscribe by key.
3
+ export function groupNodes(order, get) {
4
+ const groups = [];
5
+ const seenTurns = new Set();
6
+ for (const key of order) {
7
+ const node = get(key);
8
+ if (!node || node.visibility === 'hidden')
9
+ continue;
10
+ const turn = node.location.kind === 'step' || node.location.kind === 'turn' ? node.location.turn.turn : null;
11
+ const previous = groups.at(-1);
12
+ if (turn !== null && previous?.turn === turn) {
13
+ previous.keys.push(key);
14
+ }
15
+ else {
16
+ groups.push({ key: turn === null ? `node:${key}` : seenTurns.has(turn) ? `turn:${turn}:${key}` : `turn:${turn}`, turn, keys: [key] });
17
+ if (turn !== null)
18
+ seenTurns.add(turn);
19
+ }
20
+ }
21
+ return groups;
22
+ }
23
+ export function boundaryOf(turn) {
24
+ return {
25
+ status: turn?.status ?? 'unknown',
26
+ reason: turn?.end?.data.reason.kind ?? null,
27
+ latestStep: turn?.steps.at(-1)?.step ?? -1,
28
+ closingStep: turn?.data.get('turn-tail')?.closing?.step ?? null,
29
+ };
30
+ }
31
+ export function isEarlierNarration(data, boundary) {
32
+ // New body text, a tool call, or a settled step is not a completed turn.
33
+ if (data.status !== 'settled' || boundary.status !== 'closed' || boundary.reason !== 'completed')
34
+ return false;
35
+ if (data.blocks.some(block => block.kind === 'image' || block.kind === 'other'))
36
+ return false;
37
+ return boundary.closingStep !== null && data.step < boundary.closingStep;
38
+ }
39
+ export function processExpanded(choice, boundary) {
40
+ return choice ?? !(boundary.status === 'closed' && boundary.reason === 'completed');
41
+ }
42
+ /** Reading while running must not pin the process open after completion. */
43
+ export function processChoiceKey(groupKey, boundary) {
44
+ return `${groupKey}:${boundary.status}:${boundary.reason ?? 'pending'}`;
45
+ }
46
+ /** A body-only assistant step is not a thinking/process disclosure. */
47
+ export function hasProcessContent(node, boundary) {
48
+ if (!node || node.visibility === 'hidden')
49
+ return false;
50
+ if (node.kind === 'assistant-step') {
51
+ const data = node.data;
52
+ return data.blocks.some(block => block.kind === 'reasoning' && block.text.trim() !== '')
53
+ || (isEarlierNarration(data, boundary) && hasVisibleBody(data.blocks));
54
+ }
55
+ return node.kind === 'context' || node.kind === 'model-retry' || node.kind === 'system-prompt' || node.kind === 'turn-process'
56
+ || node.kind === 'command' || node.kind === 'manual-compaction' || node.kind === 'compaction';
57
+ }
58
+ export function hasVisibleBody(blocks) {
59
+ return blocks.some(block => block.kind === 'image' || block.kind === 'other' || (block.kind === 'text' && block.text.trim() !== ''));
60
+ }
61
+ /** Keep native block order. In particular, never lift a later Think above text. */
62
+ export function assistantSegments(blocks) {
63
+ const segments = [];
64
+ let previous;
65
+ blocks.forEach((block, index) => {
66
+ if (block.kind === 'tool-call') {
67
+ previous = undefined;
68
+ return;
69
+ }
70
+ const kind = block.kind === 'reasoning' ? 'reasoning' : 'body';
71
+ if (previous?.kind === kind)
72
+ previous.blocks.push(block);
73
+ else {
74
+ previous = { kind, start: index, blocks: [block] };
75
+ segments.push(previous);
76
+ }
77
+ });
78
+ return segments;
79
+ }
80
+ export function toolFailed(block) {
81
+ return activityPhase({ block }) === 'failed';
82
+ }
83
+ export function toolName(block) {
84
+ return 'kind' in block ? block.call?.name ?? '工具调用' : block.name;
85
+ }
86
+ export function terminalLabel(reason) {
87
+ switch (reason) {
88
+ case 'completed': return null;
89
+ case 'aborted':
90
+ case 'interrupted': return '本轮已停止,已生成的内容仍保留。';
91
+ case 'blocked': return '本轮需要处理阻塞事项;请查看原对话与下方操作区。';
92
+ case 'max-tokens': return '输出达到本轮长度限制,内容可能尚未完整。';
93
+ case 'error': return '本轮未完成;错误信息保留在下方。';
94
+ case null: return null;
95
+ default: return `本轮结束状态:${reason}。请在原对话中核对完整记录。`;
96
+ }
97
+ }
98
+ /**
99
+ * Extract the first usable fork anchor seq from candidate message nodes.
100
+ * Only the durable closing message seq cuts the intended turn prefix: an
101
+ * absent anchor must surface as undefined (never as 0 or NaN), because the
102
+ * host treats a missing atSeq as a whole-session fork.
103
+ */
104
+ export function forkAnchorSeq(candidates) {
105
+ for (const candidate of candidates) {
106
+ const seq = candidate?.seq;
107
+ if (typeof seq === 'number' && Number.isFinite(seq))
108
+ return seq;
109
+ }
110
+ return undefined;
111
+ }
112
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/client/projection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,KAAwB,EAAE,GAA0D;IAC7G,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7G,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtI,IAAI,IAAI,KAAK,IAAI;gBAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAA8B;IACvD,OAAO;QACL,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,SAAS;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI;QAC3C,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAC1C,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAuB,EAAE,QAAsB;IAChF,yEAAyE;IACzE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/G,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9F,OAAO,QAAQ,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA2B,EAAE,QAAsB;IACjF,OAAO,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;AACtF,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAsB;IACvE,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;AAC1E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,IAA0C,EAAE,QAAsB;IAClG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAyB,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;eACnF,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;WACzH,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAiC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACvI,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,MAAiC;IACjE,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAC1D,IAAI,QAAkE,CAAC;IACvE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAAC,QAAQ,GAAG,SAAS,CAAC;YAAC,OAAO;QAAC,CAAC;QACjE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/D,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI;YAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACpD,CAAC;YACJ,QAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAoB;IAC7C,OAAO,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC3C,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC;QAC9B,KAAK,SAAS,CAAC;QAAC,KAAK,aAAa,CAAC,CAAC,OAAO,kBAAkB,CAAC;QAC9D,KAAK,SAAS,CAAC,CAAC,OAAO,0BAA0B,CAAC;QAClD,KAAK,YAAY,CAAC,CAAC,OAAO,sBAAsB,CAAC;QACjD,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC;QACxC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,OAAO,CAAC,CAAC,OAAO,UAAU,MAAM,gBAAgB,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,UAA+D;IAE/D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,SAAS,EAAE,GAAG,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Transitions.dev Reasoning stream, adapted to appended content, never a loop. */
2
+ export declare const REASON_HOLD = 840;
3
+ export declare const REASON_STEP = 500;
4
+ export declare const REASON_LINES = 2;
5
+ export declare function reasoningTarget(top: number, contentHeight: number, viewportHeight: number, lineHeight: number): number;
6
+ //# sourceMappingURL=reasoning-follow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-follow.d.ts","sourceRoot":"","sources":["../../../src/client/reasoning-follow.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAMtH"}
@@ -0,0 +1,12 @@
1
+ /** Transitions.dev Reasoning stream, adapted to appended content, never a loop. */
2
+ export const REASON_HOLD = 840;
3
+ export const REASON_STEP = 500;
4
+ export const REASON_LINES = 2;
5
+ export function reasoningTarget(top, contentHeight, viewportHeight, lineHeight) {
6
+ const end = Math.max(0, contentHeight - viewportHeight);
7
+ const current = Math.min(end, Math.max(0, top));
8
+ // Receiving a burst changes the available transcript, never the step size.
9
+ // Only the final, partial step may be shorter than the reference's two lines.
10
+ return Math.min(end, current + Math.max(1, lineHeight) * REASON_LINES);
11
+ }
12
+ //# sourceMappingURL=reasoning-follow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-follow.js","sourceRoot":"","sources":["../../../src/client/reasoning-follow.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,aAAqB,EAAE,cAAsB,EAAE,UAAkB;IAC5G,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,2EAA2E;IAC3E,8EAA8E;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type SettingsCopyKey = "nav" | "openTitle" | "openDescription" | "skillTitle" | "skillInstalled" | "skillMissing" | "skillPurpose" | "skillPluginNote" | "skillInstall" | "skillRecheck" | "skillChecking" | "skillUnavailable";
2
+ export type SettingsCopy = Record<SettingsCopyKey, string>;
3
+ export declare const en: SettingsCopy;
4
+ export declare const zh: SettingsCopy;
5
+ export declare function settingsLanguage(tag: string | undefined): "zh" | "en";
6
+ export declare function settingsCopyFor(tag: string | undefined): SettingsCopy;
@@ -0,0 +1,16 @@
1
+ import type { SettingsCopyKey } from './settings-copy.js';
2
+ export interface SettingsSectionOwnerProps {
3
+ close: () => void;
4
+ }
5
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
6
+ interface SlotMap {
7
+ 'settings.section': {
8
+ kind: 'list';
9
+ scope: 'root';
10
+ owner: SettingsSectionOwnerProps;
11
+ };
12
+ }
13
+ interface LocaleNamespaceMap {
14
+ 'better-display': SettingsCopyKey;
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ import type { EngineStoreHandle } from '@deepseek-ai/dsh-client-store';
2
+ import type { DeliverableOpenMode } from './open-file.js';
3
+ export interface ReaderState {
4
+ expanded: Record<string, boolean>;
5
+ motion: boolean;
6
+ autoFold: boolean;
7
+ deliverableOpenMode: DeliverableOpenMode;
8
+ }
9
+ type ReaderActions = {
10
+ setExpanded: (draft: ReaderState, key: string, value: boolean) => void;
11
+ setMotion: (draft: ReaderState, value: boolean) => void;
12
+ setAutoFold: (draft: ReaderState, value: boolean) => void;
13
+ setDeliverableOpenMode: (draft: ReaderState, value: DeliverableOpenMode) => void;
14
+ };
15
+ export declare function createReaderStore(): EngineStoreHandle<ReaderState, ReaderActions>;
16
+ export {};
17
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/client/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;AACtG,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvE,SAAS,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3D,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAUjF"}
@@ -0,0 +1,13 @@
1
+ import { defineStore } from '@deepseek-ai/dsh-client-store';
2
+ export function createReaderStore() {
3
+ return defineStore({
4
+ init: () => ({ expanded: {}, motion: true, autoFold: true }),
5
+ persist: 'dsh.reader.v1',
6
+ actions: {
7
+ setExpanded: (draft, key, value) => { draft.expanded[key] = value; },
8
+ setMotion: (draft, value) => { draft.motion = value; },
9
+ setAutoFold: (draft, value) => { draft.autoFold = value; },
10
+ },
11
+ });
12
+ }
13
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/client/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAU5D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,GAAgB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzE,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE;YACP,WAAW,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,KAAc,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YACrF,SAAS,EAAE,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;YAC/D,WAAW,EAAE,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;SACpE;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Presentation only. The original session string remains the source of truth. */
2
+ export declare const STREAM_TIMING: {
3
+ readonly catchUpMs: 180;
4
+ readonly maxQueuedMs: 240;
5
+ readonly finishMs: 96;
6
+ readonly revealMs: 350;
7
+ readonly minimumRate: 100;
8
+ };
9
+ export declare class StreamBuffer {
10
+ target: string;
11
+ visible: string;
12
+ revision: number;
13
+ private boundaries;
14
+ private arrivals;
15
+ private lastAt;
16
+ private credit;
17
+ private finishAt;
18
+ constructor(initial?: string);
19
+ get pending(): boolean;
20
+ private segment;
21
+ /** Non-append updates, cancellations and hidden/reduced views never replay. */
22
+ update(text: string, now: number, options?: {
23
+ immediate?: boolean;
24
+ finished?: boolean;
25
+ }): void;
26
+ flush(): void;
27
+ advance(now: number): boolean;
28
+ }
29
+ //# sourceMappingURL=stream-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-buffer.d.ts","sourceRoot":"","sources":["../../../src/client/stream-buffer.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,aAAa;;;;;;CAA+F,CAAC;AAc1H,qBAAa,YAAY;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,SAAK;IACb,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,OAAO,SAAK;IAMxB,IAAI,OAAO,IAAI,OAAO,CAAqD;IAE3E,OAAO,CAAC,OAAO;IAOf,+EAA+E;IAC/E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;IAwBlG,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CA0B9B"}