@v587d/capital-generation 2.7.12 → 2.8.0
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 +28 -0
- package/README.md +3 -2
- package/chart-ui/package.json +1 -1
- 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/index.js +14 -8
- 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/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,34 @@
|
|
|
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.0] - 2026-10-15
|
|
11
|
+
|
|
12
|
+
主 Agent 的工具面按用户决策调整为「**开 read、同时保留 bash**」,三个平台的口径终于一致。宿主要求与
|
|
13
|
+
2.7.11 相同(DSH`@0.2.0-rc.2`),**不必换宿主版本**。
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **主 Agent 现在能直接读文件**(新增 `read`):读精选 Skill 的方法论分册、读工作区里的文件都走它。
|
|
18
|
+
此前主 Agent 没有读文件的工具,真机上都是拿 `bash` 的 `cat` 绕——能力等价,但现在是正路。此前几版
|
|
19
|
+
「入口册 + 分册」的分层阅读,也从这一版起有了产品内的正式通道。
|
|
20
|
+
- **主 Agent 保留 `bash` / `pwsh`**(各平台二选一,和数据角色用的是同一颗):用于纯计算兜底。此前
|
|
21
|
+
Linux / Web 平面上它被整体拿掉、而 Windows 桌面端因为已知宿主差异实际没拦住——同一个产品两种行为。
|
|
22
|
+
现在三端一致:主 Agent 都有 shell。
|
|
23
|
+
- **主 Agent 仍然不能写文件**(`write` / `edit` 不开放,调用时拒绝并指回正路):数据与产物继续走工具
|
|
24
|
+
回传,落盘由工具实现完成;子 Agent 也一样不直接写文件。读文件的口子开了,写文件的没开——这是刻意的。
|
|
25
|
+
- **通用子会话收掉文件口**:临时子会话读不到原始数据文件(原始行永不出工具层),也写不了文件。
|
|
26
|
+
- **`read` 的读侧纪律写在人设里,而不是写成一道闸门**:主 Agent 不读原始行落盘目录、不读宿主配置与
|
|
27
|
+
凭据,引用 Skill 分册要整册读完再引用。原因很直白——shell 仍然开着,`cat` 同一个文件不需要任何
|
|
28
|
+
权限,而沙箱实测只拦写、不拦读;按参数拦路径只会得到一个看起来严、实际绕得开的边界。这一条有回归
|
|
29
|
+
点名(四条断言),管不住的地方说清楚是谁在管,比假装管住了强。
|
|
30
|
+
|
|
31
|
+
### 迁移说明
|
|
32
|
+
|
|
33
|
+
- 不需要任何动作:密钥、卡片设置、精选 Skills 勾选、自选股与持仓标记全部照旧读得到。
|
|
34
|
+
- 行为变化只在工具可见性(上面四条);取数、出图、检索的契约都没变。
|
|
35
|
+
- Windows 桌面端那条[已知宿主差异](README.md)依旧存在(主 Agent 的部分工具限制可能不生效);由于 shell
|
|
36
|
+
本版起对主 Agent 正式开放,这条差异的暴露面缩小为"出图与检索的限制",请继续留意它实际调用了哪些工具。
|
|
37
|
+
|
|
10
38
|
## [2.7.12] - 2026-10-14
|
|
11
39
|
|
|
12
40
|
内部整理,治的是同一件事:**正文长过一次的加载窗口,宿主就从中间把它剪掉**。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.0-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
|
|
|
@@ -168,10 +168,11 @@ https://github.com/v587d/capital-generation
|
|
|
168
168
|
- **安装后找不到 Capital 模式?** 确认插件出现在「插件」→ 已安装列表;Web / CLI profile 安装后要重启该 profile,并在新会话选择模式。
|
|
169
169
|
- **配置在哪?** 打开「插件」→ 已安装的 **Capital Generation**,页面顶部就是「数据源 / 精选 Skills / 包含的组件」三格,四把密钥都在第一格;不在 DSH 的普通「设置」页面,也不用点进任何一行组件。保存密钥后新建会话再试。
|
|
170
170
|
- **升级到 2.7.11 后,卡片里的开关回到默认值了?** 这一版把插件内部两个组件换了目录名,宿主按旧路径记住的那份保存值因此接不上。四把 API Key、你的自选股清单与持仓标记都不受影响;「精选 Skills」的勾选、附加人设与「本机直连」开关需要重新设一次并保存,之后就稳定了。已经设过的话,旧的那份仍写在 DSH 的 profile 文件里,手改那一行的路径也能取回来。
|
|
171
|
-
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.
|
|
171
|
+
- **桌面端升级后仍是旧版?** 桌面端安装时会固定所解析的版本,不会自动升级。卸载后重新安装,再到插件详情查看版本号;如需指定版本,可在地址末尾加 `#v2.8.0` 或 `@2.8.0`。
|
|
172
172
|
- **刚发布的新版本装不到?** 桌面端取包时会跳过**刚发布不久**的版本(宿主侧包管理器的发布冷却策略,实测会静默装成上一个版本),国内镜像的同步也可能滞后一段时间。急着用最新代码,改用仓库地址安装最直接。
|
|
173
173
|
- **网页抓取失败?** 配置卡片中的「允许启动本地提取网页内容」默认开启:AnySearch 提取失败时可尝试本机直连。关闭后,本机直连的具名来源查询也不可用;请检查该开关和网络连接。
|
|
174
174
|
- **Wind 那部分会消耗积分?** 会。公告与新闻检索、宏观 / 行业 / 汇率指标、按日期区间取的历史 K 线都按次消耗你在 Wind 侧的额度;额度与条款以 Wind 为准,插件不做用量封顶。没配 `WIND_API_KEY` 时这几类不可用,其余功能照常。
|
|
175
|
+
- **运行时主 Agent没有加载已打开的精选 Skill?** 由 LLM 判断是否值得加载精选 Skill, 如果你需要强制使用某一种技能,可通过 `/技能名称` 斜杠命令的形式手动加载已在设置中打开的 Skill。
|
|
175
176
|
|
|
176
177
|
目前 Windows 桌面端有一项[已知宿主差异](CHANGELOG.md):主 Agent 的部分工具限制可能不生效。请特别留意它实际调用了哪些工具;结构化数据的取数限制仍由工具自身执行。
|
|
177
178
|
|
package/chart-ui/package.json
CHANGED
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
|
*
|
package/lib/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import { registerTimeTool } from './time/tools.js';
|
|
|
11
11
|
import { registerWatchlistTool } from './watchlist/tools.js';
|
|
12
12
|
import { registerChartTool } from './chart/tool.js';
|
|
13
13
|
import { createChartEventPublisher } from './chart/events.js';
|
|
14
|
-
import { registerRootToolPolicy, rootPolicyProbes } from './agents/root-tool-policy.js';
|
|
14
|
+
import { registerRootToolPolicy, registerFsWriteGuard, rootPolicyProbes } from './agents/root-tool-policy.js';
|
|
15
15
|
import { registerBashGuard } from './agents/bash-guard.js';
|
|
16
16
|
import { registerRootSelectedSkills, SELECTED_SKILL_CATALOG } from './agents/selected-skills-provider.js';
|
|
17
17
|
import { ChartSourceTokenStore, registerChartSourceTool } from './chart/source-token.js';
|
|
@@ -362,16 +362,22 @@ export function apply(ctx, config) {
|
|
|
362
362
|
chartEvents: () => createChartEventPublisher(chartEventContext),
|
|
363
363
|
});
|
|
364
364
|
// 根 Agent 工具收敛:`agent/created` 里对**主 Agent**(无 parentSession)在其自己的
|
|
365
|
-
// scope
|
|
365
|
+
// scope 上逐名 deny `ROOT_AGENT_DENIED_TOOLS`(出图三件套 + 十三个出网工具 + `write` /
|
|
366
|
+
// `edit`;2026-10-15 用户决策「开 read、同时保留 bash」后 shell 名已移出名单)。
|
|
366
367
|
// 子 Agent 的 scope parent 是 standing key(兄弟),因此不受影响。
|
|
367
368
|
registerRootToolPolicy(ctx);
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
// 理由全文见 src/agents/bash-guard.ts 与 docs/dev/bash-gate.md §1.6
|
|
369
|
+
// shell 闸门:对**本 preset 的每个 agent**(含主 Agent)在其自己的 scope 上装一次单调 guard,
|
|
370
|
+
// 只拦**必然失败的沙箱升级**(`sandbox_permissions` / `justification`:被委派会话的审批策略
|
|
371
|
+
// 由框架固定为 never,answerer 根本不会被调用),并给出正确路径。主 Agent 的 shell 保留
|
|
372
|
+
// (2026-10-15 决策),它的升级走正常 ask 审批。**不解析命令内容**:正则挡不住 `node -e`,
|
|
373
|
+
// 而 node/python 正是引入 bash 的目的;禁区纪律走 data_junior 的 persona。
|
|
374
|
+
// 理由全文见 src/agents/bash-guard.ts 与 docs/dev/bash-gate.md §1.6。
|
|
374
375
|
registerBashGuard(ctx);
|
|
376
|
+
// fs 写口闸门:**全局**装一次(guard 按 `exec.agent` 取链路,与实例绑哪层无关——
|
|
377
|
+
// docs/dev/bash-gate.md §1.6 里声明的备选方向在写口上落地),调用期拦本 preset 的
|
|
378
|
+
// `write` / `edit`;`read` 开放给主 Agent 读 skill 分册与工作区文件。判据 fail-open
|
|
379
|
+
// (别的 preset 的会话照常读写),见 src/agents/root-tool-policy.ts。
|
|
380
|
+
registerFsWriteGuard(ctx);
|
|
375
381
|
ctx.effect(() => {
|
|
376
382
|
const sources = createTencentSources();
|
|
377
383
|
const disposers = sources.map((dataSource) => hub.registerSource(dataSource));
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* between validation and connect. Closing that window would require a custom
|
|
7
7
|
* dispatcher; this module keeps the same explicit trade-off as dsh-search-first.
|
|
8
8
|
*/
|
|
9
|
-
export declare const LOCAL_FETCH_CLIENT_VERSION = "2.
|
|
9
|
+
export declare const LOCAL_FETCH_CLIENT_VERSION = "2.8.0";
|
|
10
10
|
export declare const LOCAL_FETCH_MAX_URL_LENGTH = 2048;
|
|
11
11
|
export type LocalFetchErrorCode = 'ABORTED' | 'TIMEOUT' | 'INVALID_URL' | 'BLOCKED_URL' | 'DNS' | 'REDIRECT' | 'HTTP' | 'TOO_LARGE' | 'UNSUPPORTED_CONTENT_TYPE';
|
|
12
12
|
export declare class LocalFetchError extends Error {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* dispatcher; this module keeps the same explicit trade-off as dsh-search-first.
|
|
8
8
|
*/
|
|
9
9
|
import { htmlToMarkdown, stripInvisibleText } from './html-markdown.js';
|
|
10
|
-
export const LOCAL_FETCH_CLIENT_VERSION = '2.
|
|
10
|
+
export const LOCAL_FETCH_CLIENT_VERSION = '2.8.0';
|
|
11
11
|
export const LOCAL_FETCH_MAX_URL_LENGTH = 2048;
|
|
12
12
|
export class LocalFetchError extends Error {
|
|
13
13
|
code;
|
|
@@ -52,7 +52,7 @@ export interface WindCallResult {
|
|
|
52
52
|
* `test/chart-composition.test.mjs` 守着(会因漂移而失败),这里原本是写死的第二处,
|
|
53
53
|
* 一次发版就得记得改两遍。所以本常量由测试一并核对(见 `test/wind-client.test.mjs`)。
|
|
54
54
|
*/
|
|
55
|
-
export declare const WIND_CLIENT_VERSION = "2.
|
|
55
|
+
export declare const WIND_CLIENT_VERSION = "2.8.0";
|
|
56
56
|
export interface WindClient {
|
|
57
57
|
callTool(toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<WindCallResult>;
|
|
58
58
|
}
|
|
@@ -35,7 +35,7 @@ export const WIND_SERVER_ENDPOINTS = {
|
|
|
35
35
|
* `test/chart-composition.test.mjs` 守着(会因漂移而失败),这里原本是写死的第二处,
|
|
36
36
|
* 一次发版就得记得改两遍。所以本常量由测试一并核对(见 `test/wind-client.test.mjs`)。
|
|
37
37
|
*/
|
|
38
|
-
export const WIND_CLIENT_VERSION = '2.
|
|
38
|
+
export const WIND_CLIENT_VERSION = '2.8.0';
|
|
39
39
|
function errorText(error) {
|
|
40
40
|
return error instanceof Error ? error.message : String(error);
|
|
41
41
|
}
|
package/package.json
CHANGED
|
@@ -120,33 +120,40 @@
|
|
|
120
120
|
coding 工具;插件注册 `read_profile`(allow 里的名字必须先真实存在);更新 `AGENTS.md` 与 `docs/dev/data-roles.md`
|
|
121
121
|
的角色边界与 `test/persona.test.mjs` 的预留期断言。
|
|
122
122
|
|
|
123
|
-
## 5.1 bash
|
|
123
|
+
## 5.1 shell 与文件口:开 read、保留 bash、不给写(2026-10-15 用户决策)
|
|
124
124
|
|
|
125
125
|
- **动机**:`query_dataset` 只有 `count/min/max/avg/sum`,变化量 / 增幅 / CAGR / 比值这类派生
|
|
126
126
|
指标没有宿主工具;模型只能拿 `time_facts.first/last` 心算——那正是 §1.3 那次 41,961 字符
|
|
127
127
|
时间戳心算的同型浪费。所以给 data_junior 一个纯计算兜底。**不是**给它开取数通道。
|
|
128
|
-
-
|
|
129
|
-
的
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
- **2026-10-15 起主 Agent 也持有 shell 与 `read`**(用户决策「开 read、同时保留 bash」,推翻
|
|
129
|
+
2026-09-30 的"主 Agent 不给 shell"):主 Agent 需要 `read` 读 skill 分册与工作区文件
|
|
130
|
+
(此前只能 `bash cat`,能力等价但绕远),shell 保留纯计算兜底。`ROOT_AGENT_DENIED_TOOLS`
|
|
131
|
+
里的 `bash` / `pwsh` 随之移出,名单改为出图三件套 + 十三个出网工具 + `write` / `edit`。
|
|
132
|
+
- **文件写口不开**:`write` / `edit` 被两层拦住——根侧逐名收敛(主 Agent 视图层)+ 全局
|
|
133
|
+
`tools.guard()`(`registerFsWriteGuard`,调用期按 `composedPreset` 认领,fail-open,细节见
|
|
134
|
+
`docs/dev/bash-gate.md` §1.6)。理由:主 Agent 唯一对用户说话、又会读到子 Agent 回传(含网页
|
|
135
|
+
材料),写文件等于给"注入 → 落盘 → 被别的环节读回"开口;业务落盘本来就有正路
|
|
136
|
+
(`store.writeContext` 等工具实现),模型手里的写口没有正当用途。通用 `subagent` 行的
|
|
137
|
+
`toolFilter.deny` 同步含 `read` / `write` / `edit`(通用 child 不得读 raw.json,原始 rows
|
|
138
|
+
永不出工具层)。
|
|
133
139
|
- **平台成对挂载**:Windows 上 host 层挂的是 `pwsh-sandbox`,没有 `bash-sandbox`;只挂
|
|
134
140
|
`tool-bash` 会让名为 bash 的工具实际执行 PowerShell。所以两行互补 `disabled`,allow / deny
|
|
135
141
|
里的名字用 `!!js` 三元表达式按平台选。`tools.restrict()` 对未注册名字报错,所以表达式与行必须
|
|
136
142
|
同进同退(回归:`test/persona.test.mjs`「shell 行:平台成对挂载……」)。
|
|
137
143
|
- **不给后台执行**:`enableRunInBackground: false`。本 preset 不挂 `tool-jobs`,开着后台只会让
|
|
138
144
|
模型拿到一个永远读不回来的 jobId(`job_output` / `job_kill` 不在任何 allow 里)。
|
|
139
|
-
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
`
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
- **shell 闸门只剩一层,且不是安全边界**(`src/agents/bash-guard.ts`):拦掉
|
|
146
|
+
`sandbox_permissions` / `justification`——被委派会话的审批策略由框架固定为 `never`,升级必然
|
|
147
|
+
失败,而且模型会收到「the user rejected…」这种把系统拒绝说成用户拒绝的文案;被委派或身份
|
|
148
|
+
不可考的调用方 fail closed。主 Agent 的升级走正常 ask 审批(2026-10-15 前的"只对被委派子会话
|
|
149
|
+
开放"一层随决策移除,断言迁移见 `test/bash-guard.test.mjs`)。**刻意不解析 `command`**:本仓
|
|
150
|
+
实测沙箱只拦写、不拦读(`~/.dsh/.credentials.yaml` 与 `sessions/**` 整机可读)、不拦网络
|
|
151
|
+
(`curl` 直连 200),而正则挡不住 `node -e` / `python3 -c`——那正是引入 bash 的目的。禁区与
|
|
152
|
+
出网纪律是 data_junior persona 的 `# BASH DISCIPLINE` 软约束。
|
|
153
|
+
- **写边界收不窄到会话**:`store.writeContext()` 用**调用方 session** 的 policy 且要求
|
|
147
154
|
`mode ∈ {workspace-write, danger-full-access}`,而 `describe_dataset` 会用 data_junior 的会话写
|
|
148
155
|
`profile.json`;把它的会话钉成 `read-only` 会直接打断 describe_dataset。bash 与 Dataset 管线
|
|
149
|
-
共用同一把尺子(session policy
|
|
156
|
+
共用同一把尺子(session policy),所以模型侧写口只能靠上一条的调用期闸门收。
|
|
150
157
|
- **要真正收紧**只有两条路:换掉 `ctx.shell`(容器 / 微 VM / 远端执行器),或给 dsh 进程做出网
|
|
151
158
|
限制。两者都不是 `ctx.sandbox` 能提供的。
|
|
152
159
|
|