@researai/deepscientist 1.5.14 → 1.5.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +336 -90
  2. package/assets/branding/logo-raster.png +0 -0
  3. package/bin/ds.js +816 -131
  4. package/docs/en/00_QUICK_START.md +36 -15
  5. package/docs/en/01_SETTINGS_REFERENCE.md +53 -4
  6. package/docs/en/02_START_RESEARCH_GUIDE.md +7 -0
  7. package/docs/en/03_QQ_CONNECTOR_GUIDE.md +19 -0
  8. package/docs/en/05_TUI_GUIDE.md +6 -0
  9. package/docs/en/06_RUNTIME_AND_CANVAS.md +4 -3
  10. package/docs/en/09_DOCTOR.md +11 -5
  11. package/docs/en/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
  12. package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
  13. package/docs/en/15_CODEX_PROVIDER_SETUP.md +25 -8
  14. package/docs/en/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
  15. package/docs/en/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
  16. package/docs/en/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
  17. package/docs/en/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  18. package/docs/en/19_LOCAL_BROWSER_AUTH.md +70 -0
  19. package/docs/en/20_WORKSPACE_MODES_GUIDE.md +250 -0
  20. package/docs/en/README.md +24 -0
  21. package/docs/zh/00_QUICK_START.md +36 -15
  22. package/docs/zh/01_SETTINGS_REFERENCE.md +53 -4
  23. package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
  24. package/docs/zh/03_QQ_CONNECTOR_GUIDE.md +19 -0
  25. package/docs/zh/05_TUI_GUIDE.md +6 -0
  26. package/docs/zh/09_DOCTOR.md +11 -5
  27. package/docs/zh/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
  28. package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
  29. package/docs/zh/15_CODEX_PROVIDER_SETUP.md +25 -8
  30. package/docs/zh/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
  31. package/docs/zh/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
  32. package/docs/zh/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
  33. package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
  34. package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
  35. package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
  36. package/docs/zh/README.md +24 -0
  37. package/install.sh +2 -0
  38. package/package.json +1 -1
  39. package/pyproject.toml +1 -1
  40. package/src/deepscientist/__init__.py +1 -1
  41. package/src/deepscientist/acp/envelope.py +6 -0
  42. package/src/deepscientist/artifact/charts.py +567 -0
  43. package/src/deepscientist/artifact/guidance.py +50 -10
  44. package/src/deepscientist/artifact/metrics.py +228 -5
  45. package/src/deepscientist/artifact/schemas.py +3 -0
  46. package/src/deepscientist/artifact/service.py +4276 -308
  47. package/src/deepscientist/bash_exec/models.py +23 -0
  48. package/src/deepscientist/bash_exec/monitor.py +147 -67
  49. package/src/deepscientist/bash_exec/runtime.py +218 -156
  50. package/src/deepscientist/bash_exec/service.py +309 -69
  51. package/src/deepscientist/bash_exec/shells.py +87 -0
  52. package/src/deepscientist/bridges/connectors.py +51 -2
  53. package/src/deepscientist/cli.py +115 -19
  54. package/src/deepscientist/codex_cli_compat.py +232 -0
  55. package/src/deepscientist/config/models.py +8 -4
  56. package/src/deepscientist/config/service.py +38 -11
  57. package/src/deepscientist/connector/weixin_support.py +122 -1
  58. package/src/deepscientist/daemon/api/handlers.py +199 -9
  59. package/src/deepscientist/daemon/api/router.py +5 -0
  60. package/src/deepscientist/daemon/app.py +1458 -289
  61. package/src/deepscientist/doctor.py +51 -0
  62. package/src/deepscientist/file_lock.py +48 -0
  63. package/src/deepscientist/gitops/__init__.py +10 -1
  64. package/src/deepscientist/gitops/diff.py +296 -1
  65. package/src/deepscientist/gitops/service.py +4 -1
  66. package/src/deepscientist/mcp/server.py +212 -5
  67. package/src/deepscientist/process_control.py +161 -0
  68. package/src/deepscientist/prompts/builder.py +501 -453
  69. package/src/deepscientist/quest/layout.py +15 -2
  70. package/src/deepscientist/quest/service.py +2539 -195
  71. package/src/deepscientist/quest/stage_views.py +177 -1
  72. package/src/deepscientist/runners/base.py +2 -0
  73. package/src/deepscientist/runners/codex.py +169 -31
  74. package/src/deepscientist/runners/runtime_overrides.py +17 -1
  75. package/src/deepscientist/skills/__init__.py +2 -2
  76. package/src/deepscientist/skills/installer.py +196 -5
  77. package/src/deepscientist/skills/registry.py +66 -0
  78. package/src/prompts/connectors/qq.md +18 -8
  79. package/src/prompts/connectors/weixin.md +16 -6
  80. package/src/prompts/contracts/shared_interaction.md +24 -4
  81. package/src/prompts/system.md +921 -72
  82. package/src/prompts/system_copilot.md +43 -0
  83. package/src/skills/analysis-campaign/SKILL.md +32 -2
  84. package/src/skills/analysis-campaign/references/artifact-orchestration.md +1 -1
  85. package/src/skills/analysis-campaign/references/writing-facing-slice-examples.md +65 -0
  86. package/src/skills/baseline/SKILL.md +10 -0
  87. package/src/skills/decision/SKILL.md +27 -2
  88. package/src/skills/experiment/SKILL.md +16 -2
  89. package/src/skills/figure-polish/SKILL.md +1 -0
  90. package/src/skills/finalize/SKILL.md +19 -0
  91. package/src/skills/idea/SKILL.md +79 -0
  92. package/src/skills/idea/references/idea-generation-playbook.md +100 -0
  93. package/src/skills/idea/references/outline-seeding-example.md +60 -0
  94. package/src/skills/intake-audit/SKILL.md +9 -1
  95. package/src/skills/mentor/SKILL.md +217 -0
  96. package/src/skills/mentor/references/correction-rules.md +210 -0
  97. package/src/skills/mentor/references/knowledge-profile.md +91 -0
  98. package/src/skills/mentor/references/persona-profile.md +138 -0
  99. package/src/skills/mentor/references/taste-profile.md +128 -0
  100. package/src/skills/mentor/references/thought-style-profile.md +138 -0
  101. package/src/skills/mentor/references/work-profile.md +289 -0
  102. package/src/skills/mentor/references/workflow-profile.md +240 -0
  103. package/src/skills/optimize/SKILL.md +1645 -0
  104. package/src/skills/rebuttal/SKILL.md +3 -1
  105. package/src/skills/review/SKILL.md +3 -1
  106. package/src/skills/scout/SKILL.md +8 -0
  107. package/src/skills/write/SKILL.md +81 -12
  108. package/src/skills/write/references/outline-evidence-contract-example.md +107 -0
  109. package/src/tui/dist/app/AppContainer.js +22 -11
  110. package/src/tui/dist/index.js +4 -1
  111. package/src/tui/dist/lib/api.js +33 -3
  112. package/src/tui/package.json +1 -1
  113. package/src/ui/dist/assets/AiManusChatView-COFACy7V.js +204 -0
  114. package/src/ui/dist/assets/AnalysisPlugin-DnSm0GZn.js +1 -0
  115. package/src/ui/dist/assets/CliPlugin-CvwCmDQ5.js +109 -0
  116. package/src/ui/dist/assets/CodeEditorPlugin-cOqSa0xq.js +2 -0
  117. package/src/ui/dist/assets/CodeViewerPlugin-itb0tltR.js +270 -0
  118. package/src/ui/dist/assets/DocViewerPlugin-DqKkiCI6.js +7 -0
  119. package/src/ui/dist/assets/GitCommitViewerPlugin-DVgNHBCS.js +1 -0
  120. package/src/ui/dist/assets/GitDiffViewerPlugin-DxL2ezFG.js +6 -0
  121. package/src/ui/dist/assets/GitSnapshotViewer-B_RQm1YZ.js +30 -0
  122. package/src/ui/dist/assets/ImageViewerPlugin-tHqlXY3n.js +26 -0
  123. package/src/ui/dist/assets/LabCopilotPanel-ClMbq5Yu.js +14 -0
  124. package/src/ui/dist/assets/LabPlugin-L_SuE8ow.js +22 -0
  125. package/src/ui/dist/assets/LatexPlugin-B495DTXC.js +25 -0
  126. package/src/ui/dist/assets/MarkdownViewerPlugin-DG28-61B.js +128 -0
  127. package/src/ui/dist/assets/MarketplacePlugin-BiOGT-Kj.js +13 -0
  128. package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
  129. package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
  130. package/src/ui/dist/assets/NotebookEditor-C-4Kt1p9.js +81 -0
  131. package/src/ui/dist/assets/NotebookEditor-CVsj8h_T.js +361 -0
  132. package/src/ui/dist/assets/PdfLoader-CASDQmxJ.js +16 -0
  133. package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
  134. package/src/ui/dist/assets/PdfMarkdownPlugin-BFhwoKsY.js +1 -0
  135. package/src/ui/dist/assets/PdfViewerPlugin-DcOzU9vd.js +17 -0
  136. package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
  137. package/src/ui/dist/assets/SearchPlugin-CHj7M58O.js +16 -0
  138. package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
  139. package/src/ui/dist/assets/TextViewerPlugin-CB4DYfWO.js +54 -0
  140. package/src/ui/dist/assets/VNCViewer-CjlbyCB3.js +11 -0
  141. package/src/ui/dist/assets/bot-CFkZY-JP.js +6 -0
  142. package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
  143. package/src/ui/dist/assets/chevron-up-Dq5ofbht.js +6 -0
  144. package/src/ui/dist/assets/code-DLC6G24T.js +6 -0
  145. package/src/ui/dist/assets/file-content-Dv4LoZec.js +1 -0
  146. package/src/ui/dist/assets/file-diff-panel-Denq-lC3.js +1 -0
  147. package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
  148. package/src/ui/dist/assets/file-socket-Cu4Qln7Y.js +1 -0
  149. package/src/ui/dist/assets/git-commit-horizontal-BUh6G52n.js +6 -0
  150. package/src/ui/dist/assets/image-B9HUUddG.js +6 -0
  151. package/src/ui/dist/assets/index-B2B1sg-M.js +1 -0
  152. package/src/ui/dist/assets/index-Cgla8biy.css +33 -0
  153. package/src/ui/dist/assets/index-DRyx7vAc.js +1 -0
  154. package/src/ui/dist/assets/index-Gbl53BNp.js +2496 -0
  155. package/src/ui/dist/assets/index-wQ7RIIRd.js +11 -0
  156. package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
  157. package/src/ui/dist/assets/pdf-effect-queue-ZtnHFCAi.js +6 -0
  158. package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
  159. package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
  160. package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
  161. package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
  162. package/src/ui/dist/assets/popover-DL6h35vr.js +1 -0
  163. package/src/ui/dist/assets/project-sync-CsX08Qno.js +1 -0
  164. package/src/ui/dist/assets/select-DvmXt1yY.js +11 -0
  165. package/src/ui/dist/assets/sigma-7jpXazui.js +6 -0
  166. package/src/ui/dist/assets/trash-xA7kFt8i.js +11 -0
  167. package/src/ui/dist/assets/useCliAccess-DsMwDjOp.js +1 -0
  168. package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
  169. package/src/ui/dist/assets/wrap-text-CwMn-iqb.js +11 -0
  170. package/src/ui/dist/assets/zoom-out-R-GWEhzS.js +11 -0
  171. package/src/ui/dist/index.html +5 -2
  172. package/src/ui/dist/assets/AiManusChatView-DaF9Nge_.js +0 -26597
  173. package/src/ui/dist/assets/AnalysisPlugin-BSVx6dXE.js +0 -123
  174. package/src/ui/dist/assets/CliPlugin-C9gzJX41.js +0 -5905
  175. package/src/ui/dist/assets/CodeEditorPlugin-DU9G0Tox.js +0 -427
  176. package/src/ui/dist/assets/CodeViewerPlugin-DoX_fI9l.js +0 -905
  177. package/src/ui/dist/assets/DocViewerPlugin-C4FWIXuU.js +0 -278
  178. package/src/ui/dist/assets/GitDiffViewerPlugin-BgfFMgtf.js +0 -2661
  179. package/src/ui/dist/assets/ImageViewerPlugin-tcPkfY_x.js +0 -500
  180. package/src/ui/dist/assets/LabCopilotPanel-_dKV60Bf.js +0 -4104
  181. package/src/ui/dist/assets/LabPlugin-Bje0ayoC.js +0 -2677
  182. package/src/ui/dist/assets/LatexPlugin-CVsBzAln.js +0 -1792
  183. package/src/ui/dist/assets/MarkdownViewerPlugin-xjmrqv_8.js +0 -308
  184. package/src/ui/dist/assets/MarketplacePlugin-mMM2A8wP.js +0 -413
  185. package/src/ui/dist/assets/NotebookEditor-3kVDSOBo.js +0 -4214
  186. package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
  187. package/src/ui/dist/assets/NotebookEditor-SoJ8X-MO.js +0 -84873
  188. package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
  189. package/src/ui/dist/assets/PdfLoader-DElVuHl9.js +0 -25468
  190. package/src/ui/dist/assets/PdfMarkdownPlugin-Bq88XT4G.js +0 -409
  191. package/src/ui/dist/assets/PdfViewerPlugin-CsCXMo9S.js +0 -3095
  192. package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
  193. package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
  194. package/src/ui/dist/assets/SearchPlugin-oUPvy19k.js +0 -741
  195. package/src/ui/dist/assets/TextViewerPlugin-CRkT9yNy.js +0 -472
  196. package/src/ui/dist/assets/VNCViewer-BgbuvWhR.js +0 -18821
  197. package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
  198. package/src/ui/dist/assets/bot-v_RASACv.js +0 -21
  199. package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
  200. package/src/ui/dist/assets/code-5hC9d0VH.js +0 -17
  201. package/src/ui/dist/assets/file-content-D1PxfOrp.js +0 -377
  202. package/src/ui/dist/assets/file-diff-panel-DG1oT_Hj.js +0 -92
  203. package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
  204. package/src/ui/dist/assets/file-socket-BmdFYQlk.js +0 -58
  205. package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
  206. package/src/ui/dist/assets/image-Dqe2X2tW.js +0 -18
  207. package/src/ui/dist/assets/index-BQG-1s2o.css +0 -12553
  208. package/src/ui/dist/assets/index-DVsMKK_y.js +0 -25
  209. package/src/ui/dist/assets/index-Duvz8Ip0.js +0 -159
  210. package/src/ui/dist/assets/index-Nt9hS4ck.js +0 -244829
  211. package/src/ui/dist/assets/index-RDlNXXx1.js +0 -120
  212. package/src/ui/dist/assets/monaco-DIXge1CP.js +0 -623
  213. package/src/ui/dist/assets/pdf-effect-queue-BBTTQaO-.js +0 -47
  214. package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
  215. package/src/ui/dist/assets/popover-BWlolyxo.js +0 -476
  216. package/src/ui/dist/assets/project-sync-BM5PkFH4.js +0 -297
  217. package/src/ui/dist/assets/select-D4dAtrA8.js +0 -1690
  218. package/src/ui/dist/assets/sigma-CKbE5jJT.js +0 -22
  219. package/src/ui/dist/assets/square-check-big-CZNGMgiB.js +0 -17
  220. package/src/ui/dist/assets/trash-DaB37xAz.js +0 -32
  221. package/src/ui/dist/assets/useCliAccess-C2OmAcWe.js +0 -957
  222. package/src/ui/dist/assets/useFileDiffOverlay-Dowd1Ij4.js +0 -53
  223. package/src/ui/dist/assets/wrap-text-BGjAhAUq.js +0 -35
  224. package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
  225. package/src/ui/dist/assets/zoom-out-dMZQMXzc.js +0 -34
