@researai/deepscientist 1.5.8 → 1.5.11

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 (148) hide show
  1. package/LICENSE +186 -21
  2. package/README.md +108 -95
  3. package/assets/branding/connector-qq.png +0 -0
  4. package/assets/branding/connector-rokid.png +0 -0
  5. package/assets/branding/connector-weixin.png +0 -0
  6. package/assets/branding/projects.png +0 -0
  7. package/bin/ds.js +172 -13
  8. package/docs/assets/branding/projects.png +0 -0
  9. package/docs/en/00_QUICK_START.md +308 -70
  10. package/docs/en/01_SETTINGS_REFERENCE.md +3 -0
  11. package/docs/en/02_START_RESEARCH_GUIDE.md +112 -0
  12. package/docs/en/04_LINGZHU_CONNECTOR_GUIDE.md +62 -179
  13. package/docs/en/09_DOCTOR.md +41 -5
  14. package/docs/en/10_WEIXIN_CONNECTOR_GUIDE.md +137 -0
  15. package/docs/en/11_LICENSE_AND_RISK.md +256 -0
  16. package/docs/en/12_GUIDED_WORKFLOW_TOUR.md +427 -0
  17. package/docs/en/13_CORE_ARCHITECTURE_GUIDE.md +297 -0
  18. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +506 -0
  19. package/docs/en/99_ACKNOWLEDGEMENTS.md +4 -1
  20. package/docs/en/README.md +79 -0
  21. package/docs/images/lingzhu/rokid-agent-platform-create.png +0 -0
  22. package/docs/images/weixin/weixin-plugin-entry.png +0 -0
  23. package/docs/images/weixin/weixin-plugin-entry.svg +33 -0
  24. package/docs/images/weixin/weixin-qr-confirm.svg +30 -0
  25. package/docs/images/weixin/weixin-quest-media-flow.svg +44 -0
  26. package/docs/images/weixin/weixin-settings-bind.svg +57 -0
  27. package/docs/zh/00_QUICK_START.md +315 -74
  28. package/docs/zh/01_SETTINGS_REFERENCE.md +3 -0
  29. package/docs/zh/02_START_RESEARCH_GUIDE.md +112 -0
  30. package/docs/zh/04_LINGZHU_CONNECTOR_GUIDE.md +62 -193
  31. package/docs/zh/09_DOCTOR.md +41 -5
  32. package/docs/zh/10_WEIXIN_CONNECTOR_GUIDE.md +144 -0
  33. package/docs/zh/11_LICENSE_AND_RISK.md +256 -0
  34. package/docs/zh/12_GUIDED_WORKFLOW_TOUR.md +423 -0
  35. package/docs/zh/13_CORE_ARCHITECTURE_GUIDE.md +296 -0
  36. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +506 -0
  37. package/docs/zh/99_ACKNOWLEDGEMENTS.md +4 -1
  38. package/docs/zh/README.md +126 -0
  39. package/install.sh +0 -34
  40. package/package.json +3 -3
  41. package/pyproject.toml +2 -2
  42. package/src/deepscientist/__init__.py +1 -1
  43. package/src/deepscientist/annotations.py +343 -0
  44. package/src/deepscientist/artifact/arxiv.py +484 -37
  45. package/src/deepscientist/artifact/metrics.py +1 -3
  46. package/src/deepscientist/artifact/service.py +1347 -111
  47. package/src/deepscientist/arxiv_library.py +275 -0
  48. package/src/deepscientist/bash_exec/service.py +9 -0
  49. package/src/deepscientist/bridges/builtins.py +2 -0
  50. package/src/deepscientist/bridges/connectors.py +447 -0
  51. package/src/deepscientist/channels/__init__.py +2 -0
  52. package/src/deepscientist/channels/builtins.py +3 -1
  53. package/src/deepscientist/channels/qq.py +1 -1
  54. package/src/deepscientist/channels/qq_gateway.py +1 -1
  55. package/src/deepscientist/channels/relay.py +7 -1
  56. package/src/deepscientist/channels/weixin.py +59 -0
  57. package/src/deepscientist/channels/weixin_ilink.py +317 -0
  58. package/src/deepscientist/config/models.py +22 -2
  59. package/src/deepscientist/config/service.py +431 -60
  60. package/src/deepscientist/connector/__init__.py +4 -0
  61. package/src/deepscientist/connector/connector_profiles.py +481 -0
  62. package/src/deepscientist/connector/lingzhu_support.py +668 -0
  63. package/src/deepscientist/connector/qq_profiles.py +206 -0
  64. package/src/deepscientist/connector/weixin_support.py +663 -0
  65. package/src/deepscientist/connector_profiles.py +1 -374
  66. package/src/deepscientist/connector_runtime.py +2 -0
  67. package/src/deepscientist/daemon/api/handlers.py +295 -5
  68. package/src/deepscientist/daemon/api/router.py +16 -1
  69. package/src/deepscientist/daemon/app.py +1130 -61
  70. package/src/deepscientist/doctor.py +5 -2
  71. package/src/deepscientist/gitops/diff.py +120 -29
  72. package/src/deepscientist/lingzhu_support.py +1 -182
  73. package/src/deepscientist/mcp/server.py +14 -5
  74. package/src/deepscientist/prompts/builder.py +29 -1
  75. package/src/deepscientist/qq_profiles.py +1 -196
  76. package/src/deepscientist/quest/node_traces.py +152 -2
  77. package/src/deepscientist/quest/service.py +169 -43
  78. package/src/deepscientist/quest/stage_views.py +172 -9
  79. package/src/deepscientist/registries/baseline.py +56 -4
  80. package/src/deepscientist/runners/codex.py +55 -3
  81. package/src/deepscientist/weixin_support.py +1 -0
  82. package/src/prompts/connectors/lingzhu.md +3 -1
  83. package/src/prompts/connectors/weixin.md +230 -0
  84. package/src/prompts/system.md +9 -0
  85. package/src/skills/idea/SKILL.md +16 -0
  86. package/src/skills/idea/references/literature-survey-template.md +24 -0
  87. package/src/skills/idea/references/related-work-playbook.md +4 -0
  88. package/src/skills/idea/references/selection-gate.md +9 -0
  89. package/src/skills/write/SKILL.md +1 -1
  90. package/src/tui/package.json +1 -1
  91. package/src/ui/dist/assets/{AiManusChatView-m2FNtwbn.js → AiManusChatView-D0mTXG4-.js} +156 -48
  92. package/src/ui/dist/assets/{AnalysisPlugin-BMTF8EGL.js → AnalysisPlugin-Db0cTXxm.js} +1 -1
  93. package/src/ui/dist/assets/{CliPlugin-BEOWgxCI.js → CliPlugin-DrV8je02.js} +164 -9
  94. package/src/ui/dist/assets/{CodeEditorPlugin-BCXvjqmb.js → CodeEditorPlugin-QXMSCH71.js} +8 -8
  95. package/src/ui/dist/assets/{CodeViewerPlugin-DaJcy3nD.js → CodeViewerPlugin-7hhtWj_E.js} +5 -5
  96. package/src/ui/dist/assets/{DocViewerPlugin-ByfeIq4K.js → DocViewerPlugin-BWMSnRJe.js} +3 -3
  97. package/src/ui/dist/assets/{GitDiffViewerPlugin-Cksf3VZ-.js → GitDiffViewerPlugin-7J9h9Vy_.js} +20 -21
  98. package/src/ui/dist/assets/{ImageViewerPlugin-CFz-OsTS.js → ImageViewerPlugin-CHJl_0lr.js} +5 -5
  99. package/src/ui/dist/assets/{LabCopilotPanel-CJ1cJzoX.js → LabCopilotPanel-1qSow1es.js} +11 -11
  100. package/src/ui/dist/assets/{LabPlugin-BF3dVJwa.js → LabPlugin-eQpPPCEp.js} +2 -1
  101. package/src/ui/dist/assets/{LatexPlugin-DDkwZ6Sj.js → LatexPlugin-BwRfi89Z.js} +7 -7
  102. package/src/ui/dist/assets/{MarkdownViewerPlugin-HAuvurcT.js → MarkdownViewerPlugin-836PVQWV.js} +4 -4
  103. package/src/ui/dist/assets/{MarketplacePlugin-BtoTYy2C.js → MarketplacePlugin-C2y_556i.js} +3 -3
  104. package/src/ui/dist/assets/{NotebookEditor-CSJYx7b-.js → NotebookEditor-BRzJbGsn.js} +12 -12
  105. package/src/ui/dist/assets/{NotebookEditor-DQgRezm_.js → NotebookEditor-DIX7Mlzu.js} +1 -1
  106. package/src/ui/dist/assets/{PdfLoader-DPa_-fv6.js → PdfLoader-DzRaTAlq.js} +14 -7
  107. package/src/ui/dist/assets/{PdfMarkdownPlugin-BZpXOEjm.js → PdfMarkdownPlugin-DZUfIUnp.js} +73 -6
  108. package/src/ui/dist/assets/{PdfViewerPlugin-BT8a6wGR.js → PdfViewerPlugin-BwtICzue.js} +103 -34
  109. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +3627 -0
  110. package/src/ui/dist/assets/{SearchPlugin-D_blveZi.js → SearchPlugin-DHeIAMsx.js} +1 -1
  111. package/src/ui/dist/assets/{TextViewerPlugin-Btx0M3hX.js → TextViewerPlugin-C3tCmFox.js} +5 -4
  112. package/src/ui/dist/assets/{VNCViewer-DImJO4rO.js → VNCViewer-CQsKVm3t.js} +10 -10
  113. package/src/ui/dist/assets/bot-BEA2vWuK.js +21 -0
  114. package/src/ui/dist/assets/branding/logo-rokid.png +0 -0
  115. package/src/ui/dist/assets/browser-BAcuE0Xj.js +2895 -0
  116. package/src/ui/dist/assets/{code-BUfXGJSl.js → code-XfbSR8K2.js} +1 -1
  117. package/src/ui/dist/assets/{file-content-VqamwI3X.js → file-content-BjxNaIfy.js} +1 -1
  118. package/src/ui/dist/assets/{file-diff-panel-C_wOoS7a.js → file-diff-panel-D_lLVQk0.js} +1 -1
  119. package/src/ui/dist/assets/{file-socket-D2bTuMVP.js → file-socket-D9x_5vlY.js} +1 -1
  120. package/src/ui/dist/assets/{image-BZkGJ4mM.js → image-BhWT33W1.js} +1 -1
  121. package/src/ui/dist/assets/{index-DdRW6RMJ.js → index--c4iXtuy.js} +12 -12
  122. package/src/ui/dist/assets/{index-CxkvSeKw.js → index-BDxipwrC.js} +2 -2
  123. package/src/ui/dist/assets/{index-DjggJovS.js → index-DZTZ8mWP.js} +14934 -9613
  124. package/src/ui/dist/assets/{index-DXZ1daiJ.css → index-Dqj-Mjb4.css} +2 -13
  125. package/src/ui/dist/assets/index-PJbSbPTy.js +25 -0
  126. package/src/ui/dist/assets/{monaco-DHMc7kKM.js → monaco-K8izTGgo.js} +1 -1
  127. package/src/ui/dist/assets/{pdf-effect-queue-DSw_D3RV.js → pdf-effect-queue-DfBors6y.js} +16 -1
  128. package/src/ui/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
  129. package/src/ui/dist/assets/{popover-B85oCgCS.js → popover-yFK1J4fL.js} +1 -1
  130. package/src/ui/dist/assets/{project-sync-DOMCcPac.js → project-sync-PENr2zcz.js} +1 -74
  131. package/src/ui/dist/assets/select-CAbJDfYv.js +1690 -0
  132. package/src/ui/dist/assets/{sigma-BO2rQrl3.js → sigma-DEuYJqTl.js} +1 -1
  133. package/src/ui/dist/assets/{index-D9QIGcmc.js → square-check-big-omoSUmcd.js} +2 -13
  134. package/src/ui/dist/assets/{trash-BsVEH_dV.js → trash--F119N47.js} +1 -1
  135. package/src/ui/dist/assets/{useCliAccess-b8L6JuZm.js → useCliAccess-D31UR23I.js} +1 -1
  136. package/src/ui/dist/assets/{useFileDiffOverlay-BY7uA9hV.js → useFileDiffOverlay-BH6KcMzq.js} +1 -1
  137. package/src/ui/dist/assets/{wrap-text-BwyVuUIK.js → wrap-text-CZ613PM5.js} +1 -1
  138. package/src/ui/dist/assets/{zoom-out-RDpLugQP.js → zoom-out-BgDLAv3z.js} +1 -1
  139. package/src/ui/dist/index.html +2 -2
  140. package/src/ui/dist/assets/AutoFigurePlugin-BGxN8Umr.css +0 -3056
  141. package/src/ui/dist/assets/AutoFigurePlugin-DxPdMUNb.js +0 -8149
  142. package/src/ui/dist/assets/PdfViewerPlugin-BJXtIwj_.css +0 -260
  143. package/src/ui/dist/assets/Stepper-DH2k75Vo.js +0 -158
  144. package/src/ui/dist/assets/bibtex-B-Hqu0Sg.js +0 -189
  145. package/src/ui/dist/assets/file-utils--zJCPN1i.js +0 -109
  146. package/src/ui/dist/assets/message-square-FUIPIhU2.js +0 -16
  147. package/src/ui/dist/assets/pdfjs-DU1YE8WO.js +0 -3
  148. package/src/ui/dist/assets/tooltip-B1OspAkx.js +0 -108
