@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.
Files changed (202) hide show
  1. package/README.md +385 -104
  2. package/bin/ds.js +1241 -110
  3. package/docs/en/00_QUICK_START.md +100 -19
  4. package/docs/en/01_SETTINGS_REFERENCE.md +34 -1
  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 +25 -8
  9. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
  10. package/docs/en/15_CODEX_PROVIDER_SETUP.md +37 -11
  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/21_LOCAL_MODEL_BACKENDS_GUIDE.md +283 -0
  15. package/docs/en/91_DEVELOPMENT.md +237 -0
  16. package/docs/en/README.md +24 -2
  17. package/docs/zh/00_QUICK_START.md +89 -19
  18. package/docs/zh/01_SETTINGS_REFERENCE.md +34 -1
  19. package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
  20. package/docs/zh/05_TUI_GUIDE.md +6 -0
  21. package/docs/zh/09_DOCTOR.md +26 -9
  22. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
  23. package/docs/zh/15_CODEX_PROVIDER_SETUP.md +37 -11
  24. package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  25. package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
  26. package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
  27. package/docs/zh/21_LOCAL_MODEL_BACKENDS_GUIDE.md +281 -0
  28. package/docs/zh/README.md +24 -2
  29. package/install.sh +46 -4
  30. package/package.json +2 -1
  31. package/pyproject.toml +1 -1
  32. package/src/deepscientist/__init__.py +1 -1
  33. package/src/deepscientist/acp/envelope.py +6 -0
  34. package/src/deepscientist/artifact/service.py +647 -22
  35. package/src/deepscientist/bash_exec/service.py +234 -9
  36. package/src/deepscientist/bridges/connectors.py +8 -2
  37. package/src/deepscientist/cli.py +115 -19
  38. package/src/deepscientist/codex_cli_compat.py +367 -22
  39. package/src/deepscientist/config/models.py +2 -1
  40. package/src/deepscientist/config/service.py +183 -13
  41. package/src/deepscientist/daemon/api/handlers.py +255 -31
  42. package/src/deepscientist/daemon/api/router.py +9 -0
  43. package/src/deepscientist/daemon/app.py +1146 -105
  44. package/src/deepscientist/diagnostics/__init__.py +6 -0
  45. package/src/deepscientist/diagnostics/runner_failures.py +130 -0
  46. package/src/deepscientist/doctor.py +207 -3
  47. package/src/deepscientist/gitops/__init__.py +10 -1
  48. package/src/deepscientist/gitops/diff.py +129 -0
  49. package/src/deepscientist/gitops/service.py +4 -1
  50. package/src/deepscientist/mcp/server.py +39 -0
  51. package/src/deepscientist/prompts/builder.py +275 -34
  52. package/src/deepscientist/quest/layout.py +15 -2
  53. package/src/deepscientist/quest/service.py +707 -55
  54. package/src/deepscientist/quest/stage_views.py +6 -1
  55. package/src/deepscientist/runners/codex.py +143 -43
  56. package/src/deepscientist/shared.py +19 -0
  57. package/src/deepscientist/skills/__init__.py +2 -2
  58. package/src/deepscientist/skills/installer.py +196 -5
  59. package/src/deepscientist/skills/registry.py +66 -0
  60. package/src/prompts/connectors/qq.md +18 -8
  61. package/src/prompts/connectors/weixin.md +16 -6
  62. package/src/prompts/contracts/shared_interaction.md +14 -2
  63. package/src/prompts/system.md +23 -5
  64. package/src/prompts/system_copilot.md +56 -0
  65. package/src/skills/analysis-campaign/SKILL.md +1 -0
  66. package/src/skills/baseline/SKILL.md +8 -0
  67. package/src/skills/decision/SKILL.md +8 -0
  68. package/src/skills/experiment/SKILL.md +8 -0
  69. package/src/skills/figure-polish/SKILL.md +1 -0
  70. package/src/skills/finalize/SKILL.md +1 -0
  71. package/src/skills/idea/SKILL.md +1 -0
  72. package/src/skills/intake-audit/SKILL.md +8 -0
  73. package/src/skills/mentor/SKILL.md +217 -0
  74. package/src/skills/mentor/references/correction-rules.md +210 -0
  75. package/src/skills/mentor/references/knowledge-profile.md +91 -0
  76. package/src/skills/mentor/references/persona-profile.md +138 -0
  77. package/src/skills/mentor/references/taste-profile.md +128 -0
  78. package/src/skills/mentor/references/thought-style-profile.md +138 -0
  79. package/src/skills/mentor/references/work-profile.md +289 -0
  80. package/src/skills/mentor/references/workflow-profile.md +240 -0
  81. package/src/skills/optimize/SKILL.md +1 -0
  82. package/src/skills/rebuttal/SKILL.md +1 -0
  83. package/src/skills/review/SKILL.md +1 -0
  84. package/src/skills/scout/SKILL.md +8 -0
  85. package/src/skills/write/SKILL.md +1 -0
  86. package/src/tui/dist/app/AppContainer.js +19 -11
  87. package/src/tui/dist/index.js +4 -1
  88. package/src/tui/dist/lib/api.js +33 -3
  89. package/src/tui/package.json +1 -1
  90. package/src/ui/dist/assets/AiManusChatView-Bv-Z8YpU.js +204 -0
  91. package/src/ui/dist/assets/AnalysisPlugin-BCKAfjba.js +1 -0
  92. package/src/ui/dist/assets/CliPlugin-BCKcpc35.js +109 -0
  93. package/src/ui/dist/assets/CodeEditorPlugin-DbOfSJ8K.js +2 -0
  94. package/src/ui/dist/assets/CodeViewerPlugin-CbaFRrUU.js +270 -0
  95. package/src/ui/dist/assets/DocViewerPlugin-DAjLVeQD.js +7 -0
  96. package/src/ui/dist/assets/GitCommitViewerPlugin-CIUqbUDO.js +1 -0
  97. package/src/ui/dist/assets/GitDiffViewerPlugin-CQACjoAA.js +6 -0
  98. package/src/ui/dist/assets/GitSnapshotViewer-0r4nLPke.js +30 -0
  99. package/src/ui/dist/assets/ImageViewerPlugin-nBOmI2v_.js +26 -0
  100. package/src/ui/dist/assets/LabCopilotPanel-BHxOxF4z.js +14 -0
  101. package/src/ui/dist/assets/LabPlugin-BKoZGs95.js +22 -0
  102. package/src/ui/dist/assets/LatexPlugin-ZwtV8pIp.js +25 -0
  103. package/src/ui/dist/assets/MarkdownViewerPlugin-DKqVfKyW.js +128 -0
  104. package/src/ui/dist/assets/MarketplacePlugin-BwxStZ9D.js +13 -0
  105. package/src/ui/dist/assets/NotebookEditor-BEQhaQbt.js +81 -0
  106. package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
  107. package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
  108. package/src/ui/dist/assets/NotebookEditor-DB9N_T9q.js +361 -0
  109. package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
  110. package/src/ui/dist/assets/PdfLoader-eWBONbQP.js +16 -0
  111. package/src/ui/dist/assets/PdfMarkdownPlugin-D22YOZL3.js +1 -0
  112. package/src/ui/dist/assets/PdfViewerPlugin-c-RK9DLM.js +17 -0
  113. package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
  114. package/src/ui/dist/assets/SearchPlugin-CxF9ytAx.js +16 -0
  115. package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
  116. package/src/ui/dist/assets/TextViewerPlugin-C5xqeeUH.js +54 -0
  117. package/src/ui/dist/assets/VNCViewer-BoLGLnHz.js +11 -0
  118. package/src/ui/dist/assets/bot-DREQOxzP.js +6 -0
  119. package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
  120. package/src/ui/dist/assets/chevron-up-C9Qpx4DE.js +6 -0
  121. package/src/ui/dist/assets/code-WlFHE7z_.js +6 -0
  122. package/src/ui/dist/assets/file-content-BZMz3RYp.js +1 -0
  123. package/src/ui/dist/assets/file-diff-panel-CQhw0jS2.js +1 -0
  124. package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
  125. package/src/ui/dist/assets/file-socket-CfQPKQKj.js +1 -0
  126. package/src/ui/dist/assets/git-commit-horizontal-DxZ8DCZh.js +6 -0
  127. package/src/ui/dist/assets/image-Bgl4VIyx.js +6 -0
  128. package/src/ui/dist/assets/index-BpV6lusQ.css +33 -0
  129. package/src/ui/dist/assets/index-CBNVuWcP.js +2496 -0
  130. package/src/ui/dist/assets/index-CwNu1aH4.js +11 -0
  131. package/src/ui/dist/assets/index-DrUnlf6K.js +1 -0
  132. package/src/ui/dist/assets/index-NW-h8VzN.js +1 -0
  133. package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
  134. package/src/ui/dist/assets/pdf-effect-queue-J8OnM0jE.js +6 -0
  135. package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
  136. package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
  137. package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
  138. package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
  139. package/src/ui/dist/assets/popover-CLc0pPP8.js +1 -0
  140. package/src/ui/dist/assets/project-sync-C9IdzdZW.js +1 -0
  141. package/src/ui/dist/assets/select-Cs2PmzwL.js +11 -0
  142. package/src/ui/dist/assets/sigma-ClKcHAXm.js +6 -0
  143. package/src/ui/dist/assets/trash-DwpbFr3w.js +11 -0
  144. package/src/ui/dist/assets/useCliAccess-NQ8m0Let.js +1 -0
  145. package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
  146. package/src/ui/dist/assets/wrap-text-BC-Hltpd.js +11 -0
  147. package/src/ui/dist/assets/zoom-out-E_gaeAxL.js +11 -0
  148. package/src/ui/dist/index.html +5 -2
  149. package/src/ui/dist/assets/AiManusChatView-DDjbFnbt.js +0 -26597
  150. package/src/ui/dist/assets/AnalysisPlugin-Yb5IdmaU.js +0 -123
  151. package/src/ui/dist/assets/CliPlugin-e64sreyu.js +0 -31037
  152. package/src/ui/dist/assets/CodeEditorPlugin-C4D2TIkU.js +0 -427
  153. package/src/ui/dist/assets/CodeViewerPlugin-BVoNZIvC.js +0 -905
  154. package/src/ui/dist/assets/DocViewerPlugin-CLChbllo.js +0 -278
  155. package/src/ui/dist/assets/GitDiffViewerPlugin-C4xeFyFQ.js +0 -2661
  156. package/src/ui/dist/assets/ImageViewerPlugin-OiMUAcLi.js +0 -500
  157. package/src/ui/dist/assets/LabCopilotPanel-BjD2ThQF.js +0 -4104
  158. package/src/ui/dist/assets/LabPlugin-DQPg-NrB.js +0 -2677
  159. package/src/ui/dist/assets/LatexPlugin-CI05XAV9.js +0 -1792
  160. package/src/ui/dist/assets/MarkdownViewerPlugin-DpeBLYZf.js +0 -308
  161. package/src/ui/dist/assets/MarketplacePlugin-DolE58Q2.js +0 -413
  162. package/src/ui/dist/assets/NotebookEditor-7Qm2rSWD.js +0 -4214
  163. package/src/ui/dist/assets/NotebookEditor-C1kWaxKi.js +0 -84873
  164. package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
  165. package/src/ui/dist/assets/PdfLoader-BfOHw8Zw.js +0 -25468
  166. package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
  167. package/src/ui/dist/assets/PdfMarkdownPlugin-BulDREv1.js +0 -409
  168. package/src/ui/dist/assets/PdfViewerPlugin-C-daaOaL.js +0 -3095
  169. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
  170. package/src/ui/dist/assets/SearchPlugin-CjpaiJ3A.js +0 -741
  171. package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
  172. package/src/ui/dist/assets/TextViewerPlugin-BxIyqPQC.js +0 -472
  173. package/src/ui/dist/assets/VNCViewer-HAg9mF7M.js +0 -18821
  174. package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
  175. package/src/ui/dist/assets/bot-0DYntytV.js +0 -21
  176. package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
  177. package/src/ui/dist/assets/code-B20Slj_w.js +0 -17
  178. package/src/ui/dist/assets/file-content-DT24KFma.js +0 -377
  179. package/src/ui/dist/assets/file-diff-panel-DK13YPql.js +0 -92
  180. package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
  181. package/src/ui/dist/assets/file-socket-B4T2o4nR.js +0 -58
  182. package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
  183. package/src/ui/dist/assets/image-DSeR_sDS.js +0 -18
  184. package/src/ui/dist/assets/index-BrFje2Uk.js +0 -120
  185. package/src/ui/dist/assets/index-BwRJaoTl.js +0 -25
  186. package/src/ui/dist/assets/index-D_E4281X.js +0 -221322
  187. package/src/ui/dist/assets/index-DnYB3xb1.js +0 -159
  188. package/src/ui/dist/assets/index-G7AcWcMu.css +0 -12594
  189. package/src/ui/dist/assets/monaco-LExaAN3Y.js +0 -623
  190. package/src/ui/dist/assets/pdf-effect-queue-BJk5okWJ.js +0 -47
  191. package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
  192. package/src/ui/dist/assets/popover-D3Gg_FoV.js +0 -476
  193. package/src/ui/dist/assets/project-sync-C_ygLlVU.js +0 -297
  194. package/src/ui/dist/assets/select-CpAK6uWm.js +0 -1690
  195. package/src/ui/dist/assets/sigma-DEccaSgk.js +0 -22
  196. package/src/ui/dist/assets/square-check-big-uUfyVsbD.js +0 -17
  197. package/src/ui/dist/assets/trash-CXvwwSe8.js +0 -32
  198. package/src/ui/dist/assets/useCliAccess-Bnop4mgR.js +0 -957
  199. package/src/ui/dist/assets/useFileDiffOverlay-B8eUAX0I.js +0 -53
  200. package/src/ui/dist/assets/wrap-text-9vbOBpkW.js +0 -35
  201. package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
  202. 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 };