@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,905 +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 { u as useI18n, a as useWorkspaceSurfaceStore, r as reactExports, c as copyToClipboard, j as jsxRuntimeExports, L as LoaderCircle, C as CircleAlert, F as FileCode, E as Eye, b as cn, d as Check, e as Copy, _ as __vitePreload } from './index-D_E4281X.js';
3
- import { c as consumeFileJumpEffects } from './file-jump-queue-r5XKgJEV.js';
4
- import { C as Code } from './code-B20Slj_w.js';
5
- import { H as Hash, W as WrapText } from './wrap-text-9vbOBpkW.js';
6
-
7
- const EXTENSION_TO_LANGUAGE = {
8
- // JavaScript/TypeScript
9
- ".js": "javascript",
10
- ".jsx": "javascript",
11
- ".mjs": "javascript",
12
- ".ts": "typescript",
13
- ".tsx": "typescript",
14
- ".mts": "typescript",
15
- // Python
16
- ".py": "python",
17
- ".pyw": "python",
18
- ".pyi": "python",
19
- // JSON
20
- ".json": "json",
21
- ".jsonc": "json",
22
- ".json5": "json",
23
- // Web
24
- ".html": "html",
25
- ".htm": "html",
26
- ".css": "css",
27
- ".scss": "scss",
28
- ".sass": "sass",
29
- ".less": "less",
30
- // Config
31
- ".yaml": "yaml",
32
- ".yml": "yaml",
33
- ".toml": "toml",
34
- ".ini": "ini",
35
- ".cfg": "ini",
36
- ".conf": "ini",
37
- // Shell
38
- ".sh": "bash",
39
- ".bash": "bash",
40
- ".zsh": "zsh",
41
- ".fish": "fish",
42
- // SQL
43
- ".sql": "sql",
44
- // XML
45
- ".xml": "xml",
46
- ".xsl": "xml",
47
- ".xslt": "xml",
48
- ".svg": "xml",
49
- // Go
50
- ".go": "go",
51
- // Rust
52
- ".rs": "rust",
53
- // C/C++
54
- ".c": "c",
55
- ".h": "c",
56
- ".cpp": "cpp",
57
- ".cc": "cpp",
58
- ".cxx": "cpp",
59
- ".hpp": "cpp",
60
- ".hxx": "cpp",
61
- // Java
62
- ".java": "java",
63
- // C#
64
- ".cs": "csharp",
65
- // PHP
66
- ".php": "php",
67
- // Ruby
68
- ".rb": "ruby",
69
- // Swift
70
- ".swift": "swift",
71
- // Kotlin
72
- ".kt": "kotlin",
73
- ".kts": "kotlin",
74
- // Markdown
75
- ".md": "markdown",
76
- ".markdown": "markdown"
77
- };
78
- function getLanguageFromPath(path) {
79
- const ext = path.substring(path.lastIndexOf(".")).toLowerCase();
80
- return EXTENSION_TO_LANGUAGE[ext] || "plaintext";
81
- }
82
- function isHtmlLanguage(language) {
83
- return language === "html";
84
- }
85
- const KEYWORDS = {
86
- javascript: [
87
- "const",
88
- "let",
89
- "var",
90
- "function",
91
- "return",
92
- "if",
93
- "else",
94
- "for",
95
- "while",
96
- "do",
97
- "switch",
98
- "case",
99
- "break",
100
- "continue",
101
- "default",
102
- "class",
103
- "extends",
104
- "new",
105
- "this",
106
- "super",
107
- "import",
108
- "export",
109
- "from",
110
- "as",
111
- "async",
112
- "await",
113
- "try",
114
- "catch",
115
- "finally",
116
- "throw",
117
- "typeof",
118
- "instanceof",
119
- "in",
120
- "of",
121
- "true",
122
- "false",
123
- "null",
124
- "undefined",
125
- "void"
126
- ],
127
- typescript: [
128
- "const",
129
- "let",
130
- "var",
131
- "function",
132
- "return",
133
- "if",
134
- "else",
135
- "for",
136
- "while",
137
- "do",
138
- "switch",
139
- "case",
140
- "break",
141
- "continue",
142
- "default",
143
- "class",
144
- "extends",
145
- "new",
146
- "this",
147
- "super",
148
- "import",
149
- "export",
150
- "from",
151
- "as",
152
- "async",
153
- "await",
154
- "try",
155
- "catch",
156
- "finally",
157
- "throw",
158
- "typeof",
159
- "instanceof",
160
- "in",
161
- "of",
162
- "true",
163
- "false",
164
- "null",
165
- "undefined",
166
- "void",
167
- "type",
168
- "interface",
169
- "enum",
170
- "namespace",
171
- "module",
172
- "declare",
173
- "abstract",
174
- "implements",
175
- "private",
176
- "protected",
177
- "public",
178
- "readonly",
179
- "static"
180
- ],
181
- python: [
182
- "def",
183
- "class",
184
- "if",
185
- "elif",
186
- "else",
187
- "for",
188
- "while",
189
- "try",
190
- "except",
191
- "finally",
192
- "with",
193
- "as",
194
- "import",
195
- "from",
196
- "return",
197
- "yield",
198
- "raise",
199
- "pass",
200
- "break",
201
- "continue",
202
- "and",
203
- "or",
204
- "not",
205
- "in",
206
- "is",
207
- "lambda",
208
- "True",
209
- "False",
210
- "None",
211
- "global",
212
- "nonlocal",
213
- "assert",
214
- "del"
215
- ],
216
- go: [
217
- "package",
218
- "import",
219
- "func",
220
- "return",
221
- "var",
222
- "const",
223
- "type",
224
- "struct",
225
- "interface",
226
- "map",
227
- "chan",
228
- "go",
229
- "defer",
230
- "if",
231
- "else",
232
- "for",
233
- "range",
234
- "switch",
235
- "case",
236
- "default",
237
- "break",
238
- "continue",
239
- "fallthrough",
240
- "select",
241
- "true",
242
- "false",
243
- "nil"
244
- ],
245
- rust: [
246
- "fn",
247
- "let",
248
- "mut",
249
- "const",
250
- "static",
251
- "if",
252
- "else",
253
- "match",
254
- "for",
255
- "while",
256
- "loop",
257
- "break",
258
- "continue",
259
- "return",
260
- "struct",
261
- "enum",
262
- "impl",
263
- "trait",
264
- "pub",
265
- "mod",
266
- "use",
267
- "as",
268
- "self",
269
- "super",
270
- "crate",
271
- "async",
272
- "await",
273
- "move",
274
- "ref",
275
- "true",
276
- "false",
277
- "where"
278
- ]
279
- // Add more as needed...
280
- };
281
- function tokenize(code, language) {
282
- const lines = code.split("\n");
283
- const keywords = KEYWORDS[language] || KEYWORDS.javascript || [];
284
- const keywordSet = new Set(keywords);
285
- return lines.map((line) => {
286
- const tokens = [];
287
- let remaining = line;
288
- while (remaining.length > 0) {
289
- const doubleStringMatch = remaining.match(/^"(?:[^"\\]|\\.)*"/);
290
- if (doubleStringMatch) {
291
- tokens.push({ type: "string", value: doubleStringMatch[0] });
292
- remaining = remaining.slice(doubleStringMatch[0].length);
293
- continue;
294
- }
295
- const singleStringMatch = remaining.match(/^'(?:[^'\\]|\\.)*'/);
296
- if (singleStringMatch) {
297
- tokens.push({ type: "string", value: singleStringMatch[0] });
298
- remaining = remaining.slice(singleStringMatch[0].length);
299
- continue;
300
- }
301
- const templateStringMatch = remaining.match(/^`(?:[^`\\]|\\.)*`/);
302
- if (templateStringMatch) {
303
- tokens.push({ type: "string", value: templateStringMatch[0] });
304
- remaining = remaining.slice(templateStringMatch[0].length);
305
- continue;
306
- }
307
- const commentMatch = remaining.match(/^(\/\/.*|#.*)$/);
308
- if (commentMatch) {
309
- tokens.push({ type: "comment", value: commentMatch[0] });
310
- remaining = "";
311
- continue;
312
- }
313
- const multiCommentMatch = remaining.match(/^\/\*.*?\*\//);
314
- if (multiCommentMatch) {
315
- tokens.push({ type: "comment", value: multiCommentMatch[0] });
316
- remaining = remaining.slice(multiCommentMatch[0].length);
317
- continue;
318
- }
319
- const numberMatch = remaining.match(/^-?\d+\.?\d*([eE][+-]?\d+)?/);
320
- if (numberMatch) {
321
- tokens.push({ type: "number", value: numberMatch[0] });
322
- remaining = remaining.slice(numberMatch[0].length);
323
- continue;
324
- }
325
- const wordMatch = remaining.match(/^[a-zA-Z_$][a-zA-Z0-9_$]*/);
326
- if (wordMatch) {
327
- const word = wordMatch[0];
328
- const nextChar = remaining[word.length];
329
- if (keywordSet.has(word)) {
330
- tokens.push({ type: "keyword", value: word });
331
- } else if (nextChar === "(") {
332
- tokens.push({ type: "function", value: word });
333
- } else {
334
- tokens.push({ type: "default", value: word });
335
- }
336
- remaining = remaining.slice(word.length);
337
- continue;
338
- }
339
- const operatorMatch = remaining.match(/^[+\-*/%=<>!&|^~?:]+/);
340
- if (operatorMatch) {
341
- tokens.push({ type: "operator", value: operatorMatch[0] });
342
- remaining = remaining.slice(operatorMatch[0].length);
343
- continue;
344
- }
345
- const punctMatch = remaining.match(/^[{}[\]();,.]/);
346
- if (punctMatch) {
347
- tokens.push({ type: "punctuation", value: punctMatch[0] });
348
- remaining = remaining.slice(punctMatch[0].length);
349
- continue;
350
- }
351
- tokens.push({ type: "default", value: remaining[0] });
352
- remaining = remaining.slice(1);
353
- }
354
- return tokens;
355
- });
356
- }
357
- const TOKEN_COLORS = {
358
- keyword: "text-purple-400",
359
- string: "text-green-400",
360
- comment: "text-gray-500 italic",
361
- number: "text-slate-200",
362
- function: "text-blue-400",
363
- operator: "text-pink-400",
364
- punctuation: "text-gray-400",
365
- default: "text-gray-100"
366
- };
367
- function CodeViewerPlugin({
368
- context,
369
- tabId,
370
- setDirty,
371
- setTitle
372
- }) {
373
- const { t } = useI18n("code_viewer");
374
- const updateWorkspaceTabState = useWorkspaceSurfaceStore((state) => state.updateTabState);
375
- const [content, setContent] = reactExports.useState("");
376
- const [loading, setLoading] = reactExports.useState(true);
377
- const [error, setError] = reactExports.useState(null);
378
- const [copied, setCopied] = reactExports.useState(false);
379
- const [showLineNumbers, setShowLineNumbers] = reactExports.useState(true);
380
- const [wordWrap, setWordWrap] = reactExports.useState(false);
381
- const [viewMode, setViewMode] = reactExports.useState("source");
382
- const [highlightRange, setHighlightRange] = reactExports.useState(
383
- null
384
- );
385
- const highlightTimerRef = reactExports.useRef(null);
386
- const fileId = context.resourceId;
387
- const fileName = context.resourceName || context.resourcePath || "Untitled";
388
- const language = reactExports.useMemo(
389
- () => getLanguageFromPath(context.resourcePath || ""),
390
- [context.resourcePath]
391
- );
392
- const isHtmlDocument = reactExports.useMemo(
393
- () => isHtmlLanguage(language) || String(context.mimeType || "").toLowerCase().includes("html"),
394
- [context.mimeType, language]
395
- );
396
- reactExports.useEffect(() => {
397
- setViewMode(isHtmlDocument ? "rendered" : "source");
398
- }, [fileId, isHtmlDocument]);
399
- reactExports.useEffect(() => {
400
- setTitle(fileName);
401
- }, [fileName, setTitle]);
402
- reactExports.useEffect(() => {
403
- updateWorkspaceTabState(tabId, {
404
- contentKind: isHtmlDocument ? "html" : "code",
405
- documentMode: isHtmlDocument ? viewMode : "source",
406
- isReadOnly: true
407
- });
408
- }, [isHtmlDocument, tabId, updateWorkspaceTabState, viewMode]);
409
- reactExports.useEffect(() => {
410
- const loadContent = async () => {
411
- setLoading(true);
412
- setError(null);
413
- try {
414
- if (!context.resourceId) {
415
- setContent(DEMO_CODE[language] || DEMO_CODE.javascript);
416
- setLoading(false);
417
- return;
418
- }
419
- const { getFileContent } = await __vitePreload(async () => { const { getFileContent } = await import('./index-D_E4281X.js').then(n => n.ep);return { getFileContent }},true?__vite__mapDeps([0,1]):void 0);
420
- const text = await getFileContent(context.resourceId);
421
- setContent(text);
422
- } catch (err) {
423
- setError(err instanceof Error ? err.message : t("load_failed"));
424
- } finally {
425
- setLoading(false);
426
- }
427
- };
428
- loadContent();
429
- }, [context.resourceId, language, t]);
430
- const tokenizedLines = reactExports.useMemo(() => tokenize(content, language), [content, language]);
431
- const handleCopy = reactExports.useCallback(async () => {
432
- const ok = await copyToClipboard(content);
433
- if (ok) {
434
- setCopied(true);
435
- setTimeout(() => setCopied(false), 2e3);
436
- }
437
- }, [content]);
438
- const lineCount = tokenizedLines.length;
439
- const applyJump = reactExports.useCallback(
440
- (detail) => {
441
- if (!fileId || detail.fileId !== fileId) return;
442
- const startValue = detail.lineStart ?? detail.line ?? detail.lineEnd;
443
- if (!startValue) return;
444
- const endValue = detail.lineEnd ?? detail.line ?? detail.lineStart ?? startValue;
445
- const maxLine = Math.max(1, lineCount);
446
- const start = Math.min(Math.max(startValue, 1), maxLine);
447
- const end = Math.min(Math.max(endValue, start), maxLine);
448
- setHighlightRange({ start, end });
449
- const lineElement = document.getElementById(`code-line-${start - 1}`);
450
- if (lineElement) {
451
- lineElement.scrollIntoView({ behavior: "smooth", block: "center" });
452
- }
453
- if (highlightTimerRef.current) {
454
- window.clearTimeout(highlightTimerRef.current);
455
- }
456
- highlightTimerRef.current = window.setTimeout(() => {
457
- setHighlightRange(null);
458
- }, 2500);
459
- },
460
- [fileId, lineCount]
461
- );
462
- reactExports.useEffect(() => {
463
- if (!fileId) return;
464
- const processQueue = () => {
465
- const queued = consumeFileJumpEffects(fileId);
466
- queued.forEach((entry) => applyJump(entry.data));
467
- };
468
- processQueue();
469
- const handleJump = (event) => {
470
- const detail = event.detail;
471
- applyJump(detail);
472
- };
473
- const handleQueue = (event) => {
474
- const detail = event.detail;
475
- if (!detail || detail.fileId !== fileId) return;
476
- processQueue();
477
- };
478
- window.addEventListener("ds:file:jump", handleJump);
479
- window.addEventListener("ds:file:queue", handleQueue);
480
- return () => {
481
- window.removeEventListener("ds:file:jump", handleJump);
482
- window.removeEventListener("ds:file:queue", handleQueue);
483
- if (highlightTimerRef.current) {
484
- window.clearTimeout(highlightTimerRef.current);
485
- highlightTimerRef.current = null;
486
- }
487
- };
488
- }, [applyJump, fileId]);
489
- if (loading) {
490
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-muted-foreground", children: [
491
- /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-8 h-8 animate-spin" }),
492
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("loading") })
493
- ] }) });
494
- }
495
- if (error) {
496
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-3 text-destructive", children: [
497
- /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "w-8 h-8" }),
498
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: error }),
499
- /* @__PURE__ */ jsxRuntimeExports.jsx(
500
- "button",
501
- {
502
- className: "px-4 py-2 text-sm bg-destructive/10 hover:bg-destructive/20 rounded-lg transition-colors",
503
- onClick: () => window.location.reload(),
504
- children: t("retry")
505
- }
506
- )
507
- ] }) });
508
- }
509
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full bg-[#1e1e1e] text-gray-100", children: [
510
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-[#333] bg-[#252526]", children: [
511
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
512
- /* @__PURE__ */ jsxRuntimeExports.jsx(FileCode, { className: "w-4 h-4 text-gray-400" }),
513
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-gray-300", children: fileName }),
514
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs px-2 py-0.5 rounded bg-[#333] text-gray-400 uppercase", children: isHtmlDocument ? "HTML" : language }),
515
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-gray-500", children: t("line_count", { count: lineCount }) })
516
- ] }),
517
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
518
- isHtmlDocument ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mr-2 flex items-center rounded-md border border-[#3a3a3a] bg-[#202021] p-0.5", children: [
519
- /* @__PURE__ */ jsxRuntimeExports.jsx(
520
- "button",
521
- {
522
- onClick: () => setViewMode("rendered"),
523
- className: cn(
524
- "rounded px-2 py-1 text-xs transition-colors",
525
- viewMode === "rendered" ? "bg-[#3A4653] text-white" : "text-gray-400 hover:text-gray-200"
526
- ),
527
- title: t("rendered_view"),
528
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
529
- /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "h-3.5 w-3.5" }),
530
- t("rendered_view_short")
531
- ] })
532
- }
533
- ),
534
- /* @__PURE__ */ jsxRuntimeExports.jsx(
535
- "button",
536
- {
537
- onClick: () => setViewMode("source"),
538
- className: cn(
539
- "rounded px-2 py-1 text-xs transition-colors",
540
- viewMode === "source" ? "bg-[#3A4653] text-white" : "text-gray-400 hover:text-gray-200"
541
- ),
542
- title: t("source_view"),
543
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1", children: [
544
- /* @__PURE__ */ jsxRuntimeExports.jsx(Code, { className: "h-3.5 w-3.5" }),
545
- t("source_view_short")
546
- ] })
547
- }
548
- )
549
- ] }) : null,
550
- !isHtmlDocument || viewMode === "source" ? /* @__PURE__ */ jsxRuntimeExports.jsx(
551
- "button",
552
- {
553
- onClick: () => setShowLineNumbers(!showLineNumbers),
554
- className: cn(
555
- "p-2 rounded hover:bg-[#333] transition-colors",
556
- showLineNumbers ? "text-blue-400" : "text-gray-500"
557
- ),
558
- title: t("toggle_line_numbers"),
559
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Hash, { className: "w-4 h-4" })
560
- }
561
- ) : null,
562
- !isHtmlDocument || viewMode === "source" ? /* @__PURE__ */ jsxRuntimeExports.jsx(
563
- "button",
564
- {
565
- onClick: () => setWordWrap(!wordWrap),
566
- className: cn(
567
- "p-2 rounded hover:bg-[#333] transition-colors",
568
- wordWrap ? "text-blue-400" : "text-gray-500"
569
- ),
570
- title: t("toggle_word_wrap"),
571
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(WrapText, { className: "w-4 h-4" })
572
- }
573
- ) : null,
574
- /* @__PURE__ */ jsxRuntimeExports.jsx(
575
- "button",
576
- {
577
- onClick: handleCopy,
578
- className: "p-2 rounded hover:bg-[#333] transition-colors text-gray-400 hover:text-gray-200",
579
- title: t("copy_source"),
580
- children: copied ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "w-4 h-4 text-green-400" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "w-4 h-4" })
581
- }
582
- )
583
- ] })
584
- ] }),
585
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-auto", children: isHtmlDocument && viewMode === "rendered" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full flex-col bg-[#1c1c1d]", children: [
586
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-b border-[#2f2f30] px-4 py-2 text-xs text-gray-400", children: t("html_render_hint") }),
587
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full overflow-hidden rounded-xl border border-white/10 bg-white shadow-[0_24px_60px_-36px_rgba(0,0,0,0.55)]", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
588
- "iframe",
589
- {
590
- title: t("html_render_frame_title", { name: fileName }),
591
- srcDoc: content,
592
- sandbox: "",
593
- className: "h-full w-full bg-white"
594
- }
595
- ) }) })
596
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-full", children: [
597
- showLineNumbers && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 py-4 pr-4 text-right bg-[#1e1e1e] border-r border-[#333] select-none sticky left-0", children: tokenizedLines.map((_, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
598
- "div",
599
- {
600
- className: "px-4 text-xs leading-6 text-gray-500 font-mono",
601
- children: index + 1
602
- },
603
- index
604
- )) }),
605
- /* @__PURE__ */ jsxRuntimeExports.jsx(
606
- "pre",
607
- {
608
- className: cn(
609
- "flex-1 py-4 px-4 font-mono text-sm leading-6 overflow-x-auto",
610
- wordWrap && "whitespace-pre-wrap break-all"
611
- ),
612
- children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: tokenizedLines.map((tokens, lineIndex) => {
613
- const isCitationLine = highlightRange && lineIndex + 1 >= highlightRange.start && lineIndex + 1 <= highlightRange.end;
614
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
615
- "div",
616
- {
617
- id: `code-line-${lineIndex}`,
618
- className: cn("min-h-[1.5rem]", isCitationLine && "ds-citation-line-highlight"),
619
- children: tokens.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: " " }) : tokens.map((token, tokenIndex) => /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: TOKEN_COLORS[token.type], children: token.value }, tokenIndex))
620
- },
621
- lineIndex
622
- );
623
- }) })
624
- }
625
- )
626
- ] }) })
627
- ] });
628
- }
629
- const DEMO_CODE = {
630
- javascript: `// DeepScientist - Example JavaScript Code
631
- import { useState, useEffect } from 'react';
632
-
633
- /**
634
- * Custom hook for fetching data
635
- * @param {string} url - The URL to fetch from
636
- * @returns {Object} - The data, loading state, and error
637
- */
638
- export function useFetch(url) {
639
- const [data, setData] = useState(null);
640
- const [loading, setLoading] = useState(true);
641
- const [error, setError] = useState(null);
642
-
643
- useEffect(() => {
644
- const fetchData = async () => {
645
- try {
646
- const response = await fetch(url);
647
- if (!response.ok) {
648
- throw new Error('Network response was not ok');
649
- }
650
- const json = await response.json();
651
- setData(json);
652
- } catch (err) {
653
- setError(err.message);
654
- } finally {
655
- setLoading(false);
656
- }
657
- };
658
-
659
- fetchData();
660
- }, [url]);
661
-
662
- return { data, loading, error };
663
- }
664
-
665
- // Example usage
666
- const API_URL = "https://api.example.com/data";
667
- const { data, loading } = useFetch(API_URL);
668
-
669
- console.log("Data loaded:", data);
670
- `,
671
- typescript: `// DeepScientist - Example TypeScript Code
672
- interface User {
673
- id: string;
674
- name: string;
675
- email: string;
676
- role: 'admin' | 'user' | 'guest';
677
- }
678
-
679
- type AsyncResult<T> = {
680
- data: T | null;
681
- loading: boolean;
682
- error: string | null;
683
- };
684
-
685
- async function fetchUser(userId: string): Promise<User> {
686
- const response = await fetch(\`/api/users/\${userId}\`);
687
- if (!response.ok) {
688
- throw new Error('Failed to fetch user');
689
- }
690
- return response.json();
691
- }
692
-
693
- class UserService {
694
- private cache: Map<string, User> = new Map();
695
-
696
- async getUser(id: string): Promise<User | undefined> {
697
- if (this.cache.has(id)) {
698
- return this.cache.get(id);
699
- }
700
-
701
- const user = await fetchUser(id);
702
- this.cache.set(id, user);
703
- return user;
704
- }
705
- }
706
-
707
- export const userService = new UserService();
708
- `,
709
- python: `# DeepScientist - Example Python Code
710
- from typing import List, Optional, Dict
711
- from dataclasses import dataclass
712
- import asyncio
713
-
714
- @dataclass
715
- class Document:
716
- """Represents a research document."""
717
- id: str
718
- title: str
719
- content: str
720
- tags: List[str]
721
- metadata: Dict[str, any]
722
-
723
- class DocumentProcessor:
724
- """Processes and analyzes documents."""
725
-
726
- def __init__(self, model_name: str = "gpt-4"):
727
- self.model_name = model_name
728
- self._cache: Dict[str, Document] = {}
729
-
730
- async def process(self, doc: Document) -> Dict[str, any]:
731
- """Process a document and extract insights."""
732
- # Simulate async processing
733
- await asyncio.sleep(0.1)
734
-
735
- return {
736
- "word_count": len(doc.content.split()),
737
- "tag_count": len(doc.tags),
738
- "has_metadata": bool(doc.metadata)
739
- }
740
-
741
- def summarize(self, doc: Document) -> str:
742
- """Generate a summary of the document."""
743
- words = doc.content.split()[:100]
744
- return " ".join(words) + "..."
745
-
746
- # Example usage
747
- if __name__ == "__main__":
748
- doc = Document(
749
- id="doc-001",
750
- title="Research Paper",
751
- content="This is the content of the research paper...",
752
- tags=["AI", "Machine Learning"],
753
- metadata={"author": "Dr. Smith"}
754
- )
755
-
756
- processor = DocumentProcessor()
757
- print(f"Processing: {doc.title}")
758
- `,
759
- go: `// DeepScientist - Example Go Code
760
- package main
761
-
762
- import (
763
- "context"
764
- "encoding/json"
765
- "fmt"
766
- "net/http"
767
- "time"
768
- )
769
-
770
- // Document represents a research document
771
- type Document struct {
772
- ID string \`json:"id"\`
773
- Title string \`json:"title"\`
774
- Content string \`json:"content"\`
775
- Tags []string \`json:"tags"\`
776
- Metadata map[string]string \`json:"metadata"\`
777
- }
778
-
779
- // DocumentService handles document operations
780
- type DocumentService struct {
781
- cache map[string]*Document
782
- }
783
-
784
- // NewDocumentService creates a new DocumentService
785
- func NewDocumentService() *DocumentService {
786
- return &DocumentService{
787
- cache: make(map[string]*Document),
788
- }
789
- }
790
-
791
- // GetDocument retrieves a document by ID
792
- func (s *DocumentService) GetDocument(ctx context.Context, id string) (*Document, error) {
793
- if doc, ok := s.cache[id]; ok {
794
- return doc, nil
795
- }
796
- return nil, fmt.Errorf("document not found: %s", id)
797
- }
798
-
799
- func main() {
800
- service := NewDocumentService()
801
-
802
- http.HandleFunc("/documents", func(w http.ResponseWriter, r *http.Request) {
803
- w.Header().Set("Content-Type", "application/json")
804
- json.NewEncoder(w).Encode(map[string]string{
805
- "status": "ok",
806
- "time": time.Now().Format(time.RFC3339),
807
- })
808
- })
809
-
810
- fmt.Println("Server starting on :8080")
811
- http.ListenAndServe(":8080", nil)
812
- }
813
- `,
814
- rust: `// DeepScientist - Example Rust Code
815
- use std::collections::HashMap;
816
- use serde::{Deserialize, Serialize};
817
-
818
- #[derive(Debug, Clone, Serialize, Deserialize)]
819
- pub struct Document {
820
- pub id: String,
821
- pub title: String,
822
- pub content: String,
823
- pub tags: Vec<String>,
824
- pub metadata: HashMap<String, String>,
825
- }
826
-
827
- impl Document {
828
- pub fn new(id: &str, title: &str, content: &str) -> Self {
829
- Document {
830
- id: id.to_string(),
831
- title: title.to_string(),
832
- content: content.to_string(),
833
- tags: Vec::new(),
834
- metadata: HashMap::new(),
835
- }
836
- }
837
-
838
- pub fn word_count(&self) -> usize {
839
- self.content.split_whitespace().count()
840
- }
841
-
842
- pub fn add_tag(&mut self, tag: &str) {
843
- self.tags.push(tag.to_string());
844
- }
845
- }
846
-
847
- pub struct DocumentService {
848
- cache: HashMap<String, Document>,
849
- }
850
-
851
- impl DocumentService {
852
- pub fn new() -> Self {
853
- DocumentService {
854
- cache: HashMap::new(),
855
- }
856
- }
857
-
858
- pub fn get(&self, id: &str) -> Option<&Document> {
859
- self.cache.get(id)
860
- }
861
-
862
- pub fn insert(&mut self, doc: Document) {
863
- self.cache.insert(doc.id.clone(), doc);
864
- }
865
- }
866
-
867
- fn main() {
868
- let mut service = DocumentService::new();
869
- let mut doc = Document::new("doc-001", "Research Paper", "Content here...");
870
- doc.add_tag("AI");
871
-
872
- service.insert(doc);
873
- println!("Document service initialized");
874
- }
875
- `,
876
- json: `{
877
- "name": "@ds/plugin-code-viewer",
878
- "version": "1.0.0",
879
- "description": "Code viewer plugin for DeepScientist",
880
- "author": "DeepScientist Team",
881
- "license": "MIT",
882
- "keywords": ["code", "viewer", "syntax", "highlight"],
883
- "main": "dist/index.js",
884
- "types": "dist/index.d.ts",
885
- "dependencies": {
886
- "react": "^18.0.0",
887
- "lucide-react": "^0.263.0"
888
- },
889
- "devDependencies": {
890
- "typescript": "^5.0.0",
891
- "@types/react": "^18.0.0"
892
- },
893
- "scripts": {
894
- "build": "tsc",
895
- "dev": "tsc --watch",
896
- "test": "jest"
897
- },
898
- "peerDependencies": {
899
- "react": ">=18.0.0"
900
- }
901
- }
902
- `
903
- };
904
-
905
- export { CodeViewerPlugin as default };