@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
@@ -1,216 +1,99 @@
1
- # 04 Lingzhu Connector Guide: Configure Lingzhu for DeepScientist
1
+ # 04 Lingzhu Connector Guide: Bind Rokid Glasses to DeepScientist
2
2
 
3
- This guide explains how to configure the Lingzhu companion endpoint from `Settings > Connectors > Lingzhu`.
3
+ Lingzhu now uses a minimal one-step binding flow.
4
4
 
5
- Scope:
5
+ DeepScientist serves the Lingzhu-compatible routes directly on its own daemon / web port:
6
6
 
7
- - configuration only
8
- - OpenClaw-compatible Lingzhu bridge values
9
- - local probe and SSE smoke test
10
- - what to paste into the Lingzhu platform
7
+ - `GET /metis/agent/api/health`
8
+ - `POST /metis/agent/api/sse`
11
9
 
12
- This guide does not cover cloud deployment architecture. You only need one working OpenClaw gateway and one public IP or public domain that the glasses can reach.
10
+ For a real device binding, the address registered on Rokid must be the public DeepScientist address that external devices can reach. It cannot be `127.0.0.1`, `localhost`, or a private-network address.
13
11
 
14
- Reference sources:
12
+ References:
15
13
 
16
- - Rokid forum setup page: https://forum.rokid.com/post/detail/2831
17
- - packaged bridge root: `assets/connectors/lingzhu/openclaw-bridge`
18
- - packaged OpenClaw config template: `assets/connectors/lingzhu/openclaw.lingzhu.config.template.json`
14
+ - Rokid developer forum: https://forum.rokid.com/post/detail/2831
15
+ - Rokid agent platform: https://agent-develop.rokid.com/space
19
16
 
20
- ## 1. What DeepScientist now provides
17
+ ## 1. Prerequisites
21
18
 
22
- The Lingzhu settings card now generates and validates:
19
+ Make sure:
23
20
 
24
- - local health URL
25
- - local SSE URL
26
- - public SSE URL
27
- - `auth_ak`
28
- - OpenClaw config snippet
29
- - local probe `curl`
21
+ - DeepScientist is already running
22
+ - the DeepScientist page you opened is the final public address that external devices should use
23
+ - if the current page is local-only or private-network-only, Lingzhu should not be saved yet
30
24
 
31
- The packaged bridge is configured to:
25
+ ## 2. What the UI keeps now
32
26
 
33
- - emit one immediate visible receipt acknowledgement before the model starts
34
- - keep comment heartbeats alive
35
- - emit lightweight visible progress heartbeats during long silent upstream phases
27
+ `Settings > Connectors > Lingzhu` now keeps only the necessary pieces:
36
28
 
37
- DeepScientist treats Lingzhu as a companion endpoint, not as a full bidirectional chat connector like QQ.
29
+ - one `Add Lingzhu (Rokid Glasses)` entry point
30
+ - the Rokid platform screenshot
31
+ - the auto-generated copyable fields
32
+ - concise binding instructions
33
+ - one save action
38
34
 
39
- ## 2. Before you start
35
+ You no longer need to manually edit host, port, agent, OpenClaw snippets, or extra probe steps in the main flow.
40
36
 
41
- Make sure these are already true:
37
+ ## 3. What is auto-generated
42
38
 
43
- - DeepScientist is installed and running
44
- - your OpenClaw gateway is already running locally
45
- - the OpenClaw HTTP gateway port is known, usually `18789`
46
- - you have a public IP or public domain
39
+ After you click `Add Lingzhu (Rokid Glasses)`, the popup shows these copyable values:
47
40
 
48
- Important:
41
+ - Custom agent ID
42
+ - Custom agent URL
43
+ - Custom agent AK
44
+ - Agent name
45
+ - Category
46
+ - Capability summary
47
+ - Opening message
48
+ - Input type
49
+ - Icon PNG URL
49
50
 
