@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,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 };