@researai/deepscientist 1.5.9 → 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 (140) hide show
  1. package/README.md +107 -94
  2. package/assets/branding/connector-qq.png +0 -0
  3. package/assets/branding/connector-rokid.png +0 -0
  4. package/assets/branding/connector-weixin.png +0 -0
  5. package/assets/branding/projects.png +0 -0
  6. package/bin/ds.js +168 -9
  7. package/docs/assets/branding/projects.png +0 -0
  8. package/docs/en/00_QUICK_START.md +308 -70
  9. package/docs/en/01_SETTINGS_REFERENCE.md +3 -0
  10. package/docs/en/02_START_RESEARCH_GUIDE.md +112 -0
  11. package/docs/en/04_LINGZHU_CONNECTOR_GUIDE.md +62 -179
  12. package/docs/en/09_DOCTOR.md +41 -5
  13. package/docs/en/10_WEIXIN_CONNECTOR_GUIDE.md +137 -0
  14. package/docs/en/11_LICENSE_AND_RISK.md +256 -0
  15. package/docs/en/12_GUIDED_WORKFLOW_TOUR.md +427 -0
  16. package/docs/en/13_CORE_ARCHITECTURE_GUIDE.md +297 -0
  17. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +506 -0
  18. package/docs/en/99_ACKNOWLEDGEMENTS.md +4 -1
  19. package/docs/en/README.md +79 -0
  20. package/docs/images/lingzhu/rokid-agent-platform-create.png +0 -0
  21. package/docs/images/weixin/weixin-plugin-entry.png +0 -0
  22. package/docs/images/weixin/weixin-plugin-entry.svg +33 -0
  23. package/docs/images/weixin/weixin-qr-confirm.svg +30 -0
  24. package/docs/images/weixin/weixin-quest-media-flow.svg +44 -0
  25. package/docs/images/weixin/weixin-settings-bind.svg +57 -0
  26. package/docs/zh/00_QUICK_START.md +315 -74
  27. package/docs/zh/01_SETTINGS_REFERENCE.md +3 -0
  28. package/docs/zh/02_START_RESEARCH_GUIDE.md +112 -0
  29. package/docs/zh/04_LINGZHU_CONNECTOR_GUIDE.md +62 -193
  30. package/docs/zh/09_DOCTOR.md +41 -5
  31. package/docs/zh/10_WEIXIN_CONNECTOR_GUIDE.md +144 -0
  32. package/docs/zh/11_LICENSE_AND_RISK.md +256 -0
  33. package/docs/zh/12_GUIDED_WORKFLOW_TOUR.md +423 -0
  34. package/docs/zh/13_CORE_ARCHITECTURE_GUIDE.md +296 -0
  35. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +506 -0
  36. package/docs/zh/99_ACKNOWLEDGEMENTS.md +4 -1
  37. package/docs/zh/README.md +126 -0
  38. package/install.sh +0 -34
  39. package/package.json +2 -2
  40. package/pyproject.toml +1 -1
  41. package/src/deepscientist/__init__.py +1 -1
  42. package/src/deepscientist/annotations.py +343 -0
  43. package/src/deepscientist/artifact/arxiv.py +484 -37
  44. package/src/deepscientist/artifact/service.py +574 -108
  45. package/src/deepscientist/arxiv_library.py +275 -0
  46. package/src/deepscientist/bash_exec/service.py +9 -0
  47. package/src/deepscientist/bridges/builtins.py +2 -0
  48. package/src/deepscientist/bridges/connectors.py +447 -0
  49. package/src/deepscientist/channels/__init__.py +2 -0
  50. package/src/deepscientist/channels/builtins.py +3 -1
  51. package/src/deepscientist/channels/qq.py +1 -1
  52. package/src/deepscientist/channels/qq_gateway.py +1 -1
  53. package/src/deepscientist/channels/relay.py +7 -1
  54. package/src/deepscientist/channels/weixin.py +59 -0
  55. package/src/deepscientist/channels/weixin_ilink.py +317 -0
  56. package/src/deepscientist/config/models.py +22 -2
  57. package/src/deepscientist/config/service.py +431 -60
  58. package/src/deepscientist/connector/__init__.py +4 -0
  59. package/src/deepscientist/connector/connector_profiles.py +481 -0
  60. package/src/deepscientist/connector/lingzhu_support.py +668 -0
  61. package/src/deepscientist/connector/qq_profiles.py +206 -0
  62. package/src/deepscientist/connector/weixin_support.py +663 -0
  63. package/src/deepscientist/connector_profiles.py +1 -374
  64. package/src/deepscientist/connector_runtime.py +2 -0
  65. package/src/deepscientist/daemon/api/handlers.py +165 -5
  66. package/src/deepscientist/daemon/api/router.py +13 -1
  67. package/src/deepscientist/daemon/app.py +1130 -61
  68. package/src/deepscientist/doctor.py +5 -2
  69. package/src/deepscientist/gitops/diff.py +120 -29
  70. package/src/deepscientist/lingzhu_support.py +1 -182
  71. package/src/deepscientist/mcp/server.py +11 -4
  72. package/src/deepscientist/prompts/builder.py +15 -0
  73. package/src/deepscientist/qq_profiles.py +1 -196
  74. package/src/deepscientist/quest/node_traces.py +23 -0
  75. package/src/deepscientist/quest/service.py +112 -43
  76. package/src/deepscientist/quest/stage_views.py +71 -5
  77. package/src/deepscientist/runners/codex.py +55 -3
  78. package/src/deepscientist/weixin_support.py +1 -0
  79. package/src/prompts/connectors/lingzhu.md +3 -1
  80. package/src/prompts/connectors/weixin.md +230 -0
  81. package/src/prompts/system.md +2 -0
  82. package/src/tui/package.json +1 -1
  83. package/src/ui/dist/assets/{AiManusChatView-BKZ103sn.js → AiManusChatView-D0mTXG4-.js} +156 -48
  84. package/src/ui/dist/assets/{AnalysisPlugin-mTTzGAlK.js → AnalysisPlugin-Db0cTXxm.js} +1 -1
  85. package/src/ui/dist/assets/{CliPlugin-BH58n3GY.js → CliPlugin-DrV8je02.js} +164 -9
  86. package/src/ui/dist/assets/{CodeEditorPlugin-BKGRUH7e.js → CodeEditorPlugin-QXMSCH71.js} +8 -8
  87. package/src/ui/dist/assets/{CodeViewerPlugin-BMADwFWJ.js → CodeViewerPlugin-7hhtWj_E.js} +5 -5
  88. package/src/ui/dist/assets/{DocViewerPlugin-ZOnTIHLN.js → DocViewerPlugin-BWMSnRJe.js} +3 -3
  89. package/src/ui/dist/assets/{GitDiffViewerPlugin-CQ7h1Djm.js → GitDiffViewerPlugin-7J9h9Vy_.js} +20 -21
  90. package/src/ui/dist/assets/{ImageViewerPlugin-GVS5MsnC.js → ImageViewerPlugin-CHJl_0lr.js} +5 -5
  91. package/src/ui/dist/assets/{LabCopilotPanel-BZNv1JML.js → LabCopilotPanel-1qSow1es.js} +11 -11
  92. package/src/ui/dist/assets/{LabPlugin-TWcJsdQA.js → LabPlugin-eQpPPCEp.js} +2 -1
  93. package/src/ui/dist/assets/{LatexPlugin-DIjHiR2x.js → LatexPlugin-BwRfi89Z.js} +7 -7
  94. package/src/ui/dist/assets/{MarkdownViewerPlugin-D3ooGAH0.js → MarkdownViewerPlugin-836PVQWV.js} +4 -4
  95. package/src/ui/dist/assets/{MarketplacePlugin-DfVfE9hN.js → MarketplacePlugin-C2y_556i.js} +3 -3
  96. package/src/ui/dist/assets/{NotebookEditor-s8JhzuX1.js → NotebookEditor-BRzJbGsn.js} +12 -12
  97. package/src/ui/dist/assets/{NotebookEditor-DDl0_Mc0.js → NotebookEditor-DIX7Mlzu.js} +1 -1
  98. package/src/ui/dist/assets/{PdfLoader-C2Sf6SJM.js → PdfLoader-DzRaTAlq.js} +14 -7
  99. package/src/ui/dist/assets/{PdfMarkdownPlugin-CXFLoIsa.js → PdfMarkdownPlugin-DZUfIUnp.js} +73 -6
  100. package/src/ui/dist/assets/{PdfViewerPlugin-BYTmz2fK.js → PdfViewerPlugin-BwtICzue.js} +103 -34
  101. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +3627 -0
  102. package/src/ui/dist/assets/{SearchPlugin-CjWBI1O9.js → SearchPlugin-DHeIAMsx.js} +1 -1
  103. package/src/ui/dist/assets/{TextViewerPlugin-DdOBU3-S.js → TextViewerPlugin-C3tCmFox.js} +5 -4
  104. package/src/ui/dist/assets/{VNCViewer-B8HGgLwQ.js → VNCViewer-CQsKVm3t.js} +10 -10
  105. package/src/ui/dist/assets/bot-BEA2vWuK.js +21 -0
  106. package/src/ui/dist/assets/branding/logo-rokid.png +0 -0
  107. package/src/ui/dist/assets/browser-BAcuE0Xj.js +2895 -0
  108. package/src/ui/dist/assets/{code-BWAY76JP.js → code-XfbSR8K2.js} +1 -1
  109. package/src/ui/dist/assets/{file-content-C1NwU5oQ.js → file-content-BjxNaIfy.js} +1 -1
  110. package/src/ui/dist/assets/{file-diff-panel-CywslwB9.js → file-diff-panel-D_lLVQk0.js} +1 -1
  111. package/src/ui/dist/assets/{file-socket-B4kzuOBQ.js → file-socket-D9x_5vlY.js} +1 -1
  112. package/src/ui/dist/assets/{image-D-NZM-6P.js → image-BhWT33W1.js} +1 -1
  113. package/src/ui/dist/assets/{index-DHZJ_0TI.js → index--c4iXtuy.js} +12 -12
  114. package/src/ui/dist/assets/{index-BdM1Gqfr.js → index-BDxipwrC.js} +2 -2
  115. package/src/ui/dist/assets/{index-7Chr1g9c.js → index-DZTZ8mWP.js} +14221 -9523
  116. package/src/ui/dist/assets/{index-DGIYDuTv.css → index-Dqj-Mjb4.css} +2 -13
  117. package/src/ui/dist/assets/index-PJbSbPTy.js +25 -0
  118. package/src/ui/dist/assets/{monaco-Cb2uKKe6.js → monaco-K8izTGgo.js} +1 -1
  119. package/src/ui/dist/assets/{pdf-effect-queue-DSw_D3RV.js → pdf-effect-queue-DfBors6y.js} +16 -1
  120. package/src/ui/dist/assets/pdf.worker.min-yatZIOMy.mjs +21 -0
  121. package/src/ui/dist/assets/{popover-Bg72DGgT.js → popover-yFK1J4fL.js} +1 -1
  122. package/src/ui/dist/assets/{project-sync-Ce_0BglY.js → project-sync-PENr2zcz.js} +1 -74
  123. package/src/ui/dist/assets/select-CAbJDfYv.js +1690 -0
  124. package/src/ui/dist/assets/{sigma-DPaACDrh.js → sigma-DEuYJqTl.js} +1 -1
  125. package/src/ui/dist/assets/{index-CDxNdQdz.js → square-check-big-omoSUmcd.js} +2 -13
  126. package/src/ui/dist/assets/{trash-BvTgE5__.js → trash--F119N47.js} +1 -1
  127. package/src/ui/dist/assets/{useCliAccess-CgPeMOwP.js → useCliAccess-D31UR23I.js} +1 -1
  128. package/src/ui/dist/assets/{useFileDiffOverlay-xPhz7P5B.js → useFileDiffOverlay-BH6KcMzq.js} +1 -1
  129. package/src/ui/dist/assets/{wrap-text-C3Un3YQr.js → wrap-text-CZ613PM5.js} +1 -1
  130. package/src/ui/dist/assets/{zoom-out-BgxLa0Ri.js → zoom-out-BgDLAv3z.js} +1 -1
  131. package/src/ui/dist/index.html +2 -2
  132. package/src/ui/dist/assets/AutoFigurePlugin-BGxN8Umr.css +0 -3056
  133. package/src/ui/dist/assets/AutoFigurePlugin-C_wWw4AP.js +0 -8149
  134. package/src/ui/dist/assets/PdfViewerPlugin-BJXtIwj_.css +0 -260
  135. package/src/ui/dist/assets/Stepper-B0Dd8CxK.js +0 -158
  136. package/src/ui/dist/assets/bibtex-CKaefIN2.js +0 -189
  137. package/src/ui/dist/assets/file-utils-H2fjA46S.js +0 -109
  138. package/src/ui/dist/assets/message-square-BzjLiXir.js +0 -16
  139. package/src/ui/dist/assets/pdfjs-DU1YE8WO.js +0 -3
  140. package/src/ui/dist/assets/tooltip-C_mA6R0w.js +0 -108
