@v587d/capital-generation 2.7.10 → 2.7.12
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 +68 -0
- package/README.md +3 -2
- package/chart-ui/package.json +1 -1
- package/{capital-config → config}/client.js +2 -2
- package/{capital-config → config}/client.src.cjs +2 -2
- package/{capital-config → config}/package.json +2 -2
- package/cordis.patch.yml +7 -3
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/sources/fuyao-core.d.ts +1 -1
- package/lib/sources/fuyao-core.js +1 -1
- package/lib/sources/tencent-public-core.js +1 -1
- 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 +5 -5
- package/preset/capital-generation/agent.patch.yml +6 -3
- package/preset/capital-generation/skills/capital-data-profile/SKILL.md +177 -0
- package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +11 -269
- package/preset/capital-generation/skills/capital-data-query/SKILL.md +109 -0
- package/preset/capital-generation/skills/capital-equity-research/SKILL.md +2 -2
- package/preset/capital-generation/skills/capital-orchestration/SKILL.md +3 -2
- package/preset/capital-generation/skills/capital-web-evidence/SKILL.md +134 -0
- package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +10 -130
- package/selected-skills/InvestSkill/UPSTREAM.md +1 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/SKILL.md +11 -152
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/references/10-analysis-framework.md +75 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/references/11-output-and-signal.md +51 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/references/12-thesis-invalidation.md +44 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/SKILL.md +11 -177
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/references/10-scoring-framework.md +85 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/references/11-output-format.md +58 -0
- package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/references/12-invalidation-and-signal.md +51 -0
- package/selected-skills/claude-for-financial-services-cn/UPSTREAM.md +1 -0
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-catalyst-calendar/SKILL.md +16 -184
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-catalyst-calendar/references/10-catalyst-types.md +64 -0
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-catalyst-calendar/references/11-workflow-and-calendar.md +131 -0
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-idea-generation/SKILL.md +14 -195
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-idea-generation/references/10-workflow.md +201 -0
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-sector-overview/SKILL.md +15 -156
- package/selected-skills/claude-for-financial-services-cn/vertical-plugins/china-finance/skills/china-sector-overview/references/10-workflow.md +161 -0
- package/selected-skills/financeskills/UPSTREAM.md +1 -1
- package/selected-skills/investment-skills/UPSTREAM.md +1 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/SKILL.md +31 -122
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{01-decision-posture.md → 01-decision-posture-D01-D04.md} +0 -119
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/01-decision-posture-D05-D09.md +123 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/02-business-economics-B01-B03.md +94 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{02-business-economics.md → 02-business-economics-B04-B07.md} +3 -93
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{03-management-governance.md → 03-management-governance-M01-M04.md} +0 -93
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/03-management-governance-M05-M08.md +97 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/04-financial-reality-F01-F03.md +95 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{04-financial-reality.md → 04-financial-reality-F04-F07.md} +3 -94
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{05-valuation.md → 05-valuation-V01-V03.md} +0 -72
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/05-valuation-V04-V06.md +76 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{06-capital-allocation.md → 06-capital-allocation-C01-C04.md} +0 -115
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/06-capital-allocation-C05-C09.md +119 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/{07-risk-monitoring.md → 07-risk-monitoring-R01-R03.md} +0 -94
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/07-risk-monitoring-R04-R07.md +98 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays-S01-S03.md +99 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays-S04-S06.md +72 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays-S07-S09.md +74 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays-S10-S12.md +76 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/09-workflows.md +96 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/10-method.md +12 -0
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/11-deterministic-router.md +11 -0
- package/selected-skills/peter-lynch-skill/UPSTREAM.md +1 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/SKILL.md +10 -86
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/10-workflow.md +94 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/methodology-1.md +220 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/methodology-2.md +146 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/methodology-3.md +114 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/methodology-4.md +113 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/methodology.md +8 -521
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/web-research-1.md +119 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/web-research-2.md +82 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/web-research-3.md +158 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/web-research-4.md +123 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/deep/web-research.md +8 -454
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/methodology-1.md +155 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/methodology-2.md +43 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/methodology.md +6 -180
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/web-research-1.md +114 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/web-research-2.md +180 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/web-research-3.md +92 -0
- package/selected-skills/peter-lynch-skill/skills/peter-lynch-skill/references/quick/web-research.md +7 -359
- package/{capital-watchlist → watchlist}/client.js +2 -2
- package/{capital-watchlist → watchlist}/client.src.cjs +2 -2
- package/{capital-watchlist → watchlist}/index.js +1 -1
- package/{capital-watchlist → watchlist}/package.json +2 -2
- package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays.md +0 -309
- /package/{capital-config → config}/index.js +0 -0
- /package/{capital-watchlist → watchlist}/holding-rules.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,74 @@
|
|
|
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.7.12] - 2026-10-14
|
|
11
|
+
|
|
12
|
+
内部整理,治的是同一件事:**正文长过一次的加载窗口,宿主就从中间把它剪掉**。DSH 对任何一次工具结果只
|
|
13
|
+
保留开头 4,096 与结尾 1,024 字符(阈值 8,192),中间换成一行"结果中段已剪除"的标记——模型不会报错,
|
|
14
|
+
它照着读到的那半本继续答题。本插件自己写的协议手册、以及你在「精选 Skills」里勾选的第三方研究手册,
|
|
15
|
+
都撞在同一条线上。
|
|
16
|
+
|
|
17
|
+
宿主要求与 2.7.11 相同(DSH`@0.2.0-rc.2`),**不必换宿主版本**。这一版没有改任何组件的目录名或包名:
|
|
18
|
+
四把 API Key、已保存的卡片设置、「精选 Skills」的勾选、自选股清单与持仓标记都原样读得到,不需要重设。
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **内置协议手册按"册"重切**(你这边无需任何动作):数据协议原先是一册 16,264 字符的正文,`data_junior`
|
|
23
|
+
按它自己的职责该读的取数与派生细则恰好整段落在被剪掉的中间;现在拆成三册——`capital-data-protocol`
|
|
24
|
+
(取数契约与回传边界)、`capital-data-profile`(profile 回传怎么读)、`capital-data-query`(怎么写查询
|
|
25
|
+
请求与派生算术)。检索协议(10,324 字符)拆成两册——`capital-web-protocol`(来源边界、收敛法则、
|
|
26
|
+
降级口径)与 `capital-web-evidence`(回传格式、域名核验清单、抓取失败处置、文档解析)。角色第一条
|
|
27
|
+
职责点名该读哪一册,章节编号跨册连续。**一册装不下的东西不叫长,叫丢**:要长就再加一册。
|
|
28
|
+
- **7 颗精选 Skill 现在能整本读完**:`buffett-investment-framework`(入口 11,296 → 6,605 字符,
|
|
29
|
+
参考文件 9 → 22 份)、三颗 A 股研究 `china-idea-generation` / `china-sector-overview` /
|
|
30
|
+
`china-catalyst-calendar`、InvestSkill 的 `bear-case` 与 `stock-screener`、`peter-lynch-skill`
|
|
31
|
+
(入口之外,上游自交的 4 份厚指南也超阈值,两层一起切)。做法是「入口册 + 分册」:勾选后加载的仍是
|
|
32
|
+
变薄的入口册,方法论分册由 Agent 按入口点名的文件名去打开,一次带回一整册。**内容一条没删**——
|
|
33
|
+
逐行核对原正文零行丢失(只有指向分册的那几行指针需要改写,7 颗共 16 行),分册总量只准变大。
|
|
34
|
+
- **配置卡片里的「看原文」口径不变**:仍然只给入口那一份正文,分层出来的分册不并进来。想看某颗分册的
|
|
35
|
+
原文,直接问 Agent 要那一册。
|
|
36
|
+
- **入口正文不再允许宣称"我读过全文了"**:真机样本里模型只加载了入口册,却回答"已经读入全文",还把
|
|
37
|
+
入口里那段需要本机执行环境的脚本示例当作能力报给用户。现在入口明文要求说清开了哪几册、点名没开的,
|
|
38
|
+
本轮没读过的检查卡与步骤一律不许上报;那段可执行示例整体搬进参考文件,入口不再挂跑不了的操作。
|
|
39
|
+
|
|
40
|
+
### 还没解决(不粉饰)
|
|
41
|
+
|
|
42
|
+
- 还剩 **25 颗**精选条目超限(全是 InvestSkill 的单文件厚册,两万到三万二千字符),勾选后拿到的仍是
|
|
43
|
+
节选。回归里有一条棘轮拦的是"**别再加新的超限条目**",那份存量清单只准变短。
|
|
44
|
+
- 分层只是把剪枝从"加载这一本"挪到"打开那一册",两条通道各自的上限不同(按渲染后的长度算,不按文件
|
|
45
|
+
大小算)。分册切得不对,用户看到的还是那句"中段已剪除"。
|
|
46
|
+
- 回归能拦体积、拦不住**模型会不会真去开分册**——那一半只能靠真实会话复验,目前还没有样本。
|
|
47
|
+
|
|
48
|
+
## [2.7.11] - 2026-10-14
|
|
49
|
+
|
|
50
|
+
内部整理:插件包里两颗 host 平面组件的目录与包名收短了——`capital-config/` → `config/`(`@v587d/config`)、
|
|
51
|
+
`capital-watchlist/` → `watchlist/`(`@v587d/watchlist`)。**没有一项你看得见的东西跟着变**:设置卡片
|
|
52
|
+
还在老位置(「插件」→ Capital Generation → 顶部三格),「包含的组件」里那四行的名字仍是
|
|
53
|
+
`capital-config` / `capital-charts` / `capital-watchlist` / `preset-capital-generation`,已保存的凭据引用名、
|
|
54
|
+
已勾选的精选 Skills、自选股清单与你自己标的持仓比例**全部原样读得到**——那两行的身份、配置的命名空间、
|
|
55
|
+
自选股的存储域名和 `/capital-watchlist` 路由都刻意没改,就是为了升级不产生迁移。
|
|
56
|
+
|
|
57
|
+
宿主要求与 2.7.10 相同(DSH`@0.2.0-rc.2`),不必换宿主版本。
|
|
58
|
+
|
|
59
|
+
> **更正(发布当天实测后补,2026-10-14)**:本条这一节原先写的是"升级无需迁移……已勾选的精选
|
|
60
|
+
> Skills 全部原样读得到",**那句只说对了一半**,实测把它推翻。成立的一半:四把 API Key(它们另存在
|
|
61
|
+
> 宿主的凭据域,不在插件配置里)、自选股清单、你标的持仓标记与比例都没有动。不成立的一半:凡是
|
|
62
|
+
> **保存过这张卡片**的人,DSH 在 profile 文件里记那份设置时是**连同当时解析出的模块路径一起**记下
|
|
63
|
+
> 的;目录一改名,宿主对这一行是整行跳过、也不提示,于是「精选 Skills」的勾选、附加人设与
|
|
64
|
+
> 「本机直连」开关会**静默回到默认值**。两种恢复方式任选其一:① 在卡片里重新设一次并保存;
|
|
65
|
+
> ② 打开 `~/.dsh/profiles/<你在用的 profile>/cordis.patch.yml`,把 `capital-config` 那一行的路径从
|
|
66
|
+
> `…/capital-config/index.js` 改成 `…/config/index.js`,再重启宿主。首页常见问题已同步这一条。
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **两颗嵌套包的目录与包名**(研发侧可见):`config/` = `@v587d/config`、`watchlist/` = `@v587d/watchlist`;
|
|
71
|
+
生成两份客户端 bundle 的脚本一并改名 `scripts/build-config-client.mjs` / `scripts/build-watchlist-client.mjs`。
|
|
72
|
+
- **`npm run smoke:boot` 的 bundle 检查改成现读包名**。它原先在首页 HTML 里 grep `capital-config` 这一串
|
|
73
|
+
来确认客户端 bundle 进了启动图,而那串实际是**包名**(宿主按最近的 `package.json` 归属 bundle 身份)、
|
|
74
|
+
不是行 id——改名之后这条会一直报 ⚠️ 且非零退出。现在三颗嵌套包的身份都从各自 `package.json` 现读,
|
|
75
|
+
下次再改名不必修探针。真机复核:三颗 bundle 均报告送达,四行组件、`capital-config` 命名空间与两条
|
|
76
|
+
路由围栏照常通过。
|
|
77
|
+
|
|
10
78
|
## [2.7.10] - 2026-10-13
|
|
11
79
|
|
|
12
80
|
精选 Skill 从"会话目录里的一行摘要"升级为**任务级索引**:主 Agent 加载单一标的投研 / 事件影响 /
|
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.7.
|
|
18
|
+
<a href="https://github.com/v587d/capital-generation/releases"><img src="https://img.shields.io/badge/version-2.7.12-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
|
|
|
@@ -167,7 +167,8 @@ https://github.com/v587d/capital-generation
|
|
|
167
167
|
|
|
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.7.12` 或 `@2.7.12`。
|
|
171
172
|
- **刚发布的新版本装不到?** 桌面端取包时会跳过**刚发布不久**的版本(宿主侧包管理器的发布冷却策略,实测会静默装成上一个版本),国内镜像的同步也可能滞后一段时间。急着用最新代码,改用仓库地址安装最直接。
|
|
172
173
|
- **网页抓取失败?** 配置卡片中的「允许启动本地提取网页内容」默认开启:AnySearch 提取失败时可尝试本机直连。关闭后,本机直连的具名来源查询也不可用;请检查该开关和网络连接。
|
|
173
174
|
- **Wind 那部分会消耗积分?** 会。公告与新闻检索、宏观 / 行业 / 汇率指标、按日期区间取的历史 K 线都按次消耗你在 Wind 侧的额度;额度与条款以 Wind 为准,插件不做用量封顶。没配 `WIND_API_KEY` 时这几类不可用,其余功能照常。
|
package/chart-ui/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// 由 scripts/build-
|
|
1
|
+
// 由 scripts/build-config-client.mjs 生成,请勿手改;源码见 config/client.src.cjs。
|
|
2
2
|
window.__ModuleLoader__.load({
|
|
3
|
-
id: '@v587d/
|
|
3
|
+
id: '@v587d/config',
|
|
4
4
|
factory: (require) => {
|
|
5
5
|
var module = { exports: {} }
|
|
6
6
|
var exports = module.exports
|
|
@@ -17,7 +17,7 @@ const { SELECTED_SKILL_CATALOG, SELECTED_SKILL_TAG_LABELS, SELECTED_SKILLS_MAX_E
|
|
|
17
17
|
* 卡片读的是**配置条目 id**,坐的是**组合包自己的页面**——两个不同的字符串,各自钉在不同地方:
|
|
18
18
|
*
|
|
19
19
|
* - `ENTRY_ID` 是 settings 命名空间(0.1.7 起命名空间恒等于 profile 条目 id),四处必须同字:
|
|
20
|
-
* `cordis.patch.yml` 的行 id、`
|
|
20
|
+
* `cordis.patch.yml` 的行 id、`config/index.js` 的 `SETTINGS_ENTRY_ID`、主插件
|
|
21
21
|
* `src/index.ts` 的 `CAPITAL_CONFIG_ENTRY_ID`、这里。
|
|
22
22
|
* - `BUNDLE_NAME` 是槽 `plugins.bundle.config` 的 key:页面按**组合包的包名**取该包的配置段
|
|
23
23
|
* (`renderSlot(..., { entryKey: pkg.name })`),所以它必须逐字等于根 `package.json` 的 `name`。
|
|
@@ -60,7 +60,7 @@ const PADDLE_OCR_DEFAULT_REF = 'PADDLE_OCR_TOKEN'
|
|
|
60
60
|
*/
|
|
61
61
|
const TABS_ID = 'capital-config-tabs'
|
|
62
62
|
/**
|
|
63
|
-
* 「详情」悬浮里那份 `SKILL.md` 原文的来路:host 半边(`
|
|
63
|
+
* 「详情」悬浮里那份 `SKILL.md` 原文的来路:host 半边(`config/index.js`)注册的
|
|
64
64
|
* 只读旁路,按 catalog 的 skill 名寻址——闭集在服务器那侧,这里只拼地址。
|
|
65
65
|
* 这条字符串与 host 的 `SKILL_DOC_ROUTE` 同字(客户端 import 不到那一层,所以由测试对着
|
|
66
66
|
* 两侧产物比):漂移的表现是「详情」永远读不到,且不报错。
|
package/cordis.patch.yml
CHANGED
|
@@ -33,9 +33,13 @@
|
|
|
33
33
|
# locatePkgJson 随后按"最近的 package.json"归属,正好是 chart-ui/package.json,
|
|
34
34
|
# 包身份为 @v587d/capital-charts,与主包不撞名。
|
|
35
35
|
# 回归断言见 test/chart-composition.test.mjs(name 必须是字面量且 path-like,并真的解析一次)。
|
|
36
|
+
#
|
|
37
|
+
# ⚠ 目录名 / 包名与**行 id 是两条独立的链**(AGENTS.md §5.1):下面两颗行住在 `config/` 与
|
|
38
|
+
# `watchlist/`,行 id 却仍是 `capital-config` / `capital-watchlist`——后者是 settings 命名空间与
|
|
39
|
+
# 「包含的组件」里那两行的身份,改了就会吃掉用户已保存的配置。不许"顺手对齐"。
|
|
36
40
|
- insert:
|
|
37
41
|
- id: capital-config
|
|
38
|
-
name: './
|
|
42
|
+
name: './config/index.js'
|
|
39
43
|
config:
|
|
40
44
|
customPersona: ''
|
|
41
45
|
fuyaoCredentialRef: FUYAO_API_KEY
|
|
@@ -64,9 +68,9 @@
|
|
|
64
68
|
# `test/watchlist-quote.test.mjs` 的**模块同一性探针**钉住:两处 import 必须拿到同一实例,
|
|
65
69
|
# 探针不过就重新设计,而不是先上线再说。
|
|
66
70
|
#
|
|
67
|
-
# `id` 与 `./
|
|
71
|
+
# `id` 与 `./watchlist/index.js` 的 path-like 字面量规则同上(!!js / subpath 两个坑
|
|
68
72
|
# 对这颗行同样成立)。
|
|
69
73
|
- insert:
|
|
70
74
|
- id: capital-watchlist
|
|
71
|
-
name: './
|
|
75
|
+
name: './watchlist/index.js'
|
|
72
76
|
|
package/lib/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const name = "capital-generation";
|
|
|
7
7
|
* 取数配置所在的 **profile 条目 id**(随包的 `capital-config` 行)。0.1.7 的 settings 面
|
|
8
8
|
* 以条目 id 为命名空间,本插件经 `settings.describe()` 按它读回用户配的引用名与开关。
|
|
9
9
|
*
|
|
10
|
-
* 这个字符串有三处必须一致:`cordis.patch.yml` 的行 id、`
|
|
10
|
+
* 这个字符串有三处必须一致:`cordis.patch.yml` 的行 id、`config/index.js` 的
|
|
11
11
|
* `SETTINGS_ENTRY_ID`、以及浏览器半边 `client.src.cjs` 的 `ENTRY_ID`;由
|
|
12
12
|
* `test/capital-config.test.mjs` 逐一对齐(漂移的表现为卡片静默消失)。
|
|
13
13
|
*/
|
package/lib/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export const name = 'capital-generation';
|
|
|
28
28
|
* 取数配置所在的 **profile 条目 id**(随包的 `capital-config` 行)。0.1.7 的 settings 面
|
|
29
29
|
* 以条目 id 为命名空间,本插件经 `settings.describe()` 按它读回用户配的引用名与开关。
|
|
30
30
|
*
|
|
31
|
-
* 这个字符串有三处必须一致:`cordis.patch.yml` 的行 id、`
|
|
31
|
+
* 这个字符串有三处必须一致:`cordis.patch.yml` 的行 id、`config/index.js` 的
|
|
32
32
|
* `SETTINGS_ENTRY_ID`、以及浏览器半边 `client.src.cjs` 的 `ENTRY_ID`;由
|
|
33
33
|
* `test/capital-config.test.mjs` 逐一对齐(漂移的表现为卡片静默消失)。
|
|
34
34
|
*/
|
|
@@ -131,7 +131,7 @@ const RetrieverSchema = z.object({
|
|
|
131
131
|
paddleOcr: PaddleOcrSchema.default({ ...PADDLE_OCR_DEFAULTS })
|
|
132
132
|
.description('PaddleOCR 文档解析(ocr 工具)配置;Token 走 credentials 引用 PADDLE_OCR_TOKEN'),
|
|
133
133
|
});
|
|
134
|
-
// 开关清单只有一处来源:selected-skills 的 catalog。卡片那侧(
|
|
134
|
+
// 开关清单只有一处来源:selected-skills 的 catalog。卡片那侧(config/index.js)一直按
|
|
135
135
|
// catalog 现算,主插件 Config 却手抄过一份 key 列表——接第三颗快照时这两处就漂了(默认值在
|
|
136
136
|
// 条目→主插件 边界被静默丢弃,表现是卡片能拨、运行期读不到)。新增快照因此不必再动 src/。
|
|
137
137
|
const SelectedSkillsSchema = z.object(Object.fromEntries(SELECTED_SKILL_CATALOG.map(({ key, name }) => [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fuyao REST 的最小请求内核:**零 import 的叶子模块**。
|
|
3
3
|
*
|
|
4
|
-
* 为什么单独一份:host 平面的嵌套包(`
|
|
4
|
+
* 为什么单独一份:host 平面的嵌套包(`watchlist/index.js`)与插件侧的数据能力
|
|
5
5
|
* (`fuyao-rest.ts`)必须共用同一套 base URL、鉴权头、信封 `code` 判定与错误文案——
|
|
6
6
|
* "同一知识只有一份实现"(AGENTS.md §9.7)。这一层一旦被别的模块拖进来,host 半边
|
|
7
7
|
* 就会顺带加载整棵插件依赖树,所以这里不放校验器、能力定义、也不放任何类型依赖。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fuyao REST 的最小请求内核:**零 import 的叶子模块**。
|
|
3
3
|
*
|
|
4
|
-
* 为什么单独一份:host 平面的嵌套包(`
|
|
4
|
+
* 为什么单独一份:host 平面的嵌套包(`watchlist/index.js`)与插件侧的数据能力
|
|
5
5
|
* (`fuyao-rest.ts`)必须共用同一套 base URL、鉴权头、信封 `code` 判定与错误文案——
|
|
6
6
|
* "同一知识只有一份实现"(AGENTS.md §9.7)。这一层一旦被别的模块拖进来,host 半边
|
|
7
7
|
* 就会顺带加载整棵插件依赖树,所以这里不放校验器、能力定义、也不放任何类型依赖。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 腾讯公开接口的最小内核:**零 import 的叶子模块**(只依赖 `net/throttle.js`,它自己也是叶子)。
|
|
3
3
|
*
|
|
4
|
-
* 为什么单独一份:host 平面的自选股(`
|
|
4
|
+
* 为什么单独一份:host 平面的自选股(`watchlist/index.js`)与插件侧的行情能力
|
|
5
5
|
* (`tencent-http.ts`)必须共用三样东西——同一条出口节流链、同一份港美股字段位序表、同一套守卫。
|
|
6
6
|
* 两条独立节流等于没有限流(东财那次的教训),两份位序表迟早只会修好一份(AGENTS.md §9.7)。
|
|
7
7
|
* 这一层一旦被别的模块拖进来,host 半边就会顺带加载整棵插件依赖树,所以这里不放能力定义、
|
|
@@ -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.7.
|
|
9
|
+
export declare const LOCAL_FETCH_CLIENT_VERSION = "2.7.12";
|
|
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.7.
|
|
10
|
+
export const LOCAL_FETCH_CLIENT_VERSION = '2.7.12';
|
|
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.7.
|
|
55
|
+
export declare const WIND_CLIENT_VERSION = "2.7.12";
|
|
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.7.
|
|
38
|
+
export const WIND_CLIENT_VERSION = '2.7.12';
|
|
39
39
|
function errorText(error) {
|
|
40
40
|
return error instanceof Error ? error.message : String(error);
|
|
41
41
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@v587d/capital-generation",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.12",
|
|
4
4
|
"description": "Capital Generation:面向中国散户的 AI 投资助手插件(Capital mode Agent Preset)",
|
|
5
5
|
"icon": "assets/cg-icon.png",
|
|
6
6
|
"author": "v587d",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"lib",
|
|
30
30
|
"locale",
|
|
31
31
|
"chart-ui",
|
|
32
|
-
"
|
|
33
|
-
"
|
|
32
|
+
"config",
|
|
33
|
+
"watchlist",
|
|
34
34
|
"preset",
|
|
35
35
|
"selected-skills/catalog.js",
|
|
36
36
|
"selected-skills/README.md",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"clean": "node -e \"import('node:fs').then(({ rmSync }) => rmSync('lib', { recursive: true, force: true }))\"",
|
|
61
61
|
"build": "npm run clean && tsc && node scripts/copy-assets.mjs && npm run build:client && npm run build:config-client && npm run build:watchlist-client",
|
|
62
62
|
"build:client": "node scripts/build-client.mjs",
|
|
63
|
-
"build:config-client": "node scripts/build-
|
|
64
|
-
"build:watchlist-client": "node scripts/build-
|
|
63
|
+
"build:config-client": "node scripts/build-config-client.mjs",
|
|
64
|
+
"build:watchlist-client": "node scripts/build-watchlist-client.mjs",
|
|
65
65
|
"dev": "tsc -w",
|
|
66
66
|
"vendor:charts": "node scripts/vendor-lightweight-charts.mjs",
|
|
67
67
|
"check:dsh": "node scripts/check-dsh-compat.mjs",
|
|
@@ -109,7 +109,8 @@
|
|
|
109
109
|
工具可见性不是权限隔离,工具层会拒绝非 delegated child。数据请求统一经 data_collector。
|
|
110
110
|
|
|
111
111
|
2. 委派写明问题、标的、时间窗、所需新鲜度与证据用途,让 data_collector 按目录选足相关能力;
|
|
112
|
-
不预设能力数量,不带内部源键名;载荷与重试表 → skill capital-data-protocol
|
|
112
|
+
不预设能力数量,不带内部源键名;载荷与重试表 → skill capital-data-protocol,
|
|
113
|
+
读回 junior 的 profile / query 回传 → skill capital-data-profile / capital-data-query。
|
|
113
114
|
禁止任何消息携带完整原始 rows。
|
|
114
115
|
|
|
115
116
|
3. 每收到一份 dataset_ready 就登记 DatasetRef,立即复用/创建同一个 data_junior 转交该份数据,
|
|
@@ -216,7 +217,8 @@
|
|
|
216
217
|
你无外部行情 API、无网页检索、无凭据读取能力,也不索取或保存账户密码。
|
|
217
218
|
|
|
218
219
|
# DUTIES
|
|
219
|
-
0. 第一步先加载协议:调用 Dataset 工具前先 skill capital-data-
|
|
220
|
+
0. 第一步先加载协议:调用 Dataset 工具前先 skill capital-data-profile;要写 query_request
|
|
221
|
+
或做派生算术再加 skill capital-data-query;描述完成
|
|
220
222
|
(describe_dataset / profile_dataset)后无条件加载 skill capital-visualization-protocol,
|
|
221
223
|
再选择 gate。dataset_profile_completed / dataset_query_completed / profile_failed /
|
|
222
224
|
query_failed 的载荷样例、事实怎么读、data_gap 与 QuerySpec 细则都在 skill 里。
|
|
@@ -301,7 +303,8 @@
|
|
|
301
303
|
|
|
302
304
|
# DUTIES
|
|
303
305
|
0. 首次检索前先 skill capital-web-protocol,取回来源边界、收敛法则、
|
|
304
|
-
Wind
|
|
306
|
+
Wind 三要素与降级口径;回传前再 skill capital-web-evidence,取回编号格式、
|
|
307
|
+
域名核验清单、抓取失败处置与 `ocr`;本 persona 只留硬规则。
|
|
305
308
|
1. 先定来源再动手:官方正式文件与权威新闻优先 wind_docs(public_document),
|
|
306
309
|
不要等 anysearch 空转后才想起;候选探索与归属核验走 anysearch。
|
|
307
310
|
换 provider 前先看 recent_retrievals / provider_tally。
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: capital-data-profile
|
|
3
|
+
description: Use when reading a Dataset back — describe_dataset as the default entry, the profile payload and its four fact blocks, data_gap requests, and the time axis (axis, windows, calendar filters). Volume 2 of the Capital data protocol; delegation and per-Dataset receipts live in capital-data-protocol, QuerySpec and derived arithmetic in capital-data-query.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Capital 数据协议 · 第二册:读回 Dataset、缺口与时间轴
|
|
7
|
+
|
|
8
|
+
本册是数据协议的第二册(§3.0 / §3 / §3.1 / §3.2)。委派与逐份回传在第一册 `capital-data-protocol`,
|
|
9
|
+
受控查询与派生算术在第三册 `capital-data-query`;三册 §编号连续,跨册引用照原编号点名。
|
|
10
|
+
|
|
11
|
+
**重试那张表(§5)住在第一册** `capital-data-protocol`,本册不重复它:参数类按 `input_schema` 修正后重试、
|
|
12
|
+
瞬时与执行超时重试 1 次、同一请求重试 2 次仍失败就回传 `failed` 并注明已重试。
|
|
13
|
+
|
|
14
|
+
## 3.0 读取 Dataset 的默认入口:`describe_dataset`
|
|
15
|
+
|
|
16
|
+
`data_junior` 读一份 Dataset 用 **`describe_dataset`**(一次调用完成 inspect + profile + 可选 queries),
|
|
17
|
+
**不要再走 `inspect_dataset → profile_dataset → query_dataset` 三步**——那三步只保留给单点复核。
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"dataset_id": "ds_01J...",
|
|
22
|
+
"task_id": "task_01J...",
|
|
23
|
+
"columns_of_interest": ["close_price", "volume"],
|
|
24
|
+
"queries": [
|
|
25
|
+
{ "group_by": ["report_type"], "aggregates": [{ "function": "count", "as": "n" }], "limit": 20 }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- **一次一份**:一次调用只传一个 `dataset_id`。本轮有多份数据时,**在同一条 assistant 消息里一次发完**
|
|
31
|
+
多个调用(宿主会并发执行,结果一起返回),不要一份一份等。
|
|
32
|
+
- 返回 = inspect 元数据(`artifact_ref` / `capability` / `source_label` / `captured_at` / `retention_until` /
|
|
33
|
+
`query_access.shape`)+ profile 四类事实(`statistics` / `categories` / `time_facts` / `structure`)+
|
|
34
|
+
`profile_ref` + 每条 query 的 `result`,或该条自己的 `error`(单条失败不影响其余)。
|
|
35
|
+
- `shape = document` 时 queries **不执行**(宿主跳过并在 `warnings` 说明);文档内容在 `document`。
|
|
36
|
+
- `columns_of_interest` 只对这些列返回 `statistics` / `categories` / `schema`(并同样收窄 `time_facts` 的首末值投影;时间列永远保留),是收窄结果体积的唯一手段。
|
|
37
|
+
- **体积闸门**:结果超过 7000 码点时返回
|
|
38
|
+
`{"status":"too_large","profile_ref":"...","columns":[...],"hint":"..."}`,而不是超长载荷。
|
|
39
|
+
按 hint 用 `columns_of_interest`(或减少 `queries`,一次最多 8 条)重发一次;文档型按 hint 直接调
|
|
40
|
+
`profile_dataset`。**看到 `too_large` 不是失败**——它带着完整列名,用来让你收窄。
|
|
41
|
+
- 单点复核(只看元数据 / 只要一份完整 profile / 补一条查询)仍可用 `inspect_dataset`、`profile_dataset`、
|
|
42
|
+
`query_dataset`。
|
|
43
|
+
|
|
44
|
+
## 3. 质检请求与回传(主 Agent ↔ data_junior)
|
|
45
|
+
|
|
46
|
+
请求:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"type": "profile_request",
|
|
51
|
+
"task_id": "task_01J...",
|
|
52
|
+
"dataset_ids": ["ds_01J..."],
|
|
53
|
+
"question": "检查数据质量并给出基础统计"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
- `dataset_ids` 一律取 `dataset_ready` 回传中的 `dataset_id` 原样值。
|
|
58
|
+
- 只带 DatasetRef 标识与问题描述,**绝不带原始数据行**。
|
|
59
|
+
|
|
60
|
+
回传:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"type": "dataset_profile_completed",
|
|
65
|
+
"task_id": "task_01J...",
|
|
66
|
+
"dataset_id": "ds_01J...",
|
|
67
|
+
"profile_ref": "workspace://capital-data/profiles/p_01J...",
|
|
68
|
+
"row_count": 240,
|
|
69
|
+
"columns": ["date", "open", "high", "low", "close", "volume"],
|
|
70
|
+
"schema": {
|
|
71
|
+
"close": { "contract_type": "number", "inferred_type": "number", "missing_count": 0, "null_count": 0, "invalid_count": 0 }
|
|
72
|
+
},
|
|
73
|
+
"validation": { "status": "pass", "violations": [] },
|
|
74
|
+
"quality": { "missing_values": 0, "duplicate_rows": 0, "time_ordered": true },
|
|
75
|
+
"warnings": []
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- `schema` 是字段类型和计数的有限摘要;完整 profile 以 `profile_ref` 为准,不把完整 profile 或 raw rows 放进消息。
|
|
80
|
+
- `validation.status=fail` 表示 profile 发现结构化 violations,不表示原始 Dataset 被删除或不可用。
|
|
81
|
+
- 主 Agent 可以在 collector 继续取数时逐份委派 data_junior,显式说「只到 profile」(包括必要的受控 queries);后续只送新到的 dataset_id,不重做已完成的 profile。等 `data_collection_completed` 和补数据回执后,再指示同一个 junior 综合已有结果并完成可视化 gate。
|
|
82
|
+
|
|
83
|
+
失败:`{ "type": "profile_failed", "task_id": "task_01J...", "error": "...", "code": "..." }`
|
|
84
|
+
|
|
85
|
+
`profile_dataset` 的四类事实(回传时按需引用,不要把整份 profile 抄进消息):
|
|
86
|
+
|
|
87
|
+
| 事实块 | 回答什么问题 |
|
|
88
|
+
|--------|--------------|
|
|
89
|
+
| `statistics`(count/sum/min/max/mean/分位数) | 合计多少、覆盖多少条、区间与集中度 |
|
|
90
|
+
| `categories`(distinct_count + 最多 5 个高频取值) | 有哪些类别、分布如何;`truncated=true` 表示未列全 |
|
|
91
|
+
| `time_facts`(覆盖范围 + 首行/末行取值 + `axis` + `windows`) | 最新值、区间涨跌,以及**这份数据的时间轴怎么读**(见 §3.2)。**必须**用 `first`/`last`;min/max 只是区间极值,把它讲成走势就是编造 |
|
|
92
|
+
| `structure`(路径 + total_elements 或 sampled_elements) | 嵌套里一共有多少条。对象字段用 `.name`、数组元素用 `[]`,未抽样时例如 `sub_tab[].fund_list` 的 `total_elements=40` 就是 40 只基金;若出现 `sampled_elements=50`,只能说明实际检查了 50 项,不是完整数量 |
|
|
93
|
+
|
|
94
|
+
### 3.2 时间轴:日历由宿主换算,不要自己算毫秒
|
|
95
|
+
|
|
96
|
+
`time_facts` 除覆盖范围与首末行外,还给出**这份数据的时间轴怎么读**:
|
|
97
|
+
|
|
98
|
+
| 字段 | 含义 | 怎么用 |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `axis.value_format` | `epoch_ms`(毫秒整数时间列)/ `date_string`(已是 `YYYY-MM-DD`)/ `unknown`(推断不出:先 inspect 或显式传 `time_column`) | `unknown` 时不要假设粒度 |
|
|
101
|
+
| `axis.time_zone` / `axis.utc_offset` | 该列**自身观测到**的时区偏移(如 `Asia/Shanghai` / `+08:00`) | 判断"某天"的边界一律按它,不要按 UTC 猜 |
|
|
102
|
+
| `axis.aligned_to` | `local_midnight` = 取值是当地 00:00 的瞬间(A 股日线的 `date_ms` 就是这样) | 这种列的"当天"要用 `>= 当天午夜` 且 `<= 当天日末` 两个条件才算 |
|
|
103
|
+
| `covered_from_iso` / `covered_to_iso` | 覆盖范围的可读日期 | 回答"数据到哪天",不要再做 epoch→日期换算 |
|
|
104
|
+
| `windows[]` | 近 1 月 / 近 3 月 / 近 1 年 / 年初至今的现成边界:`value_ge`、`value_le`(可直接填进 filter)与 `data_from`、`data_to`(该窗口在数据里**真实存在**的首末日期) | 命中就直接用;`data_from` 已把非交易日夹到相邻交易日 |
|
|
105
|
+
|
|
106
|
+
需要 `windows` 之外的窗口(任意区间、某年某月、历年 10 月)时:
|
|
107
|
+
|
|
108
|
+
1. 调 `resolve_data_time_range`,传 `dataset_id` + `period`(可选 `anchor_date`);它按该 Dataset
|
|
109
|
+
时间列自身的偏移返回 `bounds.bound_ge` / `bounds.bound_le` 与 `range`、`data` 日期;
|
|
110
|
+
2. 把 `bound_ge` / `bound_le` 原样填进 filter,**不要**自己把日期算成毫秒。
|
|
111
|
+
|
|
112
|
+
`query_dataset` 的 filter 也**直接接受日历写法**(宿主按同一套偏移换算):
|
|
113
|
+
|
|
114
|
+
```jsonc
|
|
115
|
+
// 三种写法都表示"从 2026-08-23 起",选一种即可
|
|
116
|
+
{ "column": "date_ms", "operator": ">=", "value": "2026-08-23" }
|
|
117
|
+
{ "column": "date_ms", "operator": ">=", "value": "2026-08" }
|
|
118
|
+
{ "column": "date_ms", "operator": ">=", "value": { "period": "last_1_month" } }
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- `>=` 取该日当地午夜、`<=` 取该日当地日末、`=` 自动展开成"这一天"的上下界;省略锚点的
|
|
122
|
+
`period` 以该 Dataset 最后一天为准(数据陈旧时相对期不会落空);
|
|
123
|
+
- 结果里时间列会附一列 `*_iso` 可读日期(原值保留,不替换);
|
|
124
|
+
- `>`、`<`、`!=`、`in` 配日期串会报 `query_type_conflict`:日期只有"整天"语义,用它们等于
|
|
125
|
+
悄悄换一天;要哪几天就直接写 `>=` / `<=`。
|
|
126
|
+
|
|
127
|
+
**硬规则:看到 epoch 毫秒要经过加减乘除才能得出结论时,就是走错了路。** 时间换算一律交给
|
|
128
|
+
`time_facts.axis`、`windows` 与 `resolve_data_time_range`;自己心算毫秒既慢又必然算错口径。
|
|
129
|
+
|
|
130
|
+
文档型 Dataset(顶层是文档对象、没有行数组,如财务指标、回测结果):`profile_dataset` 返回
|
|
131
|
+
`structure` 结构摘要 + `document` 有界内容(`$` 是文档根),**没有**行列统计,也不包含行数据专用的 `schema`/`validation`;`query_dataset`
|
|
132
|
+
对它无效。`document.truncated=true` 时必须按 `omitted` 逐条说明省略了哪个路径、保留多少、
|
|
133
|
+
省略多少,不得只说「已截断」。
|
|
134
|
+
|
|
135
|
+
硬规则:字段按工具返回原样填入;统计项只报告可计算的部分,数据不足如实说明;
|
|
136
|
+
profile 失败不影响原始 Dataset,可按指示重试。
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
## 3.1 数据缺口(data_junior → 主 Agent,中途主动发起)
|
|
140
|
+
|
|
141
|
+
data_junior 发现「问题需要的那份数据还没取」时(不是「数据里没有」),不等回合结束,
|
|
142
|
+
直接用 `send_message` 发一次:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"type": "data_gap",
|
|
147
|
+
"task_id": "task_01J...",
|
|
148
|
+
"dataset_id": "ds_01J...",
|
|
149
|
+
"need": "该指数在 2025-06-30 的成分股权重明细",
|
|
150
|
+
"reason": "现有 Dataset 只有指数点位,没有成分字段",
|
|
151
|
+
"suggested_capability": "index_constituents",
|
|
152
|
+
"blocking": true
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
| 字段 | 规则 |
|
|
157
|
+
|------|------|
|
|
158
|
+
| `type` | 固定 `data_gap` |
|
|
159
|
+
| `task_id` / `dataset_id` | 必须带:主 Agent 可能同时在等多个回传,靠这两个字段对上号 |
|
|
160
|
+
| `need` | 用自然语言写清缺什么数据(标的、区间、口径) |
|
|
161
|
+
| `reason` | 说明为什么现有 Dataset 不够,避免主 Agent 重复取已有的数据 |
|
|
162
|
+
| `suggested_capability` | 可选。只能是**手上 DatasetRef 里出现过的 capability 原值**,或整个省略;不要为了填空编造能力名 |
|
|
163
|
+
| `blocking` | `true` = 不补齐无法继续,可以停在本轮等回信;`false` = 还有别的能先做 |
|
|
164
|
+
|
|
165
|
+
硬规则:
|
|
166
|
+
|
|
167
|
+
- `data_gap` 是请求不是结论。发出后不得把「无法确认」当终局;同一条缺口只发一次。
|
|
168
|
+
- 子 Agent **不得自行取数**,也不得直接找 `data_collector`:取数一律由主 Agent 中继。
|
|
169
|
+
- 主 Agent 处置:按委派清单复用对应角色取数 → 把新 DatasetRef 用 `send_message` 发回
|
|
170
|
+
**同一个**子 Agent(禁止新建同角色)→ 它接着做完。同参数的重新取数会命中宿主复用,
|
|
171
|
+
不会重复访问上游,所以该重取就重取。
|
|
172
|
+
- 取数失败时主 Agent 必须回一条失败消息(`data_failed` 或说明性文本)给它,
|
|
173
|
+
不能让它一直等:框架没有超时与订阅机制。
|
|
174
|
+
- **结束本轮 ≠ 任务完成。** 等数据的子 Agent 会先结束回合,结算通知里那句
|
|
175
|
+
「finished and will do no further work unless you send it more」在此时是误导;
|
|
176
|
+
清单里标为「等数据」的子 Agent,收到结算通知后不要认定完成、也不要新建。
|
|
177
|
+
- 只有确认「数据里确实没有该字段」时才回传能力边界,并写明是数据没有、不是没拿到数据。
|