50
- - `127.0.0.1` only works for local health checks
51
- - Lingzhu devices need a public address
51
+ Important details:
52
52
 
53
- ## 3. Open the settings page
53
+ - `Custom agent URL` is generated as `https://<your-public-address>/metis/agent/api/sse`
54
+ - `AK` is generated automatically and reused after saving
55
+ - the logo uses a PNG DeepScientist asset so it can be uploaded directly to Rokid
54
56
 
55
- Open:
57
+ ![Rokid third-party agent creation form](../images/lingzhu/rokid-agent-platform-create.png)
56
58
 
57
- - `Settings > Connectors > Lingzhu`
59
+ ## 4. What the user does
58
60
 
59
- The card is organized into:
61
+ On the Rokid platform:
60
62
 
61
- - gateway endpoint
62
- - auth and identity
63
- - generated values
64
- - probe and verify
65
- - advanced debug
63
+ 1. Open `Project Development -> Third-party Agent -> Create`
64
+ 2. Choose `Custom Agent`
65
+ 3. Copy each generated field from the popup into the matching Rokid field
66
+ 4. Upload the DeepScientist PNG logo
67
+ 5. Return to DeepScientist and click Save
66
68
 
67
- ![Lingzhu settings overview](../images/lingzhu/lingzhu-settings-overview.svg)
69
+ After Save, the Lingzhu binding is complete.
68
70
 
69
- ## 4. Fill the endpoint fields
71
+ ## 5. How it is used afterward
70
72
 
71
- Recommended values:
73
+ The glasses or platform only need to call:
72
74
 
73
- | Field | Recommended value | Notes |
74
- | --- | --- | --- |
75
- | `Enabled` | `true` | turn on the companion config |
76
- | `Transport` | `openclaw_sse` | fixed, do not change |
77
- | `Local host` | `127.0.0.1` | used only for local probe |
78
- | `Gateway port` | `18789` | match your OpenClaw gateway |
79
- | `Public base URL` | `http://<public-ip>:18789` | must be reachable from the glasses |
75
+ - `POST /metis/agent/api/sse`
80
76
 
81
- If you do not know what to fill for the local endpoint, click:
77
+ with:
82
78
 
83
- - `Use local defaults`
79
+ - `Authorization: Bearer <saved-AK>`
84
80
 
85
- ## 5. Generate the AK and identity values
81
+ Usage rules:
86
82
 
87
- Fill or keep:
83
+ - a new task must start with `我现在的任务是 ...`
84
+ - only the text after that prefix is treated as a fresh DeepScientist task
85
+ - if you only want buffered progress, do not repeat the prefix; just say `找DeepScientist` or `继续`
88
86
 
89
- | Field | Recommended value |
90
- | --- | --- |
91
- | `Auth AK` | click `Generate AK` |
92
- | `Agent ID` | `main` |
93
- | `Lingzhu system prompt` | optional |
87
+ ## 6. Common questions
94
88
 
95
- Use the same `auth_ak` and `agent_id` in both places:
89
+ ### Why can’t I use `127.0.0.1`?
96
90
 
97
- - OpenClaw Lingzhu plugin config
98
- - Lingzhu platform config
91
+ Because Rokid and external devices cannot reach your local loopback address. Lingzhu must register a public address.
99
92
 
100
- ## 6. Use the generated values
93
+ ### Why is `AK` generated automatically?
101
94
 
102
- DeepScientist shows the exact values you need:
95
+ Because `AK` is the Bearer secret for this external entrypoint. Generating and persisting it is safer and more reliable than asking users to type it manually.
103
96
 
104
- - local health URL
105
- - local SSE URL
106
- - public SSE URL
107
- - OpenClaw config snippet
108
- - probe curl
97
+ ### Do I still need to tune a lot of extra parameters after saving?
109
98
 
