@v587d/capital-generation 2.9.0 → 2.9.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 (38) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +4 -3
  3. package/chart-ui/README.md +4 -3
  4. package/chart-ui/package.json +1 -1
  5. package/config/package.json +1 -1
  6. package/lib/agents/bash-guard.d.ts +10 -6
  7. package/lib/agents/bash-guard.js +15 -12
  8. package/lib/agents/root-tool-policy.js +2 -0
  9. package/lib/chart/artifact-ref.d.ts +11 -1
  10. package/lib/chart/artifact-ref.js +25 -3
  11. package/lib/chart/delivery.d.ts +66 -0
  12. package/lib/chart/delivery.js +148 -0
  13. package/lib/chart/events.d.ts +2 -0
  14. package/lib/chart/events.js +55 -1
  15. package/lib/chart/present-tool.d.ts +36 -0
  16. package/lib/chart/present-tool.js +149 -0
  17. package/lib/chart/tool.d.ts +1 -0
  18. package/lib/chart/tool.js +9 -5
  19. package/lib/chart-render-entry.d.ts +2 -1
  20. package/lib/chart-render-entry.js +0 -3
  21. package/lib/data-collector/dataset-tools.js +1 -1
  22. package/lib/data-collector/store.d.ts +1 -0
  23. package/lib/present-entry.d.ts +19 -0
  24. package/lib/present-entry.js +114 -0
  25. package/lib/web-retriever/local-fetch.d.ts +1 -1
  26. package/lib/web-retriever/local-fetch.js +1 -1
  27. package/lib/web-retriever/wind-client.d.ts +1 -1
  28. package/lib/web-retriever/wind-client.js +1 -1
  29. package/package.json +8 -2
  30. package/preset/capital-generation/README.md +31 -13
  31. package/preset/capital-generation/agent.patch.yml +31 -34
  32. package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +6 -4
  33. package/preset/capital-generation/skills/capital-data-profile/SKILL.md +9 -4
  34. package/preset/capital-generation/skills/capital-data-query/SKILL.md +34 -19
  35. package/preset/capital-generation/skills/capital-equity-research/SKILL.md +6 -1
  36. package/preset/capital-generation/skills/capital-orchestration/SKILL.md +15 -14
  37. package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +10 -5
  38. package/watchlist/package.json +1 -1
@@ -133,24 +133,24 @@
133
133
  (不做投资判断、不输出买卖建议),也不改写原始 Dataset。你是主 Agent 的直接子 Agent,
134
134
  与 data_collector 是兄弟:你不会被 data_collector 创建或指挥,互通一律经主 Agent 中继;
135
135
  visualization_specialist 是你的异步子 Agent,不向主 Agent 直接发消息。
136
- 就本插件工具面而言,你无外部行情 API、无网页检索、无凭据读取能力;宿主若仍暴露 web_search / web_fetch 等通用工具,也不得用于取数或查资料。不索取或保存账户密码。
136
+ 工具面没有外部行情 API、网页检索与凭据入口;run_code 里的 Node 也不得用于取数、联网或读凭据;宿主若暴露 web_search / web_fetch 也不得用于取数或查资料。不索取或保存账户密码。
137
137
 
138
138
  # DUTIES
139
- 0. 第一步先加载协议:调用 Dataset 工具前先 skill capital-data-profile;要写 query_request
140
- 或做派生算术再加 skill capital-data-query;描述完成
141
- (describe_dataset / profile_dataset)后无条件加载 skill capital-visualization-protocol,
139
+ 0. 第一步先加载协议:Dataset 工具前先 skill capital-data-profile(必须 tools.skill,别直调);写 query_request
140
+ 或做算术再加 skill capital-data-query;描述后无条件加载 skill capital-visualization-protocol,
142
141
  再选择 gate。载荷样例、事实读法、data_gap 与 QuerySpec 细则都在 skill 里。
143
- 1. 启动自检:缺少 describe_dataset(或 inspect_dataset/profile_dataset/query_dataset)时 send_message 回告;正常时登记 data_junior_ready。
142
+ 1. 启动自检:先看 SDK 有无 tools.describe_dataset,没有就 send_message 回告;正常时登记 data_junior_ready。
144
143
 
145
144
  2. 只用受控工具:dataset_ids 按主 Agent 转发的原样使用;一切路径都是 opaque
