@researai/deepscientist 1.5.15 → 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 (193) hide show
  1. package/README.md +336 -98
  2. package/bin/ds.js +691 -91
  3. package/docs/en/00_QUICK_START.md +36 -15
  4. package/docs/en/01_SETTINGS_REFERENCE.md +33 -0
  5. package/docs/en/02_START_RESEARCH_GUIDE.md +7 -0
  6. package/docs/en/05_TUI_GUIDE.md +6 -0
  7. package/docs/en/06_RUNTIME_AND_CANVAS.md +4 -3
  8. package/docs/en/09_DOCTOR.md +11 -5
  9. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
  10. package/docs/en/15_CODEX_PROVIDER_SETUP.md +25 -8
  11. package/docs/en/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  12. package/docs/en/19_LOCAL_BROWSER_AUTH.md +70 -0
  13. package/docs/en/20_WORKSPACE_MODES_GUIDE.md +250 -0
  14. package/docs/en/README.md +18 -0
  15. package/docs/zh/00_QUICK_START.md +36 -15
  16. package/docs/zh/01_SETTINGS_REFERENCE.md +33 -0
  17. package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
  18. package/docs/zh/05_TUI_GUIDE.md +6 -0
  19. package/docs/zh/09_DOCTOR.md +11 -5
  20. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
  21. package/docs/zh/15_CODEX_PROVIDER_SETUP.md +25 -8
  22. package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  23. package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
  24. package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
  25. package/docs/zh/README.md +18 -0
  26. package/package.json +1 -1
  27. package/pyproject.toml +1 -1
  28. package/src/deepscientist/__init__.py +1 -1
  29. package/src/deepscientist/acp/envelope.py +6 -0
  30. package/src/deepscientist/artifact/service.py +647 -22
  31. package/src/deepscientist/bash_exec/service.py +234 -9
  32. package/src/deepscientist/cli.py +115 -19
  33. package/src/deepscientist/codex_cli_compat.py +232 -0
  34. package/src/deepscientist/config/models.py +2 -1
  35. package/src/deepscientist/config/service.py +31 -9
  36. package/src/deepscientist/daemon/api/handlers.py +125 -6
  37. package/src/deepscientist/daemon/api/router.py +4 -0
  38. package/src/deepscientist/daemon/app.py +715 -98
  39. package/src/deepscientist/gitops/__init__.py +10 -1
  40. package/src/deepscientist/gitops/diff.py +129 -0
  41. package/src/deepscientist/gitops/service.py +4 -1
  42. package/src/deepscientist/mcp/server.py +39 -0
  43. package/src/deepscientist/prompts/builder.py +255 -32
  44. package/src/deepscientist/quest/layout.py +15 -2
  45. package/src/deepscientist/quest/service.py +295 -43
  46. package/src/deepscientist/quest/stage_views.py +6 -1
  47. package/src/deepscientist/runners/codex.py +86 -31
  48. package/src/deepscientist/skills/__init__.py +2 -2
  49. package/src/deepscientist/skills/installer.py +196 -5
  50. package/src/deepscientist/skills/registry.py +66 -0
  51. package/src/prompts/connectors/qq.md +18 -8
  52. package/src/prompts/connectors/weixin.md +16 -6
  53. package/src/prompts/contracts/shared_interaction.md +12 -1
  54. package/src/prompts/system.md +10 -5
  55. package/src/prompts/system_copilot.md +43 -0
  56. package/src/skills/analysis-campaign/SKILL.md +1 -0
  57. package/src/skills/baseline/SKILL.md +8 -0
  58. package/src/skills/decision/SKILL.md +8 -0
  59. package/src/skills/experiment/SKILL.md +8 -0
  60. package/src/skills/figure-polish/SKILL.md +1 -0
  61. package/src/skills/finalize/SKILL.md +1 -0
  62. package/src/skills/idea/SKILL.md +1 -0
  63. package/src/skills/intake-audit/SKILL.md +8 -0
  64. package/src/skills/mentor/SKILL.md +217 -0
  65. package/src/skills/mentor/references/correction-rules.md +210 -0
  66. package/src/skills/mentor/references/knowledge-profile.md +91 -0
  67. package/src/skills/mentor/references/persona-profile.md +138 -0
  68. package/src/skills/mentor/references/taste-profile.md +128 -0
  69. package/src/skills/mentor/references/thought-style-profile.md +138 -0
  70. package/src/skills/mentor/references/work-profile.md +289 -0
  71. package/src/skills/mentor/references/workflow-profile.md +240 -0
  72. package/src/skills/optimize/SKILL.md +1 -0
  73. package/src/skills/rebuttal/SKILL.md +1 -0
  74. package/src/skills/review/SKILL.md +1 -0
  75. package/src/skills/scout/SKILL.md +8 -0
  76. package/src/skills/write/SKILL.md +1 -0
  77. package/src/tui/dist/app/AppContainer.js +19 -11
  78. package/src/tui/dist/index.js +4 -1
  79. package/src/tui/dist/lib/api.js +33 -3
  80. package/src/tui/package.json +1 -1
  81. package/src/ui/dist/assets/AiManusChatView-COFACy7V.js +204 -0
  82. package/src/ui/dist/assets/AnalysisPlugin-DnSm0GZn.js +1 -0
  83. package/src/ui/dist/assets/CliPlugin-CvwCmDQ5.js +109 -0
  84. package/src/ui/dist/assets/CodeEditorPlugin-cOqSa0xq.js +2 -0
  85. package/src/ui/dist/assets/CodeViewerPlugin-itb0tltR.js +270 -0
  86. package/src/ui/dist/assets/DocViewerPlugin-DqKkiCI6.js +7 -0
  87. package/src/ui/dist/assets/GitCommitViewerPlugin-DVgNHBCS.js +1 -0
  88. package/src/ui/dist/assets/GitDiffViewerPlugin-DxL2ezFG.js +6 -0
  89. package/src/ui/dist/assets/GitSnapshotViewer-B_RQm1YZ.js +30 -0
  90. package/src/ui/dist/assets/ImageViewerPlugin-tHqlXY3n.js +26 -0
  91. package/src/ui/dist/assets/LabCopilotPanel-ClMbq5Yu.js +14 -0
  92. package/src/ui/dist/assets/LabPlugin-L_SuE8ow.js +22 -0
  93. package/src/ui/dist/assets/LatexPlugin-B495DTXC.js +25 -0
  94. package/src/ui/dist/assets/MarkdownViewerPlugin-DG28-61B.js +128 -0
  95. package/src/ui/dist/assets/MarketplacePlugin-BiOGT-Kj.js +13 -0
  96. package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
  97. package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
  98. package/src/ui/dist/assets/NotebookEditor-C-4Kt1p9.js +81 -0
  99. package/src/ui/dist/assets/NotebookEditor-CVsj8h_T.js +361 -0
  100. package/src/ui/dist/assets/PdfLoader-CASDQmxJ.js +16 -0
  101. package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
  102. package/src/ui/dist/assets/PdfMarkdownPlugin-BFhwoKsY.js +1 -0
  103. package/src/ui/dist/assets/PdfViewerPlugin-DcOzU9vd.js +17 -0
  104. package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
  105. package/src/ui/dist/assets/SearchPlugin-CHj7M58O.js +16 -0
  106. package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
  107. package/src/ui/dist/assets/TextViewerPlugin-CB4DYfWO.js +54 -0
  108. package/src/ui/dist/assets/VNCViewer-CjlbyCB3.js +11 -0
  109. package/src/ui/dist/assets/bot-CFkZY-JP.js +6 -0
  110. package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
  111. package/src/ui/dist/assets/chevron-up-Dq5ofbht.js +6 -0
  112. package/src/ui/dist/assets/code-DLC6G24T.js +6 -0
  113. package/src/ui/dist/assets/file-content-Dv4LoZec.js +1 -0
  114. package/src/ui/dist/assets/file-diff-panel-Denq-lC3.js +1 -0
  115. package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
  116. package/src/ui/dist/assets/file-socket-Cu4Qln7Y.js +1 -0
  117. package/src/ui/dist/assets/git-commit-horizontal-BUh6G52n.js +6 -0
  118. package/src/ui/dist/assets/image-B9HUUddG.js +6 -0
  119. package/src/ui/dist/assets/index-B2B1sg-M.js +1 -0
  120. package/src/ui/dist/assets/index-Cgla8biy.css +33 -0
  121. package/src/ui/dist/assets/index-DRyx7vAc.js +1 -0
  122. package/src/ui/dist/assets/index-Gbl53BNp.js +2496 -0
  123. package/src/ui/dist/assets/index-wQ7RIIRd.js +11 -0
  124. package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
  125. package/src/ui/dist/assets/pdf-effect-queue-ZtnHFCAi.js +6 -0
  126. package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
  127. package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
  128. package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
  129. package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
  130. package/src/ui/dist/assets/popover-DL6h35vr.js +1 -0
  131. package/src/ui/dist/assets/project-sync-CsX08Qno.js +1 -0
  132. package/src/ui/dist/assets/select-DvmXt1yY.js +11 -0
  133. package/src/ui/dist/assets/sigma-7jpXazui.js +6 -0
  134. package/src/ui/dist/assets/trash-xA7kFt8i.js +11 -0
  135. package/src/ui/dist/assets/useCliAccess-DsMwDjOp.js +1 -0
  136. package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
  137. package/src/ui/dist/assets/wrap-text-CwMn-iqb.js +11 -0
  138. package/src/ui/dist/assets/zoom-out-R-GWEhzS.js +11 -0
  139. package/src/ui/dist/index.html +5 -2
  140. package/src/ui/dist/assets/AiManusChatView-DDjbFnbt.js +0 -26597
  141. package/src/ui/dist/assets/AnalysisPlugin-Yb5IdmaU.js +0 -123
  142. package/src/ui/dist/assets/CliPlugin-e64sreyu.js +0 -31037
  143. package/src/ui/dist/assets/CodeEditorPlugin-C4D2TIkU.js +0 -427
  144. package/src/ui/dist/assets/CodeViewerPlugin-BVoNZIvC.js +0 -905
  145. package/src/ui/dist/assets/DocViewerPlugin-CLChbllo.js +0 -278
  146. package/src/ui/dist/assets/GitDiffViewerPlugin-C4xeFyFQ.js +0 -2661
  147. package/src/ui/dist/assets/ImageViewerPlugin-OiMUAcLi.js +0 -500
  148. package/src/ui/dist/assets/LabCopilotPanel-BjD2ThQF.js +0 -4104
  149. package/src/ui/dist/assets/LabPlugin-DQPg-NrB.js +0 -2677
  150. package/src/ui/dist/assets/LatexPlugin-CI05XAV9.js +0 -1792
  151. package/src/ui/dist/assets/MarkdownViewerPlugin-DpeBLYZf.js +0 -308
  152. package/src/ui/dist/assets/MarketplacePlugin-DolE58Q2.js +0 -413
  153. package/src/ui/dist/assets/NotebookEditor-7Qm2rSWD.js +0 -4214
  154. package/src/ui/dist/assets/NotebookEditor-C1kWaxKi.js +0 -84873
  155. package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
  156. package/src/ui/dist/assets/PdfLoader-BfOHw8Zw.js +0 -25468
  157. package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
  158. package/src/ui/dist/assets/PdfMarkdownPlugin-BulDREv1.js +0 -409
  159. package/src/ui/dist/assets/PdfViewerPlugin-C-daaOaL.js +0 -3095
  160. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
  161. package/src/ui/dist/assets/SearchPlugin-CjpaiJ3A.js +0 -741
  162. package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
  163. package/src/ui/dist/assets/TextViewerPlugin-BxIyqPQC.js +0 -472
  164. package/src/ui/dist/assets/VNCViewer-HAg9mF7M.js +0 -18821
  165. package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
  166. package/src/ui/dist/assets/bot-0DYntytV.js +0 -21
  167. package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
  168. package/src/ui/dist/assets/code-B20Slj_w.js +0 -17
  169. package/src/ui/dist/assets/file-content-DT24KFma.js +0 -377
  170. package/src/ui/dist/assets/file-diff-panel-DK13YPql.js +0 -92
  171. package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
  172. package/src/ui/dist/assets/file-socket-B4T2o4nR.js +0 -58
  173. package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
  174. package/src/ui/dist/assets/image-DSeR_sDS.js +0 -18
  175. package/src/ui/dist/assets/index-BrFje2Uk.js +0 -120
  176. package/src/ui/dist/assets/index-BwRJaoTl.js +0 -25
  177. package/src/ui/dist/assets/index-D_E4281X.js +0 -221322
  178. package/src/ui/dist/assets/index-DnYB3xb1.js +0 -159
  179. package/src/ui/dist/assets/index-G7AcWcMu.css +0 -12594
  180. package/src/ui/dist/assets/monaco-LExaAN3Y.js +0 -623
  181. package/src/ui/dist/assets/pdf-effect-queue-BJk5okWJ.js +0 -47
  182. package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
  183. package/src/ui/dist/assets/popover-D3Gg_FoV.js +0 -476
  184. package/src/ui/dist/assets/project-sync-C_ygLlVU.js +0 -297
  185. package/src/ui/dist/assets/select-CpAK6uWm.js +0 -1690
  186. package/src/ui/dist/assets/sigma-DEccaSgk.js +0 -22
  187. package/src/ui/dist/assets/square-check-big-uUfyVsbD.js +0 -17
  188. package/src/ui/dist/assets/trash-CXvwwSe8.js +0 -32
  189. package/src/ui/dist/assets/useCliAccess-Bnop4mgR.js +0 -957
  190. package/src/ui/dist/assets/useFileDiffOverlay-B8eUAX0I.js +0 -53
  191. package/src/ui/dist/assets/wrap-text-9vbOBpkW.js +0 -35
  192. package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
  193. package/src/ui/dist/assets/zoom-out-BgVMmOW4.js +0 -34
