@researai/deepscientist 1.5.14 → 1.5.16

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 (225) hide show
  1. package/README.md +336 -90
  2. package/assets/branding/logo-raster.png +0 -0
  3. package/bin/ds.js +816 -131
  4. package/docs/en/00_QUICK_START.md +36 -15
  5. package/docs/en/01_SETTINGS_REFERENCE.md +53 -4
  6. package/docs/en/02_START_RESEARCH_GUIDE.md +7 -0
  7. package/docs/en/03_QQ_CONNECTOR_GUIDE.md +19 -0
  8. package/docs/en/05_TUI_GUIDE.md +6 -0
  9. package/docs/en/06_RUNTIME_AND_CANVAS.md +4 -3
  10. package/docs/en/09_DOCTOR.md +11 -5
  11. package/docs/en/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
  12. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
  13. package/docs/en/15_CODEX_PROVIDER_SETUP.md +25 -8
  14. package/docs/en/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
  15. package/docs/en/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
  16. package/docs/en/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
  17. package/docs/en/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  18. package/docs/en/19_LOCAL_BROWSER_AUTH.md +70 -0
  19. package/docs/en/20_WORKSPACE_MODES_GUIDE.md +250 -0
  20. package/docs/en/README.md +24 -0
  21. package/docs/zh/00_QUICK_START.md +36 -15
  22. package/docs/zh/01_SETTINGS_REFERENCE.md +53 -4
  23. package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
  24. package/docs/zh/03_QQ_CONNECTOR_GUIDE.md +19 -0
  25. package/docs/zh/05_TUI_GUIDE.md +6 -0
  26. package/docs/zh/09_DOCTOR.md +11 -5
  27. package/docs/zh/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
  28. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
  29. package/docs/zh/15_CODEX_PROVIDER_SETUP.md +25 -8
  30. package/docs/zh/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
  31. package/docs/zh/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
  32. package/docs/zh/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
  33. package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  34. package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
  35. package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
  36. package/docs/zh/README.md +24 -0
  37. package/install.sh +2 -0
  38. package/package.json +1 -1
  39. package/pyproject.toml +1 -1
  40. package/src/deepscientist/__init__.py +1 -1
  41. package/src/deepscientist/acp/envelope.py +6 -0
  42. package/src/deepscientist/artifact/charts.py +567 -0
  43. package/src/deepscientist/artifact/guidance.py +50 -10
  44. package/src/deepscientist/artifact/metrics.py +228 -5
  45. package/src/deepscientist/artifact/schemas.py +3 -0
  46. package/src/deepscientist/artifact/service.py +4276 -308
  47. package/src/deepscientist/bash_exec/models.py +23 -0
  48. package/src/deepscientist/bash_exec/monitor.py +147 -67
  49. package/src/deepscientist/bash_exec/runtime.py +218 -156
  50. package/src/deepscientist/bash_exec/service.py +309 -69
  51. package/src/deepscientist/bash_exec/shells.py +87 -0
  52. package/src/deepscientist/bridges/connectors.py +51 -2
  53. package/src/deepscientist/cli.py +115 -19
  54. package/src/deepscientist/codex_cli_compat.py +232 -0
  55. package/src/deepscientist/config/models.py +8 -4
  56. package/src/deepscientist/config/service.py +38 -11
  57. package/src/deepscientist/connector/weixin_support.py +122 -1
  58. package/src/deepscientist/daemon/api/handlers.py +199 -9
  59. package/src/deepscientist/daemon/api/router.py +5 -0
  60. package/src/deepscientist/daemon/app.py +1458 -289
  61. package/src/deepscientist/doctor.py +51 -0
  62. package/src/deepscientist/file_lock.py +48 -0
  63. package/src/deepscientist/gitops/__init__.py +10 -1
  64. package/src/deepscientist/gitops/diff.py +296 -1
  65. package/src/deepscientist/gitops/service.py +4 -1
  66. package/src/deepscientist/mcp/server.py +212 -5
  67. package/src/deepscientist/process_control.py +161 -0
  68. package/src/deepscientist/prompts/builder.py +501 -453
  69. package/src/deepscientist/quest/layout.py +15 -2
  70. package/src/deepscientist/quest/service.py +2539 -195
  71. package/src/deepscientist/quest/stage_views.py +177 -1
  72. package/src/deepscientist/runners/base.py +2 -0
  73. package/src/deepscientist/runners/codex.py +169 -31
  74. package/src/deepscientist/runners/runtime_overrides.py +17 -1
  75. package/src/deepscientist/skills/__init__.py +2 -2
  76. package/src/deepscientist/skills/installer.py +196 -5
  77. package/src/deepscientist/skills/registry.py +66 -0
  78. package/src/prompts/connectors/qq.md +18 -8
  79. package/src/prompts/connectors/weixin.md +16 -6
  80. package/src/prompts/contracts/shared_interaction.md +24 -4
  81. package/src/prompts/system.md +921 -72
  82. package/src/prompts/system_copilot.md +43 -0
  83. package/src/skills/analysis-campaign/SKILL.md +32 -2
  84. package/src/skills/analysis-campaign/references/artifact-orchestration.md +1 -1
  85. package/src/skills/analysis-campaign/references/writing-facing-slice-examples.md +65 -0
  86. package/src/skills/baseline/SKILL.md +10 -0
  87. package/src/skills/decision/SKILL.md +27 -2
  88. package/src/skills/experiment/SKILL.md +16 -2
  89. package/src/skills/figure-polish/SKILL.md +1 -0
  90. package/src/skills/finalize/SKILL.md +19 -0
  91. package/src/skills/idea/SKILL.md +79 -0
  92. package/src/skills/idea/references/idea-generation-playbook.md +100 -0
  93. package/src/skills/idea/references/outline-seeding-example.md +60 -0
  94. package/src/skills/intake-audit/SKILL.md +9 -1
  95. package/src/skills/mentor/SKILL.md +217 -0
  96. package/src/skills/mentor/references/correction-rules.md +210 -0
  97. package/src/skills/mentor/references/knowledge-profile.md +91 -0
  98. package/src/skills/mentor/references/persona-profile.md +138 -0
  99. package/src/skills/mentor/references/taste-profile.md +128 -0
  100. package/src/skills/mentor/references/thought-style-profile.md +138 -0
  101. package/src/skills/mentor/references/work-profile.md +289 -0
  102. package/src/skills/mentor/references/workflow-profile.md +240 -0
  103. package/src/skills/optimize/SKILL.md +1645 -0
  104. package/src/skills/rebuttal/SKILL.md +3 -1
  105. package/src/skills/review/SKILL.md +3 -1
  106. package/src/skills/scout/SKILL.md +8 -0
  107. package/src/skills/write/SKILL.md +81 -12
  108. package/src/skills/write/references/outline-evidence-contract-example.md +107 -0
  109. package/src/tui/dist/app/AppContainer.js +22 -11
  110. package/src/tui/dist/index.js +4 -1
  111. package/src/tui/dist/lib/api.js +33 -3
  112. package/src/tui/package.json +1 -1
  113. package/src/ui/dist/assets/AiManusChatView-COFACy7V.js +204 -0
  114. package/src/ui/dist/assets/AnalysisPlugin-DnSm0GZn.js +1 -0
  115. package/src/ui/dist/assets/CliPlugin-CvwCmDQ5.js +109 -0
  116. package/src/ui/dist/assets/CodeEditorPlugin-cOqSa0xq.js +2 -0
  117. package/src/ui/dist/assets/CodeViewerPlugin-itb0tltR.js +270 -0
  118. package/src/ui/dist/assets/DocViewerPlugin-DqKkiCI6.js +7 -0
  119. package/src/ui/dist/assets/GitCommitViewerPlugin-DVgNHBCS.js +1 -0
  120. package/src/ui/dist/assets/GitDiffViewerPlugin-DxL2ezFG.js +6 -0
  121. package/src/ui/dist/assets/GitSnapshotViewer-B_RQm1YZ.js +30 -0
  122. package/src/ui/dist/assets/ImageViewerPlugin-tHqlXY3n.js +26 -0
  123. package/src/ui/dist/assets/LabCopilotPanel-ClMbq5Yu.js +14 -0
  124. package/src/ui/dist/assets/LabPlugin-L_SuE8ow.js +22 -0
  125. package/src/ui/dist/assets/LatexPlugin-B495DTXC.js +25 -0
  126. package/src/ui/dist/assets/MarkdownViewerPlugin-DG28-61B.js +128 -0
  127. package/src/ui/dist/assets/MarketplacePlugin-BiOGT-Kj.js +13 -0
  128. package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
  129. package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
  130. package/src/ui/dist/assets/NotebookEditor-C-4Kt1p9.js +81 -0
  131. package/src/ui/dist/assets/NotebookEditor-CVsj8h_T.js +361 -0
  132. package/src/ui/dist/assets/PdfLoader-CASDQmxJ.js +16 -0
  133. package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
  134. package/src/ui/dist/assets/PdfMarkdownPlugin-BFhwoKsY.js +1 -0
  135. package/src/ui/dist/assets/PdfViewerPlugin-DcOzU9vd.js +17 -0
  136. package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
  137. package/src/ui/dist/assets/SearchPlugin-CHj7M58O.js +16 -0
  138. package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
  139. package/src/ui/dist/assets/TextViewerPlugin-CB4DYfWO.js +54 -0
  140. package/src/ui/dist/assets/VNCViewer-CjlbyCB3.js +11 -0
  141. package/src/ui/dist/assets/bot-CFkZY-JP.js +6 -0
  142. package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
  143. package/src/ui/dist/assets/chevron-up-Dq5ofbht.js +6 -0
  144. package/src/ui/dist/assets/code-DLC6G24T.js +6 -0
  145. package/src/ui/dist/assets/file-content-Dv4LoZec.js +1 -0
  146. package/src/ui/dist/assets/file-diff-panel-Denq-lC3.js +1 -0
  147. package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
  148. package/src/ui/dist/assets/file-socket-Cu4Qln7Y.js +1 -0
  149. package/src/ui/dist/assets/git-commit-horizontal-BUh6G52n.js +6 -0
  150. package/src/ui/dist/assets/image-B9HUUddG.js +6 -0
  151. package/src/ui/dist/assets/index-B2B1sg-M.js +1 -0
  152. package/src/ui/dist/assets/index-Cgla8biy.css +33 -0
  153. package/src/ui/dist/assets/index-DRyx7vAc.js +1 -0
  154. package/src/ui/dist/assets/index-Gbl53BNp.js +2496 -0
  155. package/src/ui/dist/assets/index-wQ7RIIRd.js +11 -0
  156. package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
  157. package/src/ui/dist/assets/pdf-effect-queue-ZtnHFCAi.js +6 -0
  158. package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
  159. package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
  160. package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
  161. package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
  162. package/src/ui/dist/assets/popover-DL6h35vr.js +1 -0
  163. package/src/ui/dist/assets/project-sync-CsX08Qno.js +1 -0
  164. package/src/ui/dist/assets/select-DvmXt1yY.js +11 -0
  165. package/src/ui/dist/assets/sigma-7jpXazui.js +6 -0
  166. package/src/ui/dist/assets/trash-xA7kFt8i.js +11 -0
  167. package/src/ui/dist/assets/useCliAccess-DsMwDjOp.js +1 -0
  168. package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
  169. package/src/ui/dist/assets/wrap-text-CwMn-iqb.js +11 -0
  170. package/src/ui/dist/assets/zoom-out-R-GWEhzS.js +11 -0
  171. package/src/ui/dist/index.html +5 -2
  172. package/src/ui/dist/assets/AiManusChatView-DaF9Nge_.js +0 -26597
  173. package/src/ui/dist/assets/AnalysisPlugin-BSVx6dXE.js +0 -123
  174. package/src/ui/dist/assets/CliPlugin-C9gzJX41.js +0 -5905
  175. package/src/ui/dist/assets/CodeEditorPlugin-DU9G0Tox.js +0 -427
  176. package/src/ui/dist/assets/CodeViewerPlugin-DoX_fI9l.js +0 -905
  177. package/src/ui/dist/assets/DocViewerPlugin-C4FWIXuU.js +0 -278
  178. package/src/ui/dist/assets/GitDiffViewerPlugin-BgfFMgtf.js +0 -2661
  179. package/src/ui/dist/assets/ImageViewerPlugin-tcPkfY_x.js +0 -500
  180. package/src/ui/dist/assets/LabCopilotPanel-_dKV60Bf.js +0 -4104
  181. package/src/ui/dist/assets/LabPlugin-Bje0ayoC.js +0 -2677
  182. package/src/ui/dist/assets/LatexPlugin-CVsBzAln.js +0 -1792
  183. package/src/ui/dist/assets/MarkdownViewerPlugin-xjmrqv_8.js +0 -308
  184. package/src/ui/dist/assets/MarketplacePlugin-mMM2A8wP.js +0 -413
  185. package/src/ui/dist/assets/NotebookEditor-3kVDSOBo.js +0 -4214
  186. package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
  187. package/src/ui/dist/assets/NotebookEditor-SoJ8X-MO.js +0 -84873
  188. package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
  189. package/src/ui/dist/assets/PdfLoader-DElVuHl9.js +0 -25468
  190. package/src/ui/dist/assets/PdfMarkdownPlugin-Bq88XT4G.js +0 -409
  191. package/src/ui/dist/assets/PdfViewerPlugin-CsCXMo9S.js +0 -3095
  192. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
  193. package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
  194. package/src/ui/dist/assets/SearchPlugin-oUPvy19k.js +0 -741
  195. package/src/ui/dist/assets/TextViewerPlugin-CRkT9yNy.js +0 -472
  196. package/src/ui/dist/assets/VNCViewer-BgbuvWhR.js +0 -18821
  197. package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
  198. package/src/ui/dist/assets/bot-v_RASACv.js +0 -21
  199. package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
  200. package/src/ui/dist/assets/code-5hC9d0VH.js +0 -17
  201. package/src/ui/dist/assets/file-content-D1PxfOrp.js +0 -377
  202. package/src/ui/dist/assets/file-diff-panel-DG1oT_Hj.js +0 -92
  203. package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
  204. package/src/ui/dist/assets/file-socket-BmdFYQlk.js +0 -58
  205. package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
  206. package/src/ui/dist/assets/image-Dqe2X2tW.js +0 -18
  207. package/src/ui/dist/assets/index-BQG-1s2o.css +0 -12553
  208. package/src/ui/dist/assets/index-DVsMKK_y.js +0 -25
  209. package/src/ui/dist/assets/index-Duvz8Ip0.js +0 -159
  210. package/src/ui/dist/assets/index-Nt9hS4ck.js +0 -244829
  211. package/src/ui/dist/assets/index-RDlNXXx1.js +0 -120
  212. package/src/ui/dist/assets/monaco-DIXge1CP.js +0 -623
  213. package/src/ui/dist/assets/pdf-effect-queue-BBTTQaO-.js +0 -47
  214. package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
  215. package/src/ui/dist/assets/popover-BWlolyxo.js +0 -476
  216. package/src/ui/dist/assets/project-sync-BM5PkFH4.js +0 -297
  217. package/src/ui/dist/assets/select-D4dAtrA8.js +0 -1690
  218. package/src/ui/dist/assets/sigma-CKbE5jJT.js +0 -22
  219. package/src/ui/dist/assets/square-check-big-CZNGMgiB.js +0 -17
  220. package/src/ui/dist/assets/trash-DaB37xAz.js +0 -32
  221. package/src/ui/dist/assets/useCliAccess-C2OmAcWe.js +0 -957
  222. package/src/ui/dist/assets/useFileDiffOverlay-Dowd1Ij4.js +0 -53
  223. package/src/ui/dist/assets/wrap-text-BGjAhAUq.js +0 -35
  224. package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
  225. package/src/ui/dist/assets/zoom-out-dMZQMXzc.js +0 -34