@@ -27,6 +27,7 @@ DeepScientist 已经内置了微信 iLink 运行时,因此你不需要再额
27
27
  - 把入站附件复制到当前 quest 的 `userfiles/weixin/...`
28
28
  - 把文本回复发回同一个微信上下文
29
29
  - 在 agent 提供真实本地文件时,发送微信原生图片、视频、文件
30
+ - 当微信绑定到 quest 时,在每次主实验完成后自动发送按指标生成的时间线图片
30
31
 
31
32
  入站媒体不会只留在临时缓存里,而是会被复制进 quest。本地落盘路径形态如下:
32
33
 
@@ -94,7 +95,10 @@ DeepScientist 已经内置了微信 iLink 运行时,因此你不需要再额
94
95
  - 入站图片、视频、文件会被下载并复制进 quest 本地 `userfiles/weixin/...`
95
96
  - 纯媒体消息不会再被直接丢弃
96
97
  - 出站文本会沿用运行时维护的 `context_token`
98
+ - 如果微信 `context_token` 缺失或过期,低优先级出站更新会先进入排队,而不是直接丢失
99
+ - 下一次新的微信入站刷新会话后,DeepScientist 只会回放最近 `5` 条排队更新,并且每条之间固定间隔 `2` 秒
97
100
  - 出站图片、视频、文件在 agent 提供真实本地文件路径时可以正常发送