package/README.md CHANGED
@@ -5,129 +5,113 @@
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
- Local-first research operating system with a Python runtime, an npm launcher,
9
- one quest per Git repository, and shared web plus TUI surfaces.
8
+ <strong>DeepScientist is not just a long-running autonomous scientific discovery system. It is also a persistent research map that lives on your own machine.</strong>
10
9
  </p>
11
10
 
12
- ## Install
13
-
14
- Install DeepScientist:
15
-
16
- ```bash
17
- npm install -g @researai/deepscientist
18
- ```
19
-
20
- For the best experience, we recommend using GPT-5.4 in `xhigh` mode (for example, via the $20 GPT Plus plan or the $200 GPT Pro plan); if you are in China, we recommend the MiniMax-M2.7 Token Plan (Max plan): https://platform.minimaxi.com/subscribe/token-plan
21
-
22
- ## Start
23
-
24
- ```bash
25
- ds
26
- ```
27
-
28
- DeepScientist starts the local web workspace at `http://127.0.0.1:20999` by default.
29
-
30
- By default, DeepScientist keeps Codex on the standard profile: `approval_policy=on-request` and `sandbox_mode=workspace-write`. Use `--yolo` only when you want explicit full-access execution.
31
-
32
- Recommended command when you want the current directory as the home and Codex full-access execution:
33
-
34
- ```bash
35
- ds --yolo --port 20999 --here
36
- ```
37
-
38
- Parameter meanings:
39
-
40
- - `--yolo`: run Codex in YOLO mode, which sets `approval_policy=never` and `sandbox_mode=danger-full-access`
41
- - `--port 20999`: bind the local web workspace to port `20999`
42
- - `--here`: create or use `./DeepScientist` under the current working directory as the DeepScientist home
43
-
44
- On first start, `ds` will:
45
-
46
- - bootstrap a local `uv` runtime manager automatically if your machine does not already have one
47
- - use the bundled Codex CLI that ships with the npm package
48
- - still require you to complete Codex login once if your account is not ready yet
49
-
50
- If you want another port:
11
+ <p align="center">
12
+ Local-first. Open-source. Git-backed. Built for verifiable computational research.
13
+ </p>
51
14
 