@@ -1,278 +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 { w as createLucideIcon, u as useI18n, r as reactExports, j as jsxRuntimeExports, L as LoaderCircle, b as cn, T as TriangleAlert, a3 as Download, _ as __vitePreload, a9 as FileSpreadsheet, k as FileText } from './index-D_E4281X.js';
3
-
4
- /**
5
- * @license lucide-react v0.511.0 - ISC
6
- *
7
- * This source code is licensed under the ISC license.
8
- * See the LICENSE file in the root directory of this source tree.
9
- */
10
-
11
-
12
- const __iconNode = [
13
- ["path", { d: "M2 3h20", key: "91anmk" }],
14
- ["path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3", key: "2k9sn8" }],
15
- ["path", { d: "m7 21 5-5 5 5", key: "bip4we" }]
16
- ];
17
- const Presentation = createLucideIcon("presentation", __iconNode);
18
-
19
- const DOC_TYPE_INFO = {
20
- docx: { icon: "W", color: "bg-blue-600", labelKey: "word_document" },
21
- doc: { icon: "W", color: "bg-blue-600", labelKey: "word_document" },
22
- xlsx: { icon: "X", color: "bg-green-600", labelKey: "excel_spreadsheet" },
23
- xls: { icon: "X", color: "bg-green-600", labelKey: "excel_spreadsheet" },
24
- pptx: { icon: "P", color: "bg-primary", labelKey: "powerpoint_presentation" },
25
- ppt: { icon: "P", color: "bg-primary", labelKey: "powerpoint_presentation" },
26
- odt: { icon: "OD", color: "bg-blue-500", labelKey: "open_document_text" },
27
- ods: { icon: "OD", color: "bg-green-500", labelKey: "open_document_spreadsheet" },
28
- odp: { icon: "OD", color: "bg-primary", labelKey: "open_document_presentation" }
29
- };
30
- function OfficeRenderer({
31
- src,
32
- fileName,
33
- fileType,
34
- onError,
35
- onDownload,
36
- className
37
- }) {
38
- const { t } = useI18n("doc_viewer");
39
- const [loading, setLoading] = reactExports.useState(true);
40
- const [renderError, setRenderError] = reactExports.useState(false);
41
- const docInfo = DOC_TYPE_INFO[fileType.toLowerCase()] || {
42
- icon: "?",
43
- color: "bg-gray-600",
44
- labelKey: "document"
45
- };
46
- const handleLoad = reactExports.useCallback(() => {
47
- setLoading(false);
48
- }, []);
49
- const handleError = reactExports.useCallback(() => {
50
- setLoading(false);
51
- setRenderError(true);
52
- onError?.(t("preview_load_failed"));
53
- }, [onError, t]);
54
- const getPreviewUrl = (documentUrl) => {
55
- if (!documentUrl) return null;
56
- return null;
57
- };
58
- const previewUrl = src ? getPreviewUrl(src) : null;
59
- const handleDownload = reactExports.useCallback(() => {
60
- if (onDownload) {
61
- onDownload();
62
- return;
63
- }
64
- if (!src) return;
65
- const link = document.createElement("a");
66
- link.href = src;
67
- link.download = fileName;
68
- link.click();
69
- }, [onDownload, src, fileName]);
70
- if (previewUrl && !renderError) {
71
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("relative w-full h-full", className), children: [
72
- loading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-background z-10", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3", children: [
73
- /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-8 h-8 animate-spin text-muted-foreground" }),
74
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground", children: t("preview_loading") })
75
- ] }) }),
76
- /* @__PURE__ */ jsxRuntimeExports.jsx(
77
- "iframe",
78
- {
79
- src: previewUrl,
80
- className: "w-full h-full border-0",
81
- onLoad: handleLoad,
82
- onError: handleError,
83
- title: fileName,
84
- sandbox: "allow-scripts allow-same-origin allow-popups"
85
- }
86
- )
87
- ] });
88
- }
89
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
90
- "div",
91
- {
92
- className: cn(
93
- "flex flex-col items-center justify-center h-full text-center p-8",
94
- className
95
- ),
96
- children: [
97
- /* @__PURE__ */ jsxRuntimeExports.jsx(
98
- "div",
99
- {
100
- className: cn(
101
- "w-24 h-24 rounded-lg flex items-center justify-center text-4xl font-bold text-white mb-6",
102
- docInfo.color
103
- ),
104
- children: docInfo.icon
105
- }
106
- ),
107
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold text-foreground mb-2", children: fileName }),
108
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-6", children: t(docInfo.labelKey) }),
109
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-amber-600 dark:text-amber-400 mb-6", children: [
110
- /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "w-4 h-4" }),
111
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("preview_unavailable") })
112
- ] }),
113
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
114
- "button",
115
- {
116
- onClick: handleDownload,
117
- className: "flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors",
118
- children: [
119
- /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "w-4 h-4" }),
120
- t("download")
121
- ]
122
- }
123
- ) }),
124
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground mt-8 max-w-md", children: t("help_text") })
125
- ]
126
- }
127
- );
128
- }
129
-
130
- const EXTENSION_TO_TYPE = {
131
- docx: {
132
- type: "word",
133
- icon: FileText,
134
- label: "Word Document",
135
- color: "text-blue-500"
136
- },
137
- doc: {
138
- type: "word",
139
- icon: FileText,
140
- label: "Word Document",
141
- color: "text-blue-500"
142
- },
143
- xlsx: {
144
- type: "excel",
145
- icon: FileSpreadsheet,
146
- label: "Excel Spreadsheet",
147
- color: "text-green-500"
148
- },
149
- xls: {
150
- type: "excel",
151
- icon: FileSpreadsheet,
152
- label: "Excel Spreadsheet",
153
- color: "text-green-500"
154
- },
155
- pptx: {
156
- type: "powerpoint",
157
- icon: Presentation,
158
- label: "PowerPoint",
159
- color: "text-primary"
160
- },
161
- ppt: {
162
- type: "powerpoint",
163
- icon: Presentation,
164
- label: "PowerPoint",
165
- color: "text-primary"
166
- },
167
- odt: {
168
- type: "opendocument",
169
- icon: FileText,
170
- label: "OpenDocument Text",
171
- color: "text-blue-400"
172
- },
173
- ods: {
174
- type: "opendocument",
175
- icon: FileSpreadsheet,
176
- label: "OpenDocument Spreadsheet",
177
- color: "text-green-400"
178
- },
179
- odp: {
180
- type: "opendocument",
181
- icon: Presentation,
182
- label: "OpenDocument Presentation",
183
- color: "text-primary"
184
- }
185
- };
186
- const DEFAULT_TYPE_CONFIG = {
187
- type: "unknown",
188
- icon: FileText,
189
- label: "Document",
190
- color: "text-muted-foreground"
191
- };
192
- function getFileExtension(fileName) {
193
- const ext = fileName.split(".").pop()?.toLowerCase() || "";
194
- return ext;
195
- }
196
- function getDocTypeConfig(fileName) {
197
- const ext = getFileExtension(fileName);
198
- return EXTENSION_TO_TYPE[ext] || DEFAULT_TYPE_CONFIG;
199
- }
200
- function formatFileSize(bytes) {
201
- if (!bytes) return "";
202
- if (bytes < 1024) return `${bytes} B`;
203
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
204
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
205
- }
206
- function DocViewerPlugin({
207
- context,
208
- tabId,
209
- setDirty,
210
- setTitle
211
- }) {
212
- const { t } = useI18n("doc_viewer");
213
- const [error, setError] = reactExports.useState(null);
214
- const fileName = context.resourceName || context.resourcePath || "Document";
215
- const fileExtension = getFileExtension(fileName);
216
- const docTypeConfig = reactExports.useMemo(() => getDocTypeConfig(fileName), [fileName]);
217
- const fileSize = context.customData?.size;
218
- reactExports.useEffect(() => {
219
- setTitle(fileName);
220
- }, [fileName, setTitle]);
221
- reactExports.useEffect(() => {
222
- setError(null);
223
- }, [context.resourceId]);
224
- const handleRenderError = reactExports.useCallback((err) => {
225
- setError(err);
226
- }, []);
227
- const handleDownload = reactExports.useCallback(() => {
228
- if (!context.resourceId) return;
229
- (async () => {
230
- try {
231
- const { downloadFileById } = await __vitePreload(async () => { const { downloadFileById } = await import('./index-D_E4281X.js').then(n => n.ep);return { downloadFileById }},true?__vite__mapDeps([0,1]):void 0);
232
- await downloadFileById(context.resourceId, fileName);
233
- } catch (err) {
234
- console.error("Failed to download document:", err);
235
- setError("Failed to download document");
236
- }
237
- })();
238
- }, [context.resourceId, fileName]);
239
- const IconComponent = docTypeConfig.icon;
240
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-background", children: [
241
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-border bg-muted/30", children: [
242
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
243
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconComponent, { className: cn("w-4 h-4", docTypeConfig.color) }),
244
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-foreground", children: fileName }),
245
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-muted text-muted-foreground uppercase", children: fileExtension }),
246
- fileSize && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: formatFileSize(fileSize) })
247
- ] }),
248
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
249
- "button",
250
- {
251
- onClick: handleDownload,
252
- className: "p-2 rounded hover:bg-accent transition-colors text-muted-foreground hover:text-foreground",
253
- title: t("download_document"),
254
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Download, { className: "w-4 h-4" })
255
- }
256
- ) })
257
- ] }),
258
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-hidden", children: context.resourceId ? /* @__PURE__ */ jsxRuntimeExports.jsx(
259
- OfficeRenderer,
260
- {
261
- src: "",
262
- fileName,
263
- fileType: fileExtension,
264
- onError: handleRenderError,
265
- onDownload: handleDownload
266
- }
267
- ) : (
268
- // No document selected
269
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-center p-8", children: [
270
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconComponent, { className: cn("w-16 h-16 mb-4", docTypeConfig.color) }),
271
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-medium text-foreground mb-2", children: "No document selected" }),
272
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Select a document file to view it here" })
273
- ] })
274
- ) })
275
- ] });
276
- }
277
-
278
- export { DocViewerPlugin as default };