101
+ - 出站主实验指标图会自动作为微信原生图片发送
98
102
 
99
103
  ![Quest 本地多媒体流转](../images/weixin/weixin-quest-media-flow.svg)
100
104
 
@@ -116,6 +120,22 @@ userfiles/...
116
120
 
117
121
  而不是默认依赖一个任意的外链。
118
122
 
123
+ ## 5.1 主实验指标图自动推送
124
+
125
+ 当微信是当前 quest 的绑定连接器时,DeepScientist 现在会在每次主实验完成后自动发送指标时间线图片。
126
+
127
+ 当前行为:
128
+
129
+ - 每个指标生成一张图
130
+ - 如果 baseline 存在该指标,会画一条横向虚线作为 baseline 参考线
131
+ - 系统会自动判断该指标是“越高越好”还是“越低越好”
132
+ - 超过 baseline 的点会额外标星
133
+ - 最新点使用莫兰迪深红色填充
134
+ - 较早的点使用莫兰迪深蓝色填充
135
+ - 如果指标有多个,DeepScientist 会按顺序发送,并在相邻两张图之间间隔约 2 秒
136
+
137
+ 这些图来自 quest 本地生成的文件,并会作为微信原生图片自动发送到当前绑定会话。
138
+
119
139
  ## 6. 常见问题