52
- ```bash
53
- ds --port 21000
54
- ```
15
+ <p align="center">
16
+ <a href="docs/en/README.md">English</a> | <a href="docs/zh/README.md">中文</a>
17
+ </p>
55
18
 
56
- If you want YOLO mode on another port:
19
+ <p align="center">
20
+ <a href="https://openreview.net/forum?id=cZFgsLq8Gs"><img alt="ICLR 2026" src="https://img.shields.io/badge/ICLR-2026-blue?style=for-the-badge&logo=openreview"></a>
21
+ <a href="LICENSE"><img alt="License Apache-2.0" src="https://img.shields.io/badge/License-Apache%202.0-yellow.svg?style=for-the-badge"></a>
22
+ <a href="https://www.python.org/"><img alt="Python 3.11+" src="https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white"></a>
23
+ <a href="https://www.npmjs.com/package/@researai/deepscientist"><img alt="npm @researai/deepscientist" src="https://img.shields.io/badge/npm-%40researai%2Fdeepscientist-CB3837?style=for-the-badge&logo=npm&logoColor=white"></a>
24
+ <a href="https://deepscientist.cc/"><img alt="Website deepscientist.cc" src="https://img.shields.io/badge/Website-deepscientist.cc-brightgreen?style=for-the-badge&logo=googlechrome&logoColor=white"></a>
25
+ </p>
57
26
 
