@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,49 +0,0 @@
|
|
|
1
|
-
._container_1vvir_1 {
|
|
2
|
-
position: absolute;
|
|
3
|
-
overflow: auto;
|
|
4
|
-
width: 100%;
|
|
5
|
-
height: 100%;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
._highlightLayer_1vvir_8 {
|
|
9
|
-
position: absolute;
|
|
10
|
-
z-index: 3;
|
|
11
|
-
left: 0;
|
|
12
|
-
top: 0;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
._tipContainer_1vvir_15 {
|
|
16
|
-
z-index: 6;
|
|
17
|
-
position: absolute;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
._disableSelection_1vvir_20 {
|
|
21
|
-
-webkit-user-select: none;
|
|
22
|
-
-moz-user-select: none;
|
|
23
|
-
user-select: none;
|
|
24
|
-
pointer-events: none;
|
|
25
|
-
}
|
|
26
|
-
._mouseSelection_1p43j_1 {
|
|
27
|
-
position: absolute;
|
|
28
|
-
border: 1px dashed #333;
|
|
29
|
-
background: rgba(252, 232, 151, 1);
|
|
30
|
-
mix-blend-mode: multiply;
|
|
31
|
-
}
|
|
32
|
-
/* Internet Explorer support method */
|
|
33
|
-
/* biome-ignore lint/correctness/noUnknownMediaFeatureName: update this */
|
|
34
|
-
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
|
|
35
|
-
._mouseSelection_1p43j_1 {
|
|
36
|
-
opacity: 0.5;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/* Microsoft Edge Browser 12+ (All) - @supports method */
|
|
41
|
-
@supports (-ms-ime-align: auto) {
|
|
42
|
-
._mouseSelection_1p43j_1 {
|
|
43
|
-
opacity: 0.5;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
._tipContainer_f56kr_1 {
|
|
47
|
-
z-index: 6;
|
|
48
|
-
position: absolute;
|
|
49
|
-
}
|
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
import { n as useTabsStore, a as useWorkspaceSurfaceStore, o as useToast, p as useArxivStore, r as reactExports, q as buildArxivSummaryMarkdown, s as generateBibTeX, c as copyToClipboard, t as apiClient, v as BUILTIN_PLUGINS, j as jsxRuntimeExports, k as FileText, I as InfoTriangleIcon, b as cn, M as MarkdownRenderer, A as ArxivInfoModal, g as RefreshCw } from './index-D_E4281X.js';
|
|
2
|
-
import { d as defaultExtensions, s as setEditorMarkdown, U, I, r as resolveNotebookAssetUrl } from './NotebookEditor-C1kWaxKi.js';
|
|
3
|
-
|
|
4
|
-
function rewriteMarkdownImages(markdown, fileId) {
|
|
5
|
-
if (!markdown) return markdown;
|
|
6
|
-
const prefix = `/api/v1/pdf/markdown/${fileId}/assets/`;
|
|
7
|
-
return markdown.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, url) => {
|
|
8
|
-
const trimmed = String(url || "").trim();
|
|
9
|
-
if (!trimmed) return match;
|
|
10
|
-
if (trimmed.startsWith("http") || trimmed.startsWith("data:") || trimmed.startsWith("/api/")) {
|
|
11
|
-
return match;
|
|
12
|
-
}
|
|
13
|
-
const cleaned = trimmed.replace(/^\.?\//, "");
|
|
14
|
-
return ``;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
function appendTokenToMarkdownImages(markdown) {
|
|
18
|
-
if (!markdown) return markdown;
|
|
19
|
-
return markdown.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, url) => {
|
|
20
|
-
const trimmed = String(url || "").trim();
|
|
21
|
-
if (!trimmed) return match;
|
|
22
|
-
const resolved = resolveNotebookAssetUrl(trimmed);
|
|
23
|
-
if (!resolved) return match;
|
|
24
|
-
return ``;
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
function PdfMarkdownPlugin({
|
|
28
|
-
context,
|
|
29
|
-
tabId,
|
|
30
|
-
setTitle
|
|
31
|
-
}) {
|
|
32
|
-
const rawFileId = context.resourceId ?? (typeof context.customData?.fileId === "string" ? context.customData.fileId : null);
|
|
33
|
-
const fileId = rawFileId ? String(rawFileId) : "";
|
|
34
|
-
const fileName = context.resourceName || "PDF Markdown";
|
|
35
|
-
const updateTabPlugin = useTabsStore((state2) => state2.updateTabPlugin);
|
|
36
|
-
const updateWorkspaceTabState = useWorkspaceSurfaceStore((state2) => state2.updateTabState);
|
|
37
|
-
const { addToast } = useToast();
|
|
38
|
-
const arxivItems = useArxivStore((state2) => state2.items);
|
|
39
|
-
const arxivErrors = useArxivStore((state2) => state2.errors);
|
|
40
|
-
const [editor, setEditor] = reactExports.useState(null);
|
|
41
|
-
const [markdown, setMarkdown] = reactExports.useState("");
|
|
42
|
-
const [state, setState] = reactExports.useState("idle");
|
|
43
|
-
const [renderMode, setRenderMode] = reactExports.useState("novel");
|
|
44
|
-
const [parseError, setParseError] = reactExports.useState(null);
|
|
45
|
-
const [error, setError] = reactExports.useState(null);
|
|
46
|
-
const [isRetrying, setIsRetrying] = reactExports.useState(false);
|
|
47
|
-
const [infoOpen, setInfoOpen] = reactExports.useState(false);
|
|
48
|
-
const parseRequestedRef = reactExports.useRef(false);
|
|
49
|
-
const extensions = reactExports.useMemo(() => [...defaultExtensions], []);
|
|
50
|
-
const arxivFromContext = reactExports.useMemo(() => {
|
|
51
|
-
const customData = context.customData;
|
|
52
|
-
return customData?.arxiv ?? null;
|
|
53
|
-
}, [context.customData]);
|
|
54
|
-
const arxivPaper = reactExports.useMemo(() => {
|
|
55
|
-
if (arxivFromContext) return arxivFromContext;
|
|
56
|
-
if (!fileId) return null;
|
|
57
|
-
return arxivItems.find((item) => item.fileId === fileId) || null;
|
|
58
|
-
}, [arxivFromContext, arxivItems, fileId]);
|
|
59
|
-
const arxivError = arxivPaper ? arxivErrors[arxivPaper.arxivId] : void 0;
|
|
60
|
-
const isArxivPdf = Boolean(arxivPaper);
|
|
61
|
-
const arxivSummaryMarkdown = reactExports.useMemo(() => buildArxivSummaryMarkdown(arxivPaper), [arxivPaper]);
|
|
62
|
-
const handleCopyBibtex = reactExports.useCallback(async () => {
|
|
63
|
-
if (!arxivPaper) return;
|
|
64
|
-
const bibtex = generateBibTeX(arxivPaper);
|
|
65
|
-
const success = await copyToClipboard(bibtex);
|
|
66
|
-
addToast({
|
|
67
|
-
type: success ? "success" : "error",
|
|
68
|
-
title: success ? "BibTeX copied" : "Copy failed",
|
|
69
|
-
description: success ? arxivPaper.title || arxivPaper.arxivId : "Please try again.",
|
|
70
|
-
duration: 1800
|
|
71
|
-
});
|
|
72
|
-
}, [addToast, arxivPaper]);
|
|
73
|
-
const handleOpenArxiv = reactExports.useCallback(() => {
|
|
74
|
-
if (!arxivPaper?.arxivId) return;
|
|
75
|
-
window.open(`https://arxiv.org/abs/${arxivPaper.arxivId}`, "_blank", "noopener,noreferrer");
|
|
76
|
-
}, [arxivPaper]);
|
|
77
|
-
reactExports.useEffect(() => {
|
|
78
|
-
setTitle(isArxivPdf ? `${fileName} Summary` : fileName);
|
|
79
|
-
}, [fileName, isArxivPdf, setTitle]);
|
|
80
|
-
reactExports.useEffect(() => {
|
|
81
|
-
parseRequestedRef.current = false;
|
|
82
|
-
setRenderMode("novel");
|
|
83
|
-
setParseError(null);
|
|
84
|
-
}, [fileId]);
|
|
85
|
-
const triggerParse = reactExports.useCallback(async (force = false) => {
|
|
86
|
-
if (!fileId) return false;
|
|
87
|
-
setError(null);
|
|
88
|
-
try {
|
|
89
|
-
const suffix = force ? "?force=1" : "";
|
|
90
|
-
await apiClient.post(`/api/v1/pdf/parse/${fileId}${suffix}`);
|
|
91
|
-
setState("processing");
|
|
92
|
-
return true;
|
|
93
|
-
} catch (err) {
|
|
94
|
-
setError(err?.response?.data?.detail || err?.message || "Failed to start MinerU parsing");
|
|
95
|
-
setState("error");
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
}, [fileId]);
|
|
99
|
-
const loadMarkdown = reactExports.useCallback(async () => {
|
|
100
|
-
if (!fileId) return;
|
|
101
|
-
setState("loading");
|
|
102
|
-
setError(null);
|
|
103
|
-
try {
|
|
104
|
-
const response = await apiClient.get(`/api/v1/pdf/markdown/${fileId}`, {
|
|
105
|
-
responseType: "text"
|
|
106
|
-
});
|
|
107
|
-
const raw = typeof response.data === "string" ? response.data : String(response.data ?? "");
|
|
108
|
-
const rewritten = rewriteMarkdownImages(raw, fileId);
|
|
109
|
-
setMarkdown(rewritten);
|
|
110
|
-
setRenderMode("novel");
|
|
111
|
-
setParseError(null);
|
|
112
|
-
setState("ready");
|
|
113
|
-
} catch (err) {
|
|
114
|
-
const status = err?.response?.status;
|
|
115
|
-
if (status === 409) {
|
|
116
|
-
setState("processing");
|
|
117
|
-
if (!parseRequestedRef.current) {
|
|
118
|
-
parseRequestedRef.current = true;
|
|
119
|
-
await triggerParse();
|
|
120
|
-
}
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
setError(err?.response?.data?.detail || err?.message || "Failed to load PDF markdown");
|
|
124
|
-
setState("error");
|
|
125
|
-
}
|
|
126
|
-
}, [fileId, triggerParse]);
|
|
127
|
-
const handleRetryParse = reactExports.useCallback(async () => {
|
|
128
|
-
if (!fileId || isRetrying) return;
|
|
129
|
-
setIsRetrying(true);
|
|
130
|
-
parseRequestedRef.current = true;
|
|
131
|
-
const started = await triggerParse(true);
|
|
132
|
-
if (started) {
|
|
133
|
-
await loadMarkdown();
|
|
134
|
-
}
|
|
135
|
-
setIsRetrying(false);
|
|
136
|
-
}, [fileId, isRetrying, loadMarkdown, triggerParse]);
|
|
137
|
-
reactExports.useEffect(() => {
|
|
138
|
-
if (isArxivPdf) {
|
|
139
|
-
setState("idle");
|
|
140
|
-
setMarkdown("");
|
|
141
|
-
setError(null);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
if (!fileId) return;
|
|
145
|
-
void loadMarkdown();
|
|
146
|
-
}, [fileId, isArxivPdf, loadMarkdown]);
|
|
147
|
-
reactExports.useEffect(() => {
|
|
148
|
-
updateWorkspaceTabState(tabId, {
|
|
149
|
-
contentKind: "pdf",
|
|
150
|
-
documentMode: "markdown",
|
|
151
|
-
isReadOnly: true
|
|
152
|
-
});
|
|
153
|
-
}, [tabId, updateWorkspaceTabState]);
|
|
154
|
-
reactExports.useEffect(() => {
|
|
155
|
-
if (state !== "processing") return;
|
|
156
|
-
const timer = window.setTimeout(() => {
|
|
157
|
-
void loadMarkdown();
|
|
158
|
-
}, 5e3);
|
|
159
|
-
return () => window.clearTimeout(timer);
|
|
160
|
-
}, [state, loadMarkdown]);
|
|
161
|
-
reactExports.useEffect(() => {
|
|
162
|
-
if (!editor || state !== "ready" || renderMode !== "novel") return;
|
|
163
|
-
try {
|
|
164
|
-
setEditorMarkdown(editor, markdown);
|
|
165
|
-
editor.setEditable(false);
|
|
166
|
-
const hasText = editor.state.doc.textContent.trim().length > 0;
|
|
167
|
-
if (!hasText && markdown.trim().length > 0) {
|
|
168
|
-
setRenderMode("markdown");
|
|
169
|
-
}
|
|
170
|
-
} catch (err) {
|
|
171
|
-
setParseError(err?.message || "Markdown parse failed");
|
|
172
|
-
setRenderMode("markdown");
|
|
173
|
-
}
|
|
174
|
-
}, [editor, markdown, renderMode, state]);
|
|
175
|
-
const fallbackMarkdown = reactExports.useMemo(
|
|
176
|
-
() => renderMode === "markdown" ? appendTokenToMarkdownImages(markdown) : markdown,
|
|
177
|
-
[markdown, renderMode]
|
|
178
|
-
);
|
|
179
|
-
const handleBackToPdf = reactExports.useCallback(() => {
|
|
180
|
-
if (!fileId) return;
|
|
181
|
-
updateTabPlugin(tabId, BUILTIN_PLUGINS.PDF_VIEWER, {
|
|
182
|
-
...context,
|
|
183
|
-
resourceId: context.resourceId ?? fileId,
|
|
184
|
-
resourceName: context.resourceName ?? fileName,
|
|
185
|
-
customData: {
|
|
186
|
-
...context.customData || {},
|
|
187
|
-
pdfView: "pdf",
|
|
188
|
-
fileId
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
}, [context, fileId, fileName, tabId, updateTabPlugin]);
|
|
192
|
-
if (!fileId) {
|
|
193
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-md text-center space-y-3", children: [
|
|
194
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "mx-auto h-10 w-10 text-muted-foreground" }),
|
|
195
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Open a PDF to view Markdown" }),
|
|
196
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Select a PDF in the file tree or import one from arXiv, then open the Markdown view to see MinerU output." })
|
|
197
|
-
] }) });
|
|
198
|
-
}
|
|
199
|
-
if (isArxivPdf) {
|
|
200
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-background", children: [
|
|
201
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-border bg-muted/30", children: [
|
|
202
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
203
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4 text-muted-foreground" }),
|
|
204
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-foreground", children: fileName }),
|
|
205
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-muted text-muted-foreground uppercase", children: "Summary" }),
|
|
206
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
207
|
-
"button",
|
|
208
|
-
{
|
|
209
|
-
type: "button",
|
|
210
|
-
onClick: () => setInfoOpen(true),
|
|
211
|
-
className: cn(
|
|
212
|
-
"flex h-7 w-7 items-center justify-center rounded-full",
|
|
213
|
-
"text-muted-foreground transition-colors",
|
|
214
|
-
"hover:bg-muted hover:text-foreground"
|
|
215
|
-
),
|
|
216
|
-
title: "Paper info",
|
|
217
|
-
"aria-label": "Paper info",
|
|
218
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsx(InfoTriangleIcon, { className: "h-4 w-4" })
|
|
219
|
-
}
|
|
220
|
-
)
|
|
221
|
-
] }),
|
|
222
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
223
|
-
"button",
|
|
224
|
-
{
|
|
225
|
-
type: "button",
|
|
226
|
-
onClick: handleBackToPdf,
|
|
227
|
-
className: cn(
|
|
228
|
-
"flex items-center gap-2 px-3 py-1.5 rounded-full border transition-colors text-sm",
|
|
229
|
-
"bg-background hover:bg-muted/60 border-border"
|
|
230
|
-
),
|
|
231
|
-
title: "Back to PDF view",
|
|
232
|
-
children: [
|
|
233
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4" }),
|
|
234
|
-
"PDF"
|
|
235
|
-
]
|
|
236
|
-
}
|
|
237
|
-
) })
|
|
238
|
-
] }),
|
|
239
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden flex justify-center px-4 py-4 bg-muted/10", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-full w-[min(62.5vw,100%)] max-w-[70rem]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "notebook-editor-container relative h-full overflow-hidden rounded-2xl border border-border bg-background shadow-soft-card", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "notebook-doc-editor relative h-full w-full overflow-y-auto p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
240
|
-
MarkdownRenderer,
|
|
241
|
-
{
|
|
242
|
-
content: arxivSummaryMarkdown,
|
|
243
|
-
className: "prose prose-lg dark:prose-invert max-w-full"
|
|
244
|
-
}
|
|
245
|
-
) }) }) }) }),
|
|
246
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
247
|
-
ArxivInfoModal,
|
|
248
|
-
{
|
|
249
|
-
open: infoOpen,
|
|
250
|
-
onClose: () => setInfoOpen(false),
|
|
251
|
-
paper: arxivPaper,
|
|
252
|
-
errorCode: arxivError,
|
|
253
|
-
onCopyBibtex: arxivPaper ? handleCopyBibtex : void 0,
|
|
254
|
-
onOpenArxiv: arxivPaper ? handleOpenArxiv : void 0
|
|
255
|
-
}
|
|
256
|
-
)
|
|
257
|
-
] });
|
|
258
|
-
}
|
|
259
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-background", children: [
|
|
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 uppercase", children: "Markdown" }),
|
|
265
|
-
arxivPaper ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
266
|
-
"button",
|
|
267
|
-
{
|
|
268
|
-
type: "button",
|
|
269
|
-
onClick: () => setInfoOpen(true),
|
|
270
|
-
className: cn(
|
|
271
|
-
"flex h-7 w-7 items-center justify-center rounded-full",
|
|
272
|
-
"text-muted-foreground transition-colors",
|
|
273
|
-
"hover:bg-muted hover:text-foreground"
|
|
274
|
-
),
|
|
275
|
-
title: "Paper info",
|
|
276
|
-
"aria-label": "Paper info",
|
|
277
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsx(InfoTriangleIcon, { className: "h-4 w-4" })
|
|
278
|
-
}
|
|
279
|
-
) : null
|
|
280
|
-
] }),
|
|
281
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
282
|
-
fileId ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
283
|
-
"button",
|
|
284
|
-
{
|
|
285
|
-
type: "button",
|
|
286
|
-
onClick: handleBackToPdf,
|
|
287
|
-
className: cn(
|
|
288
|
-
"flex items-center gap-2 px-3 py-1.5 rounded-full border transition-colors text-sm",
|
|
289
|
-
"bg-background hover:bg-muted/60 border-border"
|
|
290
|
-
),
|
|
291
|
-
title: "Back to PDF view",
|
|
292
|
-
children: [
|
|
293
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "w-4 h-4" }),
|
|
294
|
-
"PDF"
|
|
295
|
-
]
|
|
296
|
-
}
|
|
297
|
-
) : null,
|
|
298
|
-
state === "error" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
299
|
-
"button",
|
|
300
|
-
{
|
|
301
|
-
onClick: handleRetryParse,
|
|
302
|
-
disabled: isRetrying,
|
|
303
|
-
className: cn(
|
|
304
|
-
"inline-flex items-center gap-2 text-xs transition-colors",
|
|
305
|
-
"text-muted-foreground hover:text-foreground",
|
|
306
|
-
isRetrying && "opacity-60 cursor-not-allowed"
|
|
307
|
-
),
|
|
308
|
-
children: [
|
|
309
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: cn("w-3.5 h-3.5", isRetrying && "animate-spin") }),
|
|
310
|
-
"Retry parse"
|
|
311
|
-
]
|
|
312
|
-
}
|
|
313
|
-
),
|
|
314
|
-
state === "processing" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [
|
|
315
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Parsing..." }),
|
|
316
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
317
|
-
"button",
|
|
318
|
-
{
|
|
319
|
-
onClick: handleRetryParse,
|
|
320
|
-
disabled: isRetrying,
|
|
321
|
-
className: cn(
|
|
322
|
-
"inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 transition-colors",
|
|
323
|
-
"border-border bg-background hover:bg-muted/60",
|
|
324
|
-
isRetrying && "opacity-60 cursor-not-allowed"
|
|
325
|
-
),
|
|
326
|
-
children: [
|
|
327
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: cn("h-3 w-3", isRetrying && "animate-spin") }),
|
|
328
|
-
"Retry"
|
|
329
|
-
]
|
|
330
|
-
}
|
|
331
|
-
)
|
|
332
|
-
] })
|
|
333
|
-
] })
|
|
334
|
-
] }),
|
|
335
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden flex justify-center px-4 py-4 bg-muted/10", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative h-full w-[min(62.5vw,100%)] max-w-[70rem]", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
336
|
-
"div",
|
|
337
|
-
{
|
|
338
|
-
className: cn(
|
|
339
|
-
"notebook-editor-container relative h-full overflow-hidden rounded-2xl border border-border bg-background shadow-soft-card",
|
|
340
|
-
state !== "ready" && "flex items-center justify-center"
|
|
341
|
-
),
|
|
342
|
-
children: [
|
|
343
|
-
state === "loading" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading Markdown..." }),
|
|
344
|
-
state === "processing" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-sm text-muted-foreground", children: [
|
|
345
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "MinerU parsing in progress..." }),
|
|
346
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
347
|
-
"button",
|
|
348
|
-
{
|
|
349
|
-
onClick: handleRetryParse,
|
|
350
|
-
disabled: isRetrying,
|
|
351
|
-
className: cn(
|
|
352
|
-
"inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs transition-colors",
|
|
353
|
-
"border-border bg-background hover:bg-muted/60",
|
|
354
|
-
isRetrying && "opacity-60 cursor-not-allowed"
|
|
355
|
-
),
|
|
356
|
-
children: [
|
|
357
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: cn("h-3.5 w-3.5", isRetrying && "animate-spin") }),
|
|
358
|
-
"Retry MinerU"
|
|
359
|
-
]
|
|
360
|
-
}
|
|
361
|
-
)
|
|
362
|
-
] }),
|
|
363
|
-
state === "error" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-destructive px-6 text-center", children: error || "Failed to load PDF markdown" }),
|
|
364
|
-
state === "ready" && renderMode === "novel" && /* @__PURE__ */ jsxRuntimeExports.jsx(U, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
365
|
-
I,
|
|
366
|
-
{
|
|
367
|
-
extensions,
|
|
368
|
-
className: "notebook-doc-editor relative h-full w-full overflow-y-auto",
|
|
369
|
-
editorProps: {
|
|
370
|
-
attributes: {
|
|
371
|
-
class: "prose prose-lg dark:prose-invert prose-headings:font-title font-default focus:outline-none max-w-full"
|
|
372
|
-
}
|
|
373
|
-
},
|
|
374
|
-
onCreate: ({ editor: instance }) => {
|
|
375
|
-
setEditor(instance);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
) }),
|
|
379
|
-
state === "ready" && renderMode === "markdown" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "notebook-doc-editor relative h-full w-full overflow-y-auto p-8", children: [
|
|
380
|
-
parseError ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground mb-3", children: [
|
|
381
|
-
parseError,
|
|
382
|
-
". Rendering with Markdown viewer."
|
|
383
|
-
] }) : null,
|
|
384
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
385
|
-
MarkdownRenderer,
|
|
386
|
-
{
|
|
387
|
-
content: fallbackMarkdown,
|
|
388
|
-
className: "prose prose-lg dark:prose-invert max-w-full"
|
|
389
|
-
}
|
|
390
|
-
)
|
|
391
|
-
] })
|
|
392
|
-
]
|
|
393
|
-
}
|
|
394
|
-
) }) }),
|
|
395
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
396
|
-
ArxivInfoModal,
|
|
397
|
-
{
|
|
398
|
-
open: infoOpen,
|
|
399
|
-
onClose: () => setInfoOpen(false),
|
|
400
|
-
paper: arxivPaper,
|
|
401
|
-
errorCode: arxivError,
|
|
402
|
-
onCopyBibtex: arxivPaper ? handleCopyBibtex : void 0,
|
|
403
|
-
onOpenArxiv: arxivPaper ? handleOpenArxiv : void 0
|
|
404
|
-
}
|
|
405
|
-
)
|
|
406
|
-
] });
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
export { PdfMarkdownPlugin as default };
|