110
- The public value is the one you should paste into the Lingzhu platform.
111
-
112
- ![Lingzhu platform values](../images/lingzhu/lingzhu-platform-values.svg)
113
-
114
- ## 7. Update OpenClaw
115
-
116
- Use either:
117
-
118
- - the generated snippet in the settings page
119
- - or the packaged template at `assets/connectors/lingzhu/openclaw.lingzhu.config.template.json`
120
-
121
- Install the packaged bridge with:
122
-
123
- ```bash
124
- openclaw plugins install ./assets/connectors/lingzhu/openclaw-bridge
125
- ```
126
-
127
- At minimum, OpenClaw must expose:
128
-
129
- ```json
130
- {
131
- "gateway": {
132
- "port": 18789,
133
- "http": {
134
- "endpoints": {
135
- "chatCompletions": {
136
- "enabled": true
137
- }
138
- }
139
- }
140
- }
141
- }
142
- ```
143
-
144
- DeepScientist also generates the full Lingzhu plugin block for you:
145
-
146
- ![OpenClaw config snippet](../images/lingzhu/lingzhu-openclaw-config.svg)
147
-
148
- ## 8. Run the local probe
149
-
150
- After saving the values, click:
151
-
152
- - `Run Lingzhu probe`
153
-
154
- DeepScientist performs:
155
-
156
- 1. `GET /metis/agent/api/health`
157
- 2. `POST /metis/agent/api/sse`
158
-
159
- Expected result:
160
-
161
- - `Connection = reachable`
162
- - `Auth = ready`
163
- - probe result returns no errors
164
-
165
- ## 9. What to paste into the Lingzhu platform
166
-
167
- Use:
168
-
169
- - `Public SSE URL`
170
- - `Auth AK`
171
-
172
- Do not paste:
173
-
174
- - `127.0.0.1`
175
- - any local-only host name
176
-
177
- ## 10. Common failure causes
178
-
179
- ### Health is offline
180
-
181
- Usually means:
182
-
183
- - OpenClaw is not running
184
- - wrong `gateway_port`
185
- - wrong `local_host`
186
-
187
- ### SSE probe fails
188
-
189
- Usually means:
190
-
191
- - `auth_ak` mismatch
192
- - Lingzhu endpoint path is not exposed
193
- - OpenClaw `chatCompletions.enabled` is still off
194
-
195
- ### Device still cannot connect
196
-
197
- Usually means:
198
-
199
- - `Public base URL` is not public
200
- - firewall or reverse proxy still blocks the port
201
-
202
- ## 11. Practical note
203
-
204
- This settings surface is intentionally registry-first:
205
-
206
- - Lingzhu stays in `connectors.yaml`
207
- - generated values come from the same structured config
208
- - validation, testing, and frontend rendering consume the same connector record
209
-
210
- For long-running tasks, the most stable practical behavior is:
211
-
212
- - immediate bridge-level receipt acknowledgement
213
- - visible progress heartbeats from the bridge during silent upstream phases
214
- - preserved per-user session continuity across follow-up turns
215
-
216
- This improves Lingzhu compatibility, but it still does not remove the platform-side single-request timeout limit.
99
+ No. The goal of the current Lingzhu flow is to show only the necessary values, let the user copy them, and finish with one save.
@@ -10,21 +10,35 @@ Use `ds doctor` when DeepScientist does not start cleanly after installation.
10
10
  npm install -g @researai/deepscientist
11
11
  ```
12
12
 
13
- 2. Try to start DeepScientist:
13
+ 2. Make sure Codex is installed and authenticated:
14
+
15
+ ```bash
16
+ codex --login
17
+ ```
18
+
19
+ If `codex` is missing, repair it explicitly with:
20
+
21
+ ```bash
22
+ npm install -g @openai/codex
23
+ ```
24
+
25
+ If your Codex CLI version does not expose `--login`, run `codex` and finish the interactive setup there.
26
+
27
+ 3. Try to start DeepScientist:
14
28
 
15
29
  ```bash
16
30
  ds