120
140
 
121
141
  ### 二维码一直在等待
@@ -56,6 +56,14 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
56
56
  - `SKILL.md`:定义各个阶段的执行纪律
57
57
  - `mcp/server.py`:定义内建工具面
58
58
 
59
+ 受管 quest-local prompt 镜像:
60
+
61
+ - DeepScientist 仍然会优先读取 `quest_root/.codex/prompts/` 下存在的 prompt 片段。
62
+ - 但这棵树现在是“自动维护的受管副本”,不再默认视为永久手工 fork。
63
+ - 每次真实 runner turn 开始前,DeepScientist 都会把当前 active quest-local prompt 树与仓库 `src/prompts/` 做比较;只要仓库源变了,或者 quest 本地副本漂移了,就会刷新 active 副本。
64
+ - 刷新之前,旧的 active prompt 树会先备份到 `quest_root/.codex/prompt_versions/<backup_id>/`。
65
+ - 所以默认情况下,旧 quest 也会吃到最新 prompt 合同;如果你需要回放历史 prompt,再显式选择某个备份版本。
66
+
59
67
  ## 3. 一轮 prompt 是怎么组装的
60
68
 
61
69
  当前运行时大致按下面顺序组装 turn prompt:
@@ -72,11 +80,12 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
72
80
  10. research delivery policy
73
81
  11. paper and evidence snapshot
74
82
  12. 如果是 retry turn,则加入 retry recovery packet
75
- 13. interaction style
76
- 14. priority memory for this turn
77
- 15. recent conversation window
78
- 16. current turn attachments
79
- 17. current user message
83
+ 13. 如果是 auto-continue turn,则加入 resume context spine
84
+ 14. interaction style
85
+ 15. priority memory for this turn
86
+ 16. recent conversation window
87
+ 17. current turn attachments
88
+ 18. current user message
80
89
 
81
90
  这个顺序不是随便排的。
82
91
 
@@ -100,6 +109,7 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
100
109
  - 不要过早结束 quest
101
110
  - Web、TUI、connector 属于同一个 quest
102
111
  - 用户可见的汇报风格
112
+ - baseline 提交与确认的纪律:如果源 baseline 暴露了多指标或多 variant,就要保留完整比较面,而不是只留下一个 headline scalar
103
113
 
104
114
  如果你发现 agent 在所有场景里行为都不对,`system.md` 一定是首要检查点之一。
105
115
 
@@ -113,6 +123,7 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
113
123
  - 排队中的用户消息必须优先确认和处理
114
124
  - `blocking` 只该用于真实用户决策
115
125
  - 进展汇报应该简洁且可读
126
+ - 真正发给用户的交互消息应保持完整;系统会单独生成短预览,所以 agent 不应该自己把 connector 回复截成 `...` / `…`
116
127
 
117
128
  如果模型经常在长任务里“断线”或者不会接住用户后续消息,这个文件非常关键。
118
129
 
@@ -208,6 +219,16 @@ builder 会直接把这些 quest 文件读进 prompt:
208
219
  - `src/deepscientist/prompts/builder.py`
209
220
  - 当前 quest 所处的 stage skill
210
221
 
222
+ 它现在还明确承载了 continuation 的模式分叉:
223
+
224
+ - `workspace_mode = copilot`
225
+ - 以当前请求为单位提供帮助
226
+ - 做完这一小段之后,通常停驻,等待下一条用户消息或 `/resume`
227
+ - `workspace_mode = autonomous`
228
+ - 默认继续往前推进
229
+ - 如果真实长任务还没跑起来,就继续用接下来的 turns 做准备、启动或耐久决策
230
+ - 一旦真实长任务已经在跑,后台 auto-continue 就切成低频巡检
231
+
211
232
  ### 4.8 Interaction style
212
233
 
213
234
  这个 block 决定这轮该怎么“说话”。
@@ -227,7 +248,27 @@ builder 会直接把这些 quest 文件读进 prompt:
227
248
  - 写作阶段
228
249
  - 等待用户决策的阶段
229
250
 
230
- ### 4.9 Priority memory
251
+ 它现在也编码了 auto-continue 的节奏分叉:
252
+
253
+ - autonomous 下,如果还在准备 / 启动真实长任务,可以较快地连续推进
254
+ - 如果真实外部长任务已经在跑,则默认切成低频检查,默认大约每 `240` 秒一轮
255
+ - copilot 模式则通常在当前请求单元完成后停驻,不继续自动扩展
256
+
257
+ ### 4.9 Resume context spine
258
+
259
+ 现在在 auto-continue turn 中,prompt 会额外注入一个紧凑的 resume spine,避免模型只凭一个 stage 名称硬续。
260
+
261
+ 里面包括:
262
+
263
+ - 最近一条持久化用户消息
264
+ - 最近一条 assistant checkpoint
265
+ - 最近一条 run result 摘要
266
+ - 少量最近 memory cues
267
+ - 当前 `bash_exec` 状态,包括是否有长时间 shell 会话正在运行
268
+
269
+ 这也是为什么 auto-continue 能更贴着“最新用户意图 + 最新检查点”继续,而不是漂回泛泛的 stage narration。
270
+
271
+ ### 4.10 Priority memory
231
272
 
232
273
  DeepScientist 不是随机往 prompt 里塞 memory 的。
233
274
 
@@ -244,22 +285,33 @@ DeepScientist 不是随机往 prompt 里塞 memory 的。
244
285
 
245
286
  agent 不应该在每一轮都看到完全同一批 memory。
246
287
 
247
- ## 5. 哪些 prompt 可以本地覆盖
288
+ ## 5. 本地 active prompt 与历史版本
248
289
 
249
- 当前支持按 quest 在下面路径覆盖 prompt 片段:
290
+ 当前 quest active prompt 树仍在这些路径下:
250
291
 
251
292
  - `.codex/prompts/system.md`
