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,168 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useEffect, useId, useRef, useState, } from 'react';
3
+ import css from './TimelineRail.module.css';
4
+ const TURN_SPACING_PX = 12;
5
+ const RAIL_INSET_PX = 6;
6
+ const FADE_PX = 24;
7
+ function itemPosition(index) {
8
+ return { '--turn-natural-position': `${index * TURN_SPACING_PX}px` };
9
+ }
10
+ function frameStyle(count, scrollTop) {
11
+ return {
12
+ '--turn-natural-height': `${(count - 1) * TURN_SPACING_PX + 2 * RAIL_INSET_PX}px`,
13
+ '--turn-rail-inset': `${RAIL_INSET_PX}px`,
14
+ '--turn-scroll-top': `${scrollTop}px`,
15
+ };
16
+ }
17
+ function itemIndexAtPointer(items, frame, scrollTop, clientY) {
18
+ const rect = frame.getBoundingClientRect();
19
+ const offset = clientY - rect.top + scrollTop - RAIL_INSET_PX;
20
+ return Math.max(0, Math.min(items.length - 1, Math.round(offset / TURN_SPACING_PX)));
21
+ }
22
+ const RAIL_AT_REST = { top: 0, canScrollUp: false, canScrollDown: false };
23
+ function railScrollState(scroller) {
24
+ const top = scroller.scrollTop;
25
+ return {
26
+ top,
27
+ canScrollUp: top > 1,
28
+ canScrollDown: top < scroller.scrollHeight - scroller.clientHeight - 1,
29
+ };
30
+ }
31
+ export const TimelineRail = memo(function TimelineRail({ items, activeTurn, busyTurn, onNavigate, }) {
32
+ const [hoveredIndex, setHoveredIndex] = useState(null);
33
+ const [scrollState, setScrollState] = useState(RAIL_AT_REST);
34
+ const scrollerRef = useRef(null);
35
+ const pointerInsideRef = useRef(false);
36
+ const previewId = useId();
37
+ const syncScrollState = () => {
38
+ const scroller = scrollerRef.current;
39
+ if (!scroller)
40
+ return;
41
+ const next = railScrollState(scroller);
42
+ setScrollState(cur => (cur.top === next.top && cur.canScrollUp === next.canScrollUp && cur.canScrollDown === next.canScrollDown ? cur : next));
43
+ };
44
+ useEffect(() => {
45
+ const scroller = scrollerRef.current;
46
+ if (!scroller || typeof ResizeObserver === 'undefined')
47
+ return;
48
+ const observer = new ResizeObserver(syncScrollState);
49
+ observer.observe(scroller);
50
+ return () => observer.disconnect();
51
+ }, []);
52
+ useEffect(syncScrollState, [items.length]);
53
+ // Keep active mark visible
54
+ useEffect(() => {
55
+ const scroller = scrollerRef.current;
56
+ const index = items.findIndex(item => item.turn === activeTurn);
57
+ if (!scroller || index < 0 || pointerInsideRef.current)
58
+ return;
59
+ const markTop = index * TURN_SPACING_PX + RAIL_INSET_PX;
60
+ const viewTop = scroller.scrollTop;
61
+ const viewHeight = scroller.clientHeight;
62
+ if (viewHeight <= 0 || (markTop >= viewTop + FADE_PX && markTop <= viewTop + viewHeight - FADE_PX))
63
+ return;
64
+ const target = Math.max(0, markTop - viewHeight / 2);
65
+ if (typeof scroller.scrollTo === 'function') {
66
+ scroller.scrollTo({ top: target, behavior: 'smooth' });
67
+ }
68
+ else {
69
+ scroller.scrollTop = target;
70
+ }
71
+ syncScrollState();
72
+ }, [activeTurn, items]);
73
+ if (items.length < 2)
74
+ return null;
75
+ const preview = hoveredIndex !== null && hoveredIndex >= 0 ? items[hoveredIndex] : undefined;
76
+ const previewPosition = hoveredIndex !== null && hoveredIndex >= 0 ? itemPosition(hoveredIndex) : undefined;
77
+ const onPointerMove = (event) => {
78
+ const scroller = scrollerRef.current;
79
+ const scrollTop = scroller?.scrollTop ?? 0;
80
+ const idx = itemIndexAtPointer(items, event.currentTarget, scrollTop, event.clientY);
81
+ setHoveredIndex(idx);
82
+ };
83
+ const onPointerLeave = () => {
84
+ pointerInsideRef.current = false;
85
+ setHoveredIndex(null);
86
+ };
87
+ const navigateAtPointer = (event) => {
88
+ const scroller = scrollerRef.current;
89
+ const scrollTop = scroller?.scrollTop ?? 0;
90
+ const idx = itemIndexAtPointer(items, event.currentTarget, scrollTop, event.clientY);
91
+ const item = items[idx];
92
+ if (item !== undefined)
93
+ onNavigate(item);
94
+ };
95
+ const fadeClasses = [css.scroller];
96
+ if (scrollState.canScrollUp)
97
+ fadeClasses.push(css.fadeTop);
98
+ if (scrollState.canScrollDown)
99
+ fadeClasses.push(css.fadeBottom);
100
+ return (_jsx("div", { className: css.slot, children: _jsxs("nav", { className: css.frame, style: frameStyle(items.length, scrollState.top), "aria-label": "\u8F6E\u6B21\u5BFC\u822A\u65F6\u95F4\u8F74", onClick: navigateAtPointer, onPointerMove: onPointerMove, onPointerEnter: () => { pointerInsideRef.current = true; }, onPointerLeave: onPointerLeave, onMouseDown: event => { event.preventDefault(); }, children: [_jsx("div", { ref: scrollerRef, className: fadeClasses.join(' '), onScroll: syncScrollState, children: _jsx("div", { className: css.marks, children: items.map((item, index) => {
101
+ const isBusy = busyTurn === item.turn;
102
+ const isActive = activeTurn === item.turn;
103
+ const isUnloaded = item.anchor.kind === 'unloaded';
104
+ // Wave calculation: peak at cursor, smoothly tapering off in width and height
105
+ let width = isUnloaded ? 6 : 8;
106
+ let height = 2;
107
+ let opacity = isUnloaded ? 0.3 : 0.45;
108
+ let background = 'var(--dsw-alias-label-tertiary)';
109
+ if (hoveredIndex !== null) {
110
+ const diff = Math.abs(index - hoveredIndex);
111
+ if (diff === 0) {
112
+ // Cursor peak (最长最高)
113
+ width = 26;
114
+ height = 2.8;
115
+ opacity = 1.0;
116
+ background = 'var(--dsw-alias-label-primary)';
117
+ }
118
+ else if (diff === 1) {
119
+ // 旁边第 1 阶 (次长次高)
120
+ width = 18;
121
+ height = 2.2;
122
+ opacity = 0.8;
123
+ background = 'var(--dsw-alias-label-primary)';
124
+ }
125
+ else if (diff === 2) {
126
+ // 旁边第 2 阶 (继续变矮变短)
127
+ width = 13;
128
+ height = 1.8;
129
+ opacity = 0.6;
130
+ background = 'var(--dsw-alias-label-secondary)';
131
+ }
132
+ else if (diff === 3) {
133
+ // 旁边第 3 阶 (平缓过渡)
134
+ width = 9;
135
+ height = 1.6;
136
+ opacity = 0.45;
137
+ background = 'var(--dsw-alias-label-tertiary)';
138
+ }
139
+ else {
140
+ // 远离光标的基线
141
+ width = 8;
142
+ height = 2;
143
+ opacity = 0.35;
144
+ background = 'var(--dsw-alias-label-tertiary)';
145
+ }
146
+ }
147
+ else if (isActive) {
148
+ width = 20;
149
+ height = 2.4;
150
+ opacity = 0.95;
151
+ background = 'var(--dsw-alias-label-primary)';
152
+ }
153
+ const tickStyle = {
154
+ width: `${width}px`,
155
+ height: `${height}px`,
156
+ opacity,
157
+ backgroundColor: background,
158
+ };
159
+ const markClasses = [css.mark];
160
+ if (isBusy)
161
+ markClasses.push(css.markBusy);
162
+ return (_jsx("div", { className: css.markPosition, style: itemPosition(index), children: _jsx("button", { type: "button", className: markClasses.join(' '), "aria-label": `第 ${item.turn + 1} 轮`, "aria-current": isActive ? 'true' : undefined, "aria-busy": isBusy ? 'true' : undefined, "aria-describedby": hoveredIndex === index ? previewId : undefined, onMouseDown: event => { event.preventDefault(); }, onClick: (e) => {
163
+ e.stopPropagation();
164
+ onNavigate(item);
165
+ }, onFocus: () => setHoveredIndex(index), onBlur: () => setHoveredIndex(null), children: _jsx("span", { className: css.tick, style: tickStyle }) }) }, item.turn));
166
+ }) }) }), preview !== undefined && previewPosition !== undefined && (_jsxs("div", { id: previewId, role: "tooltip", className: css.preview, style: previewPosition, children: [_jsx("div", { className: css.previewPrompt, children: preview.prompt || `第 ${preview.turn + 1} 轮` }), preview.response !== '' && (_jsx("div", { className: css.previewResponse, children: preview.response }))] }))] }) }));
167
+ });
168
+ //# sourceMappingURL=TimelineRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineRail.js","sourceRoot":"","sources":["../../../src/client/TimelineRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-conversation/client';
2
+ import type { ToolActivityEntry } from './tool-activity.js';
3
+ import type { BlockRenderProps } from './types.js';
4
+ /** One occurrence, keyed by call id all the way from generation to result. */
5
+ export declare const ToolActivity: import("react").MemoExoticComponent<({ entry, motion, turnClosed, onRead, depth, ...render }: BlockRenderProps & {
6
+ entry: ToolActivityEntry;
7
+ motion: boolean;
8
+ turnClosed: boolean;
9
+ onRead: () => void;
10
+ depth?: number;
11
+ }) => import("react").JSX.Element>;
12
+ /** Rich media (images, MCP widgets) rendered outside the folded tool ledger. */
13
+ export declare function ToolMedia({ block, depth, ...render }: BlockRenderProps & {
14
+ block: ToolCallBlock;
15
+ depth?: number;
16
+ }): import("react").JSX.Element | null;
17
+ //# sourceMappingURL=ToolActivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolActivity.d.ts","sourceRoot":"","sources":["../../../src/client/ToolActivity.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,gDAAgD,CAAC;AAOpG,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuHnD,8EAA8E;AAC9E,eAAO,MAAM,YAAY,gGAA+F,gBAAgB,GAAG;IACzI,KAAK,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACpG,iCAuEiL,CAAC;AAEnL,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAS,EAAE,GAAG,MAAM,EAAE,EAAE,gBAAgB,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,sCAQrH"}
@@ -0,0 +1,192 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo, useEffect, useId, useMemo, useRef, useState } from 'react';
3
+ import { DiffBlock, DisclosureRow, JsonTree, ReadBlock, SearchBlock, TerminalBlock, WebBlock, IconApiOutline14, IconBrowseOutline16, IconEditOutline16, IconSearchOutline16, IconSkillOutline16, IconSparkle16 } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { Blocks, contentBlocks } from './Blocks.js';
5
+ import { ProcessFragment } from './motion.js';
6
+ import { activityPhase, activitySummary, executionFacts, objectValue } from './tool-activity.js';
7
+ import { classifyTool, toolRowModel, VARIANT_TITLES } from './native/tool-call-model.js';
8
+ import { McpAppFrame, StreamingMcpAppPlaceholder } from './McpAppFrame.js';
9
+ import { diffBlockLabels, jsonTreeLabels, readBlockLabels, searchBlockLabels, terminalBlockLabels, webBlockLabels } from './primitive-labels.js';
10
+ import css from './Reader.module.css';
11
+ const LABEL = { preparing: '输入生成中', running: '执行中', returned: '已返回', succeeded: '已完成', failed: '失败', interrupted: '已中断' };
12
+ const ICONS = { write: IconEditOutline16, read: IconBrowseOutline16, terminal: IconApiOutline14, search: IconSearchOutline16, web: IconSearchOutline16, other: IconSparkle16 };
13
+ const number = new Intl.NumberFormat('zh-CN');
14
+ const language = (path) => path?.split('.').at(-1);
15
+ const duration = (ms) => ms < 1000 ? `${Math.round(ms)} 毫秒` : `${(ms / 1000).toFixed(ms < 10000 ? 1 : 0)} 秒`;
16
+ function generatedInput(content, target, preparing) {
17
+ const lines = content.split('\n').map((text, index) => ({ number: index + 1, text }));
18
+ const visible = preparing ? lines.slice(-12) : lines.slice(0, 1600);
19
+ return _jsxs("div", { "data-reader-tool-file": true, children: [_jsxs("p", { className: css.toolDetailNote, children: [preparing ? '正在生成的输入 · 尚未执行 · 末尾 12 行' : '工具输入中的文件内容', !preparing && lines.length > visible.length ? ' · 预览前 1,600 行,完整内容在原始数据中' : ''] }), _jsx(ReadBlock, { label: target ?? '文件内容', lang: language(target), lines: visible, totalLines: lines.length, maxLines: 16, labels: readBlockLabels })] });
20
+ }
21
+ function InputView({ model, preparing, fillComposer }) {
22
+ if ((model.name === 'render_ui' || model.name === 'show_widget') && typeof model.args?.html === 'string') {
23
+ return preparing
24
+ ? _jsx(StreamingMcpAppPlaceholder, { title: typeof model.args.title === 'string' ? model.args.title : undefined })
25
+ : _jsx(McpAppFrame, { html: model.args.html, title: typeof model.args.title === 'string' ? model.args.title : undefined, fillComposer: fillComposer });
26
+ }
27
+ if (model.content)
28
+ return generatedInput(model.content, model.target, preparing);
29
+ if (model.command)
30
+ return _jsxs("div", { "data-reader-tool-terminal": true, children: [_jsx("p", { className: css.toolDetailNote, children: preparing ? '正在生成命令 · 尚未执行' : '提交的命令' }), _jsx(TerminalBlock, { command: model.command, cwd: model.cwd, labels: terminalBlockLabels })] });
31
+ return _jsx(JsonTree, { data: model.args, label: preparing ? '已收到的输入字段' : '工具输入', labels: jsonTreeLabels });
32
+ }
33
+ function readLines(value) {
34
+ if (!Array.isArray(value))
35
+ return null;
36
+ const lines = [];
37
+ for (const item of value) {
38
+ const row = objectValue(item);
39
+ if (typeof row?.number !== 'number' || !Number.isInteger(row.number) || typeof row.text !== 'string')
40
+ return null;
41
+ lines.push({ number: row.number, text: row.text });
42
+ }
43
+ return lines;
44
+ }
45
+ function diffHunks(value) {
46
+ if (!Array.isArray(value) || value.length === 0)
47
+ return null;
48
+ const diffs = [];
49
+ for (const item of value) {
50
+ const row = objectValue(item);
51
+ if (typeof row?.path !== 'string' || (row.oldText !== null && typeof row.oldText !== 'string') || typeof row.newText !== 'string')
52
+ return null;
53
+ diffs.push({ path: row.path, oldText: row.oldText, newText: row.newText });
54
+ }
55
+ return diffs;
56
+ }
57
+ function searchFiles(value) {
58
+ if (!Array.isArray(value))
59
+ return null;
60
+ const files = [];
61
+ for (const item of value) {
62
+ const row = objectValue(item);
63
+ if (typeof row?.path !== 'string' || !Array.isArray(row.matches))
64
+ return null;
65
+ const matches = [];
66
+ for (const itemMatch of row.matches) {
67
+ const match = objectValue(itemMatch);
68
+ if (typeof match?.lineNumber !== 'number' || !Number.isInteger(match.lineNumber) || typeof match.line !== 'string')
69
+ return null;
70
+ matches.push({ lineNumber: match.lineNumber, line: match.line });
71
+ }
72
+ files.push({ path: row.path, matches });
73
+ }
74
+ return files;
75
+ }
76
+ function ResultView({ entry, model, phase, ...render }) {
77
+ if ((model.name === 'render_ui' || model.name === 'show_widget') && typeof model.args?.html === 'string') {
78
+ return _jsx(McpAppFrame, { html: model.args.html, title: typeof model.args.title === 'string' ? model.args.title : undefined, fillComposer: render.fillComposer });
79
+ }
80
+ const block = entry.block;
81
+ if (!block || !('kind' in block))
82
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: phase === 'interrupted' ? '已中断,没有工具结果。已生成的输入仍可查看。' : phase === 'preparing' ? '模型正在生成工具输入,工具还未开始执行。' : '工具已开始执行,正在等待结果。' }), _jsx(InputView, { model: model, preparing: phase === 'preparing', fillComposer: render.fillComposer })] });
83
+ const meta = objectValue(block.meta);
84
+ const text = block.content.filter(item => item.type === 'text').map(item => item.text).join('\n');
85
+ if (phase === 'interrupted')
86
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u5DE5\u5177\u5DF2\u53D6\u6D88\uFF0C\u672A\u6B63\u5E38\u5B8C\u6210\u3002\u8F93\u5165\u548C\u539F\u59CB\u8FD4\u56DE\u8BB0\u5F55\u4ECD\u53EF\u67E5\u770B\u3002" }), _jsx(InputView, { model: model, preparing: false, fillComposer: render.fillComposer }), _jsx("pre", { className: css.toolRaw, children: text })] });
87
+ if (model.category === 'terminal') {
88
+ const facts = executionFacts(block);
89
+ const output = text.replace(/\n\[(?:exit code: \d+|killed by signal: [^\]\n]+)\]$/, '');
90
+ return _jsx("div", { "data-reader-tool-terminal": true, children: _jsx(TerminalBlock, { command: model.command ?? model.name, cwd: model.cwd, output: output, exitCode: facts.exitCode, signal: facts.signal, maxLines: 18, labels: terminalBlockLabels }) });
91
+ }
92
+ const lines = readLines(meta?.lines);
93
+ if (model.category === 'read' && typeof meta?.path === 'string' && typeof meta.totalLines === 'number' && lines)
94
+ return _jsx("div", { "data-reader-tool-file": true, children: _jsx(ReadBlock, { label: meta.path, lang: typeof meta.lang === 'string' ? meta.lang : undefined, lines: lines, totalLines: meta.totalLines, maxLines: 18, labels: readBlockLabels }) });
95
+ const diffs = diffHunks(meta?.diffs);
96
+ if (model.category === 'write' && diffs)
97
+ return _jsx("div", { "data-reader-tool-diff": true, children: _jsx(DiffBlock, { diffs: diffs, maxLines: 18, labels: diffBlockLabels }) });
98
+ if (model.category === 'search' && typeof meta?.total === 'number' && typeof meta.truncated === 'boolean') {
99
+ if (meta.shape === 'paths' && Array.isArray(meta.paths) && meta.paths.every((path) => typeof path === 'string'))
100
+ return _jsx("div", { "data-reader-tool-search": true, children: _jsx(SearchBlock, { kind: "paths", paths: meta.paths, total: meta.total, truncated: meta.truncated, maxLines: 18, labels: searchBlockLabels }) });
101
+ const files = searchFiles(meta.files);
102
+ if (meta.shape === 'matches' && files)
103
+ return _jsx("div", { "data-reader-tool-search": true, children: _jsx(SearchBlock, { kind: "matches", files: files, total: meta.total, truncated: meta.truncated, maxLines: 18, labels: searchBlockLabels }) });
104
+ }
105
+ if (model.category === 'web' && typeof meta?.truncated === 'boolean') {
106
+ if (model.name === 'web_fetch' && typeof meta.url === 'string' && typeof meta.statusCode === 'number')
107
+ return _jsx("div", { "data-reader-tool-web": true, children: _jsx(WebBlock, { kind: "fetch", url: meta.url, statusCode: meta.statusCode, truncated: meta.truncated, labels: webBlockLabels }) });
108
+ if (model.name === 'web_search' && Array.isArray(meta.sources)) {
109
+ const sources = meta.sources.flatMap(source => {
110
+ const item = objectValue(source);
111
+ return typeof item?.url === 'string' ? [{ url: item.url, ...(typeof item.title === 'string' ? { title: item.title } : {}), ...(typeof item.snippet === 'string' ? { snippet: item.snippet } : {}), ...(typeof item.publishedAt === 'string' ? { publishedAt: item.publishedAt } : {}) }] : [];
112
+ });
113
+ if (sources.length === meta.sources.length)
114
+ return _jsx("div", { "data-reader-tool-web": true, children: _jsx(WebBlock, { kind: "search", sources: sources, answer: typeof meta.answer === 'string' ? meta.answer : undefined, truncated: meta.truncated, labels: webBlockLabels }) });
115
+ }
116
+ }
117
+ // A trace/export may omit wire presentation. Keep the generated input clearly
118
+ // labelled; it is not proof of an applied diff or a successful file mutation.
119
+ if (model.category === 'write' && model.content && !block.isError)
120
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u6587\u4EF6\u5DE5\u5177\u5DF2\u8FD4\u56DE\u3002\u4EE5\u4E0B\u4E3A\u63D0\u4EA4\u7684\u5185\u5BB9\uFF1B\u5B8C\u6574\u8FD4\u56DE\u8BB0\u5F55\u53EF\u5728\u300C\u539F\u59CB\u6570\u636E\u300D\u67E5\u770B\u3002" }), generatedInput(model.content, model.target, false)] });
121
+ const content = block.content;
122
+ if (content.some(item => item.type === 'text'))
123
+ return _jsx("div", { className: css.toolDocument, children: _jsx(Blocks, { ...render, blocks: contentBlocks(content).filter(item => item.kind === 'text'), source: "tool" }) });
124
+ if (content.length)
125
+ return _jsx("p", { className: css.toolDetailNote, children: "\u56FE\u7247\u6216\u6269\u5C55\u5185\u5BB9\u5DF2\u5728\u5BF9\u8BDD\u4E2D\u5355\u72EC\u5C55\u793A\u3002" });
126
+ return _jsx("p", { className: css.toolDetailNote, children: "\u5DE5\u5177\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u5185\u5BB9\u3002" });
127
+ }
128
+ /** One occurrence, keyed by call id all the way from generation to result. */
129
+ export const ToolActivity = memo(function ToolActivityView({ entry, motion, turnClosed, onRead, depth = 0, ...render }) {
130
+ const [open, setOpen] = useState(false);
131
+ const [tab, setTab] = useState('result');
132
+ const control = useRef(null);
133
+ const panel = useRef(null);
134
+ const [selected, setSelected] = useState(false);
135
+ const detailId = useId();
136
+ const tabRefs = useRef([]);
137
+ const model = useMemo(() => activitySummary(entry), [entry.block, entry.draft]);
138
+ const phase = activityPhase(entry, turnClosed);
139
+ const heldPreview = useRef({ entry, model, phase });
140
+ if (!selected)
141
+ heldPreview.current = { entry, model, phase };
142
+ const preview = heldPreview.current;
143
+ useEffect(() => {
144
+ const track = () => {
145
+ const selection = document.getSelection();
146
+ setSelected(!!selection && !selection.isCollapsed && !!selection.anchorNode && !!panel.current?.contains(selection.anchorNode));
147
+ };
148
+ document.addEventListener('selectionchange', track);
149
+ return () => document.removeEventListener('selectionchange', track);
150
+ }, []);
151
+ const facts = executionFacts(entry.block);
152
+ const Icon = model.name === 'skill' ? IconSkillOutline16 : ICONS[model.category];
153
+ const block = entry.block;
154
+ const native = block ? toolRowModel(model.name, block) : null;
155
+ const skillName = typeof model.args?.name === 'string' ? model.args.name.split('\n')[0] : model.raw.split('\n')[0];
156
+ const rowTitle = model.name === 'skill' ? 'Skill' : native?.title ?? VARIANT_TITLES[classifyTool(model.name)];
157
+ const rowSummary = phase === 'interrupted' ? '已停止 · 调用记录保留' : model.name === 'skill' ? skillName : native?.errorSummary ?? native?.summary
158
+ ?? (classifyTool(model.name) === 'others' ? `${model.name} · ${model.target ?? model.title}` : model.target ?? model.title);
159
+ const showState = phase === 'preparing' || phase === 'running' || phase === 'failed' || phase === 'interrupted';
160
+ const elapsed = block && 'kind' in block && block.callTime != null ? Math.max(0, block.time - block.callTime) : null;
161
+ const rawResult = useMemo(() => {
162
+ const value = preview.entry.block;
163
+ return value && 'kind' in value ? JSON.stringify({ content: value.content, isError: value.isError, meta: value.meta }, null, 2) : '';
164
+ }, [preview.entry.block]);
165
+ const tabs = [['result', phase === 'preparing' ? '生成预览' : '结果'], ['input', '输入'], ['raw', '原始数据']];
166
+ const activate = (index) => { const item = tabs[(index + tabs.length) % tabs.length]; setTab(item[0]); tabRefs.current[(index + tabs.length) % tabs.length]?.focus(); };
167
+ if (depth > 6)
168
+ return _jsx("p", { className: css.meta, children: "\u66F4\u6DF1\u7684\u5D4C\u5957\u8C03\u7528\u53EF\u5728\u539F\u5BF9\u8BDD\u67E5\u770B\u3002" });
169
+ return _jsxs("div", { ref: element => { control.current = element?.querySelector('[data-disclosure-row]') ?? null; }, className: css.toolActivity, "data-reader-tool-call": entry.callId, "data-tool-phase": phase, "data-tool-args-length": model.raw.length, "data-tool-category": model.category, "data-expanded": open, "data-ud-check": "reader-tool-activity", children: [_jsx(DisclosureRow, { icon: _jsx(Icon, { size: 14 }), title: rowTitle, open: open, expandable: true, expandOnRowClick: true, keepContentWhenOpen: true, onToggle: () => { onRead(); setOpen(value => !value); }, rowClassName: css.nativeToolRow, collapsedContent: _jsxs(_Fragment, { children: [_jsx("span", { className: css.rowSeparator, "aria-hidden": true }), _jsx("span", { className: css.nativeToolSummary, title: rowSummary, "data-reader-tool-summary": true, children: rowSummary }), showState && _jsx("span", { className: css.toolState, "data-phase": phase, children: LABEL[phase] })] }) }), _jsx(ProcessFragment, { open: open, motion: motion, onRead: onRead, returnFocusTo: control, nodeKey: `${entry.key}:detail`, framed: true, children: _jsxs("div", { id: detailId, className: css.toolDetails, children: [_jsxs("div", { className: css.toolLedger, "aria-live": "off", children: [_jsxs("span", { children: ["\u5DE5\u5177 \u00B7 ", _jsx("span", { className: css.toolEngine, children: model.name })] }), _jsx("span", { "data-reader-tool-progress": true, children: phase === 'preparing' ? `已接收 ${number.format(model.raw.length)} 字符输入` : phase === 'running' ? '已提交 · 等待工具返回' : phase === 'interrupted' ? '已停止 · 输入记录保留' : elapsed !== null ? `执行 ${duration(elapsed)}` : '结果已记录' }), facts.exitCode !== undefined && _jsxs("span", { children: ["\u9000\u51FA\u7801 ", facts.exitCode] }), facts.signal && _jsxs("span", { children: ["\u4FE1\u53F7 ", facts.signal] })] }), _jsx("div", { className: css.toolTabs, role: "tablist", "aria-label": `${model.title}的执行数据`, onKeyDown: event => {
170
+ const index = tabs.findIndex(item => item[0] === tab);
171
+ if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {
172
+ event.preventDefault();
173
+ activate(index + (event.key === 'ArrowRight' ? 1 : -1));
174
+ }
175
+ else if (event.key === 'Home' || event.key === 'End') {
176
+ event.preventDefault();
177
+ activate(event.key === 'Home' ? 0 : tabs.length - 1);
178
+ }
179
+ }, children: tabs.map(([id, title], index) => _jsx("button", { ref: element => { tabRefs.current[index] = element; }, type: "button", role: "tab", id: `${detailId}-${id}`, "aria-selected": tab === id, "aria-controls": `${detailId}-panel`, tabIndex: tab === id ? 0 : -1, onClick: () => setTab(id), children: title }, id)) }), _jsxs("div", { ref: panel, id: `${detailId}-panel`, className: css.toolPanel, role: "tabpanel", "aria-labelledby": `${detailId}-${tab}`, tabIndex: 0, children: [selected && _jsx("p", { className: css.toolDetailNote, children: "\u4E3A\u4FDD\u7559\u9009\u533A\uFF0C\u9884\u89C8\u6682\u505C\u66F4\u65B0\uFF1B\u5F53\u524D\u72B6\u6001\u89C1\u5361\u7247\u6807\u9898\u3002" }), tab === 'result' && _jsx(ResultView, { ...render, ...preview }), tab === 'input' && _jsxs(_Fragment, { children: [_jsx(InputView, { model: preview.model, preparing: preview.phase === 'preparing', fillComposer: render.fillComposer }), _jsxs("details", { className: css.detail, children: [_jsx("summary", { children: "\u5168\u90E8\u8F93\u5165\u5B57\u6BB5" }), _jsx(JsonTree, { data: preview.model.args, label: "\u8F93\u5165\u5B57\u6BB5", labels: jsonTreeLabels })] })] }), tab === 'raw' && _jsxs(_Fragment, { children: [_jsx("p", { className: css.toolDetailNote, children: "\u5B8C\u6574\u8BB0\u5F55 \u00B7 \u53EA\u8BFB \u00B7 \u4E0D\u6267\u884C\u5176\u4E2D\u7684\u4EE3\u7801" }), _jsx("h4", { className: css.toolRawLabel, children: "\u5DE5\u5177\u8F93\u5165" }), _jsx("pre", { className: css.toolRaw, children: preview.model.raw || '输入尚未到达' }), rawResult && _jsxs(_Fragment, { children: [_jsx("h4", { className: css.toolRawLabel, children: "\u5DE5\u5177\u7ED3\u679C" }), _jsx("pre", { className: css.toolRaw, children: rawResult })] })] })] })] }) }), !!block?.subCalls.length && _jsx("div", { className: css.toolChildren, "aria-label": "\u5B50\u8C03\u7528", children: block.subCalls.map((child, index) => _jsx(ToolActivity, { ...render, entry: { kind: 'tool', key: `reader-tool:${child.callId}`, callId: child.callId, step: entry.step, order: index, block: child }, motion: motion, turnClosed: turnClosed, onRead: onRead, depth: depth + 1 }, child.callId)) })] });
180
+ }, (previous, next) => previous.entry.callId === next.entry.callId && previous.entry.block === next.entry.block
181
+ && previous.entry.draft === next.entry.draft && previous.entry.step === next.entry.step
182
+ && previous.motion === next.motion && previous.turnClosed === next.turnClosed && previous.depth === next.depth
183
+ && previous.onRead === next.onRead && previous.renderSlotChain === next.renderSlotChain && previous.loadImage === next.loadImage && previous.fillComposer === next.fillComposer);
184
+ /** Rich media (images, MCP widgets) rendered outside the folded tool ledger. */
185
+ export function ToolMedia({ block, depth = 0, ...render }) {
186
+ if (depth > 6)
187
+ return null;
188
+ const settled = 'kind' in block;
189
+ const visible = settled ? contentBlocks(block.content).filter(item => item.kind === 'image' || item.kind === 'other') : [];
190
+ return _jsxs(_Fragment, { children: [visible.length > 0 && _jsx(Blocks, { ...render, blocks: visible, source: "tool" }), block.subCalls.map(child => _jsx(ToolMedia, { ...render, block: child, depth: depth + 1 }, child.callId))] });
191
+ }
192
+ //# sourceMappingURL=ToolActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolActivity.js","sourceRoot":"","sources":["../../../src/client/ToolActivity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { TurnTailChatData } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ type TurnTokenUsage = NonNullable<TurnTailChatData['tokenUsage']>;
3
+ export interface TurnMetricsProps {
4
+ usage?: TurnTokenUsage;
5
+ runMs?: number;
6
+ tokensPerSecond?: number;
7
+ ttftMs?: number;
8
+ }
9
+ export declare const TurnMetrics: import("react").MemoExoticComponent<({ usage, runMs, tokensPerSecond, ttftMs, }: TurnMetricsProps) => import("react").JSX.Element | null>;
10
+ export {};
11
+ //# sourceMappingURL=TurnMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnMetrics.d.ts","sourceRoot":"","sources":["../../../src/client/TurnMetrics.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI/E,KAAK,cAAc,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,eAAO,MAAM,WAAW,mFAKrB,gBAAgB,wCAsIjB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo, useEffect, useRef, useState } from 'react';
3
+ import { formatRanFor, formatRunDuration } from './message-chrome.js';
4
+ import css from './TurnMetrics.module.css';
5
+ function formatTokens(count) {
6
+ if (count >= 1_000_000)
7
+ return `${(count / 1_000_000).toFixed(2)}M tok`;
8
+ if (count >= 1000)
9
+ return `${(count / 1000).toFixed(1)}k tok`;
10
+ return `${count} tok`;
11
+ }
12
+ export const TurnMetrics = memo(function TurnMetrics({ usage, runMs, tokensPerSecond, ttftMs, }) {
13
+ const [open, setOpen] = useState(false);
14
+ const containerRef = useRef(null);
15
+ useEffect(() => {
16
+ if (!open)
17
+ return;
18
+ const onClickOutside = (e) => {
19
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
20
+ setOpen(false);
21
+ }
22
+ };
23
+ const onKeyDown = (e) => {
24
+ if (e.key === 'Escape')
25
+ setOpen(false);
26
+ };
27
+ document.addEventListener('pointerdown', onClickOutside);
28
+ document.addEventListener('keydown', onKeyDown);
29
+ return () => {
30
+ document.removeEventListener('pointerdown', onClickOutside);
31
+ document.removeEventListener('keydown', onKeyDown);
32
+ };
33
+ }, [open]);
34
+ const totalTokens = usage?.totalTokens;
35
+ const hasTiming = typeof runMs === 'number' && runMs > 0;
36
+ const hasTokens = typeof totalTokens === 'number' && totalTokens > 0;
37
+ if (!hasTiming && !hasTokens)
38
+ return null;
39
+ const cacheHitPercent = usage && usage.cacheReadTokens && usage.totalTokens > usage.outputTokens
40
+ ? Math.round((usage.cacheReadTokens / (usage.totalTokens - usage.outputTokens)) * 100)
41
+ : null;
42
+ return (_jsxs("span", { ref: containerRef, className: css.container, children: [hasTokens && typeof totalTokens === 'number' && (_jsxs("button", { type: "button", className: css.pillButton, "data-active": open, onClick: () => setOpen(v => !v), "aria-expanded": open, title: "\u67E5\u770B\u672C\u8F6E Token \u6D88\u8017", children: [_jsxs("svg", { className: css.pillIcon, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", children: [_jsx("ellipse", { cx: "8", cy: "4.2", rx: "5", ry: "2.2", strokeWidth: "1.2" }), _jsx("path", { d: "M3 4.2v7.6c0 1.2 2.2 2.2 5 2.2s5-1 5-2.2V4.2", strokeWidth: "1.2" }), _jsx("path", { d: "M3 8c0 1.2 2.2 2.2 5 2.2s5-1 5-2.2", strokeWidth: "1.2" })] }), _jsxs("span", { children: ["\u7528\u91CF ", formatTokens(totalTokens)] })] })), hasTiming && typeof runMs === 'number' && (_jsxs("button", { type: "button", className: css.timeButton, "data-active": open, onClick: () => setOpen(v => !v), "aria-expanded": open, "aria-label": formatRanFor(runMs), title: "\u67E5\u770B\u672C\u8F6E\u7528\u65F6\u548C\u901F\u5EA6", children: [_jsxs("svg", { className: css.pillIcon, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", children: [_jsx("circle", { cx: "8", cy: "8", r: "6.5", strokeWidth: "1.2" }), _jsx("path", { d: "M8 4.5v3.8l2.5 1.5", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })] }), _jsx("span", { children: formatRanFor(runMs) })] })), open && (_jsxs("div", { className: css.metricsPop, role: "dialog", "aria-label": "\u672C\u8F6E\u6982\u51B5", children: [_jsx("div", { className: css.popHeader, children: _jsx("span", { children: "\u672C\u8F6E\u6027\u80FD\u4E0E\u7528\u91CF\u6982\u51B5" }) }), hasTiming && typeof runMs === 'number' && (_jsxs("div", { className: css.popSection, children: [_jsx("div", { className: css.popSectionTitle, children: "\u8017\u65F6\u4E0E\u751F\u6210\u901F\u5EA6" }), _jsxs("div", { className: css.popGrid, children: [_jsx("span", { className: css.popLabel, children: "\u603B\u7528\u65F6" }), _jsx("span", { className: css.popValue, children: formatRunDuration(runMs) }), typeof tokensPerSecond === 'number' && tokensPerSecond > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u751F\u6210\u541E\u5410 (TPS)" }), _jsxs("span", { className: css.popValue, children: [tokensPerSecond.toFixed(1), " tok/s"] })] })), typeof ttftMs === 'number' && ttftMs > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u9996\u5B57\u5EF6\u8FDF (TTFT)" }), _jsxs("span", { className: css.popValue, children: [(ttftMs / 1000).toFixed(2), "s"] })] }))] })] })), hasTokens && usage && (_jsxs("div", { className: css.popSection, children: [_jsx("div", { className: css.popSectionTitle, children: "Token \u6D88\u8017\u5206\u89E3" }), _jsxs("div", { className: css.popGrid, children: [_jsx("span", { className: css.popLabel, children: "\u603B\u6D88\u8017" }), _jsxs("span", { className: css.popValue, children: [usage.totalTokens.toLocaleString(), " tok"] }), _jsxs("span", { className: css.popLabel, children: ["\u8F93\u5165", cacheHitPercent !== null && (_jsxs("span", { className: css.popBadge, children: ["\u547D\u4E2D ", cacheHitPercent, "%"] }))] }), _jsxs("span", { className: css.popValue, children: [(usage.totalTokens - usage.outputTokens).toLocaleString(), " tok"] }), typeof usage.cacheReadTokens === 'number' && usage.cacheReadTokens > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: css.popLabel, children: "\u7F13\u5B58\u8BFB\u53D6" }), _jsxs("span", { className: css.popValue, children: [usage.cacheReadTokens.toLocaleString(), " tok"] })] })), _jsxs("span", { className: css.popLabel, children: ["\u8F93\u51FA", typeof usage.reasoningTokens === 'number' && usage.reasoningTokens > 0 && (_jsxs("span", { className: css.popBadge, children: ["\u601D\u8003 ", usage.reasoningTokens.toLocaleString()] }))] }), _jsxs("span", { className: css.popValue, children: [usage.outputTokens?.toLocaleString() ?? 0, " tok"] })] })] }))] }))] }));
43
+ });
44
+ //# sourceMappingURL=TurnMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TurnMetrics.js","sourceRoot":"","sources":["../../../src/client/TurnMetrics.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { WaitingAnchor } from './waiting-clock.js';
2
+ export declare function WaitingStatus({ anchor, label }: {
3
+ anchor: WaitingAnchor;
4
+ label: string;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=WaitingStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaitingStatus.d.ts","sourceRoot":"","sources":["../../../src/client/WaitingStatus.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAGxF"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { formatRunDuration } from './message-chrome.js';
4
+ import css from './Reader.module.css';
5
+ export function WaitingStatus({ anchor, label }) {
6
+ // A new input gets its own clock even if the waiting indicator stays mounted.
7
+ return _jsx(InputClock, { startTime: anchor.time, label: label }, anchor.key);
8
+ }
9
+ function InputClock({ startTime, label }) {
10
+ const [mountedAt] = useState(() => Date.now());
11
+ const [now, setNow] = useState(() => Date.now());
12
+ const anchor = startTime ?? mountedAt;
13
+ useEffect(() => {
14
+ const id = setInterval(() => setNow(Date.now()), 1000);
15
+ return () => clearInterval(id);
16
+ }, []);
17
+ return _jsxs("div", { className: css.turnStatus, role: "status", "aria-live": "polite", "data-reader-turn-status": true, "data-reader-wait-start": anchor, children: [_jsx("span", { className: css.turnStatusLabel, children: label }), _jsx("span", { className: css.turnStatusClock, "aria-hidden": "true", children: formatRunDuration(Math.max(0, now - anchor)) })] });
18
+ }
19
+ //# sourceMappingURL=WaitingStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaitingStatus.js","sourceRoot":"","sources":["../../../src/client/WaitingStatus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,GAAG,MAAM,qBAAqB,CAAC;AAEtC,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAA4C;IACvF,8EAA8E;IAC9E,OAAO,KAAC,UAAU,IAAkB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,IAAhD,MAAM,CAAC,GAAG,CAA0C,CAAC;AAC/E,CAAC;AACD,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAA+C;IACnF,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,eAAK,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAC,QAAQ,eAAW,QAAQ,6DAAiD,MAAM,aAC5H,eAAM,SAAS,EAAE,GAAG,CAAC,eAAe,YAAG,KAAK,GAAQ,EACpD,eAAM,SAAS,EAAE,GAAG,CAAC,eAAe,iBAAc,MAAM,YAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC,GAAQ,IAC1G,CAAC;AACT,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Conversation-column scroll helpers. Official ChatView lands Turns by writing
3
+ * the enclosing `[data-conversation-scroll]` box; `Element.scrollIntoView`
4
+ * also walks ancestor scrollers and can lift the sticky composer off the
5
+ * bottom of the viewport (rail jump to top, then to bottom).
6
+ */
7
+ /** Reading-line offset used by ui-chat ChatView.landOnRow. */
8
+ export declare const READING_LINE_OFFSET_PX = 24;
9
+ /** Active column host when present; otherwise the view-local scroller. */
10
+ export declare function scrollerOf(from: HTMLElement): HTMLElement;
11
+ /** Row position in scrollport coordinates (viewport-independent). */
12
+ export declare function flowTop(row: HTMLElement, scrollport: HTMLElement): number;
13
+ /**
14
+ * Place `row` on the conversation scroller only. Never calls scrollIntoView.
15
+ * @param row - a rendered `[data-reader-turn]` row.
16
+ * @param scrollport - `scrollerOf` of the reader root.
17
+ */
18
+ export declare function landTurn(row: HTMLElement, scrollport: HTMLElement, offsetPx?: number): void;
19
+ //# sourceMappingURL=conversation-scroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-scroll.d.ts","sourceRoot":"","sources":["../../../src/client/conversation-scroll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAEzD;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,SAAyB,GAAG,IAAI,CAE3G"}