17
31
  ```
18
32
 
19
- 3. If startup fails or looks unhealthy, run:
33
+ 4. If startup fails or looks unhealthy, run:
20
34
 
21
35
  ```bash
22
36
  ds doctor
23
37
  ```
24
38
 
25
- 4. Read the checks from top to bottom and fix the failed items first.
39
+ 5. Read the checks from top to bottom and fix the failed items first.
26
40
 
27
- 5. Run `ds doctor` again until all checks are healthy, then run `ds`.
41
+ 6. Run `ds doctor` again until all checks are healthy, then run `ds`.
28
42
 
29
43
  ## What `ds doctor` checks
30
44
 
@@ -49,16 +63,38 @@ Run the package install again so the bundled Codex dependency is present:
49
63
  npm install -g @researai/deepscientist
50
64
  ```
51
65
 
66
+ If `codex` is still unavailable afterward, install it explicitly:
67
+
68
+ ```bash
69
+ npm install -g @openai/codex
70
+ ```
71
+
52
72
  ### Codex is installed but not logged in
53
73
 
54
74
  Run:
55
75
 
56
76
  ```bash
57
- codex
77
+ codex --login
58
78
  ```
59
79
 
80
+ If your Codex CLI version does not expose `--login`, run `codex` and finish the interactive setup there.
81
+
60
82
  Finish login once, then rerun `ds doctor`.
61
83
 
84
+ ### The configured Codex model is unavailable
85
+
86
+ DeepScientist blocks startup until Codex passes a real startup hello probe. In the current release, that probe first uses the runner model configured in:
87
+
88
+ ```text
89
+ ~/DeepScientist/config/runners.yaml
90
+ ```
91
+
92
+ The default is `gpt-5.4`. If your Codex account or CLI config cannot access that model, DeepScientist now retries with the current Codex default model and persists `model: inherit` for future runs. If you still want a specific model, edit the runner config manually and rerun:
93
+
94
+ ```bash
95
+ ds doctor
96
+ ```
97
+
62
98
  ### `uv` is missing
63
99
 
64
100
  Normally `ds` will bootstrap a local `uv` automatically. If that bootstrap fails, install it manually:
@@ -0,0 +1,137 @@
1
+ # 10 Weixin Connector Guide: Bind Personal WeChat To DeepScientist
2
+
3
+ This guide explains the built-in DeepScientist Weixin connector.
4
+
5
+ DeepScientist already includes the Weixin iLink runtime. You do not need to install OpenClaw, run `npx`, or configure a separate local bridge. The only required binding action is:
6
+
7
+ 1. open `Settings > Connectors > WeChat`
8
+ 2. click `Bind WeChat`
9
+ 3. scan the QR code with WeChat
10
+ 4. confirm the login inside WeChat
11
+
12
+ After confirmation, DeepScientist saves the Weixin connector automatically and starts long polling.
13
+
14
+ ## 1. What this connector does
15
+
16
+ After binding succeeds, DeepScientist can:
17
+
18
+ - receive WeChat text messages
19
+ - receive WeChat image, video, and file attachments
20
+ - copy inbound attachments into the active quest under `userfiles/weixin/...`
21
+ - send text replies back to the same WeChat context
22
+ - send native WeChat images, videos, and files when the agent attaches a real local file
23
+
24
+ Inbound media is materialized into the quest, not kept only in an ephemeral connector cache. The current path shape is:
25
+
26
+ ```text
27
+ ~/DeepScientist/quests/<quest_id>/userfiles/weixin/<message_batch>/
28
+ ```
29
+
30
+ That makes Weixin media behave much closer to the QQ path: the quest receives durable local files that the agent can read.
31
+
32
+ ![DeepScientist Weixin binding overview](../images/weixin/weixin-settings-bind.svg)
33
+
34
+ ## 2. Before you bind
35
+
36
+ Check these items first:
37
+
38
+ - DeepScientist daemon and web UI are already running
39
+ - you can open `Settings > Connectors > WeChat`
40
+ - you have a real personal WeChat account on the phone that will scan the QR code
41
+
42
+ This reference screenshot is only there to remind you to use the phone that already holds the target WeChat account. The actual binding still happens from the DeepScientist QR modal, not from a separate `npx` tool.
43
+
44
+ ![WeChat app reference](../images/weixin/weixin-plugin-entry.png)
45
+
46
+ ## 3. Bind from the Settings page
47
+
48
+ Open:
49
+
50
+ - [Settings > Connectors > WeChat](/settings/connectors#connector-weixin)
51
+
52
+ Then:
53
+
54
+ 1. click `Bind WeChat`
55
+ 2. wait for DeepScientist to generate the QR code
56
+ 3. scan it with WeChat
57
+ 4. confirm the login on the phone
58
+
59
+ Important points:
60
+
61
+ - the modal only shows the QR code because DeepScientist already knows the full iLink login flow
62
+ - there is no manual `bot_token` form during binding
63
+ - there is no extra Save button inside the QR modal
64
+ - when the platform returns `bot_token` and account ids, DeepScientist persists them automatically
65
+
66
+ After success, the WeChat card shows:
67
+
68
+ - `Bot account`
69
+ - `Owner account`
70
+
71
+ That is the saved connector binding.
72
+
73
+ ![QR scan and confirmation flow](../images/weixin/weixin-qr-confirm.svg)
74
+
75
+ ## 4. Verify with one text or media message
76
+
77
+ After the QR login succeeds:
78
+
79
+ 1. bind a quest to the Weixin connector from `Start Research` or the project surface
80
+ 2. send one text, image, video, or file message from WeChat
81
+ 3. let DeepScientist ingest it into the quest
82
+ 4. confirm the reply arrives in the same WeChat thread
83
+
84
+ Current behavior:
85
+
86
+ - inbound text enters the quest as the user message
87
+ - inbound image, video, and file attachments are downloaded and copied into quest-local `userfiles/weixin/...`
88
+ - media-only inbound messages are no longer dropped
89
+ - outbound text replies use the runtime-managed `context_token`
90
+ - outbound image, video, and file delivery works when the agent sends a real local file path
91
+
92
+ ![Quest-local media flow](../images/weixin/weixin-quest-media-flow.svg)
93
+
94
+ ## 5. What the agent should do with Weixin media
95
+
96
+ For ordinary user guidance, the important rule is simple:
97
+
98
+ - if the agent only needs to answer with text, normal message replies are enough
99
+ - if the agent needs to send a native WeChat image, video, or file, it must send a real local file from the quest
100
+
101
+ In practice, that means the agent should prefer quest-local files such as:
102
+
103
+ ```text
104
+ artifacts/...
105
+ experiments/...
106
+ paper/...
107
+ userfiles/...
108
+ ```
109
+
110
+ instead of depending on an arbitrary external URL.
111
+
112
+ ## 6. Troubleshooting
113
+
114
+ ### QR code keeps waiting
115
+
116
+ Check:
117
+
118
+ - the phone is scanning with the same WeChat account you want to bind
119
+ - the phone finished the confirmation step inside WeChat
120
+ - DeepScientist is still running while you wait
121
+
122
+ If the QR expires, DeepScientist refreshes it automatically.
123
+
124
+ ### I only see text, but not inbound media
125
+
126
+ Re-test with a real image, video, or file. After a successful inbound media message, confirm that the quest now contains:
127
+
128
+ ```text
129
+ userfiles/weixin/<message_batch>/manifest.json
130
+ ```
131
+
132
+ and the copied media file next to it.
133
+
134
+ ## 7. References
135
+
136
+ - Runoob personal WeChat guide: https://www.runoob.com/ai-agent/openclaw-weixin.html
137
+ - Upstream Weixin protocol reference: https://github.com/hao-ji-xing/openclaw-weixin/blob/main/weixin-bot-api.md