@researai/deepscientist 1.5.0 → 1.5.2

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 (168) hide show
  1. package/AGENTS.md +26 -0
  2. package/README.md +47 -161
  3. package/assets/connectors/lingzhu/openclaw-bridge/README.md +124 -0
  4. package/assets/connectors/lingzhu/openclaw-bridge/index.ts +162 -0
  5. package/assets/connectors/lingzhu/openclaw-bridge/openclaw.plugin.json +145 -0
  6. package/assets/connectors/lingzhu/openclaw-bridge/package.json +35 -0
  7. package/assets/connectors/lingzhu/openclaw-bridge/src/cli.ts +180 -0
  8. package/assets/connectors/lingzhu/openclaw-bridge/src/config.ts +196 -0
  9. package/assets/connectors/lingzhu/openclaw-bridge/src/debug-log.ts +111 -0
  10. package/assets/connectors/lingzhu/openclaw-bridge/src/events.ts +4 -0
  11. package/assets/connectors/lingzhu/openclaw-bridge/src/http-handler.ts +1133 -0
  12. package/assets/connectors/lingzhu/openclaw-bridge/src/image-cache.ts +75 -0
  13. package/assets/connectors/lingzhu/openclaw-bridge/src/lingzhu-tools.ts +246 -0
  14. package/assets/connectors/lingzhu/openclaw-bridge/src/transform.ts +541 -0
  15. package/assets/connectors/lingzhu/openclaw-bridge/src/types.ts +131 -0
  16. package/assets/connectors/lingzhu/openclaw-bridge/tsconfig.json +14 -0
  17. package/assets/connectors/lingzhu/openclaw.lingzhu.config.template.json +39 -0
  18. package/bin/ds.js +2048 -166
  19. package/docs/en/00_QUICK_START.md +152 -0
  20. package/docs/en/01_SETTINGS_REFERENCE.md +1104 -0
  21. package/docs/en/02_START_RESEARCH_GUIDE.md +404 -0
  22. package/docs/en/03_QQ_CONNECTOR_GUIDE.md +325 -0
  23. package/docs/en/04_LINGZHU_CONNECTOR_GUIDE.md +216 -0
  24. package/docs/en/05_TUI_GUIDE.md +141 -0
  25. package/docs/en/06_RUNTIME_AND_CANVAS.md +679 -0
  26. package/docs/en/07_MEMORY_AND_MCP.md +253 -0
  27. package/docs/en/08_FIGURE_STYLE_GUIDE.md +97 -0
  28. package/docs/en/09_DOCTOR.md +152 -0
  29. package/docs/en/90_ARCHITECTURE.md +247 -0
  30. package/docs/en/91_DEVELOPMENT.md +195 -0
  31. package/docs/en/99_ACKNOWLEDGEMENTS.md +29 -0
  32. package/docs/zh/00_QUICK_START.md +152 -0
  33. package/docs/zh/01_SETTINGS_REFERENCE.md +1137 -0
  34. package/docs/zh/02_START_RESEARCH_GUIDE.md +414 -0
  35. package/docs/zh/03_QQ_CONNECTOR_GUIDE.md +324 -0
  36. package/docs/zh/04_LINGZHU_CONNECTOR_GUIDE.md +230 -0
  37. package/docs/zh/05_TUI_GUIDE.md +128 -0
  38. package/docs/zh/06_RUNTIME_AND_CANVAS.md +271 -0
  39. package/docs/zh/07_MEMORY_AND_MCP.md +235 -0
  40. package/docs/zh/08_FIGURE_STYLE_GUIDE.md +97 -0
  41. package/docs/zh/09_DOCTOR.md +154 -0
  42. package/docs/zh/99_ACKNOWLEDGEMENTS.md +29 -0
  43. package/install.sh +41 -16
  44. package/package.json +5 -2
  45. package/pyproject.toml +1 -1
  46. package/src/deepscientist/__init__.py +6 -1
  47. package/src/deepscientist/artifact/guidance.py +9 -2
  48. package/src/deepscientist/artifact/service.py +1026 -39
  49. package/src/deepscientist/bash_exec/monitor.py +27 -5
  50. package/src/deepscientist/bash_exec/runtime.py +639 -0
  51. package/src/deepscientist/bash_exec/service.py +99 -16
  52. package/src/deepscientist/bridges/base.py +3 -0
  53. package/src/deepscientist/bridges/connectors.py +292 -13
  54. package/src/deepscientist/channels/qq.py +19 -2
  55. package/src/deepscientist/channels/relay.py +1 -0
  56. package/src/deepscientist/cli.py +32 -25
  57. package/src/deepscientist/config/models.py +28 -2
  58. package/src/deepscientist/config/service.py +202 -7
  59. package/src/deepscientist/connector_runtime.py +2 -0
  60. package/src/deepscientist/daemon/api/handlers.py +68 -6
  61. package/src/deepscientist/daemon/api/router.py +3 -0
  62. package/src/deepscientist/daemon/app.py +531 -15
  63. package/src/deepscientist/doctor.py +511 -0
  64. package/src/deepscientist/gitops/diff.py +3 -0
  65. package/src/deepscientist/home.py +26 -2
  66. package/src/deepscientist/latex_runtime.py +17 -4
  67. package/src/deepscientist/lingzhu_support.py +182 -0
  68. package/src/deepscientist/mcp/context.py +3 -1
  69. package/src/deepscientist/mcp/server.py +55 -2
  70. package/src/deepscientist/prompts/builder.py +222 -58
  71. package/src/deepscientist/quest/layout.py +2 -0
  72. package/src/deepscientist/quest/service.py +133 -14
  73. package/src/deepscientist/quest/stage_views.py +65 -1
  74. package/src/deepscientist/runners/codex.py +2 -0
  75. package/src/deepscientist/runtime_tools/__init__.py +16 -0
  76. package/src/deepscientist/runtime_tools/builtins.py +19 -0
  77. package/src/deepscientist/runtime_tools/models.py +29 -0
  78. package/src/deepscientist/runtime_tools/registry.py +40 -0
  79. package/src/deepscientist/runtime_tools/service.py +59 -0
  80. package/src/deepscientist/runtime_tools/tinytex.py +25 -0
  81. package/src/deepscientist/shared.py +44 -17
  82. package/src/deepscientist/tinytex.py +276 -0
  83. package/src/prompts/connectors/lingzhu.md +15 -0
  84. package/src/prompts/connectors/qq.md +121 -0
  85. package/src/prompts/system.md +214 -37
  86. package/src/skills/analysis-campaign/SKILL.md +46 -7
  87. package/src/skills/baseline/SKILL.md +12 -5
  88. package/src/skills/decision/SKILL.md +7 -5
  89. package/src/skills/experiment/SKILL.md +22 -5
  90. package/src/skills/finalize/SKILL.md +9 -5
  91. package/src/skills/idea/SKILL.md +6 -5
  92. package/src/skills/intake-audit/SKILL.md +277 -0
  93. package/src/skills/intake-audit/references/state-audit-template.md +41 -0
  94. package/src/skills/rebuttal/SKILL.md +409 -0
  95. package/src/skills/rebuttal/references/action-plan-template.md +63 -0
  96. package/src/skills/rebuttal/references/evidence-update-template.md +30 -0
  97. package/src/skills/rebuttal/references/response-letter-template.md +113 -0
  98. package/src/skills/rebuttal/references/review-matrix-template.md +55 -0
  99. package/src/skills/review/SKILL.md +295 -0
  100. package/src/skills/review/references/experiment-todo-template.md +29 -0
  101. package/src/skills/review/references/review-report-template.md +83 -0
  102. package/src/skills/review/references/revision-log-template.md +40 -0
  103. package/src/skills/scout/SKILL.md +6 -5
  104. package/src/skills/write/SKILL.md +8 -4
  105. package/src/tui/dist/components/WelcomePanel.js +17 -43
  106. package/src/tui/dist/components/messages/BashExecOperationMessage.js +3 -2
  107. package/src/tui/package.json +1 -1
  108. package/src/ui/dist/assets/{AiManusChatView-7v-dHngU.js → AiManusChatView-CZpg376x.js} +127 -597
  109. package/src/ui/dist/assets/{AnalysisPlugin-B_Xmz-KE.js → AnalysisPlugin-CtHA22g3.js} +1 -1
  110. package/src/ui/dist/assets/{AutoFigurePlugin-Cko-0tm1.js → AutoFigurePlugin-BSWmLMmF.js} +63 -8
  111. package/src/ui/dist/assets/{CliPlugin-BsU0ht7q.js → CliPlugin-CJ7jdm_s.js} +43 -609
  112. package/src/ui/dist/assets/{CodeEditorPlugin-DcMMP0Rt.js → CodeEditorPlugin-DhInVGFf.js} +8 -8
  113. package/src/ui/dist/assets/{CodeViewerPlugin-BqoQ5QyY.js → CodeViewerPlugin-D1n8S9r5.js} +5 -5
  114. package/src/ui/dist/assets/{DocViewerPlugin-D7eHNhU6.js → DocViewerPlugin-C4XM_kqk.js} +3 -3
  115. package/src/ui/dist/assets/{GitDiffViewerPlugin-DLJN42T5.js → GitDiffViewerPlugin-W6kS9r6v.js} +1 -1
  116. package/src/ui/dist/assets/{ImageViewerPlugin-gJMV7MOu.js → ImageViewerPlugin-DPeUx_Oz.js} +5 -6
  117. package/src/ui/dist/assets/{LabCopilotPanel-B857sfxP.js → LabCopilotPanel-eAelUaub.js} +12 -15
  118. package/src/ui/dist/assets/LabPlugin-BbOrBxKY.js +2676 -0
  119. package/src/ui/dist/assets/{LatexPlugin-DWKEo-Wj.js → LatexPlugin-C-HhkVXY.js} +16 -16
  120. package/src/ui/dist/assets/{MarkdownViewerPlugin-DBzoEmhv.js → MarkdownViewerPlugin-BDIzIBfh.js} +4 -4
  121. package/src/ui/dist/assets/{MarketplacePlugin-DoHc-8vo.js → MarketplacePlugin-DAOJphwr.js} +3 -3
  122. package/src/ui/dist/assets/{NotebookEditor-CKjKH-yS.js → NotebookEditor-BsoMvDoU.js} +3 -3
  123. package/src/ui/dist/assets/{PdfLoader-zFoL0VPo.js → PdfLoader-fiC7RtHf.js} +1 -1
  124. package/src/ui/dist/assets/{PdfMarkdownPlugin-DXPaL9Nt.js → PdfMarkdownPlugin-C5OxZBFK.js} +3 -3
  125. package/src/ui/dist/assets/{PdfViewerPlugin-DhK8qCFp.js → PdfViewerPlugin-CAbxQebk.js} +10 -10
  126. package/src/ui/dist/assets/{SearchPlugin-CdSi6krf.js → SearchPlugin-SE33Lb9B.js} +1 -1
  127. package/src/ui/dist/assets/{Stepper-V-WiDQJl.js → Stepper-0Av7GfV7.js} +1 -1
  128. package/src/ui/dist/assets/{TextViewerPlugin-hIs1Efiu.js → TextViewerPlugin-Daf2gJDI.js} +4 -4
  129. package/src/ui/dist/assets/{VNCViewer-DG8b0q2X.js → VNCViewer-BKrMUIOX.js} +9 -10
  130. package/src/ui/dist/assets/{bibtex-HDac6fVW.js → bibtex-JBdOEe45.js} +1 -1
  131. package/src/ui/dist/assets/{code-BnBeNxBc.js → code-B0TDFCZz.js} +1 -1
  132. package/src/ui/dist/assets/{file-content-IRQ3jHb8.js → file-content-3YtrSacz.js} +1 -1
  133. package/src/ui/dist/assets/{file-diff-panel-DZoQ9I6r.js → file-diff-panel-CJEg5OG1.js} +1 -1
  134. package/src/ui/dist/assets/{file-socket-BMCdLc-P.js → file-socket-CYQYdmB1.js} +1 -1
  135. package/src/ui/dist/assets/{file-utils-CltILB3w.js → file-utils-Cd1C9Ppl.js} +1 -1
  136. package/src/ui/dist/assets/{image-Boe6ffhu.js → image-B33ctrvC.js} +1 -1
  137. package/src/ui/dist/assets/{index-2Zf65FZt.js → index-9CLPVeZh.js} +1 -1
  138. package/src/ui/dist/assets/{index-DZqJ-qAM.js → index-BNQWqmJ2.js} +60 -2154
  139. package/src/ui/dist/assets/{index-DO43pFZP.js → index-BVXsmS7V.js} +84086 -84365
  140. package/src/ui/dist/assets/{index-BlplpvE1.js → index-Buw_N1VQ.js} +2 -2
  141. package/src/ui/dist/assets/{index-Bq2bvfkl.css → index-SwmFAld3.css} +2622 -2619
  142. package/src/ui/dist/assets/{message-square-mUHn_Ssb.js → message-square-D0cUJ9yU.js} +1 -1
  143. package/src/ui/dist/assets/{monaco-fe0arNEU.js → monaco-UZLYkp2n.js} +1 -1
  144. package/src/ui/dist/assets/{popover-D_7i19qU.js → popover-CTeiY-dK.js} +1 -1
  145. package/src/ui/dist/assets/{project-sync-DyVGrU7H.js → project-sync-Dbs01Xky.js} +2 -8
  146. package/src/ui/dist/assets/{sigma-BzazRyxQ.js → sigma-CM08S-xT.js} +1 -1
  147. package/src/ui/dist/assets/{tooltip-DN_yjHFH.js → tooltip-pDtzvU9p.js} +1 -1
  148. package/src/ui/dist/assets/trash-YvPCP-da.js +32 -0
  149. package/src/ui/dist/assets/{useCliAccess-DV2L2Qxy.js → useCliAccess-Bavi74Ac.js} +12 -42
  150. package/src/ui/dist/assets/{useFileDiffOverlay-DyTj-p_V.js → useFileDiffOverlay-CVXY6oeg.js} +1 -1
  151. package/src/ui/dist/assets/{wrap-text-ozYHtUwq.js → wrap-text-Cf4flRW7.js} +1 -1
  152. package/src/ui/dist/assets/{zoom-out-BN9MUyCQ.js → zoom-out-Hb0Z1YpT.js} +1 -1
  153. package/src/ui/dist/index.html +2 -2
  154. package/uv.lock +1155 -0
  155. package/assets/fonts/Inter-Variable.ttf +0 -0
  156. package/assets/fonts/NotoSerifSC-Regular-C94HN_ZN.ttf +0 -0
  157. package/assets/fonts/NunitoSans-Variable.ttf +0 -0
  158. package/assets/fonts/Satoshi-Medium-ByP-Zb-9.woff2 +0 -0
  159. package/assets/fonts/SourceSans3-Variable.ttf +0 -0
  160. package/assets/fonts/ds-fonts.css +0 -83
  161. package/src/ui/dist/assets/Inter-Variable-VF2RPR_K.ttf +0 -0
  162. package/src/ui/dist/assets/LabPlugin-bL7rpic8.js +0 -43
  163. package/src/ui/dist/assets/NotoSerifSC-Regular-C94HN_ZN-C94HN_ZN.ttf +0 -0
  164. package/src/ui/dist/assets/NunitoSans-Variable-B_ZymHAd.ttf +0 -0
  165. package/src/ui/dist/assets/Satoshi-Medium-ByP-Zb-9-GkA34YXu.woff2 +0 -0
  166. package/src/ui/dist/assets/SourceSans3-Variable-CD-WOsSK.ttf +0 -0
  167. package/src/ui/dist/assets/info-CcsK_htA.js +0 -18
  168. package/src/ui/dist/assets/user-plus-BusDx-hF.js +0 -79
