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,256 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, readdir } from "node:fs/promises";
3
+ import { existsSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { dirname, isAbsolute, join, resolve } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ //#region src/skill-status.ts
8
+ const GENERATIVE_MCPAPPS_SKILL = "generative-mcpapps";
9
+ function skillNameMatches(name) {
10
+ return typeof name === "string" && name === GENERATIVE_MCPAPPS_SKILL;
11
+ }
12
+ function skillListIncludes(entries) {
13
+ return Array.isArray(entries) && entries.some((entry) => skillNameMatches(entry?.name));
14
+ }
15
+ function skillRootEntryMatches(entryName) {
16
+ return entryName === GENERATIVE_MCPAPPS_SKILL || entryName === `${GENERATIVE_MCPAPPS_SKILL}.md`;
17
+ }
18
+ function skillsFromListResult(result) {
19
+ if (Array.isArray(result)) return result;
20
+ if (result === null || typeof result !== "object") return [];
21
+ if (result.ok === false) return [];
22
+ if (Array.isArray(result.skills)) return result.skills;
23
+ if (result.value && typeof result.value === "object") {
24
+ if (Array.isArray(result.value.skills)) return result.value.skills;
25
+ if (Array.isArray(result.value)) return result.value;
26
+ }
27
+ return [];
28
+ }
29
+ const CONVENTIONAL_SKILL_ROOTS = [".dsh/skills", ".agents/skills"];
30
+ function publicSkillRoots() {
31
+ return CONVENTIONAL_SKILL_ROOTS.map((path) => ({
32
+ source: "conventional",
33
+ path
34
+ }));
35
+ }
36
+ function toPublicSkillStatus(status) {
37
+ return {
38
+ name: status.name,
39
+ installed: status.installed,
40
+ via: status.via,
41
+ roots: publicSkillRoots()
42
+ };
43
+ }
44
+ //#endregion
45
+ //#region src/skill-roots.ts
46
+ function expandHomePath(path, home = homedir()) {
47
+ if (path === "~") return home;
48
+ if (path.startsWith("~/") || path.startsWith("~\\")) return join(home, path.slice(2));
49
+ return path;
50
+ }
51
+ function resolveDshHome(env = process.env, home = homedir()) {
52
+ const fromEnv = env.DSH_HOME;
53
+ const selected = fromEnv !== undefined && fromEnv.trim().length > 0 ? fromEnv : join(home, ".dsh");
54
+ return resolve(expandHomePath(selected, home));
55
+ }
56
+ function resolveAgentsHome(env = process.env, home = homedir()) {
57
+ const fromEnv = env.DSH_AGENTS_HOME;
58
+ const selected = fromEnv !== undefined && fromEnv.trim().length > 0 ? fromEnv : join(home, ".agents");
59
+ return resolve(expandHomePath(selected, home));
60
+ }
61
+ function userSkillRoots(env = process.env, home = homedir()) {
62
+ return [
63
+ {
64
+ source: "user-dsh",
65
+ path: join(resolveDshHome(env, home), "skills")
66
+ },
67
+ {
68
+ source: "user-agents",
69
+ path: join(resolveAgentsHome(env, home), "skills")
70
+ }
71
+ ];
72
+ }
73
+ function projectSkillRoots(projectRoot) {
74
+ return [
75
+ {
76
+ source: "project-dsh",
77
+ path: join(projectRoot, ".dsh", "skills")
78
+ },
79
+ {
80
+ source: "project-agents",
81
+ path: join(projectRoot, ".agents", "skills")
82
+ }
83
+ ];
84
+ }
85
+ async function findProjectRoot(cwd) {
86
+ let current = resolve(cwd);
87
+ while (true) {
88
+ if (existsSync(join(current, ".git"))) return current;
89
+ const parent = dirname(current);
90
+ if (parent === current) return resolve(cwd);
91
+ current = parent;
92
+ }
93
+ }
94
+ async function rootHasGenerativeMcpapps(rootPath) {
95
+ let entries;
96
+ try {
97
+ entries = await readdir(rootPath, { withFileTypes: true });
98
+ } catch {
99
+ return false;
100
+ }
101
+ for (const entry of entries) {
102
+ if (entry.name === ".system") continue;
103
+ if (!skillRootEntryMatches(entry.name)) continue;
104
+ if (entry.isDirectory()) {
105
+ try {
106
+ await access(join(rootPath, entry.name, "SKILL.md"));
107
+ return true;
108
+ } catch {
109
+ continue;
110
+ }
111
+ }
112
+ if (entry.isFile()) return true;
113
+ }
114
+ return false;
115
+ }
116
+ function pluginSkillPackPath(moduleUrl = import.meta.url) {
117
+ const here = dirname(fileURLToPath(moduleUrl));
118
+ const candidates = [
119
+ join(here, "../skills", GENERATIVE_MCPAPPS_SKILL),
120
+ join(here, "../../skills", GENERATIVE_MCPAPPS_SKILL),
121
+ join(here, "skills", GENERATIVE_MCPAPPS_SKILL)
122
+ ];
123
+ return candidates.find((path) => existsSync(join(path, "SKILL.md")));
124
+ }
125
+ async function scanGenerativeMcpappsStatus(options = {}) {
126
+ const env = options.env ?? process.env;
127
+ const home = options.home ?? homedir();
128
+ const roots = [...userSkillRoots(env, home)];
129
+ const cwd = typeof options.cwd === "string" && options.cwd.trim().length > 0 ? isAbsolute(options.cwd) ? options.cwd : resolve(options.cwd) : undefined;
130
+ if (cwd !== undefined) roots.unshift(...projectSkillRoots(await findProjectRoot(cwd)));
131
+ const inspected = [];
132
+ let rootHit = false;
133
+ for (const root of roots) {
134
+ const present = await rootHasGenerativeMcpapps(root.path);
135
+ inspected.push({
136
+ ...root,
137
+ present
138
+ });
139
+ if (present) rootHit = true;
140
+ }
141
+ let via = null;
142
+ let listHit = false;
143
+ if (options.listSkills) try {
144
+ listHit = skillListIncludes(await options.listSkills());
145
+ if (listHit) via = "skills.list";
146
+ } catch {}
147
+ if (!listHit && rootHit) via = "skill-root";
148
+ const packPath = options.packPath ?? pluginSkillPackPath();
149
+ return {
150
+ name: GENERATIVE_MCPAPPS_SKILL,
151
+ installed: listHit || rootHit,
152
+ via,
153
+ roots: inspected,
154
+ ...packPath !== undefined ? { packPath } : {}
155
+ };
156
+ }
157
+ //#endregion
158
+ //#region src/dsh-better-display.ts
159
+ const name = "dsh-better-display";
160
+ const inject = ["webServer"];
161
+ function writeJson(res, status, body) {
162
+ res.setHeader("Content-Type", "application/json");
163
+ res.statusCode = status;
164
+ res.end(JSON.stringify(body));
165
+ }
166
+ function skillLister(ctx) {
167
+ const skills = ctx.get?.("skills");
168
+ if (typeof skills?.list !== "function") return;
169
+ return async () => skillsFromListResult(await skills.list({}));
170
+ }
171
+ function apply(ctx) {
172
+ console.log("[my-plugins/dsh-better-display] loaded");
173
+ if (ctx.webServer) ctx.effect(() => {
174
+ const disposeReveal = ctx.webServer.register({
175
+ kind: "exact",
176
+ path: "/better-display/reveal",
177
+ handler: async (req, res) => {
178
+ if (req.method !== "POST") {
179
+ res.statusCode = 405;
180
+ res.end();
181
+ return;
182
+ }
183
+ let body = "";
184
+ req.on("data", (chunk) => {
185
+ body += chunk;
186
+ });
187
+ req.on("end", () => {
188
+ try {
189
+ const data = JSON.parse(body);
190
+ const targetPath = typeof data.path === "string" ? data.path.trim() : "";
191
+ if (!targetPath) {
192
+ res.statusCode = 400;
193
+ res.end(JSON.stringify({
194
+ ok: false,
195
+ error: "Empty path"
196
+ }));
197
+ return;
198
+ }
199
+ if (process.platform === "darwin") spawn("open", ["-R", targetPath], {
200
+ detached: true,
201
+ stdio: "ignore"
202
+ });
203
+ else if (process.platform === "win32") spawn("explorer.exe", [`/select,${targetPath}`], {
204
+ detached: true,
205
+ stdio: "ignore"
206
+ });
207
+ else spawn("xdg-open", [targetPath], {
208
+ detached: true,
209
+ stdio: "ignore"
210
+ });
211
+ res.setHeader("Content-Type", "application/json");
212
+ res.statusCode = 200;
213
+ res.end(JSON.stringify({ ok: true }));
214
+ } catch (err) {
215
+ res.statusCode = 400;
216
+ res.end(JSON.stringify({
217
+ ok: false,
218
+ error: String(err)
219
+ }));
220
+ }
221
+ });
222
+ }
223
+ });
224
+ const disposeSkill = ctx.webServer.register({
225
+ kind: "exact",
226
+ path: "/better-display/skill-status",
227
+ handler: async (req, res) => {
228
+ if (req.method !== "GET") {
229
+ res.statusCode = 405;
230
+ res.end();
231
+ return;
232
+ }
233
+ try {
234
+ const url = new URL(req.url ?? "", "http://127.0.0.1");
235
+ const cwd = url.searchParams.get("cwd") ?? undefined;
236
+ const status = await scanGenerativeMcpappsStatus({
237
+ cwd,
238
+ listSkills: skillLister(ctx)
239
+ });
240
+ writeJson(res, 200, toPublicSkillStatus(status));
241
+ } catch (err) {
242
+ writeJson(res, 500, {
243
+ ok: false,
244
+ error: String(err)
245
+ });
246
+ }
247
+ }
248
+ });
249
+ return () => {
250
+ disposeReveal();
251
+ disposeSkill();
252
+ };
253
+ }, "dsh-better-display: reveal and skill-status routes");
254
+ }
255
+ //#endregion
256
+ export { apply, inject, name };
@@ -0,0 +1,45 @@
1
+ import { Component } from 'react';
2
+ import type { ReactNode } from 'react';
3
+ import type { ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
4
+ import type { AssistantBlock, UserMessageNode } from '@deepseek-ai/dsh-client-ui-conversation/client';
5
+ import type { BlockRenderProps, ReaderBlockOwner } from './types.js';
6
+ export declare class BlockBoundary extends Component<{
7
+ children: ReactNode;
8
+ }, {
9
+ failed: boolean;
10
+ }> {
11
+ state: {
12
+ failed: boolean;
13
+ };
14
+ static getDerivedStateFromError(): {
15
+ failed: boolean;
16
+ };
17
+ render(): string | number | boolean | Iterable<ReactNode> | import("react").JSX.Element | null | undefined;
18
+ }
19
+ export declare const ImageBlock: import("react").MemoExoticComponent<({ attachment, loadImage }: {
20
+ attachment: ImageAttachmentRef;
21
+ loadImage: BlockRenderProps["loadImage"];
22
+ }) => import("react").JSX.Element>;
23
+ export declare function contentBlocks(content: UserMessageNode['content']): AssistantBlock[];
24
+ type TextPresentation = {
25
+ startedAt?: number;
26
+ interrupted?: boolean;
27
+ liveText?: boolean;
28
+ };
29
+ export declare const Blocks: import("react").MemoExoticComponent<({ blocks, streaming, source, holdFormatting, startedAt, interrupted, liveText, renderSlotChain, loadImage, fillComposer, fileMentions }: BlockRenderProps & TextPresentation & {
30
+ blocks: readonly AssistantBlock[];
31
+ streaming?: boolean;
32
+ source?: ReaderBlockOwner["source"];
33
+ holdFormatting?: boolean;
34
+ }) => import("react").JSX.Element>;
35
+ export declare function CopyAnswer({ blocks, onFork, metrics }: {
36
+ blocks: readonly AssistantBlock[];
37
+ onFork?: () => void;
38
+ metrics?: BlockRenderProps['metrics'];
39
+ }): import("react").JSX.Element | null;
40
+ export declare function UserMessageActions({ text, time }: {
41
+ text: string;
42
+ time?: number;
43
+ }): import("react").JSX.Element | null;
44
+ export {};
45
+ //# sourceMappingURL=Blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Blocks.d.ts","sourceRoot":"","sources":["../../../src/client/Blocks.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgE,MAAM,OAAO,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAKtG,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOrE,qBAAa,aAAc,SAAQ,SAAS,CAAC;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;IACxF,KAAK;;MAAqB;IAC1B,MAAM,CAAC,wBAAwB;;;IAC/B,MAAM;CAGP;AAED,eAAO,MAAM,UAAU,kEAAuD;IAC5E,UAAU,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;CAC1E,iCAwCC,CAAC;AAEH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,cAAc,EAAE,CAMnF;AAED,KAAK,gBAAgB,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA+C1F,eAAO,MAAM,MAAM,gLAA+L,gBAAgB,GAAG,gBAAgB,GAAG;IACtP,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACvH,iCAQC,CAAC;AAyBH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAAE,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;CAAE,sCAgCxJ;AAED,wBAAgB,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,sCAajF"}
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Component, Fragment, memo, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
+ import { JsonBlock, MarkdownText, writeClipboard } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { ComposerFillContext, McpAppFrame } from './McpAppFrame.js';
5
+ import { formatMessageClock } from './message-chrome.js';
6
+ import { markdownLabels, truncatedJsonLabel } from './primitive-labels.js';
7
+ import { useStreamingText } from './streaming.js';
8
+ import { MotionMarkdown, MotionPlainText } from './word-motion.js';
9
+ import css from './Reader.module.css';
10
+ const IMAGE_TYPES = new Set(['image/png', 'image/jpeg', 'image/webp', 'image/gif']);
11
+ export class BlockBoundary extends Component {
12
+ state = { failed: false };
13
+ static getDerivedStateFromError() { return { failed: true }; }
14
+ render() {
15
+ return this.state.failed ? _jsx("div", { className: css.notice, children: "\u6B64\u5185\u5BB9\u6682\u65F6\u65E0\u6CD5\u5728\u9605\u8BFB\u9875\u663E\u793A\uFF1B\u539F\u5BF9\u8BDD\u4E2D\u7684\u8BB0\u5F55\u672A\u53D7\u5F71\u54CD\u3002" }) : this.props.children;
16
+ }
17
+ }
18
+ export const ImageBlock = memo(function ImageBlock({ attachment, loadImage }) {
19
+ const [attempt, setAttempt] = useState(0);
20
+ const [url, setUrl] = useState(null);
21
+ const [error, setError] = useState(false);
22
+ const [decoded, setDecoded] = useState(false);
23
+ const dialog = useRef(null);
24
+ const opener = useRef(null);
25
+ useEffect(() => {
26
+ let active = true;
27
+ let owned = null;
28
+ const timeout = setTimeout(() => { if (active) {
29
+ setError(true);
30
+ active = false;
31
+ } }, 20000);
32
+ setError(false);
33
+ setDecoded(false);
34
+ setUrl(null);
35
+ void loadImage(attachment).then(result => {
36
+ if (!active)
37
+ return;
38
+ clearTimeout(timeout);
39
+ if (!IMAGE_TYPES.has(result.mediaType))
40
+ throw new Error('Unsupported image media type');
41
+ const bytes = Uint8Array.from(result.data);
42
+ owned = URL.createObjectURL(new Blob([bytes.buffer], { type: result.mediaType }));
43
+ setUrl(owned);
44
+ }).catch(() => { clearTimeout(timeout); if (active)
45
+ setError(true); });
46
+ return () => { active = false; clearTimeout(timeout); if (owned)
47
+ URL.revokeObjectURL(owned); };
48
+ }, [attachment.attachmentId, attempt, loadImage]);
49
+ const width = Number.isFinite(attachment.width) && attachment.width > 0 ? attachment.width : 4;
50
+ const height = Number.isFinite(attachment.height) && attachment.height > 0 ? attachment.height : 3;
51
+ return _jsxs("figure", { className: css.imageFigure, "data-reader-image": true, "data-image-state": error ? 'error' : decoded ? 'ready' : 'loading', children: [_jsxs("div", { className: css.imageFrame, style: { aspectRatio: `${width} / ${height}` }, children: [!error && url && _jsx("button", { ref: opener, type: "button", className: css.imageOpen, "aria-label": `放大图片${attachment.name ? `:${attachment.name}` : ''}`, onClick: () => dialog.current?.showModal(), children: _jsx("img", { src: url, alt: attachment.name ?? '会话图片', width: width, height: height, onLoad: () => setDecoded(true), onError: () => setError(true), "data-ready": decoded }) }), (!decoded || error) && _jsxs("div", { className: css.imagePlaceholder, children: [_jsx("span", { children: error ? '图片未能加载' : '正在加载图片' }), error && _jsx("button", { type: "button", className: css.textButton, onClick: () => setAttempt(value => value + 1), children: "\u91CD\u8BD5" })] })] }), attachment.name && _jsx("figcaption", { children: attachment.name }), _jsxs("dialog", { ref: dialog, className: css.imageDialog, "aria-label": "\u56FE\u7247\u9884\u89C8", onClose: () => opener.current?.focus(), onClick: event => { if (event.target === dialog.current)
52
+ dialog.current?.close(); }, children: [_jsx("button", { type: "button", autoFocus: true, className: css.dialogClose, "aria-label": "\u5173\u95ED\u56FE\u7247\u9884\u89C8", onClick: () => dialog.current?.close(), children: "\u00D7" }), url && _jsx("img", { src: url, alt: attachment.name ?? '会话图片' })] })] });
53
+ });
54
+ export function contentBlocks(content) {
55
+ return content.map(block => {
56
+ if (block.type === 'text')
57
+ return { kind: 'text', text: block.text };
58
+ if (block.type === 'image')
59
+ return { kind: 'image', attachment: block.attachment };
60
+ return { kind: 'other', block };
61
+ });
62
+ }
63
+ function ReadingMarkdown({ text, streaming, holdFormatting, startedAt, interrupted = false, liveText = false, kind = 'body', fileMentions }) {
64
+ const root = useRef(null);
65
+ const presentation = useStreamingText(text, streaming, { startedAt, interrupted: interrupted || !liveText, selected: holdFormatting });
66
+ // Native Markdown changes block keys for its full final parse. Keep the last
67
+ // committed mode while this answer is selected, then finish formatting on
68
+ // deselection. Business status and the source text still update normally.
69
+ const committedMode = useRef(streaming);
70
+ const effectiveMode = holdFormatting ? committedMode.current : presentation.formatStreaming;
71
+ useLayoutEffect(() => { committedMode.current = effectiveMode; }, [effectiveMode]);
72
+ return _jsx("div", { ref: root, className: css.readingText, "data-reader-text": true, "data-reader-text-kind": kind, "data-received-length": text.length, "data-shown-length": presentation.text.length, "data-presentation-pending": presentation.pending || undefined, "data-motion-style": "opacity-blur", "data-ud-motion": "reader-text-arrival", "data-ud-motion-type": "reveal", "data-ud-motion-no-flash": "true", children: _jsx(MotionMarkdown, { text: presentation.text, streaming: effectiveMode, enabled: liveText && presentation.reveal && effectiveMode, revision: presentation.revision, fileMentions: fileMentions }) });
73
+ }
74
+ function ReadingReasoning({ text, streaming, holdFormatting, startedAt, interrupted = false, liveText = false }) {
75
+ const presentation = useStreamingText(text, streaming, { startedAt, interrupted: interrupted || !liveText, selected: holdFormatting });
76
+ return _jsx("div", { className: css.readingText, "data-reader-text": true, "data-reader-text-kind": "reasoning", "data-received-length": text.length, "data-shown-length": presentation.text.length, "data-presentation-pending": presentation.pending || undefined, "data-motion-style": "opacity-blur", "data-ud-motion": "reader-text-arrival", "data-ud-motion-type": "reveal", "data-ud-motion-no-flash": "true", children: _jsx(MotionPlainText, { text: presentation.text, enabled: liveText && presentation.reveal, revision: presentation.revision }) });
77
+ }
78
+ function fallback(block, streaming, source, loadImage, fillComposer, holdFormatting, presentation, fileMentions) {
79
+ switch (block.kind) {
80
+ case 'text': return source === 'user' ? _jsx(MarkdownText, { text: block.text, labels: markdownLabels }) : _jsx(ReadingMarkdown, { text: block.text, streaming: streaming, holdFormatting: holdFormatting, ...presentation, fileMentions: fileMentions });
81
+ case 'image': return _jsx(ImageBlock, { attachment: block.attachment, loadImage: loadImage });
82
+ case 'reasoning': return _jsx(ReadingReasoning, { text: block.text, streaming: streaming, holdFormatting: holdFormatting, ...presentation });
83
+ case 'tool-call': return _jsx(JsonBlock, { label: `工具参数 · ${block.name}`, payload: block.argsRaw, truncatedLabel: truncatedJsonLabel });
84
+ case 'other': {
85
+ const raw = block.block;
86
+ if (raw && typeof raw === 'object') {
87
+ const item = raw;
88
+ if ((item.type === 'mcp-app' || item.type === 'mcpapp' || item.type === 'ui') && typeof item.html === 'string') {
89
+ return _jsx(McpAppFrame, { html: item.html, title: typeof item.title === 'string' ? item.title : undefined, fillComposer: fillComposer });
90
+ }
91
+ }
92
+ return _jsxs("div", { className: css.unknown, children: [_jsx("p", { children: "\u6B64\u5185\u5BB9\u7C7B\u578B\u5C1A\u672A\u63A5\u5165\u9605\u8BFB\u9875\uFF0C\u539F\u59CB\u5185\u5BB9\u5DF2\u4FDD\u7559\u3002" }), _jsx(JsonBlock, { label: "\u67E5\u770B\u539F\u59CB\u5185\u5BB9", payload: block.block, truncatedLabel: truncatedJsonLabel })] });
93
+ }
94
+ }
95
+ }
96
+ export const Blocks = memo(function Blocks({ blocks, streaming = false, source = 'assistant', holdFormatting = false, startedAt, interrupted, liveText, renderSlotChain, loadImage, fillComposer, fileMentions }) {
97
+ return _jsx(ComposerFillContext.Provider, { value: fillComposer, children: _jsx("div", { className: css.blocks, "data-streaming": streaming || undefined, children: blocks.map((block, index) => _jsx(BlockBoundary, { children: _jsx(Fragment, { children: renderSlotChain('dsh-better-display.block', { block, streaming, source }, { fallback: fallback(block, streaming, source, loadImage, fillComposer, holdFormatting, { startedAt, interrupted, liveText }, fileMentions) }) }) }, block.kind === 'image' ? `image:${block.attachment.attachmentId}:${index}` : `${index}:${block.kind}`)) }) });
98
+ });
99
+ import { TurnMetrics } from './TurnMetrics.js';
100
+ function CopyGlyph() {
101
+ return _jsxs("svg", { viewBox: "0 0 16 16", width: "16", height: "16", "aria-hidden": "true", children: [_jsx("rect", { x: "5", y: "5", width: "8", height: "8", rx: "1.5" }), _jsx("path", { d: "M3 10H2.8A.8.8 0 0 1 2 9.2V2.8a.8.8 0 0 1 .8-.8h6.4a.8.8 0 0 1 .8.8V3" })] });
102
+ }
103
+ function useCopyReceipt() {
104
+ const [receipt, setReceipt] = useState('');
105
+ const timer = useRef(null);
106
+ useEffect(() => () => { if (timer.current)
107
+ clearTimeout(timer.current); }, []);
108
+ const copy = async (text) => {
109
+ const accepted = await writeClipboard(text);
110
+ setReceipt(accepted ? '已复制' : '未能复制,请手动选择文字');
111
+ if (timer.current)
112
+ clearTimeout(timer.current);
113
+ timer.current = setTimeout(() => setReceipt(''), 2000);
114
+ };
115
+ return { receipt, copy };
116
+ }
117
+ function MessageClock({ time }) {
118
+ return _jsx("time", { className: css.messageClock, dateTime: new Date(time).toISOString(), children: formatMessageClock(time) });
119
+ }
120
+ export function CopyAnswer({ blocks, onFork, metrics }) {
121
+ const { receipt, copy } = useCopyReceipt();
122
+ const text = blocks.filter((block) => block.kind === 'text').map(block => block.text).join('\n\n');
123
+ const endedAt = metrics?.endedAt;
124
+ const hasMetrics = metrics !== undefined && (metrics.usage !== undefined || metrics.runMs !== undefined || endedAt !== undefined);
125
+ if (!text.trim() && !onFork && !hasMetrics)
126
+ return null;
127
+ return _jsxs("div", { className: css.answerActions, children: [text.trim() !== '' && (_jsx("button", { type: "button", className: css.iconButton, "aria-label": "\u590D\u5236\u56DE\u7B54", title: "\u590D\u5236\u56DE\u7B54", onClick: () => { void copy(text); }, children: _jsx(CopyGlyph, {}) })), onFork && (_jsx("button", { type: "button", className: css.iconButton, "aria-label": "\u4EE5\u6B64\u5904\u4E3A\u57FA\u7840\u521B\u5EFA\u5206\u53C9\u4F1A\u8BDD", title: "\u4EE5\u6B64\u5904\u4E3A\u57FA\u7840\u521B\u5EFA\u5206\u53C9\u4F1A\u8BDD (Fork)", onClick: onFork, children: _jsxs("svg", { viewBox: "0 0 16 16", width: "14", height: "14", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: [_jsx("circle", { cx: "4.5", cy: "3.5", r: "1.8" }), _jsx("circle", { cx: "4.5", cy: "12.5", r: "1.8" }), _jsx("circle", { cx: "11.5", cy: "5.5", r: "1.8" }), _jsx("path", { d: "M4.5 5.5v5M4.5 8c2.5 0 4.5-1 7-2.5", strokeLinecap: "round" })] }) })), metrics && _jsx(TurnMetrics, { usage: metrics.usage, runMs: metrics.runMs, tokensPerSecond: metrics.tokensPerSecond, ttftMs: metrics.ttftMs }), endedAt !== undefined && _jsx(MessageClock, { time: endedAt }), _jsx("span", { role: "status", className: css.meta, children: receipt })] });
128
+ }
129
+ export function UserMessageActions({ text, time }) {
130
+ const { receipt, copy } = useCopyReceipt();
131
+ const hasText = text.trim() !== '';
132
+ if (!hasText && time === undefined)
133
+ return null;
134
+ return _jsxs("div", { className: css.userActions, children: [time !== undefined && _jsx(MessageClock, { time: time }), hasText && (_jsx("button", { type: "button", className: css.iconButton, "aria-label": "\u590D\u5236\u6D88\u606F", title: "\u590D\u5236\u6D88\u606F", onClick: () => { void copy(text); }, children: _jsx(CopyGlyph, {}) })), _jsx("span", { role: "status", className: css.meta, children: receipt })] });
135
+ }
136
+ //# sourceMappingURL=Blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Blocks.js","sourceRoot":"","sources":["../../../src/client/Blocks.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ChatSnapshot } from '@deepseek-ai/dsh-client-ui-chat/client';
3
+ import type { ReaderProps } from './types.js';
4
+ import type { LiveStep, LiveTurnItem } from './live-turn.js';
5
+ /** Public projection only. Descendants cannot leak live data through a frozen frame. */
6
+ export declare const useFlowChat: ReaderProps['useChat'];
7
+ export type PresentationFrame = {
8
+ items: readonly LiveTurnItem[];
9
+ snapshot: ChatSnapshot;
10
+ };
11
+ export declare function ChoreographedFlow({ frame, motion, enabled, urgent, open, onOpenChange, processOpen, renderStep, id }: {
12
+ frame: PresentationFrame;
13
+ motion: boolean;
14
+ enabled: boolean;
15
+ urgent: boolean;
16
+ open: Readonly<Record<string, boolean>>;
17
+ onOpenChange: (key: string, value: boolean) => void;
18
+ processOpen: boolean;
19
+ renderStep: (step: LiveStep, folded: boolean) => ReactNode;
20
+ id: string;
21
+ }): import("react").JSX.Element;
22
+ //# sourceMappingURL=ChoreographedFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChoreographedFlow.d.ts","sourceRoot":"","sources":["../../../src/client/ChoreographedFlow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAS7D,wFAAwF;AACxF,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,SAAS,CAI9C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAgD3F,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;IACrH,KAAK,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAC7E,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7F,WAAW,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;CAC9F,+BA6GA"}