252
293
  - `.codex/prompts/contracts/shared_interaction.md`
253
294
  - `.codex/prompts/connectors/<connector>.md`
254
295
 
255
- 也就是说:
296
+ 仓库默认 prompt 仍然在 `src/prompts/`。
297
+
298
+ 但现在有一个关键变化:
299
+
300
+ - `.codex/prompts/` 不应再理解为长期手工维护的 override 树。
301
+ - 每次真实运行前,DeepScientist 都会把 active quest-local copy 修回当前仓库 prompt 真相。
302
+ - 所以如果你手工改了 active copy,这种改动会在下次运行时被视为漂移:先备份,再替换。
303
+ - 历史 prompt 会保存在 `.codex/prompt_versions/<backup_id>/`。
304
+
305
+ 如果你确实想让某个 quest 临时按旧 prompt 跑,启动时优先传正式版本号即可:
306
+
307
+ - `ds daemon --prompt-version <official_version>`
308
+ - `ds run --prompt-version <official_version> ...`
256
309
 
257
- - 仓库默认 prompt 在 `src/prompts/`
258
- - quest 私有覆盖在 `.codex/prompts/`
310
+ DeepScientist 会把它解析成“该正式版本号下最新的一份 prompt 备份”。如果你想精确回放某一次具体备份,而不是该版本下最新的一份,也仍然可以直接传备份目录名。
259
311
 
260
- 只有当某个 quest 确实需要局部特殊合同,才建议这样覆盖。
312
+ 如果只是想继续使用当前受管 active prompt,就用 `latest`。
261
313
 
262
- 如果这个改动应该影响整个产品,就不该做 quest-local override,而应该直接改仓库默认 prompt。
314
+ 如果这个改动应该影响正常未来行为,就不该只改 quest-local active copy,而应该直接改仓库默认 prompt。
263
315
 
264
316
  ## 6. Skills 是怎么分层的
265
317
 
@@ -62,7 +62,7 @@ codex:
62
62
 
63
63
  - 对 provider-backed 的 Codex profile,建议优先使用 `model: inherit`
64
64
  - 除非你非常确定该 provider 接受你要显式传入的模型名,否则不要再额外硬写一个模型
65
- - DeepScientist 会复用你终端里同一个 `~/.codex/config.toml` 与环境变量
65
+ - DeepScientist 现在会在 `.ds/codex-home` 下启动一个隔离的运行时 home,但会先继承你配置的 `~/.codex` 里的 auth、config、skills、agents 与 prompts
66
66
 
67
67
  ## Provider 一览
68
68
 
@@ -109,13 +109,13 @@ MiniMax 是最典型的 profile 模式。它的官方 Codex CLI 文档直接给
109
109
 
110
110
  ### 已验证的兼容性说明
111
111
 
112
- 按 2026-03-25 对 MiniMax 官方 Codex CLI 页面和本地兼容性测试的核对结果:
112
+ 按 2026-04-04 对 MiniMax 官方 Codex CLI 页面和本地兼容性测试的核对结果:
113
113
 
114
114
  - MiniMax 官方 Codex CLI 页面当前建议使用 `@openai/codex@0.57.0`
115
115
  - MiniMax 当前应使用的 Coding Plan endpoint 是 `https://api.minimaxi.com/v1`
116
116
  - MiniMax 官方页面示例 profile 名是 `m21`,但 profile 名本身只是本地别名;本仓库统一用 `m27` 作为示例名
117
117
  - MiniMax 官方页面当前给出的 `codex-MiniMax-*` 模型名,在本地使用你提供的 key 实测并不能稳定通过 Codex CLI
118
- - 本地实测能稳定跑通的组合是 `MiniMax-M2.7` + `m27` + `model: inherit` + Codex CLI `0.57.0`
118
+ - 本地实测 DeepScientist 可稳定跑通的组合包括 `MiniMax-M2.7` + `m27` + Codex CLI `0.57.0`,以及 `MiniMax-M2.5` + `m25` + Codex CLI `0.57.0`
119
119
  - 当前最新版 `@openai/codex` 和 MiniMax 官方文档并不能稳定直接对齐
120
120
 
121
121
  如果你现在要走最稳的 DeepScientist + MiniMax 路径,建议直接使用 Codex CLI `0.57.0`。
@@ -125,7 +125,7 @@ MiniMax 是最典型的 profile 模式。它的官方 Codex CLI 文档直接给
125
125
  - 已安装 Codex CLI `0.57.0`
126
126
  - 已创建 MiniMax `Coding Plan Key`
127
127
  - 在启动 Codex 和 DeepScientist 的 shell 中可见的 `MINIMAX_API_KEY`
128
- - 当前 shell 已清理 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`
128
+ - 如果你要单独在终端里验证 `codex --profile <name>`,当前 shell 需要先清理 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`
129
129
  - `~/.codex/config.toml` 中已经配置好的 Codex profile
130
130
 
131
131
  ### 安装 Codex CLI `0.57.0`
@@ -145,6 +145,8 @@ codex-cli 0.57.0
145
145
 
146
146
  如果你还想保留另一个 Codex 版本,也可以单独写一个 wrapper 脚本,再把 `runners.codex.binary` 指向那个绝对路径。
147
147
 
148
+ 现在如果 DeepScientist 在启动时检测到 MiniMax profile,但当前 `codex` 版本不是 `0.57.0`,在交互式终端里会主动提示是否自动安装 `@openai/codex@0.57.0`。
149
+
148
150
  ### Codex 侧配置
149
151
 
150
152
  请使用 `https://api.minimaxi.com/v1`,不要用 `https://api.minimax.io/v1`。
@@ -157,15 +159,19 @@ unset OPENAI_BASE_URL
157
159
  export MINIMAX_API_KEY="..."
158
160
  ```
159
161
 
162
+ 如果你是在终端里单独验证 `codex --profile <name>`,就按上面的方式处理。
163
+ 如果你走的是 DeepScientist 路径,那么当所选 provider 明确写了 `requires_openai_auth = false` 时,DeepScientist 现在会在 startup probe 和真实 runner 执行时自动剥离 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`。
164
+
160
165
  MiniMax 官方页面示例 profile 名是 `m21`。由于 profile 名只是本地别名,本仓库统一改写成 `m27`。
