@researai/deepscientist 1.5.15 → 1.5.17
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.
- package/README.md +385 -104
- package/bin/ds.js +1241 -110
- package/docs/en/00_QUICK_START.md +100 -19
- package/docs/en/01_SETTINGS_REFERENCE.md +34 -1
- package/docs/en/02_START_RESEARCH_GUIDE.md +7 -0
- package/docs/en/05_TUI_GUIDE.md +6 -0
- package/docs/en/06_RUNTIME_AND_CANVAS.md +4 -3
- package/docs/en/09_DOCTOR.md +25 -8
- package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
- package/docs/en/15_CODEX_PROVIDER_SETUP.md +37 -11
- package/docs/en/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
- package/docs/en/19_LOCAL_BROWSER_AUTH.md +70 -0
- package/docs/en/20_WORKSPACE_MODES_GUIDE.md +250 -0
- package/docs/en/21_LOCAL_MODEL_BACKENDS_GUIDE.md +283 -0
- package/docs/en/91_DEVELOPMENT.md +237 -0
- package/docs/en/README.md +24 -2
- package/docs/zh/00_QUICK_START.md +89 -19
- package/docs/zh/01_SETTINGS_REFERENCE.md +34 -1
- package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
- package/docs/zh/05_TUI_GUIDE.md +6 -0
- package/docs/zh/09_DOCTOR.md +26 -9
- package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
- package/docs/zh/15_CODEX_PROVIDER_SETUP.md +37 -11
- package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
- package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
- package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
- package/docs/zh/21_LOCAL_MODEL_BACKENDS_GUIDE.md +281 -0
- package/docs/zh/README.md +24 -2
- package/install.sh +46 -4
- package/package.json +2 -1
- package/pyproject.toml +1 -1
- package/src/deepscientist/__init__.py +1 -1
- package/src/deepscientist/acp/envelope.py +6 -0
- package/src/deepscientist/artifact/service.py +647 -22
- package/src/deepscientist/bash_exec/service.py +234 -9
- package/src/deepscientist/bridges/connectors.py +8 -2
- package/src/deepscientist/cli.py +115 -19
- package/src/deepscientist/codex_cli_compat.py +367 -22
- package/src/deepscientist/config/models.py +2 -1
- package/src/deepscientist/config/service.py +183 -13
- package/src/deepscientist/daemon/api/handlers.py +255 -31
- package/src/deepscientist/daemon/api/router.py +9 -0
- package/src/deepscientist/daemon/app.py +1146 -105
- package/src/deepscientist/diagnostics/__init__.py +6 -0
- package/src/deepscientist/diagnostics/runner_failures.py +130 -0
- package/src/deepscientist/doctor.py +207 -3
- package/src/deepscientist/gitops/__init__.py +10 -1
- package/src/deepscientist/gitops/diff.py +129 -0
- package/src/deepscientist/gitops/service.py +4 -1
- package/src/deepscientist/mcp/server.py +39 -0
- package/src/deepscientist/prompts/builder.py +275 -34
- package/src/deepscientist/quest/layout.py +15 -2
- package/src/deepscientist/quest/service.py +707 -55
- package/src/deepscientist/quest/stage_views.py +6 -1
- package/src/deepscientist/runners/codex.py +143 -43
- package/src/deepscientist/shared.py +19 -0
- package/src/deepscientist/skills/__init__.py +2 -2
- package/src/deepscientist/skills/installer.py +196 -5
- package/src/deepscientist/skills/registry.py +66 -0
- package/src/prompts/connectors/qq.md +18 -8
- package/src/prompts/connectors/weixin.md +16 -6
- package/src/prompts/contracts/shared_interaction.md +14 -2
- package/src/prompts/system.md +23 -5
- package/src/prompts/system_copilot.md +56 -0
- package/src/skills/analysis-campaign/SKILL.md +1 -0
- package/src/skills/baseline/SKILL.md +8 -0
- package/src/skills/decision/SKILL.md +8 -0
- package/src/skills/experiment/SKILL.md +8 -0
- package/src/skills/figure-polish/SKILL.md +1 -0
- package/src/skills/finalize/SKILL.md +1 -0
- package/src/skills/idea/SKILL.md +1 -0
- package/src/skills/intake-audit/SKILL.md +8 -0
- package/src/skills/mentor/SKILL.md +217 -0
- package/src/skills/mentor/references/correction-rules.md +210 -0
- package/src/skills/mentor/references/knowledge-profile.md +91 -0
- package/src/skills/mentor/references/persona-profile.md +138 -0
- package/src/skills/mentor/references/taste-profile.md +128 -0
- package/src/skills/mentor/references/thought-style-profile.md +138 -0
- package/src/skills/mentor/references/work-profile.md +289 -0
- package/src/skills/mentor/references/workflow-profile.md +240 -0
- package/src/skills/optimize/SKILL.md +1 -0
- package/src/skills/rebuttal/SKILL.md +1 -0
- package/src/skills/review/SKILL.md +1 -0
- package/src/skills/scout/SKILL.md +8 -0
- package/src/skills/write/SKILL.md +1 -0
- package/src/tui/dist/app/AppContainer.js +19 -11
- package/src/tui/dist/index.js +4 -1
- package/src/tui/dist/lib/api.js +33 -3
- package/src/tui/package.json +1 -1
- package/src/ui/dist/assets/AiManusChatView-Bv-Z8YpU.js +204 -0
- package/src/ui/dist/assets/AnalysisPlugin-BCKAfjba.js +1 -0
- package/src/ui/dist/assets/CliPlugin-BCKcpc35.js +109 -0
- package/src/ui/dist/assets/CodeEditorPlugin-DbOfSJ8K.js +2 -0
- package/src/ui/dist/assets/CodeViewerPlugin-CbaFRrUU.js +270 -0
- package/src/ui/dist/assets/DocViewerPlugin-DAjLVeQD.js +7 -0
- package/src/ui/dist/assets/GitCommitViewerPlugin-CIUqbUDO.js +1 -0
- package/src/ui/dist/assets/GitDiffViewerPlugin-CQACjoAA.js +6 -0
- package/src/ui/dist/assets/GitSnapshotViewer-0r4nLPke.js +30 -0
- package/src/ui/dist/assets/ImageViewerPlugin-nBOmI2v_.js +26 -0
- package/src/ui/dist/assets/LabCopilotPanel-BHxOxF4z.js +14 -0
- package/src/ui/dist/assets/LabPlugin-BKoZGs95.js +22 -0
- package/src/ui/dist/assets/LatexPlugin-ZwtV8pIp.js +25 -0
- package/src/ui/dist/assets/MarkdownViewerPlugin-DKqVfKyW.js +128 -0
- package/src/ui/dist/assets/MarketplacePlugin-BwxStZ9D.js +13 -0
- package/src/ui/dist/assets/NotebookEditor-BEQhaQbt.js +81 -0
- package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
- package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
- package/src/ui/dist/assets/NotebookEditor-DB9N_T9q.js +361 -0
- package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
- package/src/ui/dist/assets/PdfLoader-eWBONbQP.js +16 -0
- package/src/ui/dist/assets/PdfMarkdownPlugin-D22YOZL3.js +1 -0
- package/src/ui/dist/assets/PdfViewerPlugin-c-RK9DLM.js +17 -0
- package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
- package/src/ui/dist/assets/SearchPlugin-CxF9ytAx.js +16 -0
- package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
- package/src/ui/dist/assets/TextViewerPlugin-C5xqeeUH.js +54 -0
- package/src/ui/dist/assets/VNCViewer-BoLGLnHz.js +11 -0
- package/src/ui/dist/assets/bot-DREQOxzP.js +6 -0
- package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
- package/src/ui/dist/assets/chevron-up-C9Qpx4DE.js +6 -0
- package/src/ui/dist/assets/code-WlFHE7z_.js +6 -0
- package/src/ui/dist/assets/file-content-BZMz3RYp.js +1 -0
- package/src/ui/dist/assets/file-diff-panel-CQhw0jS2.js +1 -0
- package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
- package/src/ui/dist/assets/file-socket-CfQPKQKj.js +1 -0
- package/src/ui/dist/assets/git-commit-horizontal-DxZ8DCZh.js +6 -0
- package/src/ui/dist/assets/image-Bgl4VIyx.js +6 -0
- package/src/ui/dist/assets/index-BpV6lusQ.css +33 -0
- package/src/ui/dist/assets/index-CBNVuWcP.js +2496 -0
- package/src/ui/dist/assets/index-CwNu1aH4.js +11 -0
- package/src/ui/dist/assets/index-DrUnlf6K.js +1 -0
- package/src/ui/dist/assets/index-NW-h8VzN.js +1 -0
- package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
- package/src/ui/dist/assets/pdf-effect-queue-J8OnM0jE.js +6 -0
- package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
- package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
- package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
- package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
- package/src/ui/dist/assets/popover-CLc0pPP8.js +1 -0
- package/src/ui/dist/assets/project-sync-C9IdzdZW.js +1 -0
- package/src/ui/dist/assets/select-Cs2PmzwL.js +11 -0
- package/src/ui/dist/assets/sigma-ClKcHAXm.js +6 -0
- package/src/ui/dist/assets/trash-DwpbFr3w.js +11 -0
- package/src/ui/dist/assets/useCliAccess-NQ8m0Let.js +1 -0
- package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
- package/src/ui/dist/assets/wrap-text-BC-Hltpd.js +11 -0
- package/src/ui/dist/assets/zoom-out-E_gaeAxL.js +11 -0
- package/src/ui/dist/index.html +5 -2
- package/src/ui/dist/assets/AiManusChatView-DDjbFnbt.js +0 -26597
- package/src/ui/dist/assets/AnalysisPlugin-Yb5IdmaU.js +0 -123
- package/src/ui/dist/assets/CliPlugin-e64sreyu.js +0 -31037
- package/src/ui/dist/assets/CodeEditorPlugin-C4D2TIkU.js +0 -427
- package/src/ui/dist/assets/CodeViewerPlugin-BVoNZIvC.js +0 -905
- package/src/ui/dist/assets/DocViewerPlugin-CLChbllo.js +0 -278
- package/src/ui/dist/assets/GitDiffViewerPlugin-C4xeFyFQ.js +0 -2661
- package/src/ui/dist/assets/ImageViewerPlugin-OiMUAcLi.js +0 -500
- package/src/ui/dist/assets/LabCopilotPanel-BjD2ThQF.js +0 -4104
- package/src/ui/dist/assets/LabPlugin-DQPg-NrB.js +0 -2677
- package/src/ui/dist/assets/LatexPlugin-CI05XAV9.js +0 -1792
- package/src/ui/dist/assets/MarkdownViewerPlugin-DpeBLYZf.js +0 -308
- package/src/ui/dist/assets/MarketplacePlugin-DolE58Q2.js +0 -413
- package/src/ui/dist/assets/NotebookEditor-7Qm2rSWD.js +0 -4214
- package/src/ui/dist/assets/NotebookEditor-C1kWaxKi.js +0 -84873
- package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
- package/src/ui/dist/assets/PdfLoader-BfOHw8Zw.js +0 -25468
- package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
- package/src/ui/dist/assets/PdfMarkdownPlugin-BulDREv1.js +0 -409
- package/src/ui/dist/assets/PdfViewerPlugin-C-daaOaL.js +0 -3095
- package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
- package/src/ui/dist/assets/SearchPlugin-CjpaiJ3A.js +0 -741
- package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
- package/src/ui/dist/assets/TextViewerPlugin-BxIyqPQC.js +0 -472
- package/src/ui/dist/assets/VNCViewer-HAg9mF7M.js +0 -18821
- package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
- package/src/ui/dist/assets/bot-0DYntytV.js +0 -21
- package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
- package/src/ui/dist/assets/code-B20Slj_w.js +0 -17
- package/src/ui/dist/assets/file-content-DT24KFma.js +0 -377
- package/src/ui/dist/assets/file-diff-panel-DK13YPql.js +0 -92
- package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
- package/src/ui/dist/assets/file-socket-B4T2o4nR.js +0 -58
- package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
- package/src/ui/dist/assets/image-DSeR_sDS.js +0 -18
- package/src/ui/dist/assets/index-BrFje2Uk.js +0 -120
- package/src/ui/dist/assets/index-BwRJaoTl.js +0 -25
- package/src/ui/dist/assets/index-D_E4281X.js +0 -221322
- package/src/ui/dist/assets/index-DnYB3xb1.js +0 -159
- package/src/ui/dist/assets/index-G7AcWcMu.css +0 -12594
- package/src/ui/dist/assets/monaco-LExaAN3Y.js +0 -623
- package/src/ui/dist/assets/pdf-effect-queue-BJk5okWJ.js +0 -47
- package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
- package/src/ui/dist/assets/popover-D3Gg_FoV.js +0 -476
- package/src/ui/dist/assets/project-sync-C_ygLlVU.js +0 -297
- package/src/ui/dist/assets/select-CpAK6uWm.js +0 -1690
- package/src/ui/dist/assets/sigma-DEccaSgk.js +0 -22
- package/src/ui/dist/assets/square-check-big-uUfyVsbD.js +0 -17
- package/src/ui/dist/assets/trash-CXvwwSe8.js +0 -32
- package/src/ui/dist/assets/useCliAccess-Bnop4mgR.js +0 -957
- package/src/ui/dist/assets/useFileDiffOverlay-B8eUAX0I.js +0 -53
- package/src/ui/dist/assets/wrap-text-9vbOBpkW.js +0 -35
- package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
- package/src/ui/dist/assets/zoom-out-BgVMmOW4.js +0 -34
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-D_E4281X.js","assets/index-G7AcWcMu.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-D_E4281X.js';
|
|
3
|
-
import { C as Code } from './code-B20Slj_w.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
|
-

|
|
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-D_E4281X.js').then(n => n.ep);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 };
|