146
- artifact_ref(workspace://...),由受控工具解析;不接受路径、脚本或自定义表达式。
147
- 3. 默认用 describe_dataset 读 Dataset(一次一份;多份在**同一条消息**里一次发完,可并发);inspect_dataset/profile_dataset/query_dataset 只用于单点复核。优先用 profile 的 time_facts 与 structure;query_dataset 只做受控聚合,你取不到原始行。
145
+ artifact_ref(workspace://...),由受控工具解析;Dataset 工具只收 dataset_id 与 QuerySpec,
146
+ run_code 只调度工具与算术,不得读文件。
147
+ 3. 默认用 describe_dataset 读 Dataset(多份在同一 run_code 程序里 Promise.all,见 PROGRAM DISCIPLINE);inspect_dataset/profile_dataset/query_dataset 只用于单点复核。优先用 profile 的 time_facts 与 structure;query_dataset 只做受控聚合,你取不到原始行。
148
148
 
149
149
  4. 数据缺口:先分清「数据里确实没有」与「那份数据还没取」。后者不要写成「无法确认」,
150
150
  立即用 send_message 向父 Agent 发一次 data_gap(task_id / dataset_id / need / reason /
151
151
  blocking),同一条缺口只发一次,这是请求不是结论。你不得自行取数、也不得直接找
152
152
  data_collector(取数由主 Agent 转交);不要为了填空编造能力名。
153
- 5. 回传:逐份回传结构化载荷(type / task_id / dataset_id / profile_ref
153
+ 5. 回传:用 tools.send_message 逐份回传结构化载荷(type / task_id / dataset_id / profile_ref
154
154
  或 query_result),字段按工具返回原样填入——字段名、数值、日期一律不改写;可附表或
155
155
  摘要,禁止只回传 markdown 汇总。失败回传 profile_failed / query_failed 与 error/code,
156
156
  绝不编造统计或查询结果;失败不影响原始 Dataset,可按主 Agent 指示重试。
@@ -163,12 +163,11 @@
163
163
  任何时间窗/时间戳换算一律交给宿主:时间窗优先 resolve_data_time_range(传 dataset_id + period),
164
164
  拿 bounds 填 filter;绝不自行把日期算成毫秒,看到 epoch 要加减乘除才能得出结论,就是走错了路。
165
165
 
166
- # BASH DISCIPLINE
167
- bash 只做纯计算兜底,只用于算变化量 / 增幅 / CAGR / 比值 / 单位换算这类派生指标,
168
- 不是取数通道:不联网、不跑 curl 或 wget 取任何外部数据,数据缺失走 data_gap 回告主 Agent。
169
- 不读文件、不碰 capital-data 下的任何路径(那是原始行与 Dataset 的边界)。
170
- 输出只留结论数字(原始行与中间数据不进回传),并注明算法与口径。
171
- 输入只敲标量(≤20 个)、逐数核对再算,不整行复制。
166
+ # PROGRAM DISCIPLINE
167
+ 调用一律写进 run_code;skill 也走 tools.skill,console.log(s.content),只 await 等于没读。
168
+ 字段直接取返回值,不手抄;变化量/增幅/CAGR 在程序里算。
169
+ 多份 describe 用 Promise.all,只返回结论;回传用 tools.send_message,不用原生名。
170
+ 不读文件、不碰 capital-data、不 fetch、不申请升级(sandbox_permissions);缺数据发 data_gap。
172
171
 
173
172
  - id: agent-instructions
174
173
  name: '@deepseek-ai/dsh-agent-instructions'
@@ -185,6 +184,12 @@
185
184
  - id: tool-skill
186
185
  name: '@deepseek-ai/dsh-tool-skill'
187
186
 
187
+ # PTC: presentation is preset-scoped; the host runtime (dsh-base) stays per-call.
188
+ - id: tool-presentation
189
+ name: '@deepseek-ai/dsh-agent-tool-presentation'
190
+ config:
191
+ mode: ptc
192
+
188
193
  # ── compaction: both rows must live in one realm; thresholdChars 8192 is the instance-wide single value ──
189
194
  - id: compaction
190
195
  name: cordis:group
@@ -206,19 +211,6 @@
206
211
  headChars: 4096
207
212
  tailChars: 1024
208
213
 
209
- - id: tool-bash
210
- name: '@deepseek-ai/dsh-tool-bash'
211
- disabled: !!js process.platform === 'win32'
212
- config:
213
- # No tool-jobs row here: a background run would hand the model a jobId it can never read back.
214
- enableRunInBackground: false
215
-
216
- - id: tool-pwsh
217
- name: '@deepseek-ai/dsh-tool-pwsh'
218
- disabled: !!js process.platform !== 'win32'
219
- config:
220
- enableRunInBackground: false
221
-
222
214
  - id: tool-subagent-control
223
215
  name: '@deepseek-ai/dsh-tool-subagent-control'
224
216
 
@@ -511,8 +503,8 @@
511
503
  # OUTPUT CONVENTIONS
512
504
  关键指标与截止用表格;子 Agent 回传按原样引用。
513
505
  图表由 data_junior 的可视化 gate 统一出品:你不画图、不评价图;派的时机与收窄见下方「数据调度纪律」。
514
- 有图表时,图表会在本轮答复后的「交付」行里自动出现:正文不要提图表、不在正文里罗列图表文件;图表是呈现不是分析,不用图推断数字,数值结论一律以 profile / query 回传为准。
515
- 最终答:工具完成后再答,必须含结论、关键证据与来源标注、局限与风险;归因准确,给出观察 / 验证 / 防守选项;勿只报“已交付/已完成”。
506
+ 图表交付:收到 chart_refs 后调用一次 present_charts(一次传全部 ref;refs 丢了就传 task_id)——它只记录清单,宿主会在最终答复前写入答复末尾的「交付」行,提前调用不会落进中间轮。正文不要提图表、不在正文里罗列图表文件 / 路径 / HTML。图表是呈现不是分析:不用图推断数字,数值结论一律以 profile / query 回传为准。
507
+ 最终答(硬):必须自足——结论、关键证据与来源标注、局限与风险、观察 / 验证 / 防守选项;归因准确。**禁止“分析已完成 / 结论见上 / 如上”这类指针式收尾**:界面只展示最后一轮答复、前面轮次会被折叠,指针句会让用户什么也看不到。被通知唤醒且无新增信息时:不输出可见正文(让上一条完整结论成为最后一轮),或重发一份自足总结;绝不写指针句。
516
508
 
517
509
  # RULES & DISCIPLINE
518
510
  读文件只用 read:只读 skill 分册与工作区文件;不读 capital-data/ 落盘(原始行不进入上下文),不读 ~/.dsh/;
@@ -565,8 +557,9 @@
565
557
  是否已收到结算通知(回传正文再像完成也不算 ✓,细则见 skill capital-orchestration);
566
558
  缺一条本轮只写等待行,结论留到收齐那一步;结论后又唤醒谁就重新对账。
567
559
  结算通知只证明该子 Agent 本轮结束,仍不等于任务完成;所有委派行都结算后才可收口。
560
+ 收口顺序(硬):委派全部结算 → 对账通过 → 有 chart_refs 先 present_charts → 再写最终答复。
568
561
  等待期间不做外部检索、不反复 list_agents、不轮询。
569
- 已答复且无新增信息、之后无工具调用 → 不再重复输出;之后有工具调用 → 重新答复。
562
+ 已答复且无新增信息:不输出可见正文(绝不写“已完成/见上”),或重发自足最终答复;之后有工具调用 → 重新答复。
570
563
 
571
564
  5.1 子 Agent 中途请求(硬):收到子 Agent 的中途消息(就绪登记,或
572
565
  type=data_gap 的补数据请求)时,它是工单不是完成:就绪登记继续等其正式回传;
@@ -593,8 +586,8 @@
593
586
  不重复派发。data_failed 是单次请求失败,不等于整轮结束;
594
587
  只在收到 data_collection_completed 后才判定取数结束;等 junior 已收数据的 profile
595
588
  和补数缺口对齐后,再让它复用已有 profile 汇总并完成可视化 gate;用户明确不要图时
596
- 把「不要图」一并传入,由 junior 停在 gate 结论;把 profile_ref 记入委派清单;
597
- 失败按 error/code 修正或指示重试。
589
+ 把「不要图」一并传入,由 junior 停在 gate 结论;把 profile_ref / chart_refs 记入委派清单
590
+ (chart_refs 是最终答复前 present_charts 的入参,不要丢);失败按 error/code 修正或指示重试。
598
591
 
599
592
  4. 输出必须披露 capability、source_label、captured_at 与缺失字段。
600
593
  原始行永不进入你的上下文;网页比对仅作异常抽样,不写成绝对真实。
@@ -607,7 +600,7 @@
607
600
  不得冒充行情证据或补位缺失能力。不支持的频率如实披露,用已有粒度降级,不编造。
608
601
 
609
602
 
610
- # Shell rows: bash/pwsh pair per platform, shared with data_junior; boundaries in ./README.md §5.1.
603
+ # Shell rows: bash/pwsh pair per platform, main Agent only (junior uses PTC `run_code`); README §5.1.
611
604
  - id: tool-bash
612
605
  name: '@deepseek-ai/dsh-tool-bash'
613
606
  disabled: !!js process.platform === 'win32'
@@ -641,7 +634,6 @@
641
634
  provider: spawn
642
635
  toolName: subagent_data_junior
643
636
  agentPreset: capital-data-junior
644
- # Platform-selected shell name; must match the shell row above (restrict() fails on unknown names).
645
637
  - id: tool-subagent-web-retriever
646
638
  name: '@deepseek-ai/dsh-tool-subagent'
647
639
  config:
@@ -718,5 +710,10 @@
718
710
  - id: capital-watchlist-tools
719
711
  name: '@v587d/capital-generation/tools/watchlist'
720
712
 
713
+ # Final-turn delivery: present_charts. Charts are rendered by the specialist but presented
714
+ # here so the card sits in the closing turn (docs/dev/chart-delivery-events.md §6.3).
715
+ - id: capital-present-tools
716
+ name: '@v587d/capital-generation/tools/present'
717
+
721
718
  - id: capital-root-extras
722
719
  name: '@v587d/capital-generation/tools/root-extras'
@@ -131,7 +131,9 @@ description: Use before calling render_chart — the full chart spec vocabulary
131
131
  `series_labels`、`has_volume`、`markers`、来源标注(`dataset_id`/`source_label`/`captured_at`)、
132
132
  三个产物路径、`warnings`。**没有任何数据行** —— 序列不进上下文,这正是这套设计的意义。
133
133
 
134
- 呈现路径:`render_chart` 只负责生成图产物和小型回执。出图成功后,**宿主**会把这张图登记为
135
- 当前对话的**本轮交付物**(官方 `deliverables/presented` 事件 → 收尾「本轮文件改动 / 交付」行,
136
- 点开即在右侧渲染自包含 `chart.html`)。因此调用方**不要**在回传或正文里罗列图表文件、路径或 HTML
137
- —— 那既进不了交付行,也只会污染上下文。结论的文字部分仍需写清来源与口径。
134
+ 呈现路径:`render_chart` 只负责生成图产物和小型回执,**不会自动登记交付**。`chart_ref` 随
135
+ data_junior 的汇总回传主 Agent;主 Agent 在写最终答复前调用一次 `present_charts`,这些图才成为
136
+ **最后一轮**答复末尾的交付物(官方 `deliverables/presented` 事件 → 收尾「本轮文件改动 / 交付」行,
137
+ 点开即在右侧渲染自包含 `chart.html`)。因此 data_junior 与 specialist 都**不要**调用
138
+ `present_charts`,也不要罗列图表文件、路径或 HTML —— 那既进不了交付行,也只会污染上下文。
139
+ 结论的文字部分仍需写清来源与口径。
@@ -15,6 +15,7 @@ description: Use when reading a Dataset back — describe_dataset as the default
15
15
 
16
16
  `data_junior` 读一份 Dataset 用 **`describe_dataset`**(一次调用完成 inspect + profile + 可选 queries),
17
17
  **不要再走 `inspect_dataset → profile_dataset → query_dataset` 三步**——那三步只保留给单点复核。
18
+ `run_code` 与 `Promise.all` 的执行方式只对 data_junior 生效;主 Agent 只读事实块与回传格式。
18
19
 
19
20
  ```json
20
21
  {
@@ -27,8 +28,8 @@ description: Use when reading a Dataset back — describe_dataset as the default
27
28
  }
28
29
  ```
29
30
 
30
- - **一次一份**:一次调用只传一个 `dataset_id`。本轮有多份数据时,**在同一条 assistant 消息里一次发完**
31
- 多个调用(宿主会并发执行,结果一起返回),不要一份一份等。
31
+ - **一次一份**:一次调用只传一个 `dataset_id`。本轮有多份数据时,在同一个 `run_code` 程序里用
32
+ `Promise.all` 并发 describe;结果留在程序里,只把结论 `return`。不要一份一份等。
32
33
  - 返回 = inspect 元数据(`artifact_ref` / `capability` / `source_label` / `captured_at` / `retention_until` /
33
34
  `query_access.shape`)+ profile 四类事实(`statistics` / `categories` / `time_facts` / `structure`)+
34
35
  `profile_ref` + 每条 query 的 `result`,或该条自己的 `error`(单条失败不影响其余)。
@@ -36,8 +37,9 @@ description: Use when reading a Dataset back — describe_dataset as the default
36
37
  - `columns_of_interest` 只对这些列返回 `statistics` / `categories` / `schema`(并同样收窄 `time_facts` 的首末值投影;时间列永远保留),是收窄结果体积的唯一手段。
37
38
  - **体积闸门**:结果超过 7000 码点时返回
38
39
  `{"status":"too_large","profile_ref":"...","columns":[...],"hint":"..."}`,而不是超长载荷。
39
- 按 hint 用 `columns_of_interest`(或减少 `queries`,一次最多 8 条)重发一次;文档型按 hint 直接调
40
- `profile_dataset`。**看到 `too_large` 不是失败**——它带着完整列名,用来让你收窄。
40
+ 在同一个程序里按 hint 用 `columns_of_interest`(或减少 `queries`,一次最多 8 条)重发一次;文档型按
41
+ hint 直接调 `profile_dataset`。**看到 `too_large` 不是失败**——它带着完整列名,用来让你收窄;
42
+ 不要把它当异常、也不要另起一轮。
41
43
  - 单点复核(只看元数据 / 只要一份完整 profile / 补一条查询)仍可用 `inspect_dataset`、`profile_dataset`、
42
44
  `query_dataset`。
43
45
 
@@ -153,6 +155,9 @@ data_junior 发现「问题需要的那份数据还没取」时(不是「数
153
155
  }
154
156
  ```
155
157
 
158
+ PTC 下发送是 `await tools.send_message({ agent_id: PARENT, message: JSON.stringify(payload) })`;
159
+ payload 的 JSON 形状不变,父 Agent id 仍来自系统提示。
160
+
156
161
  | 字段 | 规则 |
157
162
  |------|------|
158
163
  | `type` | 固定 `data_gap` |
@@ -1,46 +1,61 @@
1
1
  ---
2
2
  name: capital-data-query
3
- description: Use when aggregating a Dataset or computing a derived number — the controlled QuerySpec (filters, group_by, aggregates, calendar time values, error codes) and data_junior's bash channel for derived arithmetic. Volume 3 of the Capital data protocol; payloads in capital-data-protocol, profile facts and the time axis in capital-data-profile.
3
+ description: Use when aggregating a Dataset or computing a derived number — the controlled QuerySpec (filters, group_by, aggregates, calendar time values, error codes) and data_junior's run_code programs for derived arithmetic. Volume 3 of the Capital data protocol; payloads in capital-data-protocol, profile facts and the time axis in capital-data-profile.
4
4
  ---
5
5
 
6
6
  # Capital 数据协议 · 第三册:受控查询与派生算术
7
7
 
8
- 本册是数据协议的第三册(§3.3 bash 只做纯计算 / §4 受控查询)。时间轴与 `time_facts` 在第二册
8
+ 本册是数据协议的第三册(§3.3 run_code 只做派生算术 / §4 受控查询)。时间轴与 `time_facts` 在第二册
9
9
  `capital-data-profile` §3.2,载荷契约与重试纪律在第一册 `capital-data-protocol`。
10
10
 
11
- ## 3.3 bash:派生算术的兜底,不是第二条取数通道
11
+ ## 3.3 run_code:派生算术,不是第二条取数通道
12
12
 
13
- 只有 data_junior 有 `bash`。它存在的唯一理由是 `query_dataset` 的聚合只有
14
- `count / min / max / avg / sum`——**变化量、增幅、CAGR、比值、单位换算**这类派生指标没有宿主
15
- 工具,硬心算既慢又容易错。
13
+ 只有 data_junior 有 `run_code`;主 Agent 读本节是为了理解回传格式,不要照着执行。它存在的唯一
14
+ 理由是 `query_dataset` 的聚合只有 `count / min / max / avg / sum`——**变化量、增幅、CAGR、比值、
15
+ 单位换算**这类派生指标没有宿主工具。数字必须从工具返回值直接取,不手抄、不整行复制、不中转到
16
+ 别的语言。
16
17
 
17
- **可以做的**(拿手里已有的数字算):
18
+ **可以做的**(值来自工具返回对象,算完只返回结论)。第一段程序只读协议,`content` 必须打印出来,
19
+ 只 `await` 等于没读;也不要和 describe 混在同一段:
18
20
 
19
- ```bash
20
- node -e 'const a=98.2,b=120.5; console.log(((b-a)/a*100).toFixed(2))' # 区间涨幅
21
- python3 -c "print((120.5/98.2)**(252/60)-1)" # 年化
21
+ ```ts
22
+ const s = await tools.skill({ name: 'capital-data-profile' })
23
+ console.log(s.content)
22
24
  ```
23
25
 
24
- - **只敲最终参与计算的标量,一次 ≤20 个**:不整行/整表复制原始数字进脚本(2026-10-10 真机:
25
- 两次 bash 把整段聚合行逐数敲进去,转写出笔误又花 7.2K 字符发更正);从工具回执到脚本的每个
26
- 数字**逐一核对**再执行,算完抽查 1-2 个对得上来源。要算的数超过 20 个就拆几批。
26
+ ```ts
27
+ const r = await tools.describe_dataset({ dataset_id, task_id })
28
+ const a = r.time_facts.first.close_price
29
+ const b = r.time_facts.last.close_price
30
+ return { pct: ((b - a) / a) * 100, from: a, to: b }
31
+ ```
32
+
33
+ - `describe_dataset` 返回 `{status:'too_large', columns, hint}` 时,它在同一个程序里按 hint 用
34
+ `columns_of_interest` 重发一次;这是返回值不是异常,别用 `catch` 接、也别另起一轮。
35
+ - 多份 Dataset 用 `Promise.all` 并发 describe(只有 `describe_dataset` 声明了并发安全);
36
+ `query_dataset` 串行,不要混进同一批。某份可能失败时用 `Promise.allSettled`。
37
+ - 一次程序只做一段事:先 `console.log(s.content)` 读协议,再 describe/算数,最后回传;
38
+ 不要把整份 profile 或多个工具结果 `return` 回去(外层结果会过 8192 剪枝)。
39
+ - 回传与 `data_gap` 用 `await tools.send_message({ agent_id, message })`;它返回 `{messageId}`,
40
+ 不结束本轮。`agent_id` 取系统提示里的 parent agent id。
27
41
 
28
42
  **不许做的**(这是纪律,不是沙箱限制——沙箱只拦写,不拦读与网络):
29
43
 
30
44
  | 不许 | 为什么 | 正确做法 |
31
45
  |---|---|---|
32
- | 读 `capital-data/**`、`raw.json` | 原始行**永不**进入你的上下文;而且工具结果会被剪枝成 head+tail,读了也算错 | 数值走 `describe_dataset` / `query_dataset` 的统计与聚合 |
46
+ | 读 `capital-data/**`、`raw.json` | 原始行**永不**进入你的上下文;读了也算错 | 数值走 `describe_dataset` / `query_dataset` 的统计与聚合 |
33
47
  | 读 `~/.dsh/**`、`sessions/**` | 那是宿主凭据与全部会话日志 | 不碰;需要元数据用工具回执 |
34
48
  | 读 / 改 `preset/`、`src/`、`test/` | 那是装配与门禁本身 | 不碰 |
35
- | `curl` / `wget` / 任何网络请求、`git clone`、`npm i`、`pip install` | 你的角色没有网络能力,外部材料只经主 Agent 转交 `web_retriever` | 缺外部事实就在回传里写明缺口 |
36
- | 申请更高权限(`sandbox_permissions`) | 委派会话的审批策略被框架固定为 `never`,必然失败 | 不要试;缺数据发 `data_gap` |
49
+ | `fetch` / 任何网络请求、`git clone`、`npm i`、`pip install` | 你的角色没有网络职责,外部材料只经主 Agent 转交 `web_retriever` | 缺外部事实就在回传里写明缺口 |
50
+ | 申请更高权限(`sandbox_permissions`) | 委派会话的审批固定为 `never`,必然失败 | 不要试;缺数据发 `data_gap` |
37
51
 
38
52
  另外两条:
39
53
 
40
- - **输出只留结论数字**:bash 的工具结果同样会过剪枝器(>8192 字符中间段被剪掉),把中间过程
41
- 打印出来只会挤掉真正要看的东西;回传时注明算法与口径(如「按首末收盘价、未复权」)。
54
+ - **输出只留结论数字**:`run_code` 的外层结果同样会过剪枝器(>8192 字符中间段被剪掉),把中间
55
+ 过程或整份 profile 打印出来只会挤掉真正要看的东西;回传时注明算法与口径(如「按首末收盘价、
56
+ 未复权」)。只返回结论,不要 `return` 整份 profile。
42
57
  - **时间窗仍归宿主**:窗口边界一律用 `time_facts.windows` / `resolve_data_time_range`
43
- (`capital-data-profile` §3.2),不要用 `date` 命令自己造边界——口径错了数字就全错,而且没人会发现。
58
+ (`capital-data-profile` §3.2),不要在程序里把日期算成毫秒——口径错了数字就全错。
44
59
 
45
60
  `profile_dataset` 的统计项:数值字段的 count 与 sum(合计多少、覆盖多少条)、字符串字段的
46
61
  `distinct_count` 与高频取值、字段类型(observed / contract)、缺失值与显式 null、类型冲突、
@@ -42,4 +42,9 @@ description: Use when the user requests a complete research report or comprehens
42
42
 
43
43
  先给出带时间边界的核心判断与最大风险,再按实际证据组织:研究范围、业务与财务、估值、价格/技术、事件与行业、风险与反方、关键证据及冲突、未评估项、后续观察/验证/防守选项。优先呈现影响结论的数值、证据链和仍未裁定的冲突;同一来源与采集时间可在表头合并注明,不逐项堆砌原始序列、新闻目录或全部 Dataset 数量。各段可以合并,但不得把无证据的段落写成已完成;不要给所有维度机械打分。
44
44
 
45
- 每个会影响判断的数值注明能力/来源、报告期或交易日及采集时间;材料结论给可追溯的原文链接,或文件标题、发布主体与页码(无法提供原文时明说)。不要用已实施分红或历史价格推断股价下限,不把同业倍数排序写成“便宜/贵”的充分证据。对缺失、冲突和数据延迟给出它们如何改变判断的解释;未评估清单仅列与本轮问题或结论有关的缺口。区分投资者可采取的验证步骤与交易指令;不承诺收益、不输出没有可复现模型支持的目标价、概率或胜率。图表由宿主在交付行呈现,正文不罗列图表文件,也不从图上反推数字。
45
+ 每个会影响判断的数值注明能力/来源、报告期或交易日及采集时间;材料结论给可追溯的原文链接,或文件标题、发布主体与页码(无法提供原文时明说)。不要用已实施分红或历史价格推断股价下限,不把同业倍数排序写成“便宜/贵”的充分证据。对缺失、冲突和数据延迟给出它们如何改变判断的解释;未评估清单仅列与本轮问题或结论有关的缺口。区分投资者可采取的验证步骤与交易指令;不承诺收益、不输出没有可复现模型支持的目标价、概率或胜率。
46
+
47
+ **这一段就是最后一轮的唯一可见内容**:写之前先调用一次 `present_charts`(有 chart_refs 时;refs 记不清就传 task_id 一次登记全部),报告正文不罗列图表文件,也不从图上反推数字;写完不要再补一行“已完成/结论见上”把报告盖掉。
48
+
49
+ `present_charts` 只记录本轮图表清单,宿主会在**最终答复之前**统一写入交付行;提前调用也安全,
50
+ 不必留到最后一刻。调用后继续把取证做完也可以——最终答复仍由宿主在收尾时附上图表。
@@ -91,7 +91,7 @@ A 角色的请求投给 B 角色。官方机制是 **`list_agents` 即权威 id
91
91
  不能 → `web_retriever`;② 使用者要拿它做算术(聚合、排序、时序对比、进图)吗?要 → `data_collector`;
92
92
  ③ 文本是内容本身(正文、纪要、新闻)还是行上的一个标注字段(标题、简称)?前者 → `web_retriever`;
93
93
  ④ 需要对单位、缺失值含义、时间口径做承诺吗?要 → `data_collector`。
94
- - 终判据是**错法**而不是形状:`data_collector` 出错给的是响亮错误码,`web_retriever` 是抓到什么算什么、
94
+ - 终判据是**错法**而不是形状:`data_collector` 出错给响亮错误码,`web_retriever` 抓到什么算什么、
95
95
  上游改版只会静默变样。**凡要写进用户结论的数字,一律委派 `data_collector`**;网页里的数字只能当线索
96
96
  或异常抽样,回传里标明"来源是某篇文章"而不是承诺口径。
97
97
  - 多角色可并行委派,但每个角色都必须先按第 2 节复用或创建,各记清单,等结算通知齐了再综合
@@ -118,7 +118,9 @@ A 角色的请求投给 B 角色。官方机制是 **`list_agents` 即权威 id
118
118
  不要向用户断言它已完成,也不要新建替代实例。
119
119
  - 等待回传期间:不做任何外部检索/抓取、不反复 `list_agents`、不轮询等待。
120
120
  - 回传到达后集中核对材料与结论,再决定继续委派或汇总输出。
121
- - 已向用户输出完整答案后被唤醒,且没有新增信息或纠正时不再重复输出,仅在确有必要时补充。
121
+ - **收口顺序(硬)**:所有委派行结算 → 对账通过 → 有 `chart_refs` 先 `present_charts` 一次
122
+ (全部 ref;记不清就传 `task_id`)→ 再写最终答复;登记必须早于最终答复。
123
+ - 已答复后被唤醒且无新信息:不输出可见正文,或重发自足总结(§6.1);绝不写“已完成/见上”。
122
124
  - 永远不要设置 `run_in_background: false`;所有委派必须是 continuable。
123
125
 
124
126
  ### 6.1 结算对账表(写结论前必交,硬)
@@ -142,17 +144,16 @@ A 角色的请求投给 B 角色。官方机制是 **`list_agents` 即权威 id
142
144
  - 有任何一行是 ✗ → 本步**只写等待行**(欠谁、在等什么),结论留到 ✗ 全部翻正的那一步。
143
145
  - 这张表写在 reasoning 里即可,不要作为正文发给用户(用户只看到结论)。
144
146
 
145
- **为什么必须等,量化过:** 真机会话 `cst7n9j3` turn 11——data_junior 的汇总回执先到,结算通知
146
- **14 秒后**才到,而那份结论本身生成了 **156 秒**。看到回执就立刻综合,结算通知必然落在结论之后;
147
- 框架此时只能再开一个 step 把它投递给你(inbox 非空就不结束 turn),结论被切成两条消息、
148
- 尾部多出一段"无新增信息"的确认。倒过去等的成本是一行等待,被追上的成本是整份结论重写。
147
+ **为什么必须等:** 真机上结论生成 156 秒、汇总回执比结算通知早到 14 秒——先综合,结算通知必然落在
148
+ 结论之后,框架会再开一个 step 投递,结论被切成两条消息。
149
149
 
150
150
  **已经被追上(结论后才有结算)**:
151
151
 
152
- - 内容与已用材料一致、**没有新信息也没有纠正** → 只回一行确认(可含一处口径说明),
153
- **禁止复述或重排结论**,不要重贴表格。
154
- - 带来新事实或推翻口径 → 那才是新结论,重写一份完整的,不要只补一段。
155
- - 补齐后重新对账:只要这步之后又有人被唤醒,回到本节重来。
152
+ - 无新信息/纠正 → **不要写一行确认**(它会成为折叠后唯一可见的最后一轮):要么不输出可见正文,
153
+ 要么重发自足总结(结论/证据/来源、局限、观察/验证/防守);**绝不写
154
+ “分析已完成/结论见上/如上”**。
155
+ - 有新事实或推翻口径 → 重写一份完整结论,不要只补一段。
156
+ - 补齐后重新对账:这步之后又有人被唤醒,回到本节重来。
156
157
 
157
158
  ## 7. 异常分支
158
159
 
@@ -163,13 +164,13 @@ A 角色的请求投给 B 角色。官方机制是 **`list_agents` 即权威 id
163
164
  | 子 Agent 中途发来 `data_gap` 补数据请求 | 按清单复用对应角色取数,`send_message` 发回同一个子 Agent;取数失败也要回执,不能让它一直等 |
164
165
  | 清单里有 `waiting_data` 的子 Agent 发来结算通知 | 那是它在等补数据,不是完成:不要向用户断言完成,也不要新建同角色实例 |
165
166
  | 只有回传、没有结算通知,却"想写结论了" | 按 §6.1 先交对账表:✗ 未被结算翻正就本步只写等待行,结论留到收齐那一步 |
166
- | 结论已输出后才被结算通知唤醒 | 无新增信息/纠正 → 只回一行确认,禁止复述结论;有新事实或推翻口径 → 重写完整结论(§6.1) |
167
- | `send_message` 投错对象(目标 child 的回应与角色不符) | `interrupt_agent` 停错投目标当前轮(已结束则为 no-op)→ 重新 `list_agents` → 向正确 id 重发;委派消息正文自带角色字样与任务标识可让错投被及时发现 |
167
+ | 结论已输出后才被结算通知唤醒 | 无新增信息/纠正 → 不输出可见正文或重发自足总结,禁止一行“已完成/见上”;有新事实或推翻口径 → 重写完整结论(§6.1) |
168
+ | `send_message` 投错对象(目标 child 的回应与角色不符) | `interrupt_agent` 停当前轮(已结束为 no-op)→ 重新 `list_agents` → 向正确 id 重发;委派正文自带角色字样与任务标识,错投可被及时发现 |
168
169
  | 子 Agent 回告「工具未挂载」 | 如实转述状态与检查建议,不要编造工具或数据;数据侧提示检查 `request_data`/`list_capabilities`,统计侧提示检查 `inspect_dataset`/`profile_dataset` |
169
170
  | 子 Agent 回传 `failed` | 按 `error` 与 `code` 判断:参数问题修正后 `send_message` 重试;网络/服务类最多重试 1 次;同一请求累计最多重试 2 次仍失败就如实告知用户 |
170
- | 子 Agent 回传 wind_docs 失败(AUTH/RATE_LIMIT/额度类) | Wind 检索暂不可用(Key 缺失/过期或额度不足):如实告知用户 Wind 能力暂不可用,本轮材料由 anysearch 承担(公告线索搜索 + 官方披露页 fetch);不要重试 Wind,也不要索取或改配 Key |
171
+ | 子 Agent 回传 wind_docs 失败(AUTH/RATE_LIMIT/额度类) | Wind 能力暂不可用(Key 缺失/过期/额度不足):如实告知用户;本轮材料由 anysearch 承担(公告线索 + 官方披露页 fetch),不要重试 Wind、不要索取或改配 Key |
171
172
  | 出现「想直接读取 Dataset 内容」的冲动 | 改为委派 `data_junior`(`inspect_dataset` / `profile_dataset`);主 Agent 直接调用 Dataset 系列工具会被工具层拒绝(`dataset_session_mismatch`),被拒后不要重试直读,改走委派 |
172
- | 任务需要分钟级数据 | 检查 `tencent_kline`:支持 m1/m5/m15/m30/m60,仅支持最近 `count` 根(最多 320),不支持 `start/end` 历史分钟区间;旧分钟/小时历史不可编造,不满足时再披露边界 |
173
+ | 任务需要分钟级数据 | 检查 `tencent_kline`:支持 m1/m5/m15/m30/m60,仅支持最近 `count` 根(最多 320),无 `start/end` 历史区间;旧分钟历史不可编造,不满足就披露边界 |
173
174
  | 需要周期刷新(如每日收盘快照) | 用 `send_message` 指示 `data_collector` 再次获取并回传;不存在订阅机制——新需求 = 新消息,回传即唤醒 |
174
175
 
175
176
  载荷字段、`force_refresh` 语义与 dataset 逐份回传见 skill `capital-data-protocol`;profile 回传与
@@ -122,7 +122,8 @@ ohlc
122
122
  prepare_chart_source({ dataset_id, task_id })
123
123
  ```
124
124
 
125
- 只使用工具返回的 `chart_source_ref`。不要自己构造 token、路径或 `raw.json` 地址。
125
+ data_junior 在 `run_code` 里调用 `tools.prepare_chart_source(...)`;specialist 是 native,
126
+ 照旧直调 `render_chart`,不经过 `run_code`。只使用工具返回的 `chart_source_ref`。不要自己构造 token、路径或 `raw.json` 地址。
126
127
 
127
128
  **token 有 15 分钟 TTL,同一 task_id + dataset_id 重复签发幂等返回同一个 token**:仍建议先定好
128
129
  要出哪几张图、每张用哪份 Dataset,再一次性签发(省往返);万一改了视图方案再签一次也无妨——
@@ -196,6 +197,9 @@ prepare_chart_source({ dataset_id, task_id })
196
197
 
197
198
  ## 4. 调用 render_chart
198
199
 
200
+ data_junior 只在 `run_code` 程序里用 `tools.subagent_visualization_specialist(...)` 创建 specialist;
201
+ specialist 是 native,照旧直调 `render_chart`。以下步骤属于 specialist。
202
+
199
203
  第一次调用前加载:
200
204
 
201
205
  ```text
@@ -273,10 +277,11 @@ warnings / failures
273
277
 
274
278
  图表成功后,data_junior 回传 `chart_ref`;图表失败、blocked 或 not_needed 也必须回传明确的终态、warnings/failures 和 task_id,不能让主 Agent把“无图表”误解为流程未完成。
275
279
 
276
- **呈现由宿主完成,不需要任何 Agent 再做什么**:`render_chart` 成功时宿主会把这张图登记为
277
- **本轮交付物**(官方 `deliverables/presented`),用户在收尾的「本轮文件改动 / 交付」行点开
278
- `chart.html`,右侧即渲染可交互图表。因此 data_junior 与 specialist **都不得**在回传里罗列图表文件、
279
- 路径或 HTML,主 Agent 也不在正文里重复这些内容。
280
+ **呈现由主 Agent 的最终答复承载**:`render_chart` 只出图并回 `chart_ref`,不会自动登记交付。
281
+ data_junior 在汇总里回传全部 `charts[].chart_ref`;主 Agent 在写最终答复前调用一次
282
+ `present_charts`,这些图才成为**最后一轮**答复末尾的交付物(官方 `deliverables/presented`)。
283
+ 因此 data_junior 与 specialist **都不得**调用 `present_charts`,也不得在回传里罗列图表文件、路径或
284
+ HTML;主 Agent 也不在正文里重复这些内容。
280
285
 
281
286
  **图表跟着 Dataset 一对一,宁多勿叠**:一个 `chart_source_ref` 对应一张图;需要多个视图就出多张
282
287
  (各自独立的 `render_chart`)。不要试图把多个来源、多种单位或需要归一化的序列叠进一张图 ——
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@v587d/watchlist",
3
- "version": "2.9.0",
3
+ "version": "2.9.2",
4
4
  "description": "自动模式的用户自选股(宿主级清单 + Fuyao 报价快照 + /capital-watchlist 路由 + 输入框菜单弹窗):由 @v587d/capital-generation 随包携带并作为 host 平面行挂载。",
5
5
  "license": "MIT",
6
6
  "type": "module",