@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,413 +0,0 @@
1
- import { w as createLucideIcon, r as reactExports, aa as useNavigate, n as useTabsStore, ab as useOpenFile, f as useFileTreeStore, v as BUILTIN_PLUGINS, j as jsxRuntimeExports, l as Search, N as Sparkles, ac as Terminal, ad as Settings, ae as Puzzle, af as BookOpen, k as FileText, ag as FileCode2, b as cn } from './index-D_E4281X.js';
2
- import { S as Sigma } from './sigma-DEccaSgk.js';
3
- import { I as Image } from './image-DSeR_sDS.js';
4
-
5
- /**
6
- * @license lucide-react v0.511.0 - ISC
7
- *
8
- * This source code is licensed under the ISC license.
9
- * See the LICENSE file in the root directory of this source tree.
10
- */
11
-
12
-
13
- const __iconNode$1 = [
14
- ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
15
- ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
16
- ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
17
- ];
18
- const CodeXml = createLucideIcon("code-xml", __iconNode$1);
19
-
20
- /**
21
- * @license lucide-react v0.511.0 - ISC
22
- *
23
- * This source code is licensed under the ISC license.
24
- * See the LICENSE file in the root directory of this source tree.
25
- */
26
-
27
-
28
- const __iconNode = [
29
- ["path", { d: "M15 12h-5", key: "r7krc0" }],
30
- ["path", { d: "M15 8h-5", key: "1khuty" }],
31
- ["path", { d: "M19 17V5a2 2 0 0 0-2-2H4", key: "zz82l3" }],
32
- [
33
- "path",
34
- {
35
- d: "M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",
36
- key: "1ph1d7"
37
- }
38
- ]
39
- ];
40
- const ScrollText = createLucideIcon("scroll-text", __iconNode);
41
-
42
- function getProjectIdFromContext(context) {
43
- const projectId = context.customData?.projectId;
44
- return typeof projectId === "string" ? projectId : null;
45
- }
46
- function ensureExtension(fileName, ext) {
47
- const trimmed = fileName.trim();
48
- if (!trimmed) return trimmed;
49
- if (trimmed.includes(".")) return trimmed;
50
- return `${trimmed}${ext}`;
51
- }
52
- function buildNotebookSeedFile(name) {
53
- const finalName = ensureExtension(name, ".md");
54
- const title = finalName.replace(/\.md$/i, "");
55
- const content = `# ${title}
56
-
57
- `;
58
- return new File([content], finalName, { type: "text/markdown" });
59
- }
60
- function buildSeedName(prefix) {
61
- const stamp = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
62
- const suffix = Math.random().toString(36).slice(2, 6);
63
- return `${prefix}-${stamp}-${suffix}`;
64
- }
65
- const workspaceTools = [
66
- {
67
- id: BUILTIN_PLUGINS.SEARCH,
68
- title: "Search",
69
- description: "Find files by name or path.",
70
- icon: Search,
71
- badge: "tool",
72
- requiresProject: true
73
- },
74
- {
75
- id: "@ds/plugin-analysis",
76
- title: "Analysis",
77
- description: "Reusable prompts and analysis recipes.",
78
- icon: Sparkles,
79
- badge: "tool",
80
- requiresProject: true
81
- },
82
- {
83
- id: BUILTIN_PLUGINS.CLI,
84
- title: "CLI",
85
- description: "Remote CLI sessions and agent tooling.",
86
- icon: Terminal,
87
- badge: "tool",
88
- requiresProject: true
89
- },
90
- {
91
- id: BUILTIN_PLUGINS.SETTINGS,
92
- title: "Settings",
93
- description: "Quest-focused settings and workspace preferences.",
94
- icon: Settings,
95
- badge: "system"
96
- },
97
- {
98
- id: "@ds/plugin-marketplace",
99
- title: "Plugin Marketplace",
100
- description: "Browse and organize installed plugins.",
101
- icon: Puzzle,
102
- badge: "system"
103
- }
104
- ];
105
- const authoringTools = [
106
- {
107
- id: BUILTIN_PLUGINS.NOTEBOOK,
108
- title: "Notebook",
109
- description: "Create a new markdown notebook file.",
110
- icon: BookOpen,
111
- badge: "authoring",
112
- requiresProject: true,
113
- openLabel: "New"
114
- },
115
- {
116
- id: BUILTIN_PLUGINS.LATEX,
117
- title: "LaTeX",
118
- description: "Create a new LaTeX project folder.",
119
- icon: Sigma,
120
- badge: "authoring",
121
- requiresProject: true,
122
- openLabel: "New"
123
- }
124
- ];
125
- const pdfTools = [
126
- {
127
- id: BUILTIN_PLUGINS.PDF_VIEWER,
128
- title: "PDF Viewer",
129
- description: "View and annotate PDFs with highlights.",
130
- icon: FileText,
131
- badge: "pdf",
132
- openMode: "disabled",
133
- openLabel: "Auto",
134
- disabledReason: "Opens when you select a PDF file."
135
- },
136
- {
137
- id: BUILTIN_PLUGINS.PDF_MARKDOWN,
138
- title: "PDF Markdown",
139
- description: "Read MinerU Markdown output from PDFs.",
140
- icon: FileCode2,
141
- badge: "pdf",
142
- openMode: "disabled",
143
- openLabel: "Auto",
144
- disabledReason: "Opens after selecting a PDF and switching to Markdown view."
145
- }
146
- ];
147
- const fileViewers = [
148
- {
149
- id: BUILTIN_PLUGINS.CODE_EDITOR,
150
- title: "Code Editor",
151
- description: "Monaco editor with autosave.",
152
- icon: CodeXml,
153
- badge: "viewer",
154
- openMode: "disabled",
155
- openLabel: "Auto",
156
- disabledReason: "Opens when you select a code file."
157
- },
158
- {
159
- id: BUILTIN_PLUGINS.CODE_VIEWER,
160
- title: "Code Viewer",
161
- description: "Read-only viewer with syntax highlighting.",
162
- icon: CodeXml,
163
- badge: "viewer",
164
- openMode: "disabled",
165
- openLabel: "Auto",
166
- disabledReason: "Opens when you select a supported code file."
167
- },
168
- {
169
- id: BUILTIN_PLUGINS.MARKDOWN_VIEWER,
170
- title: "Markdown Viewer",
171
- description: "Render Markdown with GFM + math.",
172
- icon: ScrollText,
173
- badge: "viewer",
174
- openMode: "disabled",
175
- openLabel: "Auto",
176
- disabledReason: "Opens when you select a Markdown file."
177
- },
178
- {
179
- id: BUILTIN_PLUGINS.TEXT_VIEWER,
180
- title: "Text Viewer",
181
- description: "Plain text viewer with search tools.",
182
- icon: FileText,
183
- badge: "viewer",
184
- openMode: "disabled",
185
- openLabel: "Auto",
186
- disabledReason: "Opens when you select a text file."
187
- },
188
- {
189
- id: BUILTIN_PLUGINS.IMAGE_VIEWER,
190
- title: "Image Viewer",
191
- description: "Zoom, pan, and inspect images.",
192
- icon: Image,
193
- badge: "viewer",
194
- openMode: "disabled",
195
- openLabel: "Auto",
196
- disabledReason: "Opens when you select an image file."
197
- },
198
- {
199
- id: "@ds/plugin-doc-viewer",
200
- title: "Document Viewer",
201
- description: "Preview Word, Excel, and PowerPoint files.",
202
- icon: FileText,
203
- badge: "viewer",
204
- openMode: "disabled",
205
- openLabel: "Auto",
206
- disabledReason: "Opens when you select a document file."
207
- }
208
- ];
209
- const integrations = [
210
- {
211
- id: "panel:arxiv",
212
- title: "ArXiv Import",
213
- description: "Import papers from arXiv into your workspace.",
214
- icon: BookOpen,
215
- badge: "integration",
216
- openMode: "disabled",
217
- openLabel: "Use sidebar",
218
- disabledReason: "Use the ArXiv panel in the left sidebar."
219
- }
220
- ];
221
- const pluginSections = [
222
- {
223
- id: "workspace-tools",
224
- title: "Workspace tools",
225
- subtitle: "Openable as tabs",
226
- plugins: workspaceTools
227
- },
228
- {
229
- id: "authoring",
230
- title: "Authoring",
231
- subtitle: "Notes and documents",
232
- plugins: authoringTools
233
- },
234
- {
235
- id: "pdf-tools",
236
- title: "PDF workflow",
237
- subtitle: "View, extract, and publish",
238
- plugins: pdfTools
239
- },
240
- {
241
- id: "file-viewers",
242
- title: "Viewers & editors",
243
- subtitle: "Auto-picked based on file type",
244
- plugins: fileViewers
245
- },
246
- {
247
- id: "integrations",
248
- title: "Integrations",
249
- subtitle: "External sources",
250
- plugins: integrations
251
- }
252
- ];
253
- function MarketplacePlugin({ context, setTitle }) {
254
- reactExports.useEffect(() => setTitle("Plugin Marketplace"), [setTitle]);
255
- const navigate = useNavigate();
256
- const openTab = useTabsStore((s) => s.openTab);
257
- const { openFileInTab } = useOpenFile();
258
- const storeProjectId = useFileTreeStore((s) => s.projectId);
259
- const loadFiles = useFileTreeStore((s) => s.loadFiles);
260
- const upload = useFileTreeStore((s) => s.upload);
261
- const createLatexProject = useFileTreeStore((s) => s.createLatexProject);
262
- const highlightFile = useFileTreeStore((s) => s.highlightFile);
263
- const projectId = getProjectIdFromContext(context);
264
- const ensureProjectReady = reactExports.useCallback(async () => {
265
- if (!projectId) return false;
266
- if (storeProjectId !== projectId) {
267
- await loadFiles(projectId);
268
- }
269
- return true;
270
- }, [loadFiles, projectId, storeProjectId]);
271
- const handleOpen = reactExports.useCallback(
272
- async (card) => {
273
- if (card.openMode === "disabled") return;
274
- if (card.requiresProject && !projectId) return;
275
- if (card.id === BUILTIN_PLUGINS.SETTINGS) {
276
- navigate("/settings");
277
- return;
278
- }
279
- if (card.id === BUILTIN_PLUGINS.NOTEBOOK) {
280
- try {
281
- const ready = await ensureProjectReady();
282
- if (!ready || !projectId) return;
283
- const fileName = buildSeedName("Notebook");
284
- const file = buildNotebookSeedFile(fileName);
285
- const created = await upload(null, [file]);
286
- const createdFile = created.find((node) => node.type === "file") || created[0];
287
- if (createdFile) {
288
- highlightFile(createdFile.id);
289
- await openFileInTab(createdFile, { customData: { projectId } });
290
- }
291
- } catch (error) {
292
- console.error("[MarketplacePlugin] Failed to create notebook file:", error);
293
- }
294
- return;
295
- }
296
- if (card.id === BUILTIN_PLUGINS.LATEX) {
297
- try {
298
- const ready = await ensureProjectReady();
299
- if (!ready || !projectId) return;
300
- const folderName = buildSeedName("LaTeX");
301
- const folder = await createLatexProject(null, folderName);
302
- highlightFile(folder.id);
303
- openTab({
304
- pluginId: card.id,
305
- context: {
306
- type: "custom",
307
- resourceId: folder.id,
308
- resourceName: folder.name,
309
- customData: {
310
- projectId,
311
- latexFolderId: folder.id,
312
- mainFileId: folder.latex?.mainFileId ?? null
313
- }
314
- },
315
- title: folder.name
316
- });
317
- } catch (error) {
318
- console.error("[MarketplacePlugin] Failed to create LaTeX project:", error);
319
- }
320
- return;
321
- }
322
- const contextData = {
323
- type: card.contextType ?? "custom",
324
- resourceName: card.resourceName ?? card.title,
325
- resourcePath: card.resourcePath,
326
- mimeType: card.mimeType,
327
- customData: projectId ? { projectId, ...card.customData ?? {} } : card.customData
328
- };
329
- openTab({
330
- pluginId: card.id,
331
- context: contextData,
332
- title: card.tabTitle ?? card.resourceName ?? card.title
333
- });
334
- },
335
- [
336
- createLatexProject,
337
- ensureProjectReady,
338
- highlightFile,
339
- openFileInTab,
340
- openTab,
341
- projectId,
342
- upload,
343
- navigate
344
- ]
345
- );
346
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-5xl", children: [
347
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-4", children: [
348
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
349
- /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: "Plugin Marketplace" }),
350
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: "Browse built-in plugins and jump straight in. File-based viewers open automatically when you select a file." })
351
- ] }),
352
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "hidden sm:flex items-center gap-2 text-xs text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "px-2 py-1 rounded-full border border-border bg-muted/30", children: "Built-in" }) })
353
- ] }),
354
- pluginSections.map((section) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-8", children: [
355
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
356
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-sm font-semibold text-foreground", children: section.title }),
357
- section.subtitle ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: section.subtitle }) : null
358
- ] }),
359
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-3 grid grid-cols-1 md:grid-cols-2 gap-4", children: section.plugins.map((plugin) => {
360
- const Icon = plugin.icon;
361
- const isCurrent = plugin.id === "@ds/plugin-marketplace";
362
- const missingProject = plugin.requiresProject && !projectId;
363
- const showButton = plugin.openMode !== "disabled" || missingProject;
364
- const isDisabled = isCurrent || missingProject;
365
- const buttonLabel = isCurrent ? "You're here" : missingProject ? "Requires project" : plugin.openLabel ?? "Open";
366
- const helperText = missingProject ? "Open a project to use this plugin." : plugin.disabledReason;
367
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
368
- "div",
369
- {
370
- className: cn(
371
- "rounded-2xl border border-border bg-card/90 backdrop-blur p-5",
372
- "shadow-sm hover:shadow-md transition-shadow"
373
- ),
374
- children: [
375
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-4", children: [
376
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3 min-w-0", children: [
377
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-flex h-10 w-10 items-center justify-center rounded-xl bg-muted text-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { className: "h-5 w-5" }) }),
378
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
379
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold text-foreground", children: plugin.title }),
380
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: plugin.description }),
381
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 text-[11px] font-mono text-muted-foreground truncate", children: plugin.id })
382
- ] })
383
- ] }),
384
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 px-2 py-1 rounded-full border border-border bg-muted/30 text-[10px] text-muted-foreground", children: plugin.badge ?? "built-in" })
385
- ] }),
386
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4", children: [
387
- showButton ? /* @__PURE__ */ jsxRuntimeExports.jsx(
388
- "button",
389
- {
390
- type: "button",
391
- onClick: () => void handleOpen(plugin),
392
- disabled: isDisabled,
393
- className: cn(
394
- "inline-flex items-center justify-center px-3 py-1.5 rounded-xl text-sm",
395
- "border border-border bg-background hover:bg-accent/40 transition-colors text-foreground",
396
- isDisabled && "opacity-50 cursor-not-allowed"
397
- ),
398
- children: buttonLabel
399
- }
400
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-flex items-center px-3 py-1.5 rounded-xl text-xs border border-border bg-muted/30 text-muted-foreground", children: plugin.openLabel ?? "Auto" }),
401
- helperText ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-2 text-[11px] text-muted-foreground", children: helperText }) : null
402
- ] })
403
- ]
404
- },
405
- plugin.id
406
- );
407
- }) })
408
- ] }, section.id)),
409
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-8 text-xs text-muted-foreground", children: "Want external plugins? That's next: sandboxing, permissions, and a loader that can fetch + verify bundles." })
410
- ] }) });
411
- }
412
-
413
- export { MarketplacePlugin as default };