58
- ```bash
59
- ds --yolo --port 21000
60
- ```
27
+ <p align="center">
28
+ <a href="docs/en/00_QUICK_START.md">Quick Start</a>
29
+ <a href="docs/en/02_START_RESEARCH_GUIDE.md">Start Research Guide</a> •
30
+ <a href="docs/en/10_WEIXIN_CONNECTOR_GUIDE.md"><img src="assets/branding/connector-weixin.png" alt="Weixin" width="14" height="14" /> Weixin</a> •
31
+ <a href="docs/en/03_QQ_CONNECTOR_GUIDE.md"><img src="assets/branding/connector-qq.png" alt="QQ" width="14" height="14" /> QQ</a> •
32
+ <a href="docs/en/04_LINGZHU_CONNECTOR_GUIDE.md"><img src="assets/branding/connector-rokid.png" alt="Rokid" width="14" height="14" /> Rokid</a> •
33
+ <a href="https://openreview.net/forum?id=cZFgsLq8Gs">Paper</a>
34
+ </p>
61
35
 
62
- If you want to bind on all interfaces:
36
+ ## About
63
37
 
64
- ```bash
65
- ds --host 0.0.0.0 --port 21000
66
- ```
38
+ DeepScientist is not just a long-running autonomous scientific discovery system. It is also a persistent research map that lives on your own machine.
67
39
 
68
- DeepScientist now uses `uv` to manage a locked local Python runtime. If a conda environment is active and already provides Python `>=3.11`, `ds` prefers it automatically; otherwise it bootstraps a managed `uv` + Python toolchain under `~/DeepScientist/runtime/`.
40
+ - See every branch.
41
+ - Recover every lesson.
42
+ - Compound every round.
69
43
 
70
- The default DeepScientist home is:
44
+ **A research workspace you can actually inspect.** The frontend rebuilds a live [Canvas](docs/en/06_RUNTIME_AND_CANVAS.md) from Git branches, artifacts, connector traffic, and raw quest events, so progress stays visible as a navigable map instead of collapsing into one long chat log.
71
45
 
72
- - macOS / Linux: `~/DeepScientist`
73
- - Windows: `%USERPROFILE%\\DeepScientist`
46
+ **Memory that survives failure.** Built-in [memory](docs/en/07_MEMORY_AND_MCP.md) turns paper notes, dead ends, route decisions, and recovered lessons into searchable project state that later rounds can pull back deliberately.
74
47
 
75
- Use `ds --home <path>` if you want to place the runtime somewhere else.
48
+ **A self-evolving loop with real state.** Failed branches, reusable baselines, promoted lessons, and new evidence all feed the next round, so DeepScientist compounds research progress instead of restarting from zero.
76
49
 
77
- If you want to place the DeepScientist home under the current working directory, use:
50
+ **A studio, not a sealed autopilot.** DeepScientist can drive a task end to end, but you can step in at any moment to redirect the plan, edit code, inspect files, or run the terminal yourself inside the same quest.
78
51
 
79
- ```bash
80
- ds --here
81
- ```
52
+ DeepScientist is strong at:
82
53
 
83
- This is equivalent to launching with `ds --home "$PWD/DeepScientist"`.
54
+ - reproducing baselines and keeping them reusable
55
+ - reading papers, extracting concrete limitations, and generating hypotheses
56
+ - running experiment branches, analysis campaigns, figures, and paper drafts
57
+ - preserving both successful and failed results so the next round can start stronger
84
58
 
85
- Useful launch examples:
59
+ DeepScientist is flexible and easy to use with:
86
60
 
87
- ```bash
88
- ds --yolo --port 20999 --here
89
- ds --host 0.0.0.0 --port 21000
90
- ds --yolo --host 0.0.0.0 --port 21000 --here
91
- ```
61
+ - local-first, open-source, one-command install
62
+ - Git-backed quest repositories, shared web workspace, Studio / Canvas, and TUI
63
+ - workshop-style collaboration: let DeepScientist drive, or pause anytime to inspect, edit, and run commands yourself
64
+ - Codex with `gpt-5.4` by default, plus external OpenAI-compatible inference endpoints
65
+ - use DeepScientist anywhere: server via TUI, browser via Web, phone via Weixin or QQ, and even glasses via Rokid Glasses
66
+ - one bound external connector per quest: [Weixin](docs/en/10_WEIXIN_CONNECTOR_GUIDE.md), [QQ](docs/en/03_QQ_CONNECTOR_GUIDE.md), Telegram, Discord, Slack, Feishu, WhatsApp, and [Lingzhu / Rokid](docs/en/04_LINGZHU_CONNECTOR_GUIDE.md)
67
+ - conference-to-journal extension workflows, and rebuttal workflows from paper, code, and reviewer comments
68
+ - one quest, one Git repository
69
+ - branches and worktrees as native research structure
70
+ - live Studio and Canvas from durable quest state
71
+ - reusable baselines, not one-off benchmark runs
72
+ - durable `bash_exec` sessions, not disposable terminal output
92
73
 