@@ -1,260 +0,0 @@
1
- ._tip_14ms1_1 {
2
- transform-origin: top left;
3
- }
4
-
5
- @keyframes _tip-pop_14ms1_1 {
6
- 0% {
7
- opacity: 0;
8
- transform: translateY(6px) scale(0.98);
9
- }
10
- 100% {
11
- opacity: 1;
12
- transform: translateY(0) scale(1);
13
- }
14
- }
15
-
16
- @keyframes _tip-slide_14ms1_1 {
17
- 0% {
18
- opacity: 0;
19
- transform: translateX(-10px);
20
- }
21
- 100% {
22
- opacity: 1;
23
- transform: translateX(0);
24
- }
25
- }
26
-
27
- @keyframes _tip-fade_14ms1_1 {
28
- 0% {
29
- opacity: 0;
30
- transform: translateY(8px);
31
- }
32
- 100% {
33
- opacity: 1;
34
- transform: translateY(0);
35
- }
36
- }
37
-
38
- ._tipNote_14ms1_38 {
39
- animation: _tip-pop_14ms1_1 160ms cubic-bezier(0.16, 1, 0.3, 1) both;
40
- }
41
-
42
- ._tipQuestion_14ms1_42 {
43
- animation: _tip-slide_14ms1_1 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
44
- }
45
-
46
- ._tipTask_14ms1_46 {
47
- animation: _tip-fade_14ms1_1 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
48
- }
49
- ._highlight_dilkk_1 {
50
- position: absolute;
51
- left: 0;
52
- right: 0;
53
- top: 0;
54
- bottom: 0;
55
- width: auto;
56
- pointer-events: none;
57
- overflow: visible;
58
- }
59
-
60
- ._parts_dilkk_12 {
61
- opacity: 1;
62
- pointer-events: none;
63
- }
64
-
65
- ._part_dilkk_12 {
66
- cursor: pointer;
67
- position: absolute;
68
- pointer-events: auto;
69
- border-radius: 3px;
70
- /* Make highlight feel “under” the text (canvas) instead of washing it out. */
71
- mix-blend-mode: multiply;
72
- transition:
73
- background 0.2s ease,
74
- box-shadow 0.2s ease,
75
- filter 0.2s ease;
76
- }
77
-
78
- ._partFocused_dilkk_30 {
79
- outline: 2.5px solid rgba(128, 107, 62, 0.96);
80
- outline-offset: 0;
81
- box-shadow:
82
- inset 0 0 0 1px rgba(128, 107, 62, 0.4),
83
- 0 0 0 2px rgba(128, 107, 62, 0.24);
84
- }
85
-
86
- ._scrolledTo_dilkk_38 ._part_dilkk_12 {
87
- outline: 1.5px solid rgba(138, 120, 78, 0.95);
88
- outline-offset: 0;
89
- box-shadow:
90
- inset 0 0 0 1px rgba(138, 120, 78, 0.32),
91
- 0 0 0 2px rgba(138, 120, 78, 0.22);
92
- filter: saturate(1.04);
93
- }
94
-
95
- @keyframes _hl-fade-in_dilkk_1 {
96
- from {
97
- opacity: 0.35;
98
- filter: saturate(1.15);
99
- }
100
- to {
101
- opacity: 1;
102
- filter: saturate(1);
103
- }
104
- }
105
-
106
- @keyframes _hl-pulse_dilkk_1 {
107
- 0%,
108
- 100% {
109
- box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);
110
- }
111
- 50% {
112
- box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.35);
113
- }
114
- }
115
-
116
- @keyframes _hl-sheen_dilkk_1 {
117
- 0% {
118
- background-position: 0% 0%;
119
- }
120
- 100% {
121
- background-position: 100% 0%;
122
- }
123
- }
124
-
125
- ._partNote_dilkk_77 {
126
- background: transparent;
127
- animation: _hl-fade-in_dilkk_1 180ms ease-out both;
128
- }
129
-
130
- ._partQuestion_dilkk_82 {
131
- background: transparent;
132
- box-shadow: inset 0 -2px 0 rgba(99, 102, 241, 0.65);
133
- animation: _hl-pulse_dilkk_1 900ms ease-in-out 2;
134
- }
135
-
136
- ._partTask_dilkk_88 {
137
- background: transparent;
138
- box-shadow: inset 0 -2px 0 rgba(34, 197, 94, 0.65);
139
- animation: _hl-fade-in_dilkk_1 180ms ease-out both;
140
- }
141
-
142
- ._hintChip_dilkk_94 {
143
- position: absolute;
144
- left: 12px;
145
- z-index: 4;
146
- min-height: 40px;
147
- width: 220px;
148
- max-width: 220px;
149
- display: flex;
150
- flex-direction: column;
151
- justify-content: flex-start;
152
- gap: 4px;
153
- align-items: flex-start;
154
- min-width: 170px;
155
- padding: 7px 11px;
156
- border-radius: 9px;
157
- pointer-events: auto;
158
- border: 1px solid rgba(123, 132, 151, 0.42);
159
- background: rgba(255, 255, 255, 0.92);
160
- color: rgba(28, 36, 52, 0.92);
161
- font-size: 12px;
162
- line-height: 1.25;
163
- font-weight: 500;
164
- font-family:
165
- "DS-Project",
166
- "DS-Inter",
167
- "Inter",
168
- "Noto Sans",
169
- "Noto Sans Math",
170
- "STIX Two Math",
171
- "Cambria Math",
172
- "Segoe UI Symbol",
173
- "Apple Symbols",
174
- "Symbola",
175
- "DejaVu Sans",
176
- sans-serif;
177
- letter-spacing: 0.005em;
178
- text-align: left;
179
- overflow: visible;
180
- box-shadow: 0 1px 5px rgba(15, 23, 42, 0.08);
181
- transition:
182
- border-color 120ms ease,
183
- background-color 120ms ease,
184
- box-shadow 120ms ease;
185
- }
186
-
187
- ._hintChipFocused_dilkk_139 {
188
- border-width: 1.5px;
189
- box-shadow:
190
- 0 2px 8px rgba(15, 23, 42, 0.14),
191
- 0 0 0 1px rgba(128, 107, 62, 0.14);
192
- }
193
-
194
- ._hintPrimaryLine_dilkk_146 {
195
- display: block;
196
- width: 100%;
197
- font-size: 11px;
198
- line-height: 1.2;
199
- font-weight: 600;
200
- color: inherit;
201
- -webkit-text-fill-color: currentColor;
202
- white-space: nowrap;
203
- overflow: hidden;
204
- text-overflow: ellipsis;
205
- }
206
-
207
- ._hintSecondaryLine_dilkk_159 {
208
- display: block;
209
- width: 100%;
210
- font-size: 12px;
211
- line-height: 1.4;
212
- font-weight: 500;
213
- color: inherit;
214
- -webkit-text-fill-color: currentColor;
215
- opacity: 0.9;
216
- white-space: normal;
217
- overflow-wrap: anywhere;
218
- word-break: break-word;
219
- }
220
-
221
- ._hintChip_dilkk_94:hover {
222
- border-color: rgba(126, 113, 82, 0.75);
223
- background: rgba(255, 255, 255, 0.97);
224
- box-shadow: 0 2px 8px rgba(15, 23, 42, 0.12);
225
- }
226
- ._areaHighlight_7ldrr_1 {
227
- border: 1px solid rgba(120, 109, 87, 0.6);
228
- background-color: rgba(214, 204, 182, 0.2);
229
- opacity: 1;
230
- mix-blend-mode: multiply;
231
- }
232
-
233
- ._part_7ldrr_8 {
234
- cursor: pointer;
235
- position: absolute;
236
- border: 1px solid transparent;
237
- box-sizing: border-box;
238
- background: rgba(214, 204, 182, 0.24);
239
- transition:
240
- background 0.2s,
241
- border-color 0.2s,
242
- box-shadow 0.2s;
243
- }
244
-
245
- ._scrolledTo_7ldrr_20 ._part_7ldrr_8 {
246
- border-color: rgba(138, 120, 78, 0.95);
247
- box-shadow:
248
- inset 0 0 0 1px rgba(138, 120, 78, 0.3),
249
- 0 0 0 2px rgba(138, 120, 78, 0.22);
250
- background: rgba(214, 204, 182, 0.32);
251
- }
252
-
253
- ._focused_7ldrr_28 ._part_7ldrr_8 {
254
- border-color: rgba(128, 107, 62, 0.96);
255
- border-width: 2px;
256
- box-shadow:
257
- inset 0 0 0 1px rgba(128, 107, 62, 0.34),
258
- 0 0 0 2px rgba(128, 107, 62, 0.26);
259
- background: rgba(214, 204, 182, 0.35);
260
- }
@@ -1,158 +0,0 @@
1
- import { z as createLucideIcon, r as reactExports, j as jsxRuntimeExports, d as Check, b as cn, a3 as Button } from './index-DjggJovS.js';
2
-
3
- /**
4
- * @license lucide-react v0.511.0 - ISC
5
- *
6
- * This source code is licensed under the ISC license.
7
- * See the LICENSE file in the root directory of this source tree.
8
- */
9
-
10
-
11
- const __iconNode = [
12
- ["path", { d: "M12 13v8", key: "1l5pq0" }],
13
- ["path", { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242", key: "1pljnt" }],
14
- ["path", { d: "m8 17 4-4 4 4", key: "1quai1" }]
15
- ];
16
- const CloudUpload = createLucideIcon("cloud-upload", __iconNode);
17
-
18
- function Step({ children }) {
19
- return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children });
20
- }
21
- const clampStep = (step, totalSteps) => {
22
- if (totalSteps <= 0) return 1;
23
- return Math.min(Math.max(step, 1), totalSteps);
24
- };
25
- function Stepper({
26
- initialStep = 1,
27
- onStepChange,
28
- onFinalStepCompleted,
29
- backButtonText = "Previous",
30
- nextButtonText = "Next",
31
- nextDisabled,
32
- backDisabled,
33
- contentAnimation = false,
34
- className,
35
- children
36
- }) {
37
- const steps = reactExports.useMemo(
38
- () => reactExports.Children.toArray(children).filter((child) => reactExports.isValidElement(child)),
39
- [children]
40
- );
41
- const totalSteps = steps.length;
42
- const [currentStep, setCurrentStep] = reactExports.useState(() => clampStep(initialStep, totalSteps));
43
- const previousStepRef = reactExports.useRef(currentStep);
44
- reactExports.useEffect(() => {
45
- setCurrentStep(clampStep(initialStep, totalSteps));
46
- }, [initialStep, totalSteps]);
47
- reactExports.useEffect(() => {
48
- onStepChange?.(currentStep);
49
- }, [currentStep, onStepChange]);
50
- reactExports.useEffect(() => {
51
- previousStepRef.current = currentStep;
52
- }, [currentStep]);
53
- const resolveDisabled = (value, step, total) => {
54
- if (typeof value === "function") return value(step, total);
55
- return Boolean(value);
56
- };
57
- const isFinalStep = currentStep >= totalSteps;
58
- const isNextDisabled = resolveDisabled(nextDisabled, currentStep, totalSteps);
59
- const isBackDisabled = resolveDisabled(backDisabled, currentStep, totalSteps);
60
- const canGoBack = currentStep > 1 && !isBackDisabled;
61
- const nextLabel = typeof nextButtonText === "function" ? nextButtonText(currentStep, totalSteps) : nextButtonText;
62
- const handleNext = () => {
63
- if (isFinalStep) {
64
- if (!isNextDisabled) {
65
- onFinalStepCompleted?.();
66
- }
67
- return;
68
- }
69
- if (isNextDisabled) return;
70
- setCurrentStep((prev) => clampStep(prev + 1, totalSteps));
71
- };
72
- const handleBack = () => {
73
- if (!canGoBack) return;
74
- setCurrentStep((prev) => clampStep(prev - 1, totalSteps));
75
- };
76
- if (totalSteps === 0) {
77
- return null;
78
- }
79
- const activeStep = steps[currentStep - 1];
80
- const activeTitle = activeStep?.props?.title ?? `Step ${currentStep}`;
81
- const activeDescription = activeStep?.props?.description;
82
- const stepDirection = currentStep >= previousStepRef.current ? "forward" : "back";
83
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("stepper-root flex flex-col gap-5", className), children: [
84
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "stepper-header flex flex-wrap items-center justify-between gap-3", children: [
85
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap items-center gap-3", children: steps.map((step, index) => {
86
- const stepNumber = index + 1;
87
- const isComplete = stepNumber < currentStep;
88
- const isActive = stepNumber === currentStep;
89
- const title = step.props.title ?? `Step ${stepNumber}`;
90
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
91
- /* @__PURE__ */ jsxRuntimeExports.jsx(
92
- "div",
93
- {
94
- className: cn(
95
- "stepper-dot flex h-8 w-8 items-center justify-center rounded-full border text-xs font-semibold transition",
96
- isComplete && "border-transparent bg-[var(--cli-accent-olive)] text-[var(--cli-ink-0)]",
97
- isActive && "border-[var(--cli-accent-olive)] bg-white/90 text-[var(--cli-ink-1)]",
98
- !isComplete && !isActive && "border-white/60 bg-white/60 text-[var(--cli-muted-1)]"
99
- ),
100
- "data-state": isComplete ? "complete" : isActive ? "active" : "upcoming",
101
- children: isComplete ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "h-4 w-4" }) : stepNumber
102
- }
103
- ),
104
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [
105
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] uppercase tracking-wide text-[var(--cli-muted-1)]", children: [
106
- "Step ",
107
- stepNumber
108
- ] }),
109
- /* @__PURE__ */ jsxRuntimeExports.jsx(
110
- "span",
111
- {
112
- className: cn(
113
- "text-xs font-semibold",
114
- isActive ? "text-[var(--cli-ink-1)]" : "text-[var(--cli-muted-1)]"
115
- ),
116
- children: title
117
- }
118
- )
119
- ] }),
120
- index < totalSteps - 1 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-px w-8 bg-white/60", "aria-hidden": "true" }) : null
121
- ] }, `${title}-${stepNumber}`);
122
- }) }),
123
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-full border border-white/50 bg-white/80 px-3 py-1 text-[10px] uppercase tracking-wide text-[var(--cli-muted-1)]", children: [
124
- currentStep,
125
- " / ",
126
- totalSteps
127
- ] })
128
- ] }),
129
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
130
- "div",
131
- {
132
- className: "stepper-content rounded-xl border border-white/40 bg-white/80 p-4",
133
- "data-step": currentStep,
134
- "data-direction": stepDirection,
135
- children: [
136
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
137
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
138
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold text-[var(--cli-ink-1)]", children: activeTitle }),
139
- activeDescription ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-[var(--cli-muted-1)]", children: activeDescription }) : null
140
- ] }),
141
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded-full border border-white/60 bg-white/70 px-2 py-1 text-[10px] uppercase tracking-wide text-[var(--cli-muted-1)]", children: [
142
- "Step ",
143
- currentStep
144
- ] })
145
- ] }),
146
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4", children: activeStep })
147
- ]
148
- },
149
- contentAnimation ? `step-${currentStep}` : "step-static"
150
- ),
151
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "stepper-actions flex flex-wrap items-center justify-between gap-3", children: [
152
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "secondary", onClick: handleBack, disabled: !canGoBack, children: backButtonText }),
153
- /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { onClick: handleNext, disabled: isNextDisabled, children: nextLabel })
154
- ] })
155
- ] });
156
- }
157
-
158
- export { CloudUpload as C, Stepper as S, Step as a };
@@ -1,189 +0,0 @@
1
- import { z as createLucideIcon, j as jsxRuntimeExports, ac as Modal, L as LoaderCircle, b as cn, C as CircleAlert, ad as ModalFooter, ae as ExternalLink } from './index-DjggJovS.js';
2
-
3
- /**
4
- * @license lucide-react v0.511.0 - ISC
5
- *
6
- * This source code is licensed under the ISC license.
7
- * See the LICENSE file in the root directory of this source tree.
8
- */
9
-
10
-
11
- const __iconNode = [
12
- ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
13
- ["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2", key: "4jdomd" }],
14
- ["path", { d: "M16 4h2a2 2 0 0 1 2 2v4", key: "3hqy98" }],
15
- ["path", { d: "M21 14H11", key: "1bme5i" }],
16
- ["path", { d: "m15 10-4 4 4 4", key: "5dvupr" }]
17
- ];
18
- const ClipboardCopy = createLucideIcon("clipboard-copy", __iconNode);
19
-
20
- function formatError(code) {
21
- switch (code) {
22
- case "invalid_id":
23
- return "Invalid ID";
24
- case "metadata_failed":
25
- return "Not found or metadata failed";
26
- case "download_failed":
27
- return "Download failed";
28
- case "already_exists":
29
- return "Already imported";
30
- case "storage_failed":
31
- return "Storage failed";
32
- case "timeout":
33
- return "Import timed out";
34
- default:
35
- return "Import failed";
36
- }
37
- }
38
- function formatDate(value) {
39
- if (!value) return "-";
40
- const [date] = value.split("T");
41
- return date || value;
42
- }
43
- function ArxivInfoModal({
44
- open,
45
- onClose,
46
- paper,
47
- errorCode,
48
- onCopyBibtex,
49
- onOpenArxiv
50
- }) {
51
- const isProcessing = paper?.status === "processing";
52
- const isFailed = paper?.status === "failed" || Boolean(errorCode);
53
- const statusLabel = isFailed ? "Failed" : isProcessing ? "Processing" : "Imported";
54
- const statusClass = isFailed ? "bg-red-500/15 text-red-600" : isProcessing ? "bg-amber-500/15 text-amber-700" : "bg-emerald-500/15 text-emerald-700";
55
- const title = paper?.title || paper?.displayName || paper?.arxivId || "Paper info";
56
- const authors = paper?.authors && paper.authors.length > 0 ? paper.authors.join(", ") : "Unknown authors";
57
- const categories = paper?.categories && paper.categories.length > 0 ? paper.categories.join(", ") : "-";
58
- const publishedAt = paper ? formatDate(paper.publishedAt) : "-";
59
- const canShowActions = Boolean(paper && (onCopyBibtex || onOpenArxiv));
60
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(Modal, { open, onClose, title: "Paper info", size: "lg", children: [
61
- paper ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-h-[55vh] space-y-4 overflow-y-auto pr-1 text-sm", children: [
62
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
63
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-base font-semibold text-soft-text-primary", children: title }),
64
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
65
- "span",
66
- {
67
- className: cn(
68
- "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide",
69
- statusClass
70
- ),
71
- children: [
72
- isProcessing ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "h-3 w-3 animate-spin" }) : null,
73
- statusLabel
74
- ]
75
- }
76
- )
77
- ] }),
78
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-[90px_minmax(0,1fr)] gap-2 text-xs", children: [
79
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-secondary", children: "Authors" }),
80
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 text-soft-text-primary", children: authors }),
81
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-secondary", children: "Published" }),
82
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-primary", children: publishedAt }),
83
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-secondary", children: "Categories" }),
84
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-w-0 text-soft-text-primary", children: categories }),
85
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-secondary", children: "arXiv ID" }),
86
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-soft-text-primary", children: paper.arxivId || "-" })
87
- ] }),
88
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md border border-soft-border bg-soft-bg-elevated/40 p-3", children: [
89
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[11px] font-semibold text-soft-text-secondary", children: "Abstract" }),
90
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-1 text-xs leading-relaxed text-soft-text-primary", children: paper.abstract || "No abstract available." })
91
- ] }),
92
- isFailed && errorCode ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 text-[11px] text-red-600", children: [
93
- /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "h-3.5 w-3.5" }),
94
- formatError(errorCode)
95
- ] }) : null
96
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-soft-text-secondary", children: "Select a paper to view details." }),
97
- canShowActions ? /* @__PURE__ */ jsxRuntimeExports.jsxs(ModalFooter, { className: "-mx-6 -mb-4 mt-4", children: [
98
- onCopyBibtex ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
99
- "button",
100
- {
101
- type: "button",
102
- onClick: onCopyBibtex,
103
- className: cn(
104
- "inline-flex items-center gap-2 rounded-md border border-soft-border bg-white px-3 py-1.5",
105
- "text-xs text-soft-text-primary transition-colors",
106
- "hover:bg-soft-bg-elevated"
107
- ),
108
- children: [
109
- /* @__PURE__ */ jsxRuntimeExports.jsx(ClipboardCopy, { className: "h-3.5 w-3.5" }),
110
- "Copy BibTeX"
111
- ]
112
- }
113
- ) : null,
114
- onOpenArxiv ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
115
- "button",
116
- {
117
- type: "button",
118
- onClick: onOpenArxiv,
119
- className: cn(
120
- "inline-flex items-center gap-2 rounded-md border border-soft-border bg-white px-3 py-1.5",
121
- "text-xs text-soft-text-primary transition-colors",
122
- "hover:bg-soft-bg-elevated"
123
- ),
124
- children: [
125
- /* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "h-3.5 w-3.5" }),
126
- "Open arXiv"
127
- ]
128
- }
129
- ) : null
130
- ] }) : null
131
- ] });
132
- }
133
-
134
- function InfoTriangleIcon({ className }) {
135
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
136
- "svg",
137
- {
138
- viewBox: "0 0 24 24",
139
- className: cn("h-4 w-4", className),
140
- role: "img",
141
- "aria-hidden": "true",
142
- children: [
143
- /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M12 4L21 20H3L12 4Z", fill: "none", stroke: "currentColor", strokeWidth: "1.6" }),
144
- /* @__PURE__ */ jsxRuntimeExports.jsx(
145
- "text",
146
- {
147
- x: "12",
148
- y: "14.5",
149
- textAnchor: "middle",
150
- dominantBaseline: "middle",
151
- fontSize: "10",
152
- fontFamily: "sans-serif",
153
- fill: "currentColor",
154
- children: "?"
155
- }
156
- )
157
- ]
158
- }
159
- );
160
- }
161
-
162
- function getLastName(name) {
163
- const parts = name.trim().split(/\s+/);
164
- return parts[parts.length - 1] || "unknown";
165
- }
166
- function generateBibTeX(paper) {
167
- const authorStr = (paper.authors || []).join(" and ");
168
- const year = paper.publishedAt && !Number.isNaN(Date.parse(paper.publishedAt)) ? new Date(paper.publishedAt).getFullYear() : (/* @__PURE__ */ new Date()).getFullYear();
169
- const firstAuthor = paper.authors?.[0] ? getLastName(paper.authors[0]).toLowerCase() : "unknown";
170
- const baseId = paper.arxivId.replace(/v\d+$/, "").replace(".", "");
171
- const key = `${firstAuthor}${year}${baseId}`;
172
- const primaryClass = paper.categories?.[0] || "";
173
- const lines = [
174
- `@misc{${key},`,
175
- ` title={${paper.title || ""}},`,
176
- ` author={${authorStr}},`,
177
- ` year={${year}},`,
178
- ` eprint={${paper.arxivId}},`,
179
- ` archivePrefix={arXiv},`
180
- ];
181
- if (primaryClass) {
182
- lines.push(` primaryClass={${primaryClass}},`);
183
- }
184
- lines[lines.length - 1] = lines[lines.length - 1].replace(/,$/, "");
185
- lines.push("}");
186
- return lines.join("\n");
187
- }
188
-
189
- export { ArxivInfoModal as A, InfoTriangleIcon as I, generateBibTeX as g };