161
166
 
162
167
  先说明差异:
163
168
 
164
169
  - 官方页面当前展示的是 `codex-MiniMax-M2.5`
165
- - 但本地实测里,直接请求 MiniMax API 能稳定跑通的是 `MiniMax-M2.7`
166
- - 同一把 key 下,`codex-MiniMax-M2.5` / `codex-MiniMax-M2.7` 通过 Codex CLI 都会失败
170
+ - 但本地实测里,直接请求 MiniMax API 能稳定跑通的是 `MiniMax-M2.7` 和 `MiniMax-M2.5`
171
+ - 可复现的 DeepScientist 路径是:`MiniMax-M2.7` `m27`,以及 `MiniMax-M2.5` `m25`
172
+ - 对 `m25` 这条路径,请使用 `MiniMax-M2.5`,不要写成 `codex-MiniMax-M2.5`
167
173
 
168
- 因此,下面给的是当前 DeepScientist 推荐的可运行配置:
174
+ 因此,下面给的是当前 DeepScientist 推荐配置:
169
175
 
170
176
  ```toml
171
177
  [model_providers.minimax]
@@ -183,9 +189,19 @@ model = "MiniMax-M2.7"
183
189
  model_provider = "minimax"
184
190
  ```
185
191
 
192
+ 如果你想走同样的 DeepScientist 路径但使用 `m25`,保持上面的 provider 配置不变,再把 profile 写成:
193
+
194
+ ```toml
195
+ [profiles.m25]
196
+ model = "MiniMax-M2.5"
197
+ model_provider = "minimax"
198
+ ```
199
+
186
200
  DeepScientist 现在对它的支持方式是:
187
201
 