93
- If you want to install the bundled CLI tree into another base path from a source checkout:
74
+ DeepScientist works best when the task is computational, verifiable, and worth tracking across multiple rounds.
94
75
 
95
- ```bash
96
- bash install.sh --dir /data/DeepScientist
97
- ```
76
+ ## News
98
77
 
99
- If you already have a populated DeepScientist home and want to move it safely:
78
+ - `2026/03/24`: DeepScientist officially releases `v1.5`.
79
+ - `2026/02/01`: the DeepScientist paper is available on [OpenReview](https://openreview.net/forum?id=cZFgsLq8Gs) for `ICLR 2026`.
100
80
 
101
- ```bash
102
- ds migrate /data/DeepScientist
103
- ```
81
+ ## Getting Started
104
82
 
105
- `ds migrate` stops the managed daemon first, shows the absolute source and target paths, asks for a double confirmation, verifies the copied tree, updates launcher wrappers, and only then removes the old path.
83
+ - [Docs Index (English)](docs/en/README.md)
84
+ - [Quick Start (English)](docs/en/00_QUICK_START.md)
85
+ - [Guided Workflow Tour (English)](docs/en/12_GUIDED_WORKFLOW_TOUR.md)
86
+ - [Start Research Guide (English)](docs/en/02_START_RESEARCH_GUIDE.md)
87
+ - [Core Architecture Guide (English)](docs/en/13_CORE_ARCHITECTURE_GUIDE.md)
106
88
 
107
- ## Troubleshooting
89
+ ## Install
108
90
 
109
91
  ```bash
110
- ds doctor
92
+ npm install -g @researai/deepscientist
93
+ codex --login
94
+ ds --yolo --here
111
95
  ```
112
96
 
113
- `ds docker` is also accepted as a compatibility alias, but `ds doctor` is the documented command.
97
+ If `codex --login` is unavailable, run `codex` once and finish authentication there. After startup, open `http://127.0.0.1:20999`.
114
98
 
115
- ## Local PDF Compile
99
+ For detailed install, troubleshooting, PDF compile, and other launch modes, use:
116
100
 
117
- ```bash
118
- ds latex install-runtime
119
- ```
120
-
121
- This installs a lightweight TinyTeX `pdflatex` runtime for local paper compilation.
101
+ - [Quick Start](docs/en/00_QUICK_START.md)
102
+ - [Doctor](docs/en/09_DOCTOR.md)
122
103
 
123
- ## QQ Connector
104
+ ## Documentation
124
105
 
125
- - [Quick Start (English)](docs/en/00_QUICK_START.md)
126
- - [快速开始(中文)](docs/zh/00_QUICK_START.md)
106
+ - [Docs Index (English)](docs/en/README.md)
107
+ - [Guided Workflow Tour (English)](docs/en/12_GUIDED_WORKFLOW_TOUR.md)
108
+ - [Core Architecture Guide (English)](docs/en/13_CORE_ARCHITECTURE_GUIDE.md)
109
+ - [Prompt, Skills, and MCP Guide (English)](docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md)
110
+ - [Weixin Connector Guide (English)](docs/en/10_WEIXIN_CONNECTOR_GUIDE.md)
127
111
  - [QQ Connector Guide (English)](docs/en/03_QQ_CONNECTOR_GUIDE.md)
128
- - [QQ Connector Guide (中文)](docs/zh/03_QQ_CONNECTOR_GUIDE.md)
112
+ - [Lingzhu / Rokid Guide (English)](docs/en/04_LINGZHU_CONNECTOR_GUIDE.md)
129
113
  - [Memory and MCP Guide (English)](docs/en/07_MEMORY_AND_MCP.md)
130
- - [Memory MCP 指南(中文)](docs/zh/07_MEMORY_AND_MCP.md)
114
+ - [Settings Reference (English)](docs/en/01_SETTINGS_REFERENCE.md)
131
115
 
132
116
  ## Maintainers
133
117
 
@@ -136,9 +120,7 @@ This installs a lightweight TinyTeX `pdflatex` runtime for local paper compilati
136
120
 
137
121
  ## Citation
138
122
 
139
- This project is currently contributed by Yixuan Weng, Shichen Li, Weixu Zhao, Minjun Zhu. If you find our work valuable, please cite:
140
-
141
- 本项目当前由 Yixuan Weng、Shichen Li、Weixu Zhao、Minjun Zhu 共同贡献。如果你觉得我们的工作有价值,请引用:
123
+ This project is currently contributed by Yixuan Weng, Shichen Li, Weixu Zhao, Qiyao Sun, Zhen Lin, Minjun Zhu. If you find our work valuable, please cite:
142
124
 
143
125
  ```bibtex
144
126
  @inproceedings{
@@ -151,6 +133,37 @@ url={https://openreview.net/forum?id=cZFgsLq8Gs}
151
133
  }
152
134
  ```
153
135
 
136
+ ## End-to-End Autonomous Research Systems
137
+
138
+ | System | System Type | E2E | Research Map | Workshop | Keeps Growing | Channels | Figure & Rebuttal & Review |
139
+ |---|---|---|---|---|---|---|---|
140
+ | [autoresearch](https://github.com/karpathy/autoresearch) | Open-source | | | ✓ | | | |
141
+ | [RD-Agent](https://github.com/microsoft/RD-Agent) | Open-source | | | | ✓ | | |
142
+ | [Agent Laboratory](https://github.com/SamuelSchmidgall/AgentLaboratory) | Open-source | ✓ | | ✓ | ✓ | | |
143
+ | [AI-Scientist](https://github.com/SakanaAI/AI-Scientist) | Open-source | ✓ | | | | | |
144
+ | [AI-Scientist-v2](https://github.com/SakanaAI/AI-Scientist-v2) | Open-source | ✓ | | | | | |
145
+ | [AutoResearchClaw](https://github.com/aiming-lab/AutoResearchClaw) | Open-source | ✓ | | | ✓ | ✓ | |
146
+ | [ClawPhD](https://github.com/ZhihaoAIRobotic/ClawPhD) | Open-source | | | ✓ | | ✓ | |
147
+ | [Dr. Claw](https://github.com/OpenLAIR/dr-claw) | Open-source | ✓ | | ✓ | | ✓ | |
148
+ | [FARS](https://analemma.ai/fars/) | Closed-source | ✓ | | | | | |
149
+ | [EvoScientist](https://github.com/EvoScientist/EvoScientist) | Open-source | ✓ | | ✓ | ✓ | ✓ | |
150
+ | [PaperClaw](https://github.com/meowscles69/PaperClaw) | Open-source | | | | | | ✓ |
151
+ | [ScienceClaw](https://github.com/beita6969/ScienceClaw) | Open-source | | | | ✓ | ✓ | |
152
+ | [claude-scholar](https://github.com/Galaxy-Dawn/claude-scholar) | Open-source | ✓ | | ✓ | ✓ | | |
153
+ | [Research-Claw](https://github.com/wentorai/Research-Claw) | Open-source | ✓ | | ✓ | ✓ | ✓ | |
154
+ | [DeepScientist](https://github.com/ResearAI/DeepScientist) | Open-source | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
155
+
156
+ ## More From ResearAI
157
+
158
+ DeepReviewer and AutoFigure projects worth exploring alongside DeepScientist:
159
+
160
+ | Project | What it does |
161
+ |---|---|
162
+ | [AutoFigure](https://github.com/ResearAI/AutoFigure) | generate paper-ready figures |
163
+ | [AutoFigure-Edit](https://github.com/ResearAI/AutoFigure-Edit) | editable vector paper figures |
164
+ | [DeepReviewer-v2](https://github.com/ResearAI/DeepReviewer-v2) | review papers and drafts |
165
+ | [Awesome-AI-Scientist](https://github.com/ResearAI/Awesome-AI-Scientist) | curated AI scientist landscape |
166
+
154
167
  ## License
155
168
 
156
169
  [Apache License 2.0](LICENSE)
Binary file
Binary file
package/bin/ds.js CHANGED
@@ -564,6 +564,12 @@ function colorize(code, text) {
564
564
  return `${code}${text}\u001B[0m`;
565
565
  }
566
566
 
567
+ const OFFICIAL_REPOSITORY_URL = 'https://github.com/ResearAI/DeepScientist';
568
+
569
+ function officialRepositoryLine() {
570
+ return `Official open-source repository: ${hyperlink(OFFICIAL_REPOSITORY_URL, OFFICIAL_REPOSITORY_URL)}`;
571
+ }
572
+
567
573
  function renderBrandArtwork() {
568
574
  const brandPath = path.join(repoRoot, 'assets', 'branding', 'deepscientist-mark.png');
569
575
  const chafa = resolveExecutableOnPath('chafa');
@@ -668,7 +674,10 @@ function printLaunchCard({
668
674
  const width = Math.max(72, Math.min(process.stdout.columns || 100, 108));
669
675
  const divider = colorize('\u001B[38;5;245m', '─'.repeat(Math.max(36, width - 6)));
670
676
  const title = colorize('\u001B[1;38;5;39m', 'ResearAI');
671
- const subtitle = colorize('\u001B[38;5;110m', 'Local-first research operating system');
677
+ const subtitleLines = [
678
+ colorize('\u001B[38;5;110m', 'DeepScientist is not just a fully open-source autonomous scientific discovery system.'),
679
+ colorize('\u001B[38;5;110m', 'It is also a research map that keeps growing from every round.'),
680
+ ];
672
681
  const versionLine = colorize('\u001B[38;5;245m', `Version ${packageJson.version}`);
673
682
  const urlLabel = colorize('\u001B[1;38;5;45m', hyperlink(url, url));
674
683
  const workspaceMode =
@@ -711,7 +720,9 @@ function printLaunchCard({
711
720
  for (const line of wordmark) {
712
721
  console.log(centerText(colorize('\u001B[1;38;5;39m', line), width));
713
722
  }
714
- console.log(centerText(subtitle, width));
723
+ for (const line of subtitleLines) {
724
+ console.log(centerText(line, width));
725
+ }
715
726
  console.log('');
716
727
  console.log(centerText(divider, width));
717
728
  console.log(centerText(colorize('\u001B[1m', workspaceMode), width));
@@ -721,6 +732,7 @@ function printLaunchCard({
721
732
  console.log(centerText(nextStep, width));
722
733
  console.log(centerText('Run ds --stop to stop the managed daemon.', width));
723
734
  console.log(centerText('Need to move this installation later? Use ds migrate /new/path.', width));
735
+ console.log(centerText(officialRepositoryLine(), width));
724
736
  console.log('');
725
737
  renderLaunchHints({ home, url, bindUrl, pythonSelection, yolo });
726
738
  }
@@ -802,8 +814,8 @@ function writeCodexPreflightReport(home, probe) {
802
814
  <main class="page">
803
815
  <section class="panel">
804
816
  <h1>DeepScientist could not start Codex</h1>
805
- <p class="meta">DeepScientist blocked startup because the Codex hello probe did not pass. Please run <code>codex</code>, complete login, then launch <code>ds</code> again.</p>
806
- <p class="meta">DeepScientist 启动前进行了 Codex 可用性检查,但 hello 探测没有通过。请先手动运行 <code>codex</code> 并完成登录,再重新启动 <code>ds</code>。</p>
817
+ <p class="meta">DeepScientist blocked startup because the Codex hello probe did not pass. In most installs, <code>npm install -g @researai/deepscientist</code> also installs the bundled Codex dependency. If <code>codex</code> is still missing, repair it with <code>npm install -g @openai/codex</code>. Then run <code>codex --login</code> (or <code>codex</code>), finish authentication, run <code>ds doctor</code>, and launch <code>ds</code> again.</p>
818
+ <p class="meta">DeepScientist 启动前进行了 Codex 可用性检查,但 hello 探测没有通过。正常情况下,<code>npm install -g @researai/deepscientist</code> 也会一并安装 bundled Codex 依赖;如果此后 <code>codex</code> 仍不可用,请再执行 <code>npm install -g @openai/codex</code> 修复。然后运行 <code>codex --login</code>(或 <code>codex</code>)完成认证,再执行 <code>ds doctor</code>,最后重新启动 <code>ds</code>。</p>
807
819
 
808
820
  <h2>Summary</h2>
809
821
  <p>${escapeHtml(probe?.summary || 'Codex startup probe failed.')}</p>
@@ -1002,6 +1014,8 @@ Flags:
1002
1014
  --force-check Ignore the cached version probe
1003
1015
  --remind-later Defer prompts for the current published version
1004
1016
  --skip-version Skip reminders for the current published version
1017
+
1018
+ Without \`--yes\`, \`ds update\` will ask for a \`Y/N\` confirmation on interactive terminals.
1005
1019
  `);
1006
1020
  }
1007
1021
 
@@ -2769,6 +2783,33 @@ function printUpdateStatus(status, { compact = false } = {}) {
2769
2783
  }
2770
2784
  }
2771
2785
 
2786
+ function parseYesNoAnswer(answer, defaultValue = false) {
2787
+ const normalized = String(answer || '').trim().toLowerCase();
2788
+ if (!normalized) {
2789
+ return defaultValue;
2790
+ }
2791
+ if (normalized === 'y' || normalized === 'yes') {
2792
+ return true;
2793
+ }
2794
+ if (normalized === 'n' || normalized === 'no') {
2795
+ return false;
2796
+ }
2797
+ return defaultValue;
2798
+ }
2799
+
2800
+ async function promptYesNo(question, { defaultValue = false } = {}) {
2801
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
2802
+ return defaultValue;
2803
+ }
2804
+ return new Promise((resolve) => {
2805
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
2806
+ rl.question(question, (answer) => {
2807
+ rl.close();
2808
+ resolve(parseYesNoAnswer(answer, defaultValue));
2809
+ });
2810
+ });
2811
+ }
2812
+
2772
2813
  function spawnDetachedNode(args, options = {}) {
2773
2814
  const out = options.logPath ? fs.openSync(options.logPath, 'a') : 'ignore';
2774
2815
  const child = spawn(process.execPath, args, {
@@ -2965,6 +3006,50 @@ async function performSelfUpdate(home, options = {}) {
2965
3006
  };
2966
3007
  }
2967
3008
 
3009
+ function normalizeLauncherRelaunchArgs(rawArgs, home) {
3010
+ const normalized = [];
3011
+ for (let index = 0; index < rawArgs.length; index += 1) {
3012
+ const arg = rawArgs[index];
3013
+ if (arg === '--home') {
3014
+ index += 1;
3015
+ continue;
3016
+ }
3017
+ if (arg === '--here' || arg === '--skip-update-check') {
3018
+ continue;
3019
+ }
3020
+ normalized.push(arg);
3021
+ }
3022
+ return ['--home', home, ...normalized, '--skip-update-check'];
3023
+ }
3024
+
3025
+ function relaunchLauncherAfterUpdate(rawArgs, home) {
3026
+ const launcherPath = resolveLauncherPath();
3027
+ if (!launcherPath) {
3028
+ return {
3029
+ ok: false,
3030
+ exitCode: 1,
3031
+ message: 'DeepScientist was updated, but the new launcher path could not be resolved for relaunch.',
3032
+ };
3033
+ }
3034
+ const result = spawnSync(process.execPath, [launcherPath, ...normalizeLauncherRelaunchArgs(rawArgs, home)], {
3035
+ cwd: repoRoot,
3036
+ stdio: 'inherit',
3037
+ env: process.env,
3038
+ });
3039
+ if (result.error) {
3040
+ return {
3041
+ ok: false,
3042
+ exitCode: 1,
3043
+ message: result.error.message,
3044
+ };
3045
+ }
3046
+ return {
3047
+ ok: true,
3048
+ exitCode: result.status ?? 0,
3049
+ message: null,
3050
+ };
3051
+ }
3052
+
2968
3053
  async function maybeHandleStartupUpdate(home, rawArgs, options = {}) {
2969
3054
  if (options.skipUpdateCheck || process.env.DS_SKIP_UPDATE_PROMPT === '1') {
2970
3055
  return false;
@@ -2978,8 +3063,43 @@ async function maybeHandleStartupUpdate(home, rawArgs, options = {}) {
2978
3063
  }
2979
3064
 
2980
3065
  printUpdateStatus(status, { compact: true });
2981
- markUpdateDeferred(home, status.latest_version);
2982
- return false;
3066
+ if (!status.can_self_update || !process.stdin.isTTY || !process.stdout.isTTY) {
3067
+ markUpdateDeferred(home, status.latest_version);
3068
+ return false;
3069
+ }
3070
+
3071
+ const confirmed = await promptYesNo(`Install DeepScientist ${status.latest_version} now? [y/N]: `, {
3072
+ defaultValue: false,
3073
+ });
3074
+ if (!confirmed) {
3075
+ markUpdateDeferred(home, status.latest_version);
3076
+ console.log(`DeepScientist will remind you later about ${status.latest_version || 'the next release'}.`);
3077
+ return false;
3078
+ }
3079
+
3080
+ console.log('Updating DeepScientist now...');
3081
+ const payload = await performSelfUpdate(home, {
3082
+ host: options.host,
3083
+ port: options.port,
3084
+ restartDaemon: false,
3085
+ });
3086
+ console.log(payload.message);
3087
+ if (payload.log_path) {
3088
+ console.log(`Update log: ${payload.log_path}`);
3089
+ }
3090
+ if (!payload.ok) {
3091
+ console.log('DeepScientist will continue launching with the current session.');
3092
+ return false;
3093
+ }
3094
+
3095
+ console.log('Relaunching DeepScientist...');
3096
+ const relaunch = relaunchLauncherAfterUpdate(rawArgs, home);
3097
+ if (!relaunch.ok) {
3098
+ console.error(relaunch.message);
3099
+ process.exit(relaunch.exitCode || 1);
3100
+ }
3101
+ process.exit(relaunch.exitCode || 0);
3102
+ return true;
2983
3103
  }
2984
3104
 
2985
3105
  async function startBackgroundUpdateWorker(home, options = {}) {
@@ -3244,14 +3364,27 @@ function handleCodexPreflightFailure(error) {
3244
3364
  if (!error || error.code !== 'DS_CODEX_PREFLIGHT') {
3245
3365
  return false;
3246
3366
  }
3367
+ const errorLabel = colorize('\u001B[1;38;5;196m', 'ERROR');
3368
+ const warningLabel = colorize('\u001B[1;38;5;214m', 'WARNING');
3247
3369
  console.error('');
3248
- console.error('DeepScientist could not start because Codex is not ready yet.');
3370
+ console.error(`${errorLabel} DeepScientist could not start because Codex is not ready yet.`);
3249
3371
  console.error(`Report: ${error.reportPath}`);
3250
3372
  if (Array.isArray(error.probe?.errors)) {
3251
3373
  for (const item of error.probe.errors) {
3252
- console.error(` - ${item}`);
3374
+ console.error(`${errorLabel} ${item}`);
3375
+ }
3376
+ }
3377
+ if (Array.isArray(error.probe?.warnings)) {
3378
+ for (const item of error.probe.warnings) {
3379
+ console.error(`${warningLabel} ${item}`);
3253
3380
  }
3254
3381
  }
3382
+ console.error(`${warningLabel} Recommended fix:`);
3383
+ console.error(`${warningLabel} 1. In most installs, \`npm install -g @researai/deepscientist\` also installs the bundled Codex dependency.`);
3384
+ console.error(`${warningLabel} 2. If \`codex\` is still missing, run \`npm install -g @openai/codex\`.`);
3385
+ console.error(`${warningLabel} 3. Run \`codex --login\` (or \`codex\`) and finish authentication.`);
3386
+ console.error(`${warningLabel} 4. Run \`ds doctor\` and confirm the Codex check passes.`);
3387
+ console.error(`${warningLabel} 5. Run \`ds\` again.`);
3255
3388
  openBrowser(error.reportUrl);
3256
3389
  process.exit(1);
3257
3390
  return true;
@@ -3375,7 +3508,29 @@ async function updateMain(rawArgs) {
3375
3508
  process.exit(0);
3376
3509
  }
3377
3510
  printUpdateStatus(status, { compact: true });
3378
- process.exit(0);
3511
+ if (!status.can_self_update) {
3512
+ process.exit(0);
3513
+ }
3514
+
3515
+ const confirmed = await promptYesNo(`Install DeepScientist ${status.latest_version} now? [y/N]: `, {
3516
+ defaultValue: false,
3517
+ });
3518
+ if (!confirmed) {
3519
+ const payload = markUpdateDeferred(home, status.latest_version);
3520
+ console.log(`DeepScientist will remind you later about ${payload.latest_version || 'the next release'}.`);
3521
+ process.exit(0);
3522
+ }
3523
+
3524
+ const payload = await performSelfUpdate(home, {
3525
+ host: options.host,
3526
+ port: options.port,
3527
+ restartDaemon: options.restartDaemon,
3528
+ });
3529
+ console.log(payload.message);
3530
+ if (payload.log_path) {
3531
+ console.log(`Update log: ${payload.log_path}`);
3532
+ }
3533
+ process.exit(payload.ok ? 0 : 1);
3379
3534
  }
3380
3535
 
3381
3536
  async function migrateMain(rawArgs) {
@@ -3680,6 +3835,10 @@ module.exports = {
3680
3835
  detectInstallMode,
3681
3836
  updateManualCommand,
3682
3837
  buildUpdateStatus,
3838
+ parseYesNoAnswer,
3839
+ normalizeLauncherRelaunchArgs,
3840
+ officialRepositoryLine,
3841
+ stripAnsi,
3683
3842
  },
3684
3843
  };
3685
3844