@v587d/capital-generation 2.7.12 → 2.8.1
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.
- package/CHANGELOG.md +66 -0
- package/README.md +10 -6
- package/THIRD_PARTY_NOTICES.md +6 -1
- package/chart-ui/package.json +1 -1
- package/config/index.js +1 -0
- package/config/package.json +1 -1
- package/lib/agents/bash-guard.d.ts +22 -17
- package/lib/agents/bash-guard.js +32 -28
- package/lib/agents/root-tool-policy.d.ts +29 -3
- package/lib/agents/root-tool-policy.js +100 -14
- package/lib/data-collector/dataset-tools.js +9 -0
- package/lib/data-collector/tools.js +17 -5
- package/lib/index.d.ts +4 -0
- package/lib/index.js +27 -8
- package/lib/sources/ftshare-rest.d.ts +54 -0
- package/lib/sources/ftshare-rest.js +2363 -0
- package/lib/time/tools.js +24 -0
- package/lib/web-retriever/local-fetch.d.ts +1 -1
- package/lib/web-retriever/local-fetch.js +1 -1
- package/lib/web-retriever/wind-client.d.ts +1 -1
- package/lib/web-retriever/wind-client.js +1 -1
- package/package.json +1 -1
- package/preset/capital-generation/README.md +22 -15
- package/preset/capital-generation/agent.patch.yml +14 -1
- package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +4 -1
- package/selected-skills/InvestSkill/UPSTREAM.md +17 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/10k-digest/SKILL.md +10 -296
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/10k-digest/references/10-retrieving-the-filing.md +130 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/10k-digest/references/11-key-metrics-table.md +129 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/10k-digest/references/12-language-mode.md +60 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/SKILL.md +5 -3
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/catalyst-calendar/SKILL.md +10 -284
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/catalyst-calendar/references/10-persona.md +113 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/catalyst-calendar/references/11-section-c-company-specific.md +108 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/catalyst-calendar/references/12-section-f-90-day.md +85 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/SKILL.md +11 -433
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/references/10-overview.md +82 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/references/11-porter-s-five-forces.md +137 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/references/12-innovation-disruption-assessment.md +112 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/references/13-input-formats.md +130 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/SKILL.md +12 -639
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/references/10-analysis-framework.md +138 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/references/11-dividend-history-and-reliability.md +131 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/references/12-share-buyback-analysis.md +125 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/references/13-fcf-deployment-scorecard.md +133 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/references/14-output.md +149 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-call-analysis/SKILL.md +10 -411
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-call-analysis/references/10-analysis-framework.md +194 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-call-analysis/references/11-data-sources.md +196 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-call-analysis/references/12-thesis-invalidation.md +43 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/SKILL.md +11 -234
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/references/10-overview.md +86 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/references/11-phase-4-the-implied.md +60 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/references/12-output-format.md +83 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/references/13-standard-signal-output.md +34 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/economics-analysis/SKILL.md +10 -304
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/economics-analysis/references/10-key-economic-indicators.md +98 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/economics-analysis/references/11-credit-market-indicators.md +114 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/economics-analysis/references/12-recession-probability-scoring.md +114 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/SKILL.md +11 -236
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/references/10-overview.md +83 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/references/11-phase-5-overlap-with.md +69 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/references/12-output-format.md +79 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/references/13-standard-signal-output.md +34 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/SKILL.md +11 -243
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/references/10-overview.md +61 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/references/11-phase-2-source-hierarchy.md +54 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/references/12-phase-5-consistency.md +90 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/references/13-notes.md +68 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/SKILL.md +11 -499
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/references/10-overview.md +143 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/references/11-phase-3-financial-statement.md +167 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/references/12-phase-6-management-tone.md +176 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/references/13-thesis-invalidation.md +43 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/industry-map/SKILL.md +10 -291
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/industry-map/references/10-overview.md +117 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/industry-map/references/11-step-3-position-locator.md +112 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/industry-map/references/12-visualization-support.md +84 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/insider-trading/SKILL.md +10 -457
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/insider-trading/references/10-analysis-framework.md +185 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/insider-trading/references/11-pattern-recognition.md +175 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/insider-trading/references/12-interpretation-guidelines.md +120 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/SKILL.md +11 -503
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/references/10-analysis-framework.md +132 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/references/11-ownership-concentration-analysis.md +166 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/references/12-red-flags-warning-signs.md +192 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/references/13-thesis-invalidation.md +43 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/SKILL.md +11 -264
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/references/10-overview.md +63 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/references/11-phase-2-explanation-card.md +108 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/references/12-output-format.md +88 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/references/13-standard-signal-output.md +34 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/SKILL.md +11 -448
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/references/10-analysis-framework.md +109 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/references/11-implied-volatility-iv-analysis.md +102 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/references/12-earnings-play-analysis.md +109 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/references/13-data-sources.md +159 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/SKILL.md +11 -435
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/references/10-phase-1-portfolio-snapshot.md +124 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/references/11-phase-6-correlation-diversification.md +124 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/references/12-phase-9-rebalancing-decision.md +153 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/references/13-data-verification.md +62 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/SKILL.md +11 -372
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/references/10-overview.md +102 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/references/11-phase-3-the-trim.md +88 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/references/12-phase-6-the-thesis.md +105 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/references/13-input-formats.md +105 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/risk-stress-test/SKILL.md +10 -250
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/risk-stress-test/references/10-overview.md +92 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/risk-stress-test/references/11-phase-4-correlation-spike.md +116 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/risk-stress-test/references/12-notes.md +65 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/SKILL.md +11 -381
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/references/10-sector-overview.md +123 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/references/11-sector-correlation-matrix.md +90 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/references/12-peer-benchmarking-within-sector.md +92 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/references/13-consumer-staples.md +105 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/short-interest/SKILL.md +10 -352
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/short-interest/references/10-analysis-framework.md +110 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/short-interest/references/11-bearish-thesis-evaluation.md +118 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/short-interest/references/12-data-sources.md +148 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/SKILL.md +16 -603
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/10-analysis-components.md +122 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/11-dupont-decomposition.md +121 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/12-quality-scoring-framework.md +115 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/13-dcf-framework.md +113 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/14-analyst-consensus-tracking.md +127 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/references/15-thesis-invalidation.md +43 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/SKILL.md +5 -3
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/SKILL.md +12 -595
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/references/10-overview.md +133 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/references/11-method-2-comparable-company.md +127 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/references/12-football-field-summary-valuation.md +140 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/references/13-terminal-value-two-methods.md +121 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/references/14-when-dcf-is.md +110 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/SKILL.md +12 -304
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/references/10-overview.md +73 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/references/11-phase-3-dividends-qualified.md +67 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/references/12-framework-non-us-module.md +61 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/references/13-scoring-tax-efficiency-score.md +83 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/references/14-thesis-invalidation.md +55 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/SKILL.md +16 -612
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/10-chart-pattern-analysis.md +172 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/11-chart-visualization-support.md +181 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/12-multi-timeframe-analysis-mtf.md +95 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/13-advanced-indicators-ichimoku-cloud.md +61 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/14-options-flow-integration.md +95 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/references/15-thesis-invalidation.md +45 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/thesis-tracker/SKILL.md +10 -274
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/thesis-tracker/references/10-overview.md +94 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/thesis-tracker/references/11-phase-5-the-pre.md +113 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/thesis-tracker/references/12-example.md +90 -0
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-catalyst-calendar/SKILL.md +5 -3
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-idea-generation/SKILL.md +5 -3
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-sector-overview/SKILL.md +5 -3
- package/selected-skills/investment-skills/skills/buffett-investment-framework/SKILL.md +1 -1
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/SKILL.md +5 -3
- package/watchlist/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,72 @@
|
|
|
7
7
|
- **第三位(patch)**:不破坏既有工具 / 配置 / 会话的新增与修复(如 2.1.1、2.1.2)。
|
|
8
8
|
- **第二位(minor)**:有需要用户知晓的行为变更,且段内附迁移说明(如 2.1.0 的图表呈现通道重做、2.2.0 的数据源与检索来源扩容、2.4.0 的**必须换宿主版本**——本插件自己的工具与数据契约没变,所以只抬第二位)。
|
|
9
9
|
|
|
10
|
+
## [2.8.1] - 2026-10-16
|
|
11
|
+
|
|
12
|
+
接入第二家结构化数据上游 **FTShare(非凸科技)**,数据收集能力 **94 → 118** 项(新增 24 项)。宿主要求与
|
|
13
|
+
2.8.0 相同(DSH`@0.2.0-rc.2`),**不必换宿主版本**。
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **A 股主力资金流**:个股、行业板块、概念板块的日度资金流(近 45 个交易日,亿元),外加个股主力五档的
|
|
18
|
+
15 分钟切片(元)。这一块此前只有一家、而那一家的同类接口明确不对外部开放,问得到、取不到。
|
|
19
|
+
- **盘面截面四颗**:沪深北全市场实时行情(含 ST 与停牌)、任一交易日的全市场日 K(含北交所)、
|
|
20
|
+
全市场成交额与涨跌家数分布(九档)、单只标的的逐日昨收价序列(用来校验复权与涨跌停)。
|
|
21
|
+
- **五处真正的空白**:每日涨跌停价与昨收(含北证——此前只有腾讯的当日快照,而它明确不接受北证代码)、
|
|
22
|
+
龙虎榜前五买入/卖出席位(此前只到个股汇总,没有席位明细)、股东人数**历史**(此前只有最新一期截面)、
|
|
23
|
+
中证系列指数成分**权重数值**(此前只有成分名单)、可转债历史 K 线(此前只有发行条款,没有价格序列)。
|
|
24
|
+
- **业绩与行业**:大宗交易明细(一笔一行)、A 股业绩预告与业绩快报(按报告期或单票,含北证与更正行)、
|
|
25
|
+
申万行业估值快照与单行业日度量价序列、交易日历(沪北深与港股)。
|
|
26
|
+
- **宏观利率长尾五颗**:LPR 全历史、中债收益率曲线(国债 / AAA 票据,八档期限)、SHIBOR、HIBOR、
|
|
27
|
+
全球财经日历(含公布时刻与前值)。
|
|
28
|
+
- 每一项都按上游真实返回逐列核验后才登记:单位、哪些列可以为空、时间与分页口径写进该项的说明里;
|
|
29
|
+
上游文档与实际不符的地方(例如某项只滚动保留最近一个交易日、某项标称的上游自己并不遵守)以实测为准,
|
|
30
|
+
说明里点名,取数失败时也会点名是哪一处、并给出该怎么改。
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **一次任务里要看多个数据能力时,等待变短**:能力目录与单项契约的读取都是纯读、无副作用,现在允许
|
|
35
|
+
在同一条消息里一次发出多个,由框架并发执行、结果一起返回,不再一份一份串行等。取数本身仍然一次一条
|
|
36
|
+
——上游限流按这个节奏设计,没有改。
|
|
37
|
+
|
|
38
|
+
### 迁移说明
|
|
39
|
+
|
|
40
|
+
- 要用上 FTShare 这 24 项,需要向服务方申请免费档密钥,并写入 `~/.dsh/.credentials.yaml`,名称
|
|
41
|
+
`FTSHARE_API_KEY`。**这一把目前不在「插件」→ Capital Generation 的「数据源」卡片上**(卡片仍是四格),
|
|
42
|
+
下一版会补输入框。没配这把密钥时,这 24 项仍在能力目录里,但每次取数都会点名 `FTSHARE_API_KEY` 失败;
|
|
43
|
+
其余来源与功能照常。
|
|
44
|
+
- 不需要任何其它动作:已有的密钥、卡片设置、精选 Skills 勾选、自选股清单与持仓标记全部照旧读得到。
|
|
45
|
+
- 覆盖范围见 [数据收集能力表](docs/data-collector-capabilities.md)。**尚未接入**:期货、期权与贵金属
|
|
46
|
+
(同一家的免费档里有,排在下一批)。
|
|
47
|
+
|
|
48
|
+
## [2.8.0] - 2026-10-15
|
|
49
|
+
|
|
50
|
+
主 Agent 的工具面按用户决策调整为「**开 read、同时保留 bash**」,三个平台的口径终于一致。宿主要求与
|
|
51
|
+
2.7.11 相同(DSH`@0.2.0-rc.2`),**不必换宿主版本**。
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **主 Agent 现在能直接读文件**(新增 `read`):读精选 Skill 的方法论分册、读工作区里的文件都走它。
|
|
56
|
+
此前主 Agent 没有读文件的工具,真机上都是拿 `bash` 的 `cat` 绕——能力等价,但现在是正路。此前几版
|
|
57
|
+
「入口册 + 分册」的分层阅读,也从这一版起有了产品内的正式通道。
|
|
58
|
+
- **主 Agent 保留 `bash` / `pwsh`**(各平台二选一,和数据角色用的是同一颗):用于纯计算兜底。此前
|
|
59
|
+
Linux / Web 平面上它被整体拿掉、而 Windows 桌面端因为已知宿主差异实际没拦住——同一个产品两种行为。
|
|
60
|
+
现在三端一致:主 Agent 都有 shell。
|
|
61
|
+
- **主 Agent 仍然不能写文件**(`write` / `edit` 不开放,调用时拒绝并指回正路):数据与产物继续走工具
|
|
62
|
+
回传,落盘由工具实现完成;子 Agent 也一样不直接写文件。读文件的口子开了,写文件的没开——这是刻意的。
|
|
63
|
+
- **通用子会话收掉文件口**:临时子会话读不到原始数据文件(原始行永不出工具层),也写不了文件。
|
|
64
|
+
- **`read` 的读侧纪律写在人设里,而不是写成一道闸门**:主 Agent 不读原始行落盘目录、不读宿主配置与
|
|
65
|
+
凭据,引用 Skill 分册要整册读完再引用。原因很直白——shell 仍然开着,`cat` 同一个文件不需要任何
|
|
66
|
+
权限,而沙箱实测只拦写、不拦读;按参数拦路径只会得到一个看起来严、实际绕得开的边界。这一条有回归
|
|
67
|
+
点名(四条断言),管不住的地方说清楚是谁在管,比假装管住了强。
|
|
68
|
+
|
|
69
|
+
### 迁移说明
|
|
70
|
+
|
|
71
|
+
- 不需要任何动作:密钥、卡片设置、精选 Skills 勾选、自选股与持仓标记全部照旧读得到。
|
|
72
|
+
- 行为变化只在工具可见性(上面四条);取数、出图、检索的契约都没变。
|
|
73
|
+
- Windows 桌面端那条[已知宿主差异](README.md)依旧存在(主 Agent 的部分工具限制可能不生效);由于 shell
|
|
74
|
+
本版起对主 Agent 正式开放,这条差异的暴露面缩小为"出图与检索的限制",请继续留意它实际调用了哪些工具。
|
|
75
|
+
|
|
10
76
|
## [2.7.12] - 2026-10-14
|
|
11
77
|
|
|
12
78
|
内部整理,治的是同一件事:**正文长过一次的加载窗口,宿主就从中间把它剪掉**。DSH 对任何一次工具结果只
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<p align="center">
|
|
16
16
|
<a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="awesome · DSH plugin"></a>
|
|
17
17
|
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="License"></a>
|
|
18
|
-
<a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.
|
|
18
|
+
<a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.8.1-9cf" alt="Version"></a>
|
|
19
19
|
<a href="https://www.npmjs.com/package/@v587d/capital-generation"><img src="https://img.shields.io/npm/v/%40v587d%2Fcapital-generation" alt="npm version"></a>
|
|
20
20
|
</p>
|
|
21
21
|
|
|
@@ -72,10 +72,12 @@ https://github.com/v587d/capital-generation
|
|
|
72
72
|
| [AnySearch](https://www.anysearch.com/docs) | 网页搜索和正文提取 |
|
|
73
73
|
| [Wind Alice](https://market.windalice.com/#/home) | 公告与新闻检索,以及宏观/行业/汇率指标与按日期区间取的历史 K 线 |
|
|
74
74
|
| [PaddleOCR AIStudio](https://aistudio.baidu.com/paddleocr) | 解析 PDF 和图片中的文字 |
|
|
75
|
+
| [FTShare(非凸科技)](https://market.ft.tech/gateway/doc/p/pb8eizu3) | A 股行情与日 K 截面、主力资金流、涨跌停、龙虎榜席位、股东人数、指数权重、可转债行情与宏观利率等第二家上游口径 |
|
|
75
76
|
|
|
76
77
|
这些都是第三方服务的密钥,需分别向服务方申请;额度和条款以各服务方为准。
|
|
77
78
|
保存后**新建 Capital 模式会话**即可生效,无需重启。
|
|
78
|
-
也可以将密钥写入 `~/.dsh/.credentials.yaml`,名称依次为 `FUYAO_API_KEY`、`ANYSEARCH_API_KEY`、`WIND_API_KEY`、`PADDLE_OCR_TOKEN`。
|
|
79
|
+
也可以将密钥写入 `~/.dsh/.credentials.yaml`,名称依次为 `FUYAO_API_KEY`、`ANYSEARCH_API_KEY`、`WIND_API_KEY`、`PADDLE_OCR_TOKEN`、`FTSHARE_API_KEY`。
|
|
80
|
+
其中 **FTShare 这一把暂时只能走这份文件**:卡片上那一格还没给它留输入框,没配时目录里这 24 项仍在,但每次取数都会点名 `FTSHARE_API_KEY` 失败。
|
|
79
81
|
密钥由 DSH 凭据服务保存,不会显示在会话配置中。
|
|
80
82
|
|
|
81
83
|
<p align="center">
|
|
@@ -130,7 +132,7 @@ https://github.com/v587d/capital-generation
|
|
|
130
132
|
|
|
131
133
|
## 还能做什么
|
|
132
134
|
|
|
133
|
-
- **查数据和资料:** 覆盖A股、港股、美股,由 Agents 按需获取行情、财务、指数、基金与宏观行业数据,检索公告、新闻和研报。共计 **
|
|
135
|
+
- **查数据和资料:** 覆盖A股、港股、美股,由 Agents 按需获取行情、财务、指数、基金与宏观行业数据,检索公告、新闻和研报。共计 **118** 个数据收集能力和 **14** 个网页检索能力,部分公开数据源无需额外密钥;具体覆盖范围见 [数据收集能力表](docs/data-collector-capabilities.md) 和 [网页检索能力表](docs/web-retriever-capabilities.md)。
|
|
134
136
|
- **数据分析:** 所有 Agents 均不直接接触原始结构数据,Agents 按需读取数据、校验数据,并写脚本挖掘数据背后含义。
|
|
135
137
|
- **可视化:** Agent 视情况将校验后数据交给可视化专家生成可交互图表。图表会作为本轮交付物出现在会话中,可在侧栏查看或离线打开。了解处理流程可看 [Agent 角色说明](docs/agent-roles.md)。
|
|
136
138
|
|
|
@@ -166,12 +168,14 @@ https://github.com/v587d/capital-generation
|
|
|
166
168
|
## 常见问题
|
|
167
169
|
|
|
168
170
|
- **安装后找不到 Capital 模式?** 确认插件出现在「插件」→ 已安装列表;Web / CLI profile 安装后要重启该 profile,并在新会话选择模式。
|
|
169
|
-
- **配置在哪?** 打开「插件」→ 已安装的 **Capital Generation**,页面顶部就是「数据源 / 精选 Skills /
|
|
171
|
+
- **配置在哪?** 打开「插件」→ 已安装的 **Capital Generation**,页面顶部就是「数据源 / 精选 Skills / 包含的组件」三格,密钥都在第一格;不在 DSH 的普通「设置」页面,也不用点进任何一行组件。保存密钥后新建会话再试。只有 **FTShare** 那一把目前不在卡片上,要写进 `~/.dsh/.credentials.yaml`(名称 `FTSHARE_API_KEY`)。
|
|
170
172
|
- **升级到 2.7.11 后,卡片里的开关回到默认值了?** 这一版把插件内部两个组件换了目录名,宿主按旧路径记住的那份保存值因此接不上。四把 API Key、你的自选股清单与持仓标记都不受影响;「精选 Skills」的勾选、附加人设与「本机直连」开关需要重新设一次并保存,之后就稳定了。已经设过的话,旧的那份仍写在 DSH 的 profile 文件里,手改那一行的路径也能取回来。
|
|
171
|
-
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.
|
|
173
|
+
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.8.1` 或 `@2.8.1`。
|
|
172
174
|
- **刚发布的新版本装不到?** 桌面端取包时会跳过**刚发布不久**的版本(宿主侧包管理器的发布冷却策略,实测会静默装成上一个版本),国内镜像的同步也可能滞后一段时间。急着用最新代码,改用仓库地址安装最直接。
|
|
173
175
|
- **网页抓取失败?** 配置卡片中的「允许启动本地提取网页内容」默认开启:AnySearch 提取失败时可尝试本机直连。关闭后,本机直连的具名来源查询也不可用;请检查该开关和网络连接。
|
|
174
176
|
- **Wind 那部分会消耗积分?** 会。公告与新闻检索、宏观 / 行业 / 汇率指标、按日期区间取的历史 K 线都按次消耗你在 Wind 侧的额度;额度与条款以 Wind 为准,插件不做用量封顶。没配 `WIND_API_KEY` 时这几类不可用,其余功能照常。
|
|
177
|
+
- **运行时主 Agent 没有加载已打开的精选 Skill?** 由 LLM 判断是否值得加载精选 Skill,如果你需要强制使用某一种技能,可通过 `/技能名称` 斜杠命令的形式手动加载已在设置中打开的 Skill。
|
|
178
|
+
- **精选 Skill 的方法论很长,Agent 读得完吗?** 读得完。超过一次可读长度的正文已经重排成「入口 + 分册」:Agent 先看入口目录,需要具体规则、模板或阈值时把对应那一册整本读进来,并会告诉你它读了哪几册、哪些没读。设置卡片里的「看原文」仍然只给入口那一份,想看某一册直接问 Agent。
|
|
175
179
|
|
|
176
180
|
目前 Windows 桌面端有一项[已知宿主差异](CHANGELOG.md):主 Agent 的部分工具限制可能不生效。请特别留意它实际调用了哪些工具;结构化数据的取数限制仍由工具自身执行。
|
|
177
181
|
|
|
@@ -194,6 +198,6 @@ npm run smoke:boot # 检查插件装配
|
|
|
194
198
|
|
|
195
199
|
- 「精选 Skills」的研究、交易过程与财务方法 Skill 按固定 commit **快照收录**自 [finterm-ai/investment-skills](https://github.com/finterm-ai/investment-skills)、[spikeHongg/china-stock-research-skills](https://github.com/spikeHongg/china-stock-research-skills)、[yennanliu/InvestSkill](https://github.com/yennanliu/InvestSkill)、[DjNero11/peter-lynch-skill](https://github.com/DjNero11/peter-lynch-skill)、[marian2js/trading-skills](https://github.com/marian2js/trading-skills)、[GAJETOso/financeskills](https://github.com/GAJETOso/financeskills)、[Howard-Jerry/quant-agent-skills](https://github.com/Howard-Jerry/quant-agent-skills)(以上均 MIT License)与 [jwangkun/claude-for-financial-services-cn](https://github.com/jwangkun/claude-for-financial-services-cn)(Apache-2.0)。快照目录、收录口径与逐颗排除理由见 [selected-skills/](selected-skills/README.md),第三方组件与许可见下面的清单文件。
|
|
196
200
|
- 会话里的可交互图表由 [TradingView Lightweight Charts](https://github.com/tradingview/lightweight-charts)(Apache-2.0)渲染,图上保留它自带的归属标识。
|
|
197
|
-
-
|
|
201
|
+
- 行情、财务、公告与网页材料来自五类需自备密钥的服务(同花顺 Fuyao、Wind Alice、AnySearch、PaddleOCR、FTShare 非凸科技)与一批公开口径的来源(东方财富、腾讯、新浪、财联社、华尔街见闻、巨潮互动易、上证 e互动、同花顺公开站点);数据版权归各服务方,额度与条款以服务方为准,本项目不重新分发原始数据。
|
|
198
202
|
|
|
199
203
|
第三方组件、版本与许可,以及宿主提供哪部分、构建期用什么、各服务的数据会出到哪些地方,逐条列在 [第三方组件与许可](THIRD_PARTY_NOTICES.md)。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -127,7 +127,7 @@ roadmap 与贡献指南、站点体检记录、给别的宿主用的接线配置
|
|
|
127
127
|
|
|
128
128
|
以下服务**不是代码依赖,也不受上表许可约束**;接口条款、额度与数据版权归各服务方所有。分两组列全:
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
**需要使用者自备密钥的五项**(前四项对应首页「数据源」卡片里的那四格,密钥一律只进宿主的凭据域):
|
|
131
131
|
|
|
132
132
|
- **同花顺 Fuyao** —— 结构化数据:行情、财务、基金与指数,以及自选股报价。
|
|
133
133
|
- **Wind Alice** —— 三个能力面:公告与新闻等信披文档检索、宏观 / 行业 / 汇率等指标(EDB)、按日期区间取的
|
|
@@ -136,6 +136,11 @@ roadmap 与贡献指南、站点体检记录、给别的宿主用的接线配置
|
|
|
136
136
|
- **PaddleOCR(百度 AIStudio)** —— PDF 与图片的文字解析。注意解析结果不是从作业接口直接返回的:
|
|
137
137
|
本插件按服务方给的**预签名地址**到它的对象存储主机取回结果(与提交作业的不是同一台主机),
|
|
138
138
|
取回后只落在使用者本机。
|
|
139
|
+
- **FTShare(非凸科技)** —— 结构化数据的第二家上游口径:A 股行情与日 K 截面、主力资金流(个股 / 行业 /
|
|
140
|
+
概念)、涨跌停价、龙虎榜席位、股东人数、指数成分权重、可转债行情、大宗交易、业绩预告与快报、交易日历,
|
|
141
|
+
以及 LPR / SHIBOR / HIBOR / 中债收益率曲线等利率长尾。免费档按次限流(服务方标 10 QPS / 突发 20),
|
|
142
|
+
本插件用进程级节流链把节奏压在这条线内。**这一把密钥目前只能写进宿主的凭据文件**(名称
|
|
143
|
+
`FTSHARE_API_KEY`),配置卡片上还没给它留输入框。
|
|
139
144
|
|
|
140
145
|
**公开口径的来源**(无需密钥,但同样受各服务方的条款与数据版权约束):东方财富(宏观与个股数据、公告与
|
|
141
146
|
研报列表、7×24 快讯与新闻)、腾讯(公开行情与历史 K 线、代码检索)、新浪(研报列表)、财联社(电报)、
|
package/chart-ui/package.json
CHANGED
package/config/index.js
CHANGED
|
@@ -94,6 +94,7 @@ export const Config = z.object({
|
|
|
94
94
|
customPersona: z.string().default('').volatile().description('Capital 模式附加人设文本'),
|
|
95
95
|
selectedSkills: SelectedSkillsSchema.default(SELECTED_SKILL_DEFAULTS).description('Explicitly selected community experiments; default off and visible only to the Capital root Agent'),
|
|
96
96
|
fuyaoCredentialRef: z.string().default('FUYAO_API_KEY').volatile().description('Fuyao credentials 引用名'),
|
|
97
|
+
ftshareCredentialRef: z.string().default('FTSHARE_API_KEY').volatile().description('FTShare(非凸科技)credentials 引用名'),
|
|
97
98
|
retriever: z.object({
|
|
98
99
|
baseURL: z.string().default('').volatile().description('AnySearch API 地址'),
|
|
99
100
|
credentialRef: z.string().default('ANYSEARCH_API_KEY').volatile().description('AnySearch credentials 引用名'),
|
package/config/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* shell 调用闸门(`bash` / `pwsh` 两个名字都认,只拦**必然失败的沙箱升级**,不看命令内容)。
|
|
3
3
|
*
|
|
4
4
|
* 背景与边界(设计理由全文在 preset/capital-generation/README.md):
|
|
5
5
|
* - bash 不是计算器,是一台完整终端。本仓实测:沙箱**只拦写**(workspace + /tmp 之外
|
|
@@ -14,15 +14,17 @@
|
|
|
14
14
|
* 的会话钉成 read-only 会直接打断 `describe_dataset` 的 profile 落盘
|
|
15
15
|
* (`workspace_not_writable`)。bash 与 Dataset 管线共用同一把尺子(session policy)。
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* A
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
17
|
+
* 规则只留一层(2026-10-15 用户决策「开 read、同时保留 bash」后):
|
|
18
|
+
* A 结构层(**已随决策移除**):曾拒绝根会话的 shell 调用("只对被委派子会话开放")。
|
|
19
|
+
* 现在主 Agent 保留 bash / pwsh(读 skill 分册、纯计算);shell 归谁由可见性收敛——
|
|
20
|
+
* `ROOT_AGENT_DENIED_TOOLS` 不再含 shell 名,子会话侧由委派行的 `toolFilter` 把 shell
|
|
21
|
+
* 只给 data_junior。迁移的断言在 `test/bash-guard.test.mjs`(根会话放行是**新契约**)。
|
|
22
|
+
* B UX 层(保留,收窄到"被委派 / 身份不可考的调用方"):委派子会话的审批策略由框架固定为
|
|
23
|
+
* `never`(dsh-subagent 的 `captureDelegatedPolicyOverrides` → `approval/policy: never`,
|
|
24
|
+
* `dsh-user-approval.decide()` 在 never 时**直接返回 rejected、根本不调用 answerer**),
|
|
25
|
+
* 所以 `sandbox_permissions` 必然失败,而且模型会收到「the user rejected…」这种
|
|
26
|
+
* **把系统拒绝说成用户拒绝**的文案。这里提前拦下并给出正确路径:省一次必然白跑的往返 +
|
|
27
|
+
* 纠正归因。主 Agent 自己的升级照常走 ask 审批(那正是 escalation 的正当用途)。
|
|
26
28
|
*
|
|
27
29
|
* 为什么用 `tools.guard` 而不是 `tools/pre-execute`:guard 是**单调**的(没有 allow 结果,
|
|
28
30
|
* 任何监听顺序都无法把别人的 deny 翻回 allow),同步、拿到解析后的 `arguments`,且
|
|
@@ -32,20 +34,23 @@
|
|
|
32
34
|
import { type GuardedExecution, type PolicyContext } from './root-tool-policy.js';
|
|
33
35
|
/** 闸门看到的调用形状:guard 拿到的是解析后的 arguments,不是一个 shell 字符串。 */
|
|
34
36
|
export type BashGuardExecution = GuardedExecution;
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* 沙箱升级拒绝文案:说清"这不是用户拒绝",并给出正确路径。
|
|
39
|
+
* (A 结构层文案 `SHELL_DELEGATED_ONLY` 随 2026-10-15 决策删除,断言迁移到
|
|
40
|
+
* `test/bash-guard.test.mjs` 的"根会话放行"用例。)
|
|
41
|
+
*/
|
|
38
42
|
export declare const SHELL_ESCALATION_UNREACHABLE: string;
|
|
39
43
|
/**
|
|
40
44
|
* 单次 shell 调用的判定:返回拒绝理由,或 undefined 放行。
|
|
41
45
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* 绝不解析 `command
|
|
46
|
+
* 2026-10-15 起主 Agent 的 shell 调用一律放行(A 层随决策移除);被拦的只有**升级参数**
|
|
47
|
+
* ——注意这里**只读两个字段**(调用方身份、`sandbox_permissions`/`justification`),
|
|
48
|
+
* 绝不解析 `command`——理由见文件头。升级判不了身份时 fail closed:根会话的形状是
|
|
49
|
+
* "有 session 且无 parentSession",证明不了就当最坏打算,不给"拿不到身份就放行"的口子。
|
|
45
50
|
*/
|
|
46
51
|
export declare function bashGuardReason(exec: BashGuardExecution | undefined): string | undefined;
|
|
47
52
|
/**
|
|
48
|
-
* 注册
|
|
53
|
+
* 注册 shell 闸门:对**本 preset 的每个 agent**(含主 Agent)在它自己的 scope 上装一次 guard。
|
|
49
54
|
*
|
|
50
55
|
* 监听位置与 `registerRootToolPolicy` 同因:`agent/created` 的路由键是 agent 对象本身,
|
|
51
56
|
* 注册在 standing scope(打了标签)的监听器**收不到且不报错**,必须挂 `ctx.root`。
|
package/lib/agents/bash-guard.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* shell 调用闸门(`bash` / `pwsh` 两个名字都认,只拦**必然失败的沙箱升级**,不看命令内容)。
|
|
3
3
|
*
|
|
4
4
|
* 背景与边界(设计理由全文在 preset/capital-generation/README.md):
|
|
5
5
|
* - bash 不是计算器,是一台完整终端。本仓实测:沙箱**只拦写**(workspace + /tmp 之外
|
|
@@ -14,15 +14,17 @@
|
|
|
14
14
|
* 的会话钉成 read-only 会直接打断 `describe_dataset` 的 profile 落盘
|
|
15
15
|
* (`workspace_not_writable`)。bash 与 Dataset 管线共用同一把尺子(session policy)。
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* A
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
17
|
+
* 规则只留一层(2026-10-15 用户决策「开 read、同时保留 bash」后):
|
|
18
|
+
* A 结构层(**已随决策移除**):曾拒绝根会话的 shell 调用("只对被委派子会话开放")。
|
|
19
|
+
* 现在主 Agent 保留 bash / pwsh(读 skill 分册、纯计算);shell 归谁由可见性收敛——
|
|
20
|
+
* `ROOT_AGENT_DENIED_TOOLS` 不再含 shell 名,子会话侧由委派行的 `toolFilter` 把 shell
|
|
21
|
+
* 只给 data_junior。迁移的断言在 `test/bash-guard.test.mjs`(根会话放行是**新契约**)。
|
|
22
|
+
* B UX 层(保留,收窄到"被委派 / 身份不可考的调用方"):委派子会话的审批策略由框架固定为
|
|
23
|
+
* `never`(dsh-subagent 的 `captureDelegatedPolicyOverrides` → `approval/policy: never`,
|
|
24
|
+
* `dsh-user-approval.decide()` 在 never 时**直接返回 rejected、根本不调用 answerer**),
|
|
25
|
+
* 所以 `sandbox_permissions` 必然失败,而且模型会收到「the user rejected…」这种
|
|
26
|
+
* **把系统拒绝说成用户拒绝**的文案。这里提前拦下并给出正确路径:省一次必然白跑的往返 +
|
|
27
|
+
* 纠正归因。主 Agent 自己的升级照常走 ask 审批(那正是 escalation 的正当用途)。
|
|
26
28
|
*
|
|
27
29
|
* 为什么用 `tools.guard` 而不是 `tools/pre-execute`:guard 是**单调**的(没有 allow 结果,
|
|
28
30
|
* 任何监听顺序都无法把别人的 deny 翻回 allow),同步、拿到解析后的 `arguments`,且
|
|
@@ -38,33 +40,35 @@ import { agentSessionId, isCapitalAgent, SHELL_TOOL_NAMES } from './root-tool-po
|
|
|
38
40
|
* 一次都不触发,且不报错(2026-09-30 实测发现,症状是"§1.6 那道闸门在 Windows 上是死代码")。
|
|
39
41
|
*/
|
|
40
42
|
const shellToolNames = new Set(SHELL_TOOL_NAMES);
|
|
41
|
-
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
/**
|
|
44
|
+
* 沙箱升级拒绝文案:说清"这不是用户拒绝",并给出正确路径。
|
|
45
|
+
* (A 结构层文案 `SHELL_DELEGATED_ONLY` 随 2026-10-15 决策删除,断言迁移到
|
|
46
|
+
* `test/bash-guard.test.mjs` 的"根会话放行"用例。)
|
|
47
|
+
*/
|
|
48
|
+
export const SHELL_ESCALATION_UNREACHABLE = 'shell 工具(bash / pwsh)的沙箱升级只有主 Agent 的会话能拿到用户审批:被委派的子会话拿不到'
|
|
49
|
+
+ '(框架把委派会话的审批策略固定为 never,不会去问用户),当前调用方也不是可确认的主 Agent 会话。'
|
|
50
|
+
+ '不要重试升级:缺数值用 describe_dataset / query_dataset,缺数据用 send_message 发 data_gap 回主 Agent。';
|
|
47
51
|
function isRecord(value) {
|
|
48
52
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
55
|
* 单次 shell 调用的判定:返回拒绝理由,或 undefined 放行。
|
|
52
56
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* 绝不解析 `command
|
|
57
|
+
* 2026-10-15 起主 Agent 的 shell 调用一律放行(A 层随决策移除);被拦的只有**升级参数**
|
|
58
|
+
* ——注意这里**只读两个字段**(调用方身份、`sandbox_permissions`/`justification`),
|
|
59
|
+
* 绝不解析 `command`——理由见文件头。升级判不了身份时 fail closed:根会话的形状是
|
|
60
|
+
* "有 session 且无 parentSession",证明不了就当最坏打算,不给"拿不到身份就放行"的口子。
|
|
56
61
|
*/
|
|
57
62
|
export function bashGuardReason(exec) {
|
|
58
63
|
if (exec === undefined || typeof exec.name !== 'string' || !shellToolNames.has(exec.name))
|
|
59
64
|
return undefined;
|
|
60
|
-
const parent = exec.agent?.session?.header?.parentSession;
|
|
61
|
-
if (typeof parent !== 'string' || parent.length === 0)
|
|
62
|
-
return SHELL_DELEGATED_ONLY;
|
|
63
65
|
const args = isRecord(exec.arguments) ? exec.arguments : undefined;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const escalated = args !== undefined && (args.sandbox_permissions !== undefined || args.justification !== undefined);
|
|
67
|
+
if (!escalated)
|
|
68
|
+
return undefined;
|
|
69
|
+
const parent = exec.agent?.session?.header?.parentSession;
|
|
70
|
+
const knownRoot = exec.agent?.session !== undefined && (typeof parent !== 'string' || parent.length === 0);
|
|
71
|
+
return knownRoot ? undefined : SHELL_ESCALATION_UNREACHABLE;
|
|
68
72
|
}
|
|
69
73
|
/** 在某个 agent 自己的 scope 上安装 guard,返回 disposer(不可用时返回 undefined)。 */
|
|
70
74
|
function installAgentGuard(agent) {
|
|
@@ -86,7 +90,7 @@ function installAgentGuard(agent) {
|
|
|
86
90
|
}
|
|
87
91
|
}
|
|
88
92
|
/**
|
|
89
|
-
* 注册
|
|
93
|
+
* 注册 shell 闸门:对**本 preset 的每个 agent**(含主 Agent)在它自己的 scope 上装一次 guard。
|
|
90
94
|
*
|
|
91
95
|
* 监听位置与 `registerRootToolPolicy` 同因:`agent/created` 的路由键是 agent 对象本身,
|
|
92
96
|
* 注册在 standing scope(打了标签)的监听器**收不到且不报错**,必须挂 `ctx.root`。
|
|
@@ -107,7 +111,7 @@ export function registerBashGuard(ctx) {
|
|
|
107
111
|
return;
|
|
108
112
|
const dispose = installAgentGuard(agent);
|
|
109
113
|
if (dispose === undefined) {
|
|
110
|
-
ctx.logger?.warn('capital-generation:
|
|
114
|
+
ctx.logger?.warn('capital-generation: shell 闸门未生效(agent scope 上没有 tools.guard):沙箱升级拦截只剩 persona 软约束');
|
|
111
115
|
return;
|
|
112
116
|
}
|
|
113
117
|
const id = agentSessionId(agent);
|
|
@@ -47,11 +47,15 @@ export declare function rootOcrGuardReason(exec: GuardedExecution | undefined):
|
|
|
47
47
|
* `tool-pwsh`,靠 `process.platform === 'win32'` 互斥 `disabled`),所以名字由平台决定。
|
|
48
48
|
*
|
|
49
49
|
* ⛔ 但**闸门必须认全集**:只认本平台那一个,另一端就是静默放行——同一个能力两个入口,
|
|
50
|
-
* 本地测试只覆盖了接好的那个(AGENTS.md §9.7
|
|
51
|
-
*
|
|
50
|
+
* 本地测试只覆盖了接好的那个(AGENTS.md §9.7 的第三种形状)。`bash-guard.ts` 的升级闸门
|
|
51
|
+
* 从这里取名字,不再各写一份。
|
|
52
|
+
*
|
|
53
|
+
* 2026-10-15 用户决策「开 read、同时保留 bash」:shell **不再**进 {@link ROOT_AGENT_DENIED_TOOLS}
|
|
54
|
+
* ——主 Agent 保留 bash / pwsh(读 skill 分册、纯计算);子会话侧仍由委派行的 `toolFilter`
|
|
55
|
+
* 与 `bash-guard.ts` 的升级闸门收敛。
|
|
52
56
|
*/
|
|
53
57
|
export declare const SHELL_TOOL_NAMES: readonly ["bash", "pwsh"];
|
|
54
|
-
export declare const ROOT_AGENT_DENIED_TOOLS: readonly ["render_chart", "subagent_visualization_specialist", "prepare_chart_source", "anysearch_search", "web_retriever_fetch", "wind_docs_announcements", "wind_docs_news", "cls_telegraph", "wscn_lives", "cninfo_irm", "sseinfo_qa", "eastmoney_724", "eastmoney_stock_news", "eastmoney_reports", "sina_reports", "ths_eps_forecast", "
|
|
58
|
+
export declare const ROOT_AGENT_DENIED_TOOLS: readonly ["render_chart", "subagent_visualization_specialist", "prepare_chart_source", "anysearch_search", "web_retriever_fetch", "wind_docs_announcements", "wind_docs_news", "cls_telegraph", "wscn_lives", "cninfo_irm", "sseinfo_qa", "eastmoney_724", "eastmoney_stock_news", "eastmoney_reports", "sina_reports", "ths_eps_forecast", "write", "edit"];
|
|
55
59
|
/** 本 preset 的 id(`composedPreset` 的返回值)。 */
|
|
56
60
|
export declare const CAPITAL_PRESET_ID = "capital-generation";
|
|
57
61
|
interface ToolRestriction {
|
|
@@ -154,6 +158,28 @@ export declare function restrictRootAgentTools(agent: AgentLike | undefined, rec
|
|
|
154
158
|
* 已经完成的 deny 收敛(宁可少一层闸门,不能挡住建 agent)。
|
|
155
159
|
*/
|
|
156
160
|
export declare function installRootOcrGuard(agent: AgentLike | undefined): (() => void) | undefined;
|
|
161
|
+
/** `tool-fs` 的写口工具名(唯一一份):`read` / `read_image` 是只读口,不在名单。 */
|
|
162
|
+
export declare const FS_WRITE_TOOL_NAMES: readonly ["write", "edit"];
|
|
163
|
+
/** fs 写口拒绝文案:指回正确路径(读用 read,落盘走工具回传),并留可恢复的余地。 */
|
|
164
|
+
export declare const FS_WRITE_READ_ONLY: string;
|
|
165
|
+
/**
|
|
166
|
+
* `tool-fs` 写口的调用级闸门(**全局**装在插件 ctx 上,一次安装管住本 preset 所有 agent)。
|
|
167
|
+
*
|
|
168
|
+
* 为什么装全局而不是像 `ocr` 那样按 agent 装:`agent/created` 的落层时机随宿主形状漂移
|
|
169
|
+
* (桌面端 restrict 不写进链路层,见 `docs/dev/bash-gate.md` 的实测记录),而 guard 按
|
|
170
|
+
* `exec.agent` 取链路、与实例绑哪层无关——这正是那份文档里声明的备选方向,先在写口上落地。
|
|
171
|
+
*
|
|
172
|
+
* ⛔ 全局 guard 会吃到本进程**所有**调用,所以判据必须 fail-**open**:registry 读不到、
|
|
173
|
+
* `composedPreset` 抛错、拿不到 agent 的形状一律放行——宁可少拦一层(`ROOT_AGENT_DENIED_TOOLS`
|
|
174
|
+
* 还在视图层兜着),也绝不能把别的 preset(开发会话的 read / write / edit)吃掉。
|
|
175
|
+
* 拒绝只发生在"能确证调用方属于本 preset"时。
|
|
176
|
+
*/
|
|
177
|
+
export declare function fsWriteGuardReasonFor(ctx: PolicyContext): (execution: GuardedExecution) => string | undefined;
|
|
178
|
+
/**
|
|
179
|
+
* 装 {@link fsWriteGuardReasonFor}。guard 不可用或安装异常都不外抛(调用方是装配路径);
|
|
180
|
+
* disposer 由 `ctx.effect` 持有,随本 fiber 释放。
|
|
181
|
+
*/
|
|
182
|
+
export declare function registerFsWriteGuard(ctx: PolicyContext): void;
|
|
157
183
|
/**
|
|
158
184
|
* 注册 `agent/created` 监听。监听器只做一件事:对本 preset 的根 Agent 收敛一次。
|
|
159
185
|
*
|
|
@@ -64,8 +64,12 @@ export function rootOcrGuardReason(exec) {
|
|
|
64
64
|
* `tool-pwsh`,靠 `process.platform === 'win32'` 互斥 `disabled`),所以名字由平台决定。
|
|
65
65
|
*
|
|
66
66
|
* ⛔ 但**闸门必须认全集**:只认本平台那一个,另一端就是静默放行——同一个能力两个入口,
|
|
67
|
-
* 本地测试只覆盖了接好的那个(AGENTS.md §9.7
|
|
68
|
-
*
|
|
67
|
+
* 本地测试只覆盖了接好的那个(AGENTS.md §9.7 的第三种形状)。`bash-guard.ts` 的升级闸门
|
|
68
|
+
* 从这里取名字,不再各写一份。
|
|
69
|
+
*
|
|
70
|
+
* 2026-10-15 用户决策「开 read、同时保留 bash」:shell **不再**进 {@link ROOT_AGENT_DENIED_TOOLS}
|
|
71
|
+
* ——主 Agent 保留 bash / pwsh(读 skill 分册、纯计算);子会话侧仍由委派行的 `toolFilter`
|
|
72
|
+
* 与 `bash-guard.ts` 的升级闸门收敛。
|
|
69
73
|
*/
|
|
70
74
|
export const SHELL_TOOL_NAMES = ['bash', 'pwsh'];
|
|
71
75
|
export const ROOT_AGENT_DENIED_TOOLS = [
|
|
@@ -91,10 +95,19 @@ export const ROOT_AGENT_DENIED_TOOLS = [
|
|
|
91
95
|
*/
|
|
92
96
|
...RETRIEVAL_DENIED_TOOLS,
|
|
93
97
|
/**
|
|
94
|
-
*
|
|
95
|
-
*
|
|
98
|
+
* 文件写口收敛:preset 挂 `tool-fs` 一颗(read / write / edit),主 Agent 只留 `read`
|
|
99
|
+
* (2026-10-15 用户决策「开 read、同时保留 bash」)。`write` / `edit` 这里逐名 deny 是
|
|
100
|
+
* **视图层**(restrict 落对层的形状里主 Agent 根本看不见写口);由于 restrict 落层依赖
|
|
101
|
+
* 宿主形状(桌面端不写进链路层,见 `docs/dev/bash-gate.md`),调用层还有
|
|
102
|
+
* {@link fsWriteGuardReasonFor} 兜底——两层拦同一件事:业务落盘只走工具实现
|
|
103
|
+
* (`store.writeContext` 等),模型不直接写文件。
|
|
104
|
+
*
|
|
105
|
+
* `read_image` 刻意不点名:它只读、且条件注册(依赖宿主 `attachments` 服务),照
|
|
106
|
+
* `web_search` / `web_fetch` 的教训不该在名单里养 `failed` 记录。`tool-fs-search`
|
|
107
|
+
* (glob / grep)本轮不挂:需求只是"读得动",发现面等真需求再开。
|
|
96
108
|
*/
|
|
97
|
-
|
|
109
|
+
'write',
|
|
110
|
+
'edit',
|
|
98
111
|
];
|
|
99
112
|
/** 本 preset 的 id(`composedPreset` 的返回值)。 */
|
|
100
113
|
export const CAPITAL_PRESET_ID = 'capital-generation';
|
|
@@ -110,26 +123,38 @@ export function agentSessionId(agent) {
|
|
|
110
123
|
const id = agent?.session?.id;
|
|
111
124
|
return typeof id === 'string' && id.length > 0 ? id : undefined;
|
|
112
125
|
}
|
|
113
|
-
/**
|
|
114
|
-
|
|
126
|
+
/** registry 认领结果:字符串 = `composedPreset` 的原样返回值,`'no-registry'` = registry 或方法不在。 */
|
|
127
|
+
const NO_REGISTRY = 'no-registry';
|
|
128
|
+
/**
|
|
129
|
+
* 读 `agentPresets` registry 对某个 agent 的认领结果——**registry 读取只此一份**
|
|
130
|
+
* (两个判据的差异只在"读不到时认领还是放行",见各自调用点)。
|
|
131
|
+
* `composedPreset` 抛错按"不认领"返回 undefined(不能吞进 `'no-registry'`:那会改变缺省方向)。
|
|
132
|
+
*/
|
|
133
|
+
function presetClaimOf(ctx, agent) {
|
|
115
134
|
let presets;
|
|
116
135
|
try {
|
|
117
136
|
presets = ctx.get?.('agentPresets');
|
|
118
137
|
}
|
|
119
138
|
catch {
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
if (presets === undefined || typeof presets.composedPreset !== 'function') {
|
|
123
|
-
// 读不到 registry 时保守放行:逐名 restrict 本身会拒绝未知工具名,不会误伤别的 preset。
|
|
124
|
-
return true;
|
|
139
|
+
return NO_REGISTRY;
|
|
125
140
|
}
|
|
141
|
+
if (presets === undefined || typeof presets.composedPreset !== 'function')
|
|
142
|
+
return NO_REGISTRY;
|
|
126
143
|
try {
|
|
127
|
-
return presets.composedPreset(agent?.ctx)
|
|
144
|
+
return presets.composedPreset(agent?.ctx);
|
|
128
145
|
}
|
|
129
146
|
catch {
|
|
130
|
-
return
|
|
147
|
+
return undefined;
|
|
131
148
|
}
|
|
132
149
|
}
|
|
150
|
+
/** 只有本 preset 的 agent 才收敛:别的 preset 的 agent 不该被我们碰。 */
|
|
151
|
+
export function isCapitalAgent(ctx, agent) {
|
|
152
|
+
const claim = presetClaimOf(ctx, agent);
|
|
153
|
+
// 读不到 registry 时保守**认领**:逐名 restrict 本身会拒绝未知工具名,不会误伤别的 preset。
|
|
154
|
+
if (claim === NO_REGISTRY)
|
|
155
|
+
return true;
|
|
156
|
+
return claim === CAPITAL_PRESET_ID;
|
|
157
|
+
}
|
|
133
158
|
const probes = [];
|
|
134
159
|
const MAX_PROBES = 8;
|
|
135
160
|
/** 最近 {@link MAX_PROBES} 条收敛现场(进程内;不落盘,随宿主进程生灭)。 */
|
|
@@ -215,6 +240,67 @@ export function installRootOcrGuard(agent) {
|
|
|
215
240
|
return undefined;
|
|
216
241
|
}
|
|
217
242
|
}
|
|
243
|
+
/** `tool-fs` 的写口工具名(唯一一份):`read` / `read_image` 是只读口,不在名单。 */
|
|
244
|
+
export const FS_WRITE_TOOL_NAMES = ['write', 'edit'];
|
|
245
|
+
const fsWriteNames = new Set(FS_WRITE_TOOL_NAMES);
|
|
246
|
+
/** fs 写口拒绝文案:指回正确路径(读用 read,落盘走工具回传),并留可恢复的余地。 */
|
|
247
|
+
export const FS_WRITE_READ_ONLY = 'write / edit 不开放(主 Agent 与子会话都不直接写文件):读文件用 read;'
|
|
248
|
+
+ '数据与产物走工具回传(DatasetRef / chart_ref / send_message),需要落盘的由工具实现完成。'
|
|
249
|
+
+ '若你判断确需写文件,用 send_message 把 data_gap 与已有证据发回主 Agent 协调。';
|
|
250
|
+
/**
|
|
251
|
+
* `tool-fs` 写口的调用级闸门(**全局**装在插件 ctx 上,一次安装管住本 preset 所有 agent)。
|
|
252
|
+
*
|
|
253
|
+
* 为什么装全局而不是像 `ocr` 那样按 agent 装:`agent/created` 的落层时机随宿主形状漂移
|
|
254
|
+
* (桌面端 restrict 不写进链路层,见 `docs/dev/bash-gate.md` 的实测记录),而 guard 按
|
|
255
|
+
* `exec.agent` 取链路、与实例绑哪层无关——这正是那份文档里声明的备选方向,先在写口上落地。
|
|
256
|
+
*
|
|
257
|
+
* ⛔ 全局 guard 会吃到本进程**所有**调用,所以判据必须 fail-**open**:registry 读不到、
|
|
258
|
+
* `composedPreset` 抛错、拿不到 agent 的形状一律放行——宁可少拦一层(`ROOT_AGENT_DENIED_TOOLS`
|
|
259
|
+
* 还在视图层兜着),也绝不能把别的 preset(开发会话的 read / write / edit)吃掉。
|
|
260
|
+
* 拒绝只发生在"能确证调用方属于本 preset"时。
|
|
261
|
+
*/
|
|
262
|
+
export function fsWriteGuardReasonFor(ctx) {
|
|
263
|
+
return (execution) => {
|
|
264
|
+
const name = execution?.name;
|
|
265
|
+
if (typeof name !== 'string' || !fsWriteNames.has(name))
|
|
266
|
+
return undefined;
|
|
267
|
+
if (presetClaimOf(ctx, execution.agent) !== CAPITAL_PRESET_ID)
|
|
268
|
+
return undefined;
|
|
269
|
+
return FS_WRITE_READ_ONLY;
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 装 {@link fsWriteGuardReasonFor}。guard 不可用或安装异常都不外抛(调用方是装配路径);
|
|
274
|
+
* disposer 由 `ctx.effect` 持有,随本 fiber 释放。
|
|
275
|
+
*/
|
|
276
|
+
export function registerFsWriteGuard(ctx) {
|
|
277
|
+
const install = () => {
|
|
278
|
+
let tools;
|
|
279
|
+
try {
|
|
280
|
+
const direct = ctx.tools;
|
|
281
|
+
const viaGet = typeof ctx.get === 'function' ? ctx.get('tools') : undefined;
|
|
282
|
+
const candidate = direct !== undefined ? direct : viaGet;
|
|
283
|
+
tools = candidate;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
if (tools === undefined || typeof tools.guard !== 'function')
|
|
289
|
+
return undefined;
|
|
290
|
+
try {
|
|
291
|
+
const dispose = tools.guard(fsWriteGuardReasonFor(ctx));
|
|
292
|
+
return typeof dispose === 'function' ? dispose : undefined;
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
if (typeof ctx.effect === 'function') {
|
|
299
|
+
ctx.effect(() => install() ?? (() => { }), 'capital-generation.fs-write-guard()');
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
install();
|
|
303
|
+
}
|
|
218
304
|
/**
|
|
219
305
|
* 注册 `agent/created` 监听。监听器只做一件事:对本 preset 的根 Agent 收敛一次。
|
|
220
306
|
*
|
|
@@ -108,6 +108,11 @@ function tool(name, description, parameters, schema, execute, options = {}) {
|
|
|
108
108
|
// 会被放进有界并发池(默认上限 10),结果仍按模型顺序在**同一个下一步**一起返回。
|
|
109
109
|
// 这正是 describe_dataset 省往返的手段——多个 dataset 由模型一次发完,而不是把 N 份结果
|
|
110
110
|
// 合并成一个超长载荷(见 docs/design/describe-dataset-design.md §2.1)。
|
|
111
|
+
// 宿主侧是 **fail-closed**,两版源码同为「没有这个函数就 exclusive」;2026-10-16 用一次性
|
|
112
|
+
// headless 探针在真机核过(账本 L30):两颗除声明与否外逐字相同的工具,三颗**已声明**在
|
|
113
|
+
// 1 毫秒内一起派发、整批 706 毫秒;三颗**未声明**严格 call→result 交替、整批 1426 毫秒。
|
|
114
|
+
// ⚠ 混发会把已声明的那颗拖回串行(池在遇到第一颗未声明调用处断开),所以"要不要标"是
|
|
115
|
+
// 按**工具**定的、不是按**这一次批次**定的:见下面 query_dataset 那条刻意不标的理由。
|
|
111
116
|
...(options.concurrencySafe === true ? { isConcurrencySafe: () => true } : {}),
|
|
112
117
|
};
|
|
113
118
|
}
|
|
@@ -363,6 +368,10 @@ export function registerDatasetTools(ctx, store) {
|
|
|
363
368
|
primary_key: typeof args.primary_key === 'string' ? args.primary_key : undefined,
|
|
364
369
|
signal: exec.signal,
|
|
365
370
|
})),
|
|
371
|
+
// 刻意**不**标并发安全(与 describe_dataset 相反,且这是量出来的):真会话里 query_dataset
|
|
372
|
+
// 单颗中位 17 毫秒(25 次样本),一次消息发 6 颗串行也只多付约 85 毫秒;而它的成本主体是
|
|
373
|
+
// 读 raw.json 后的 `JSON.parse` + 聚合,Node 单线程下这部分**并发也不会重叠**,标了买不到什么。
|
|
374
|
+
// 多份数据 / 多条查询的诉求已经由 describe_dataset 的 `queries` 承接(那颗标了)。
|
|
366
375
|
tool('query_dataset', `对当前 session 已授权的 json_rows Dataset 执行固定 QuerySpec:参数是一个 JSON 对象,QuerySpec 字段既可平铺在根上(flat),也可整体放进 query(query_request envelope,宿主自动展开);两种形态同时给出时以 query 为准。支持受限 filter、group_by、count/min/max/avg/sum、asc/desc 和 limit。必须返回聚合或分组结果,禁止原始行投影;select 可省略,默认返回分组列和聚合别名。默认 error_policy=skip_with_warning,脏值会被排除并在 warnings 披露;需要全量类型一致性时显式使用 strict。**时间筛选直接写日期**:时间列(如 date_ms)的 filter 值可写 "2026-08-23" / "2026-08" / "2026" 或 {period:"last_3_months"}(period 省略锚点时以该 Dataset 最后一天为准),宿主按该列自身的时区偏移换算成边界,不要自己算毫秒;日期写法配 >、<、!= 无意义会报 query_type_conflict(用 >= / <= / =)。结果里时间列会附 *_iso 可读日期。最多 ${MAX_QUERY_FILTERS} 个条件、${MAX_QUERY_GROUP_BY} 个分组列、${MAX_QUERY_AGGREGATES} 个聚合、${MAX_QUERY_LIMIT} 行,结果最多 ${MAX_QUERY_OUTPUT_BYTES} 字节。数值字符串只在 Dataset schema 明确为 number/integer 时兼容。query_dataset 是受控分组/聚合工具,不是通用 raw.json 读取或自定义分析工具:select 只能引用 group_by 列或聚合别名,取不到原始行(首末/最新值请用 profile 的 time_facts)。select/group_by/aggregates/order_by 请传真正的 JSON 数组(宿主也兼容 JSON 字符串,但不要依赖)。若还要 profile/元数据,可用 describe_dataset 的 queries 参数一次拿到;本工具用于单点补查。`, queryParametersSchema, queryResultSchema, async (args, exec) => {
|
|
367
376
|
const normalized = normalizeQueryArgs(args);
|
|
368
377
|
const session = delegatedSession(exec, 'query_dataset');
|