@@ -1,308 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-Nt9hS4ck.js","assets/index-BQG-1s2o.css"])))=>i.map(i=>d[i]);
2
- import { u as useI18n, a as useWorkspaceSurfaceStore, r as reactExports, R as React, a7 as getQuestMarkdownContextFromFileId, c as copyToClipboard, j as jsxRuntimeExports, L as LoaderCircle, C as CircleAlert, a8 as MARKDOWN_VIEWER_STYLES, k as FileText, E as Eye, b as cn, d as Check, e as Copy, M as MarkdownRenderer, _ as __vitePreload } from './index-Nt9hS4ck.js';
3
- import { C as Code } from './code-5hC9d0VH.js';
4
-
5
- function isMdxDocument(fileName) {
6
- if (!fileName) return false;
7
- return /\.mdx$/i.test(fileName.trim());
8
- }
9
- function stripFrontmatter(content) {
10
- if (!content.startsWith("---")) return content;
11
- const match = content.match(/^---\s*\n[\s\S]*?\n---\s*\n?/);
12
- return match ? content.slice(match[0].length) : content;
13
- }
14
- function preprocessMarkdownDocument(content, options = {}) {
15
- if (!options.isMdx) return content;
16
- const withoutFrontmatter = stripFrontmatter(content);
17
- const lines = withoutFrontmatter.split(/\r?\n/);
18
- const nextLines = [];
19
- let inFence = false;
20
- let contentStarted = false;
21
- for (const line of lines) {
22
- const trimmed = line.trim();
23
- if (/^(```|~~~)/.test(trimmed)) {
24
- inFence = !inFence;
25
- contentStarted = true;
26
- nextLines.push(line);
27
- continue;
28
- }
29
- if (inFence) {
30
- nextLines.push(line);
31
- continue;
32
- }
33
- if (!contentStarted) {
34
- if (!trimmed) {
35
- continue;
36
- }
37
- if (/^(import|export)\s/.test(trimmed)) {
38
- continue;
39
- }
40
- if (/^\{\/\*.*\*\/\}$/.test(trimmed)) {
41
- continue;
42
- }
43
- contentStarted = true;
44
- }
45
- if (/^\{\/\*.*\*\/\}$/.test(trimmed)) {
46
- continue;
47
- }
48
- nextLines.push(line);
49
- }
50
- return nextLines.join("\n");
51
- }
52
-
53
- const DEMO_MARKDOWN = `# DeepScientist Markdown Viewer
54
-
55
- Welcome to the **Markdown Viewer** plugin. This viewer supports [GitHub Flavored Markdown](https://github.github.com/gfm/) with additional features.
56
-
57
- ## Features
58
-
59
- ### Text Formatting
60
-
61
- - **Bold text** using \`**bold**\`
62
- - *Italic text* using \`*italic*\`
63
- - ***Bold and italic*** using \`***combined***\`
64
- - ~~Strikethrough~~ using \`~~text~~\`
65
- - \`Inline code\` using backticks
66
-
67
- ### Code Blocks
68
-
69
- \`\`\`typescript
70
- interface Document {
71
- id: string;
72
- title: string;
73
- content: string;
74
- tags: string[];
75
- }
76
-
77
- async function fetchDocument(id: string): Promise<Document> {
78
- const response = await fetch(\`/api/documents/\${id}\`);
79
- return response.json();
80
- }
81
- \`\`\`
82
-
83
- ### Math Support
84
-
85
- Inline math: $E = mc^2$
86
-
87
- Display math:
88
-
89
- $$
90
- \\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}
91
- $$
92
-
93
- ### Tables (GFM)
94
-
95
- | Feature | Status | Priority |
96
- |---------|--------|----------|
97
- | Markdown rendering | Done | High |
98
- | Code highlighting | Done | High |
99
- | Math formulas | Done | Medium |
100
- | Export to PDF | Planned | Low |
101
-
102
- ### Task Lists (GFM)
103
-
104
- - [x] Implement markdown parser
105
- - [x] Add code highlighting
106
- - [ ] Add export functionality
107
- - [ ] Implement search
108
-
109
- ### Blockquotes
110
-
111
- > This is a blockquote.
112
- > It can span multiple lines.
113
- >
114
- > Use it for citations or important notes.
115
-
116
- ### Images
117
-
118
- Images are loaded lazily for better performance:
119
-
120
- ![DeepScientist Logo](https://via.placeholder.com/400x200?text=DeepScientist)
121
-
122
- ### Links
123
-
124
- - [Visit our website](https://example.com)
125
- - [GitHub Repository](https://github.com/example/deepscientist)
126
-
127
- ---
128
-
129
- ## Getting Started
130
-
131
- 1. Open a markdown file
132
- 2. The viewer will render it automatically
133
- 3. Use the toolbar to toggle between rendered and source view
134
- 4. Copy the source using the copy button
135
-
136
- Happy writing! :rocket:
137
- `;
138
- const DEMO_MARKDOWN_ZH = `# DeepScientist Markdown 查看器
139
-
140
- 欢迎使用 **Markdown 查看器** 插件。该查看器支持 [GitHub Flavored Markdown](https://github.github.com/gfm/) 及更多增强能力。
141
-
142
- ## 功能特性
143
-
144
- ### 文本格式
145
-
146
- - 使用 \`**粗体**\` 显示 **粗体**
147
- - 使用 \`*斜体*\` 显示 *斜体*
148
- - 使用 \`***加粗斜体***\` 显示 ***加粗斜体***
149
- - 使用 \`~~删除线~~\` 显示 ~~删除线~~
150
- - 使用反引号显示 \`行内代码\`
151
-
152
- ### 数学公式
153
-
154
- 行内公式:$E = mc^2$
155
-
156
- 块级公式:
157
-
158
- $$
159
- \\int_{-\\infty}^{\\infty} e^{-x^2} dx = \\sqrt{\\pi}
160
- $$
161
-
162
- ### 表格
163
-
164
- | 功能 | 状态 | 优先级 |
165
- |------|------|--------|
166
- | Markdown 渲染 | 已完成 | 高 |
167
- | 代码高亮 | 已完成 | 高 |
168
- | 数学公式 | 已完成 | 中 |
169
- | 导出 PDF | 规划中 | 低 |
170
-
171
- ### 开始使用
172
-
173
- 1. 打开一个 Markdown 文件
174
- 2. 查看器会自动完成渲染
175
- 3. 使用顶部工具栏在渲染视图和源码视图之间切换
176
- 4. 使用复制按钮复制源内容
177
-
178
- 祝你写作顺利!:rocket:
179
- `;
180
- function MarkdownViewerPlugin({
181
- context,
182
- tabId,
183
- setDirty,
184
- setTitle
185
- }) {
186
- const { t, language } = useI18n("markdown_viewer");
187
- const updateWorkspaceTabState = useWorkspaceSurfaceStore((state) => state.updateTabState);
188
- const [content, setContent] = reactExports.useState("");
189
- const [loading, setLoading] = reactExports.useState(true);
190
- const [error, setError] = reactExports.useState(null);
191
- const [copied, setCopied] = reactExports.useState(false);
192
- const [viewMode, setViewMode] = reactExports.useState("rendered");
193
- const fileName = context.resourceName || context.resourcePath || "Untitled.md";
194
- const isMdx = isMdxDocument(fileName);
195
- const renderedContent = preprocessMarkdownDocument(content, { isMdx });
196
- const questContext = React.useMemo(
197
- () => getQuestMarkdownContextFromFileId(context.resourceId),
198
- [context.resourceId]
199
- );
200
- reactExports.useEffect(() => {
201
- setTitle(fileName);
202
- }, [fileName, setTitle]);
203
- reactExports.useEffect(() => {
204
- updateWorkspaceTabState(tabId, {
205
- contentKind: isMdx ? "mdx" : "markdown",
206
- documentMode: viewMode,
207
- isReadOnly: true
208
- });
209
- }, [isMdx, tabId, updateWorkspaceTabState, viewMode]);
210
- reactExports.useEffect(() => {
211
- const loadContent = async () => {
212
- setLoading(true);
213
- setError(null);
214
- try {
215
- if (!context.resourceId) {
216
- setContent(language === "zh-CN" ? DEMO_MARKDOWN_ZH : DEMO_MARKDOWN);
217
- setLoading(false);
218
- return;
219
- }
220
- const { getFileContent } = await __vitePreload(async () => { const { getFileContent } = await import('./index-Nt9hS4ck.js').then(n => n.el);return { getFileContent }},true?__vite__mapDeps([0,1]):void 0);
221
- const text = await getFileContent(context.resourceId);
222
- setContent(text);
223
- } catch (err) {
224
- setError(err instanceof Error ? err.message : t("load_failed"));
225
- } finally {
226
- setLoading(false);
227
- }
228
- };
229
- loadContent();
230
- }, [context.resourceId, language, t]);
231
- const handleCopy = reactExports.useCallback(async () => {
232
- const ok = await copyToClipboard(content);
233
- if (ok) {
234
- setCopied(true);
235
- setTimeout(() => setCopied(false), 2e3);
236
- }
237
- }, [content]);
238
- if (loading) {
239
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-muted-foreground", children: [
240
- /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-8 h-8 animate-spin" }),
241
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("loading") })
242
- ] }) });
243
- }
244
- if (error) {
245
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-destructive", children: [
246
- /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "w-8 h-8" }),
247
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: error }),
248
- /* @__PURE__ */ jsxRuntimeExports.jsx(
249
- "button",
250
- {
251
- className: "px-4 py-2 text-sm bg-destructive/10 hover:bg-destructive/20 rounded-lg transition-colors",
252
- onClick: () => window.location.reload(),
253
- children: t("retry")
254
- }
255
- )
256
- ] }) });
257
- }
258
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-background text-foreground", children: [
259
- /* @__PURE__ */ jsxRuntimeExports.jsx("style", { dangerouslySetInnerHTML: { __html: MARKDOWN_VIEWER_STYLES } }),
260
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-border bg-muted/30", children: [
261
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
262
- /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 text-muted-foreground" }),
263
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-foreground", children: fileName }),
264
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-muted text-muted-foreground", children: isMdx ? "MDX" : "Markdown" })
265
- ] }),
266
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
267
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center border border-border rounded-md mr-2", children: [
268
- /* @__PURE__ */ jsxRuntimeExports.jsx(
269
- "button",
270
- {
271
- onClick: () => setViewMode("rendered"),
272
- className: cn(
273
- "p-2 rounded-l-md transition-colors",
274
- viewMode === "rendered" ? "bg-primary text-primary-foreground" : "hover:bg-accent text-muted-foreground"
275
- ),
276
- title: t("rendered_view"),
277
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "w-4 h-4" })
278
- }
279
- ),
280
- /* @__PURE__ */ jsxRuntimeExports.jsx(
281
- "button",
282
- {
283
- onClick: () => setViewMode("source"),
284
- className: cn(
285
- "p-2 rounded-r-md transition-colors",
286
- viewMode === "source" ? "bg-primary text-primary-foreground" : "hover:bg-accent text-muted-foreground"
287
- ),
288
- title: t("source_view"),
289
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Code, { className: "w-4 h-4" })
290
- }
291
- )
292
- ] }),
293
- /* @__PURE__ */ jsxRuntimeExports.jsx(
294
- "button",
295
- {
296
- onClick: handleCopy,
297
- className: "p-2 rounded hover:bg-accent transition-colors text-muted-foreground hover:text-foreground",
298
- title: t("copy_source"),
299
- children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "w-4 h-4 text-green-500" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "w-4 h-4" })
300
- }
301
- )
302
- ] })
303
- ] }),
304
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-auto", children: viewMode === "rendered" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "max-w-4xl mx-auto p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownRenderer, { content: renderedContent, questContext }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "p-4 font-mono text-sm whitespace-pre-wrap", children: content }) })
305
- ] });
306
- }
307
-
308
- export { MarkdownViewerPlugin as default };