188
- - 如果你使用的是这类 profile-only MiniMax 配置,再配合 Codex CLI `0.57.0`,DeepScientist 会在自己的 probe / 运行时临时 `.codex/config.toml` 里,把所选 profile 的 `model_provider` 和 `model` 自动提升到顶层
202
+ - 如果你使用的是这类 profile-only MiniMax 配置,再配合 Codex CLI `0.57.0`,DeepScientist 会在自己的 probe / 运行时临时 `config.toml` 副本里,把所选 profile 的 `model_provider` 和 `model` 自动提升到顶层
203
+ - 对 provider-backed 的 MiniMax profile,DeepScientist 会强制使用 `model: inherit`,避免再被硬编码的 OpenAI 模型覆盖
204
+ - 当 `requires_openai_auth = false` 时,DeepScientist 会自动移除冲突的 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`
189
205
  - 这意味着即使终端里原样执行 `codex --profile m27` 还会失败,DeepScientist 也可以先兼容跑起来
190
206
 
191
207
  如果你还希望终端里的 `codex --profile <name>` 也直接可用,请使用显式顶层兼容写法:
@@ -248,6 +264,7 @@ DeepScientist 现在会为 MiniMax 的 `0.57.0` 路径额外做两层兼容:
248
264
 
249
265
  - 当检测到旧版 Codex CLI 不支持 `xhigh` 时,自动把 `xhigh` 降级成 `high`
250
266
  - 当检测到 MiniMax 使用 profile-only 的 `model_provider` / `model` 配置形态时,在临时 DeepScientist Codex home 里自动补齐顶层字段
267
+ - 当 provider 明确声明 `requires_openai_auth = false` 时,自动移除冲突的 `OPENAI_*` 认证环境变量
251
268
 
252
269
  ## GLM
253
270
 
@@ -0,0 +1,134 @@
1
+ # 16 Telegram Connector 指南
2
+
3
+ 当你希望通过 Telegram 继续推进 DeepScientist quest 时,请阅读这份指南。
4
+
5
+ 当前开源版本中的 Telegram 连接方式使用内置 polling 路径:
6
+
7
+ - 不需要公网 webhook
8
+ - 核心凭据是 BotFather token
9
+ - 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
10
+
11
+ ## 1. Telegram 支持包含什么
12
+
13
+ 当前 Telegram connector 由以下部分组成:
14
+
15
+ - `TelegramPollingService`:负责入站轮询
16
+ - `GenericRelayChannel`:负责绑定、inbox/outbox、target 与运行时状态
17
+ - `TelegramConnectorBridge`:负责通过 Bot API 直接出站发送
18
+
19
+ 这意味着 Telegram 已经接入了和其他 connector 一致的 quest 绑定模型。
20
+
21
+ ## 2. 推荐配置路径
22
+
23
+ 1. 打开 BotFather。
24
+ 2. 执行 `/newbot`。
25
+ 3. 保存生成的 bot token。
26
+ 4. 打开 `Settings > Connectors > Telegram`。
27
+ 5. 启用 Telegram。
28
+ 6. 保持 `transport: polling`。
29
+ 7. 填写 `bot_token`。
30
+ 8. 保存连接器配置。
31
+ 9. 从 Telegram 给 bot 发送一条真实私聊,例如 `/start` 或 `/help`。
32
+ 10. 回到 DeepScientist,确认运行时已经发现这个 target conversation。
33
+
34
+ ## 3. 关键配置字段
35
+
36
+ 主要字段包括:
37
+
38
+ - `enabled`
39
+ - `transport`
40
+ - `bot_name`
41
+ - `bot_token`
42
+ - `command_prefix`
43
+ - `require_mention_in_groups`
44
+ - `dm_policy`
45
+ - `allow_from`
46
+ - `group_policy`
47
+ - `group_allow_from`
48
+ - `groups`
49
+ - `auto_bind_dm_to_active_quest`
50
+
51
+ 完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
52
+
53
+ ## 4. 绑定模型
54
+
55
+ Telegram 会话会被规范化成 quest-aware connector id,例如:
56
+
57
+ - `telegram:direct:<chat_id>`
58
+ - `telegram:group:<chat_id>`
59
+
60
+ DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时 webhook 状态。
61
+
62
+ 重要规则:
63
+
64
+ - 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
65
+ - 如果启用了自动绑定,Telegram 私聊可以自动跟随最新活跃 quest
66
+ - 之后也可以在项目设置页修改绑定
67
+
68
+ ## 5. 群聊行为
69
+
70
+ 默认情况下:
71
+
72
+ - Telegram 私聊允许直接触发
73
+ - 群聊行为由 `group_policy` 控制
74
+ - 如果 `require_mention_in_groups` 为 `true`,机器人只有在被明确 mention,或收到命令时才会响应
75
+
76
+ 这也是更适合多人群聊的推荐默认值。
77
+
78
+ ## 6. 出站投递
79
+
80
+ 当前 Telegram connector 主要聚焦于 text-first 的 quest 更新:
81
+
82
+ - 进度
83
+ - 里程碑摘要
84
+ - 绑定通知
85
+ - 结构化 quest 回复
86
+
87
+ 当前 bridge 使用 Telegram Bot API 的 `sendMessage` 发送。
88
+
89
+ ## 7. 常见问题排查
90
+
91
+ ### 设置页里看不到 Telegram
92
+
93
+ Telegram 可能被 system connector gate 隐藏了。请确认:
94
+
95
+ - `config.connectors.system_enabled.telegram` 为 `true`
96
+
97
+ ### 校验提示缺少凭据
98
+
99
+ 请检查:
100
+
101
+ - `bot_token` 是否已填写
102
+ - 或 `bot_token_env` 是否指向真实存在的环境变量
103
+
104
+ ### 机器人收不到消息
105
+
106
+ 请检查:
107
+
108
+ - bot token 是否正确
109
+ - 是否至少从 Telegram 端先和 bot 交互过一次
110
+ - `transport` 是否仍然是 `polling`
111
+ - 是否存在旧的 webhook 抢占了更新流
112
+
113
+ ### 群聊里 bot 不响应
114
+
115
+ 请检查:
116
+
117
+ - `group_policy`
118
+ - `groups`
119
+ - `group_allow_from`
120
+ - `require_mention_in_groups`
121
+
122
+ ### Telegram 里无法继续已有 quest
123
+
124
+ 请检查:
125
+
126
+ - 当前会话是否已经绑定到目标 quest
127
+ - 或 `auto_bind_dm_to_active_quest` 是否已经启用
128
+
129
+ ## 8. 相关文档
130
+
131
+ - [01 设置参考](./01_SETTINGS_REFERENCE.md)
132
+ - [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
133
+ - [09 启动诊断](./09_DOCTOR.md)
134
+ - [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)
@@ -0,0 +1,126 @@
1
+ # 17 WhatsApp Connector 指南
2
+
3
+ 当你希望通过 WhatsApp 继续推进 DeepScientist quest 时,请阅读这份指南。
4
+
5
+ 当前开源版本里的 WhatsApp 推荐路径使用本地 local-session 方案:
6
+
7
+ - 不需要公网 webhook
8
+ - 本地认证 / 会话状态保存在你自己的机器上
9
+ - 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
10
+
11
+ ## 1. WhatsApp 支持包含什么
12
+
13
+ 当前 WhatsApp connector 由以下部分组成:
14
+
15
+ - `WhatsAppLocalSessionService`:负责本地会话同步与入站接入
16
+ - `GenericRelayChannel`:负责 bindings、inbox/outbox、targets 与运行时状态
17
+ - `WhatsAppConnectorBridge`:负责出站投递
18
+
19
+ 在推荐路径下,出站消息会先写入 local-session outbox,再由本地 session / sidecar 处理。
20
+
21
+ ## 2. 推荐配置路径
22
+
23
+ 1. 打开 `Settings > Connectors > WhatsApp`。
24
+ 2. 启用 WhatsApp。
25
+ 3. 保持 `transport: local_session`。
26
+ 4. 保持默认或指定一个可写的 `session_dir`。
27
+ 5. 保存连接器配置。
28
+ 6. 完成本地 WhatsApp 会话登录流程。
29
+ 7. 从 WhatsApp 发送一条真实消息。
30
+ 8. 回到 DeepScientist,确认目标会话已经被自动发现。
31
+
32
+ ## 3. 关键配置字段
33
+
34
+ 主要字段包括:
35
+
36
+ - `enabled`
37
+ - `transport`
38
+ - `bot_name`
39
+ - `auth_method`
40
+ - `session_dir`
41
+ - `command_prefix`
42
+ - `dm_policy`
43
+ - `allow_from`
44
+ - `group_policy`
45
+ - `group_allow_from`
46
+ - `groups`
47
+ - `auto_bind_dm_to_active_quest`
48
+
49
+ 完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
50
+
51
+ ## 4. 绑定模型
52
+
53
+ WhatsApp 会话会被规范化成 quest-aware connector id,例如:
54
+
55
+ - `whatsapp:direct:<jid>`
56
+ - `whatsapp:group:<jid>`
57
+
58
+ DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时浏览器状态或短期 session 状态。
59
+
60
+ 重要规则:
61
+
62
+ - 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
63
+ - 如果启用了自动绑定,WhatsApp 私聊可以自动跟随最新活跃 quest
64
+ - 之后也可以在项目设置页修改绑定
65
+
66
+ ## 5. local-session 运行方式
67
+
68
+ 当前开源版本里的 WhatsApp 路径是 local-session 导向的:
69
+
70
+ - 运行时状态会镜像写入 DeepScientist 的 connector 日志目录
71
+ - 入站消息会从本地 session inbox 中被消费
72
+ - 出站消息会被写入本地 session outbox
73
+
74
+ 这也符合 DeepScientist 的本地优先设计。
75
+
76
+ ## 6. 群聊行为
77
+
78
+ 默认情况下:
79
+
80
+ - 私聊可以和活跃 quest 自动配对
81
+ - 群聊行为由 `group_policy` 控制
82
+ - 也可以通过 `groups` 与 `group_allow_from` 强制使用白名单
83
+
84
+ ## 7. 常见问题排查
85
+
86
+ ### 设置页里看不到 WhatsApp
87
+
88
+ WhatsApp 可能被 system connector gate 隐藏了。请确认:
89
+
90
+ - `config.connectors.system_enabled.whatsapp` 为 `true`
91
+
92
+ ### 校验提示连接器未就绪
93
+
94
+ 请检查:
95
+
96
+ - `transport` 是否为 `local_session`
97
+ - `session_dir` 是否指向可写目录
98
+
99
+ ### 没有自动发现目标会话
100
+
101
+ 请检查:
102
+
103
+ - 本地登录 / 配对流程是否已经完成
104
+ - 是否至少有一条真实入站消息进入 local session inbox
105
+
106
+ ### 无法从 WhatsApp 继续已有 quest
107
+
108
+ 请检查:
109
+
110
+ - 当前会话是否已经绑定到目标 quest
111
+ - 或 `auto_bind_dm_to_active_quest` 是否已经启用
112
+
113
+ ### 出站消息没有送达
114
+
115
+ 请检查:
116
+
117
+ - 本地 session sidecar / processor 是否正在运行
118
+ - 本地 session outbox 是否正在被消费
119
+ - 目标 JID 是否正确
120
+
121
+ ## 8. 相关文档
122
+
123
+ - [01 设置参考](./01_SETTINGS_REFERENCE.md)
124
+ - [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
125
+ - [09 启动诊断](./09_DOCTOR.md)
126
+ - [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)
@@ -0,0 +1,136 @@
1
+ # 18 Feishu Connector 指南
2
+
3
+ 当你希望通过 Feishu / Lark 继续推进 DeepScientist quest 时,请阅读这份指南。
4
+
5
+ 当前开源版本中的 Feishu 推荐路径使用内置 long-connection 方案:
6
+
7
+ - 不需要公网 event callback
8
+ - 核心凭据是 `app_id` 和 `app_secret`
9
+ - 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
10
+
11
+ ## 1. Feishu 支持包含什么
12
+
13
+ 当前 Feishu connector 由以下部分组成:
14
+
15
+ - `FeishuLongConnectionService`:负责 long-connection 入站接收
16
+ - `GenericRelayChannel`:负责 bindings、inbox/outbox、targets 与运行时状态
17
+ - `FeishuConnectorBridge`:负责直接出站发送
18
+
19
+ 这意味着 Feishu 已经接入了和其他 connector 一致的 quest 绑定模型。
20
+
21
+ ## 2. 推荐配置路径
22
+
23
+ 1. 打开 Feishu / Lark 开发者平台。
24
+ 2. 创建应用。
25
+ 3. 保存 `app_id` 和 `app_secret`。
26
+ 4. 打开 `Settings > Connectors > Feishu`。
27
+ 5. 启用 Feishu。
28
+ 6. 保持 `transport: long_connection`。
29
+ 7. 填写 `app_id` 与 `app_secret`。
30
+ 8. 保存连接器配置。
31
+ 9. 给 bot 发送一条真实消息。
32
+ 10. 回到 DeepScientist,确认目标会话已经被自动发现。
33
+
34
+ ## 3. 关键配置字段
35
+
36
+ 主要字段包括:
37
+
38
+ - `enabled`
39
+ - `transport`
40
+ - `bot_name`
41
+ - `app_id`
42
+ - `app_secret`
43
+ - `api_base_url`
44
+ - `command_prefix`
45
+ - `dm_policy`
46
+ - `allow_from`
47
+ - `group_policy`
48
+ - `group_allow_from`
49
+ - `groups`
50
+ - `require_mention_in_groups`
51
+ - `auto_bind_dm_to_active_quest`
52
+
53
+ 完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
54
+
55
+ ## 4. 绑定模型
56
+
57
+ Feishu 会话会被规范化成 quest-aware connector id,例如:
58
+
59
+ - `feishu:direct:<chat_id>`
60
+ - `feishu:group:<chat_id>`
61
+
62
+ DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时 callback payload。
63
+
64
+ 重要规则:
65
+
66
+ - 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
67
+ - 如果启用了自动绑定,Feishu 私聊可以自动跟随最新活跃 quest
68
+ - 之后也可以在项目设置页修改绑定
69
+
70
+ ## 5. 群聊行为
71
+
72
+ 默认情况下:
73
+
74
+ - 私聊允许直接触发
75
+ - 群聊行为由 `group_policy` 控制
76
+ - 如果 `require_mention_in_groups` 为 `true`,机器人只有在被明确 mention,或收到命令时才会响应
77
+
78
+ 这也是更适合多人协作群的推荐默认值。
79
+
80
+ ## 6. 出站投递
81
+
82
+ 当前 Feishu connector 主要聚焦于 text-first 的 quest 更新:
83
+
84
+ - 进度
85
+ - 里程碑摘要
86
+ - 绑定通知
87
+ - 结构化 quest 回复
88
+
89
+ 当前 bridge 使用 Feishu Open Platform 的消息接口发送。
90
+
91
+ ## 7. 常见问题排查
92
+
93
+ ### 设置页里看不到 Feishu
94
+
95
+ Feishu 可能被 system connector gate 隐藏了。请确认:
96
+
97
+ - `config.connectors.system_enabled.feishu` 为 `true`
98
+
99
+ ### 校验提示缺少凭据
100
+
101
+ 请检查:
102
+
103
+ - `app_id` 是否已填写
104
+ - `app_secret` 是否已填写
105
+ - 或 `app_secret_env` 是否指向真实存在的环境变量
106
+
107
+ ### 没有自动发现目标会话
108
+
109
+ 请检查:
110
+
111
+ - 应用凭据是否正确
112
+ - bot 是否已经收到至少一条真实入站消息
113
+ - `transport` 是否仍然是 `long_connection`
114
+
115
+ ### 群聊里 bot 不响应
116
+
117
+ 请检查:
118
+
119
+ - `group_policy`
120
+ - `groups`
121
+ - `group_allow_from`
122
+ - `require_mention_in_groups`
123
+
124
+ ### 无法从 Feishu 继续已有 quest
125
+
126
+ 请检查:
127
+
128
+ - 当前会话是否已经绑定到目标 quest
129
+ - 或 `auto_bind_dm_to_active_quest` 是否已经启用
130
+
131
+ ## 8. 相关文档
132
+
133
+ - [01 设置参考](./01_SETTINGS_REFERENCE.md)
134
+ - [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
135
+ - [09 启动诊断](./09_DOCTOR.md)
136
+ - [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)