@@ -0,0 +1,271 @@
1
+ # 06 运行时与 Canvas:理解运行流程和图结构
2
+
3
+ 本文描述的是本仓库里 **DeepScientist Core 的当前实现行为**(以代码为准),而不是旧的架构草案。
4
+
5
+ ## 1. 以哪些文件为准
6
+
7
+ 本文的结论来自这些核心文件(不需要全部读完,按需定位即可):
8
+
9
+ - Prompt / Skills
10
+ - `src/prompts/system.md`
11
+ - `src/skills/*/SKILL.md`
12
+ - `src/deepscientist/prompts/builder.py`
13
+ - 运行时与 API
14
+ - `src/deepscientist/daemon/app.py`
15
+ - `src/deepscientist/daemon/api/handlers.py`
16
+ - `src/deepscientist/daemon/api/router.py`
17
+ - 任务状态 / Artifact / Memory
18
+ - `src/deepscientist/quest/service.py`
19
+ - `src/deepscientist/artifact/service.py`
20
+ - `src/deepscientist/memory/service.py`
21
+ - 前端 Canvas(Lab)
22
+ - `src/ui/src/lib/api/lab.ts`
23
+ - `src/ui/src/lib/plugins/lab/components/LabQuestGraphCanvas.tsx`
24
+
25
+ ## 2. 一句话总结
26
+
27
+ 当前系统不是“重型的阶段机(stage engine)”。
28
+
29
+ 它更像是一个 **Prompt-led + Skill-led + File-led** 的本地研究运行时:
30
+
31
+ - daemon 负责:排队、turn 调度、API、connector、恢复
32
+ - prompt/skills 负责:研究纪律、产物规范、什么时候需要决策
33
+ - 持久化真相在文件中:quest 文档、artifacts、memory 卡片、Git、bash 日志
34
+ - Canvas 从 Git + artifacts + events 重建,而不是维护一份中心化图数据库
35
+
36
+ ## 3. Anchor(阶段)模型
37
+
38
+ system prompt 定义的 canonical anchors(会写入 `quest.yaml.active_anchor`):
39
+
40
+ - `scout`
41
+ - `baseline`
42
+ - `idea`
43
+ - `experiment`
44
+ - `analysis-campaign`
45
+ - `write`
46
+ - `finalize`
47
+
48
+ `decision` **不是**一个固定 stage;它是跨阶段的 skill:当继续/停止/分支/归零/需要用户决策时使用。
49
+
50
+ 本系统默认允许“非线性回退”:
51
+
52
+ - `write -> analysis-campaign / experiment / scout`
53
+ - `experiment -> idea`
54
+ - `analysis-campaign -> experiment`
55
+
56
+ ## 4. 用户发来一条命令/消息后发生什么
57
+
58
+ 有两条路径:
59
+
60
+ ### 4.1 结构化命令(daemon 直接处理)
61
+
62
+ 例如:
63
+
64
+ - `GET /api/quests/<id>/workflow`
65
+ - `GET /api/quests/<id>/node-traces`
66
+ - `GET /api/quests/<id>/artifacts`
67
+ - `GET /api/quests/<id>/events?format=raw|acp`
68
+ - `GET /api/quests/<id>/git/branches`
69
+ - `POST /api/quests/<id>/control`(pause/stop/resume)
70
+
71
+ 这类请求通常不会启动 runner(除非某个动作明确触发 turn 调度)。
72
+
73
+ ### 4.2 普通对话文本(走 mailbox + turn 调度)
74
+
75
+ 顺序大致为:
76
+
77
+ 1. UI/TUI/connector 提交用户消息
78
+ 2. daemon 把消息写入 quest history
79
+ 3. 如果 quest 空闲:立刻调度新 turn
80
+ 4. 如果 quest 正在运行:消息进入 mailbox 队列,等待 agent 调用 `artifact.interact(...)` 时再投递
81
+
82
+ 关键点:第一条消息往往启动 turn;后续消息通过 `artifact.interact(...)` 才会被“送达 agent”。
83
+
84
+ ## 5. Turn 生命周期(实际实现)
85
+
86
+ 概略流程:
87
+
88
+ 1. `submit_user_message(...)`
89
+ 2. `schedule_turn(...)`
90
+ 3. worker 线程 `_drain_turns(...)`
91
+ 4. `_run_quest_turn(...)`
92
+ 5. 选择 runner(当前主要是 Codex)
93
+ 6. 选择 skill
94
+ 7. 构建 prompt
95
+ 8. 运行 runner
96
+ 9. agent 使用 MCP / 文件 / Git / shell
97
+ 10. 退出并记录 run 输出
98
+
99
+ ### 5.1 如果当前 quest 已经在运行
100
+
101
+ daemon 维护 per-quest turn state(`running/pending/stop_requested`)。
102
+
103
+ 当 quest 已运行时,新消息不会启动第二个 runner,而是标记为 `pending` 并进入 mailbox,随后通过 `artifact.interact(...)` 投递。
104
+
105
+ ### 5.2 本轮用哪个 skill
106
+
107
+ 当前规则(很重要):
108
+
109
+ 1. 若用户消息是在回复一个阻塞交互(waiting interaction):使用 `decision`
110
+ 2. 否则读取 `quest.yaml.active_anchor`
111
+ 3. 若 `active_anchor` 是标准 skill:使用该 skill
112
+ 4. 否则 fallback 到 `decision`
113
+
114
+ 实现位置:`src/deepscientist/daemon/app.py` 的 `_turn_skill_for(...)`。
115
+
116
+ ## 6. 现实:Anchor 推进不是强自动化的
117
+
118
+ 新 quest 通常从:
119
+
120
+ - `active_anchor: baseline`
121
+
122
+ 开始。但 daemon 目前不会像严格 workflow engine 那样自动把每个 quest 从 A 推到 B。
123
+
124
+ 实践上系统更依赖:
125
+
126
+ - prompt 的“研究纪律说明”
127
+ - `quest.yaml.active_anchor` 决定本轮 skill
128
+ - agent 写出 artifacts / memory / 文档来维持连续性
129
+ - 遇到路线变化时用 `decision` 明确理由与证据
130
+
131
+ ## 7. Prompt 如何构建
132
+
133
+ 每个 turn 的 prompt 由 `PromptBuilder.build(...)` 组装,主要包含:
134
+
135
+ 1. `src/prompts/system.md`
136
+ 2. 运行时上下文(home、quest_root、branch、anchor、runner、locale…)
137
+ 3. 当前交互 surface
138
+ 4. skills 的根目录与路径(让 agent 去读取对应 SKILL.md)
139
+ 5. quest 核心文档(brief/plan/status/summary 等)
140
+ 6. 相关 memory(按 stage 偏置)
141
+ 7. 最近对话窗口
142
+ 8. 当前 turn 的附件摘要
143
+ 9. 当前用户消息
144
+
145
+ ### 7.1 当前交互 surface
146
+
147
+ builder 现在会注入一个 surface block,明确告诉 agent:这一轮主要是在哪个用户表面上交流。
148
+
149
+ 典型字段包括:
150
+
151
+ - 最新用户消息来源
152
+ - 当前是本地 surface 还是 connector surface
153
+ - 如果是 connector,则给出 connector 名称与 chat type
154
+ - 若当前 turn 来自 QQ,则补充 QQ 的里程碑媒体策略
155
+
156
+ 这仍然是轻量做法:
157
+
158
+ - 不会把系统变成每个 connector 一套独立 workflow
159
+ - 只是把“这一轮的沟通契约”显式化
160
+
161
+ ### 7.2 当前 turn 的附件摘要
162
+
163
+ 如果最新一条入站用户消息携带了附件元信息,builder 会注入一个很小的附件摘要 block。
164
+
165
+ 这个 block 的作用是:
166
+
167
+ - 告诉 agent 当前确实有附件
168
+ - 如果已经有可读 sidecar(如提取文本 / OCR / manifest),优先提示它先读这些
169
+ - 避免 agent 对二进制附件是否相关完全靠猜
170
+
171
+ 它只是“摘要层”,不是完整的附件处理流水线。
172
+
173
+ ### 7.3 Skill 以“路径引用”为主
174
+
175
+ 系统并不把 skill 内容全部内联进 prompt,而是把 skill 文件路径注入,然后 prompt 指示 agent 去读对应 `SKILL.md`。
176
+
177
+ 这保证:
178
+
179
+ - prompt 简洁
180
+ - skill 可独立维护
181
+ - 支持注册表式扩展
182
+
183
+ ### 7.4 Memory 注入是“按阶段偏置”的
184
+
185
+ 不同 stage 会优先检索不同 kind 的 memory(例如 baseline 更看 `episodes/knowledge/decisions`,idea 更看 `ideas/papers` 等)。
186
+
187
+ ## 8. MCP(内建)只有三个 namespace
188
+
189
+ 本仓库的核心约束:只提供 3 个内建 MCP namespace:
190
+
191
+ - `memory`
192
+ - `artifact`
193
+ - `bash_exec`
194
+
195
+ ### 8.1 `memory`
196
+
197
+ 用于可复用知识的持久化与检索(Markdown + YAML 头)。
198
+
199
+ ### 8.2 `artifact`
200
+
201
+ 用于 quest 状态改变 / 结构化产物 / Git 相关操作(例如 checkpoint、分支准备、实验记录、summary 刷新、git graph 渲染、交互投递)。
202
+
203
+ ### 8.3 `bash_exec`
204
+
205
+ 用于可审计、可恢复的 shell 运行(训练、评测、长脚本等)。
206
+
207
+ ## 9. 为什么 `artifact.interact(...)` 是中枢
208
+
209
+ `artifact.interact(...)` 同时承担:
210
+
211
+ 1. 写入结构化 artifact(形成可追踪的研究过程)
212
+ 2. 可选 checkpoint
213
+ 3. 维护交互线程状态(thread/blocking)
214
+ 4. 向绑定的 connectors 推送进展(按路由策略)
215
+ 5. 消费 mailbox 中排队的用户消息并返还给 agent
216
+ 6. 返回近期交互上下文(便于长任务不中断)
217
+
218
+ 这就是为什么“运行中”时用户补充消息不会丢:它们会在下一次 `interact` 时被投递。
219
+
220
+ ## 10. Connector 推送与路由策略(简述)
221
+
222
+ 当允许向外推送时,目标来自 quest bindings:
223
+
224
+ - `<quest_root>/.ds/bindings.json`
225
+ - home 的 `connectors.yaml` 以及 `_routing` 配置
226
+
227
+ 常见策略:
228
+
229
+ - `fanout_all`:广播所有
230
+ - `primary_only`:只推送 primary
231
+ - `primary_plus_local`:primary + 本地
232
+
233
+ 默认行为通常是:本地保留 + 一个 preferred connector。
234
+
235
+ ## 11. Canvas(Git 图)如何构建
236
+
237
+ Canvas 不依赖一份中心化 graph 文件。
238
+
239
+ 当前主要从两类来源重建:
240
+
241
+ 1. Git refs/branches + worktree 元信息(用于“分支视图”)
242
+ 2. artifacts + events(用于“事件视图/研究轨迹”)
243
+
244
+ 其中“分支视图”可以表达两种模式(后端已有字段支持):
245
+
246
+ 1. 不同 idea / 不同主实现的 major branches
247
+ 2. 在同一主实验线下分出多个 analysis branches,最终合并回主线写论文
248
+
249
+ 额外实验的当前运行时约束也已经固定:
250
+
251
+ - 只要某个已完成节点之后还需要补做额外实验,就应通过 `artifact.create_analysis_campaign(...)` 启动
252
+ - 即使只需要 1 个额外实验,也应该作为一个只含 1 个 slice 的 campaign 来创建
253
+ - 这个 campaign 应该从“当前工作节点 / 当前结果节点”分叉,而不是直接在已完成父节点上继续改
254
+ - 这样 Git 历史和 Canvas 里的父子关系才会保持一致
255
+
256
+ ## 12. 事件流与 ACP 兼容
257
+
258
+ daemon 的实时刷新依赖:
259
+
260
+ - `GET /api/quests/<id>/events`
261
+
262
+ 该端点可以返回:
263
+
264
+ - `format=raw`:原生事件
265
+ - `format=acp`:ACP 兼容 envelope(给 Web/TUI/connector 做统一渲染)
266
+
267
+ 重要原则:
268
+
269
+ - 文件与 artifacts 是持久化真相
270
+ - events 是实时操作流
271
+ - ACP 只是兼容包装层
@@ -0,0 +1,235 @@
1
+ # 07 Memory 与 MCP:内建 MCP 和记忆协议
2
+
3
+ 本文定义 DeepScientist Core 内建的 3 个 MCP namespace 的含义与使用纪律:
4
+
5
+ - `memory`
6
+ - `artifact`
7
+ - `bash_exec`
8
+
9
+ 目标很简单:
10
+
11
+ - `artifact` 驱动 quest 的“研究状态与结构化产物”
12
+ - `memory` 降低重复发现成本(可复用知识)
13
+ - `bash_exec` 运行可审计的持久 shell 工作
14
+
15
+ ## 1. 什么时候用哪个 MCP
16
+
17
+ 当输出是“以后还会复用、需要记住”的内容时,用 `memory`:
18
+
19
+ - 论文阅读笔记(可复用)
20
+ - 失败模式与排错经验
21
+ - 选择/否决某个 idea 的稳定理由
22
+ - 评测/指标的稳定注意事项(metric caveat)
23
+
24
+ 对 ideation 的要求(非常重要):
25
+
26
+ - 在提出新 idea 前,先回看相关的 idea cards
27
+ - 在扩大检索前,先回看实验结果与失败模式
28
+ - 不要把历史上某行内容当作当前 active idea,除非它被明确再次选中
29
+
30
+ 当输出会改变/汇报 quest 状态时,用 `artifact`:
31
+
32
+ - idea 的创建/修订
33
+ - 分支/工作树切换记录
34
+ - 主实验记录
35
+ - analysis campaign 记录
36
+ - 进度/里程碑推送
37
+ - 决策与 approval
38
+ - connector 侧需要看到的交互状态
39
+
40
+ 当需要运行“可持续跟踪、可回放”的命令时,用 `bash_exec`:
41
+
42
+ - 训练/评测
43
+ - 长时间脚本
44
+ - 需要后续 `read/list/kill` 的命令
45
+
46
+ ## 2. Memory 工具语义(建议用法)
47
+
48
+ ### `memory.list_recent(...)`
49
+
50
+ 用途:
51
+
52
+ - 快速恢复本地上下文
53
+ - pause/restart 后重建状态
54
+
55
+ 建议在:
56
+
57
+ - turn 开始
58
+ - 恢复 stopped quest 后
59
+ - 在决定“要读哪几张卡”之前
60
+
61
+ 示例:
62
+
63
+ ```text
64
+ memory.list_recent(scope="quest", limit=5, kind="knowledge")
65
+ ```
66
+
67
+ ### `memory.search(...)`
68
+
69
+ 用途:
70
+
71
+ - 在重复劳动之前做定向检索
72
+
73
+ 建议在:
74
+
75
+ - 做大范围文献检索之前
76
+ - 反复失败前先查是否已有排错记录
77
+ - 选择/修订 idea 之前
78
+ - 问用户前先查是否已经有稳定答案
79
+
80
+ 常见 kind:
81
+
82
+ - `papers`:论文与引用
83
+ - `decisions`:路线选择理由
84
+ - `episodes`:故障与排错
85
+ - `knowledge`:稳定规则
86
+
87
+ 示例:
88
+
89
+ ```text
90
+ memory.search(query="official validation split", scope="both", kind="papers", limit=6)
91
+ memory.search(query="metric wiring mismatch", scope="quest", kind="episodes", limit=5)
92
+ memory.search(query="baseline novelty constraints", scope="both", kind="ideas", limit=6)
93
+ ```
94
+
95
+ ### `memory.read(...)`
96
+
97
+ 用途:
98
+
99
+ - 读一张“确定相关”的卡
100
+
101
+ 建议:
102
+
103
+ - 先 `search/list_recent` 找到少量候选,再 `read` 其中 1~3 张
104
+ - 不要一口气读几十张
105
+
106
+ 示例:
107
+
108
+ ```text
109
+ memory.read(path="~/DeepScientist/quests/q-xxxx/memory/knowledge/metric-contract.md")
110
+ ```
111
+
112
+ ### `memory.write(...)`
113
+
114
+ 用途:
115
+
116
+ - 写入可复用的持久化发现
117
+
118
+ 适合写在:
119
+
120
+ - 有价值的论文阅读总结之后
121
+ - 非平凡的 debug episode 之后
122
+ - 稳定的评测规则确认之后
123
+ - 选中/否决某个 idea(有理由与证据)之后
124
+
125
+ 不适合写在:
126
+
127
+ - 泛泛的聊天总结
128
+ - 临时的进度 ping(那应该用 artifact)
129
+ - 已经在 artifact 中更好记录的信息
130
+
131
+ Memory 卡片格式:**Markdown + 顶部 YAML**。建议包含:
132
+
133
+ 1. context
134
+ 2. action/observation
135
+ 3. outcome
136
+ 4. interpretation
137
+ 5. boundaries
138
+ 6. evidence paths
139
+ 7. retrieval hints
140
+
141
+ 示例:
142
+
143
+ ```md
144
+ ---
145
+ id: knowledge-1234abcd
146
+ type: knowledge
147
+ title: 指标对比只有在官方验证划分下才成立
148
+ quest_id: q-xxxx
149
+ scope: quest
150
+ tags:
151
+ - stage:baseline
152
+ - topic:metric-contract
153
+ stage: baseline
154
+ confidence: high
155
+ evidence_paths:
156
+ - artifacts/baselines/verification_report.md
157
+ retrieval_hints:
158
+ - baseline comparison
159
+ - metric contract
160
+ updated_at: 2026-03-11T18:00:00+00:00
161
+ ---
162
+
163
+ 背景:在官方 benchmark 设置下验证 baseline。
164
+
165
+ 观察:只有使用官方 validation split 时数值才一致。
166
+
167
+ 解释:若使用自定义 split,与该 baseline 的对比将不成立。
168
+
169
+ 边界:该规则是 benchmark-specific 的;除非在多个 quest 中复现,否则不建议提升为 global。
170
+ ```
171
+
172
+ ### `memory.promote_to_global(...)`
173
+
174
+ 用途:
175
+
176
+ - 将已证明可复用的 quest-local 经验提升到 global memory
177
+
178
+ 仅在以下情况下使用:
179
+
180
+ - 不是项目噪声
181
+ - 已足够稳定
182
+ - 其他 quest 很可能受益
183
+
184
+ ## 3. Artifact vs Memory 的边界
185
+
186
+ 两者都写的前提是“职责不同”:
187
+
188
+ - 实验完成:
189
+ - `artifact.record_*` 记录官方实验与证据
190
+ - `memory.write`(可选)只记录可复用规则/教训
191
+
192
+ 不要用 memory 代替实验 artifact。
193
+ 不要用 artifact 代替可复用知识卡。
194
+
195
+ ## 4. Bash exec 的基本用法
196
+
197
+ 用于可监控命令:
198
+
199
+ ```text
200
+ bash_exec.bash_exec(command="python train.py --config configs/main.yaml", mode="detach", workdir="<quest workspace>")
201
+ ```
202
+
203
+ 随后检查:
204
+
205
+ ```text
206
+ bash_exec.bash_exec(mode="list", status="running")
207
+ bash_exec.bash_exec(mode="read", id="<bash_id>")
208
+ ```
209
+
210
+ 只有在确实需要停止时才使用 `kill`。
211
+
212
+ ## 5. Prompt 级纪律(建议)
213
+
214
+ 通常推荐遵循:
215
+
216
+ 1. turn 开始/恢复时先 `memory.list_recent(...)`
217
+ 2. 重复劳动前 `memory.search(...)`
218
+ 3. 只 `memory.read(...)` 少量关键卡片
219
+ 4. quest 状态变化用 `artifact`
220
+ 5. 长任务 shell 用 `bash_exec`
221
+ 6. 有真正的可复用发现才 `memory.write(...)`
222
+
223
+ ## 6. UI 期望
224
+
225
+ 在 `/projects/{id}` 的 Studio trace 中:
226
+
227
+ - `memory.*` 应渲染为结构化卡片,而不是 raw JSON
228
+ - 卡片应显示:
229
+ - 操作类型
230
+ - scope / kind
231
+ - title 或 query
232
+ - 命中条目或写入摘要
233
+
234
+ 如果 agent 完全不调用 memory:优先看 prompt/skill 行为是否偏离。
235
+ 如果 agent 调用 memory 但 UI 只显示 raw logs:优先修 UI 的渲染层。
@@ -0,0 +1,97 @@
1
+ # 08 图表风格指南:实验图与论文图规范
2
+
3
+ 本文档定义 DeepScientist 默认的实验图、分析图和论文图风格规范。
4
+
5
+ ## 核心原则
6
+
7
+ 优先使用克制、证据优先的图。
8
+
9
+ - 面向 connector 的里程碑图,目标是快速传达结论
10
+ - 面向论文的图,目标是干净、稳定、适合 PDF 导出与审稿阅读
11
+ - 两者都统一使用 prompt / stage skills 中固定的莫兰迪色系
12
+
13
+ ## 固定莫兰迪配色
14
+
15
+ - `mist-stone`: `#F3EEE8`, `#D8D1C7`, `#8A9199`
16
+ - `sage-clay`: `#E7E1D6`, `#B7A99A`, `#7F8F84`
17
+ - `dust-rose`: `#F2E9E6`, `#D8C3BC`, `#B88C8C`
18
+ - `fog-blue`: `#DCE5E8`, `#A9BCC4`, `#6F8894`
19
+ - `olive-paper`: `#E6E1D3`, `#B8B095`, `#7C7A5C`
20
+ - `lavender-ash`: `#E8E3EA`, `#B9AFC2`, `#7D7486`
21
+
22
+ 推荐搭配:
23
+
24
+ - 主方法 vs baseline:`sage-clay` + `mist-stone`
25
+ - 多个 ablation:`mist-stone` + `fog-blue` + `dust-rose`
26
+ - uncertainty / sensitivity:`mist-stone` + `olive-paper`
27
+ - appendix / supplementary:`mist-stone` + `lavender-ash`
28
+
29
+ ## 图表类型选择
30
+
31
+ 图表类型应由研究问题决定:
32
+
33
+ - 折线图:epoch、step、budget、scale 或有序条件上的趋势
34
+ - 柱状图:少量类别的并列比较,且共享零基线
35
+ - 点图 / point-range:更强调精确值和置信区间时
36
+ - 箱线图 / 小提琴图 / 直方图:真正的分布问题
37
+ - 热力图:只有当矩阵结构本身就是结果时才使用
38
+
39
+ 不要为了“看起来丰富”而做成拥挤的 dashboard。
40
+
41
+ ## 颜色语义
42
+
43
+ - 有序幅值 -> 使用顺序型、低饱和配色
44
+ - 围绕 0 或某个参考值的正负偏移 -> 使用带中性中心的发散型低饱和配色
45
+ - 类别比较 -> 使用离散配色,不要拿连续色带冒充类别
46
+
47
+ 避免使用 rainbow / jet / HSV 这类会扭曲排序感知的配色。
48
+
49
+ ## 导出规则
50
+
51
+ - connector 里程碑图:通常导出 `png`
52
+ - 论文图:导出 `pdf` 或 `svg`,同时保留一份 `png` 预览
53
+ - 如果可以导出矢量格式,就不要把线稿和文字栅格化
54
+ - 背景保持白色或近白色
55
+ - 网格线保持轻量
56
+ - 图例尽量简洁,能直标就直标
57
+ - 确保缩放到论文版面后文字仍然可读
58
+ - 默认优先接近常见论文版式:
59
+ - 单栏宽度约 `89 mm`
60
+ - 双栏宽度约 `183 mm`
61
+
62
+ ## 强制复检流程
63
+
64
+ 不要在第一次渲染后就把重要图片标记为完成。
65
+
66
+ 对于里程碑图、论文图、附录图,默认流程应当是:
67
+
68
+ 1. 先生成第一版
69
+ 2. 打开导出的实际图片进行查看
70
+ 3. 如果发现留白、标签、图例、颜色层级或可读性问题,就立即修图
71
+ 4. 再导出最终版本
72
+
73
+ 最低完成条件应当是“已经实际看过图,并做过必要修正”,而不是“代码看起来没问题”。
74
+
75
+ ## 最小检查清单
76
+
77
+ 把图当作完成之前,至少确认:
78
+
79
+ - 可视编码与研究问题一致
80
+ - 标签、单位、基线明确
81
+ - 同一组图里的颜色语义一致
82
+ - 源数据路径明确
83
+ - 生成脚本路径明确
84
+ - 图可以从 durable 文件重新生成
85
+ - 缩小到真实论文版面后仍然可读
86
+ - 用户快速扫一眼就能看出主结论
87
+ - 图例不会挡住数据
88
+
89
+ ## 参考依据
90
+
91
+ 本规范主要参考以下公开资料进行约束抽象:
92
+
93
+ - PLOS Computational Biology《Ten Simple Rules for Better Figures》:`https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003833`
94
+ - Graphics Principles:`https://graphicsprinciples.github.io/`
95
+ - Nature 作者格式说明:`https://www.nature.com/nature/for-authors/formatting-guide`
96
+ - Matplotlib colormap 指南:`https://matplotlib.org/stable/users/explain/colors/colormaps.html`
97
+ - Datawrapper 可访问性图表规范:`https://academy.datawrapper.de/article/206-how-we-make-sure-our-charts-maps-and-tables-are-accessible`