@v587d/capital-generation 2.9.2 → 2.10.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 +83 -0
- package/README.md +8 -5
- package/chart-ui/package.json +1 -1
- package/config/client.js +8 -6
- package/config/client.src.cjs +74 -34
- package/config/index.js +8 -2
- package/config/package.json +1 -1
- package/lib/agents/selected-skills-provider.d.ts +29 -10
- package/lib/agents/selected-skills-provider.js +262 -139
- package/lib/agents/settled-wake.d.ts +43 -0
- package/lib/agents/settled-wake.js +81 -0
- package/lib/agents/skill-usage.d.ts +22 -0
- package/lib/agents/skill-usage.js +92 -0
- package/lib/agents/wait-for-agents.d.ts +79 -0
- package/lib/agents/wait-for-agents.js +256 -0
- package/lib/capital-settings.d.ts +12 -1
- package/lib/capital-settings.js +23 -3
- package/lib/chart/artifact-ref.d.ts +4 -1
- package/lib/chart/artifact-ref.js +2 -1
- package/lib/chart/delivery.d.ts +15 -1
- package/lib/chart/delivery.js +17 -8
- package/lib/chart/events.d.ts +1 -1
- package/lib/chart/html.js +16 -0
- package/lib/chart/present-tool.js +52 -3
- package/lib/chart/tool.js +63 -9
- package/lib/data-collector/store.d.ts +1 -0
- package/lib/data-collector/store.js +2 -2
- package/lib/index.d.ts +6 -3
- package/lib/index.js +10 -19
- package/lib/orchestration-entry.d.ts +11 -0
- package/lib/orchestration-entry.js +6 -0
- package/lib/present-entry.js +26 -5
- package/lib/root-extras-entry.d.ts +2 -5
- package/lib/root-extras-entry.js +1 -3
- package/lib/selected-skills-entry.d.ts +14 -0
- package/lib/selected-skills-entry.js +43 -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 +15 -2
- package/preset/capital-generation/README.md +3 -3
- package/preset/capital-generation/agent.patch.yml +43 -20
- package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +3 -2
- package/preset/capital-generation/skills/capital-data-query/SKILL.md +32 -0
- package/preset/capital-generation/skills/capital-equity-research/SKILL.md +5 -0
- package/preset/capital-generation/skills/capital-event-impact/SKILL.md +3 -0
- package/preset/capital-generation/skills/capital-orchestration/SKILL.md +8 -10
- package/preset/capital-generation/skills/capital-portfolio-review/SKILL.md +3 -0
- package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +7 -1
- package/preset/capital-generation/skills/capital-web-evidence/SKILL.md +1 -0
- package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +3 -0
- package/selected-skills/README.md +5 -4
- package/selected-skills/ROUTING.md +88 -0
- package/selected-skills/catalog.js +32 -121
- package/selected-skills/routing.js +1036 -0
- package/watchlist/package.json +1 -1
|
@@ -28,9 +28,8 @@ export const SELECTED_SKILL_SKILL_DIRS = Object.freeze({
|
|
|
28
28
|
})
|
|
29
29
|
|
|
30
30
|
// Selected-skill metadata owned by Capital Generation. Upstream snapshots remain unchanged.
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// 钉着);tags 同时决定条目进哪几颗任务型内置 skill 的索引,所以登记一处、两处生效。
|
|
31
|
+
// 标签只做设置卡片的筛选条(SELECTED_SKILL_TAG_LABELS 由注册表现算);角色归属与触发条件
|
|
32
|
+
// 住在 routing.js,不再由标签反推任务型 skill 的索引。
|
|
34
33
|
export const SELECTED_SKILL_CATALOG = Object.freeze([
|
|
35
34
|
{
|
|
36
35
|
key: 'buffettFramework',
|
|
@@ -1330,91 +1329,44 @@ export const SELECTED_SKILL_CATALOG = Object.freeze([
|
|
|
1330
1329
|
},
|
|
1331
1330
|
])
|
|
1332
1331
|
|
|
1333
|
-
// ──
|
|
1332
|
+
// ── 展示标签:只给设置卡片筛选,不承担路由 ─────────────────────────────────────
|
|
1334
1333
|
//
|
|
1335
|
-
//
|
|
1336
|
-
//
|
|
1337
|
-
//
|
|
1338
|
-
// 新增一个标签 = 在 SELECTED_SKILL_TAGS 里加一行(zh / en 本来就必须填,`capital-config.test.mjs`
|
|
1339
|
-
// 钉着),`serves` 或 `fallback` 顺带填掉。没有第二处要改,也没有任何东西会因为"忘了挂"而静默变成孤儿:
|
|
1340
|
-
// 下面四条闸门(`test/selected-skill-tags.test.mjs`)会把漏挂、拼错、孤儿和上限都打红。
|
|
1341
|
-
|
|
1342
|
-
/**
|
|
1343
|
-
* 任务型内置 skill:正文会被补上"外部精选 skill 索引"的那几颗(住 `preset/capital-generation/skills/`)。
|
|
1344
|
-
* 其余五颗内置 skill 是协议 / 流程类(data / web / chart / visualization / orchestration),读者是
|
|
1345
|
-
* 特定角色或特定工具调用,不是"用户提了一个研究任务"的入口,因此不接索引。
|
|
1346
|
-
*/
|
|
1347
|
-
export const SELECTED_SKILL_TASK_IDS = Object.freeze([
|
|
1348
|
-
'capital-equity-research',
|
|
1349
|
-
'capital-event-impact',
|
|
1350
|
-
'capital-portfolio-review',
|
|
1351
|
-
])
|
|
1334
|
+
// 角色(main / data_junior / web_retriever)与触发条件住 `routing.js`。新增一颗 skill 时要改的是
|
|
1335
|
+
// `SELECTED_SKILL_ROUTING`;这里只在它用了新标签时补一行显示名。
|
|
1352
1336
|
|
|
1353
|
-
/** 没有任何归属的标签,其条目兜底进这一颗(2026-10-13 决策:一切兜底都往 equity 里装)。 */
|
|
1354
|
-
export const SELECTED_SKILL_FALLBACK_TASK = 'capital-equity-research'
|
|
1355
|
-
|
|
1356
|
-
/**
|
|
1357
|
-
* 标签轴。`routes: false` 的轴只做**标注**,不决定条目进哪颗任务型 skill;`routes: true` 的轴参与路由。
|
|
1358
|
-
*
|
|
1359
|
-
* 市场口径轴是**不路由**的,这一点被实测纠过一次:最初把它写成"对所有任务型 skill 生效",结果
|
|
1360
|
-
* 你这 10 个启用项(9 颗带 `a-share`)在三颗任务型 skill 里得到**完全相同**的清单,索引等于失效;
|
|
1361
|
-
* 修成不路由之后,`10k-digest`(美股 10-K 深读)只进 equity / event-impact,`tax-lens` 只进
|
|
1362
|
-
* portfolio。判据因此是:"是 A 股"不蕴含"服务单股研究 / 事件影响 / 组合复盘"。
|
|
1363
|
-
*
|
|
1364
|
-
* 好处顺带落在自动化上:**新增一个市场口径标签零决策**——不写 serves、不重跑任何分配,
|
|
1365
|
-
* 只登记一行(zh/en/axis)即可。新增一个 routing 轴 = 这里加一行,该轴的标签各自带 `axis`。
|
|
1366
|
-
*/
|
|
1367
1337
|
export const SELECTED_SKILL_TAG_AXES = Object.freeze({
|
|
1368
|
-
market: Object.freeze({
|
|
1369
|
-
capability: Object.freeze({
|
|
1370
|
-
topic: Object.freeze({
|
|
1338
|
+
market: Object.freeze({ zh: '市场口径', en: 'Market' }),
|
|
1339
|
+
capability: Object.freeze({ zh: '分析方法', en: 'Method' }),
|
|
1340
|
+
topic: Object.freeze({ zh: '场景主题', en: 'Topic' }),
|
|
1371
1341
|
})
|
|
1372
1342
|
|
|
1373
|
-
/**
|
|
1374
|
-
* 能力标签注册表。键集 ≡ 标签词表(`SELECTED_SKILL_TAG_LABELS` 由它派生)。三轴判据:
|
|
1375
|
-
* market —— 什么市场口径(A 股 / 美股 / 将来的港股…),**不路由**,只做标注;
|
|
1376
|
-
* capability —— 调用什么分析方法(估值 / 财务健康 / 证据核验…);
|
|
1377
|
-
* topic —— 落在什么场景或对象上(组合、监控、税务…)。
|
|
1378
|
-
* routing 轴(capability / topic)的 `serves` 与 `fallback` 二选一:前者点名接收它的任务型 skill
|
|
1379
|
-
* (允许重叠),后者是"还没想好挂哪颗"的显式承认。两者都不给 = 孤儿,闸门会红——不写成"静默不出现",
|
|
1380
|
-
* 因为静默正是这套东西最容易坏的地方。
|
|
1381
|
-
*/
|
|
1382
1343
|
export const SELECTED_SKILL_TAGS = Object.freeze({
|
|
1383
|
-
'a-share': { zh: 'A 股', en: 'A-share', axis: 'market'
|
|
1384
|
-
'business-analysis': { zh: '业务分析', en: 'Business analysis', axis: 'capability'
|
|
1385
|
-
'capital-allocation': { zh: '资本配置', en: 'Capital allocation', axis: 'capability'
|
|
1386
|
-
'cash-flow': { zh: '现金流', en: 'Cash flow', axis: 'capability'
|
|
1387
|
-
competition: { zh: '竞争格局', en: 'Competition', axis: 'topic'
|
|
1388
|
-
earnings: { zh: '业绩与电话会', en: 'Earnings', axis: 'capability'
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
valuation: { zh: '估值', en: 'Valuation', axis: 'capability', serves: ['capital-equity-research', 'capital-event-impact'] },
|
|
1408
|
-
verification: { zh: '证据核验', en: 'Verification', axis: 'capability', serves: ['capital-equity-research', 'capital-event-impact', 'capital-portfolio-review'] },
|
|
1344
|
+
'a-share': { zh: 'A 股', en: 'A-share', axis: 'market' },
|
|
1345
|
+
'business-analysis': { zh: '业务分析', en: 'Business analysis', axis: 'capability' },
|
|
1346
|
+
'capital-allocation': { zh: '资本配置', en: 'Capital allocation', axis: 'capability' },
|
|
1347
|
+
'cash-flow': { zh: '现金流', en: 'Cash flow', axis: 'capability' },
|
|
1348
|
+
competition: { zh: '竞争格局', en: 'Competition', axis: 'topic' },
|
|
1349
|
+
earnings: { zh: '业绩与电话会', en: 'Earnings', axis: 'capability' },
|
|
1350
|
+
education: { zh: '教学', en: 'Education', axis: 'topic' },
|
|
1351
|
+
filings: { zh: '披露文件', en: 'Filings', axis: 'capability' },
|
|
1352
|
+
'financial-health': { zh: '财务健康', en: 'Financial health', axis: 'capability' },
|
|
1353
|
+
instruments: { zh: '期权与基金', en: 'Options & funds', axis: 'topic' },
|
|
1354
|
+
macro: { zh: '宏观与行业', en: 'Macro & industry', axis: 'topic' },
|
|
1355
|
+
monitoring: { zh: '监控', en: 'Monitoring', axis: 'topic' },
|
|
1356
|
+
orders: { zh: '订单', en: 'Orders', axis: 'topic' },
|
|
1357
|
+
perspective: { zh: '分析视角', en: 'Perspective', axis: 'topic' },
|
|
1358
|
+
'peter-lynch': { zh: '彼得·林奇', en: 'Peter Lynch', axis: 'topic' },
|
|
1359
|
+
portfolio: { zh: '组合与仓位', en: 'Portfolio', axis: 'topic' },
|
|
1360
|
+
risk: { zh: '风险', en: 'Risk', axis: 'topic' },
|
|
1361
|
+
strategy: { zh: '战略', en: 'Strategy', axis: 'topic' },
|
|
1362
|
+
tax: { zh: '税务', en: 'Tax', axis: 'topic' },
|
|
1363
|
+
technicals: { zh: '技术面', en: 'Technicals', axis: 'topic' },
|
|
1364
|
+
'trade-discipline': { zh: '交易纪律', en: 'Trade discipline', axis: 'topic' },
|
|
1365
|
+
'us-stock': { zh: '美股', en: 'US equity', axis: 'market' },
|
|
1366
|
+
valuation: { zh: '估值', en: 'Valuation', axis: 'capability' },
|
|
1367
|
+
verification: { zh: '证据核验', en: 'Verification', axis: 'capability' },
|
|
1409
1368
|
})
|
|
1410
1369
|
|
|
1411
|
-
/**
|
|
1412
|
-
* 设置卡片最多能同时勾选的精选 skill 数。**只约束"能勾几个",不约束"已勾的生效"**:
|
|
1413
|
-
* 运行期 provider 不按这个数截断——老配置多于 6 个时照常全部生效并提示收敛,否则就是
|
|
1414
|
-
* "卡片上开着 10 个、会话里只有 6 个"那种静默砍功能(AGENTS.md §9.7)。
|
|
1415
|
-
*/
|
|
1416
|
-
export const SELECTED_SKILLS_MAX_ENABLED = 6
|
|
1417
|
-
|
|
1418
1370
|
/** 标签的显示名(含恒在第一格的「全部」)。键集恒等于注册表,所以新标签只登记一次。 */
|
|
1419
1371
|
export const SELECTED_SKILL_TAG_LABELS = Object.freeze({
|
|
1420
1372
|
zh: Object.freeze({
|
|
@@ -1426,44 +1378,3 @@ export const SELECTED_SKILL_TAG_LABELS = Object.freeze({
|
|
|
1426
1378
|
...Object.fromEntries(Object.entries(SELECTED_SKILL_TAGS).map(([tag, meta]) => [tag, meta.en])),
|
|
1427
1379
|
}),
|
|
1428
1380
|
})
|
|
1429
|
-
|
|
1430
|
-
/** 该标签服务的任务型 skill(不路由的轴 → 空;未登记的标签 → 空)。 */
|
|
1431
|
-
export function taggedTaskSkills(tag) {
|
|
1432
|
-
const meta = SELECTED_SKILL_TAGS[tag]
|
|
1433
|
-
if (meta === undefined) return []
|
|
1434
|
-
const axis = SELECTED_SKILL_TAG_AXES[meta.axis]
|
|
1435
|
-
if (axis === undefined || !axis.routes) return []
|
|
1436
|
-
return [...meta.serves]
|
|
1437
|
-
}
|
|
1438
|
-
|
|
1439
|
-
/** 该任务型 skill 收到的全部标签。派生自注册表:反向可达闸门与文档读它,不手写清单。 */
|
|
1440
|
-
export function taskSkillTags(taskId) {
|
|
1441
|
-
return Object.keys(SELECTED_SKILL_TAGS).filter((tag) => taggedTaskSkills(tag).includes(taskId))
|
|
1442
|
-
}
|
|
1443
|
-
|
|
1444
|
-
/** 该条目是否挂上了至少一颗任务型 skill——没挂上的按兜底规则进 `SELECTED_SKILL_FALLBACK_TASK`。 */
|
|
1445
|
-
function entryRoutesAnywhere(entry) {
|
|
1446
|
-
return entry.tags.some((tag) => taggedTaskSkills(tag).length > 0)
|
|
1447
|
-
}
|
|
1448
|
-
|
|
1449
|
-
/**
|
|
1450
|
-
* **唯一实现**:已启用(按运行时 skill name)的精选条目里,某颗任务型 skill 应当索引到哪几条。
|
|
1451
|
-
* 目录(provider 的 `list()`)、任务型 skill 的索引块、测试三处都调这一个函数,不许各自重算
|
|
1452
|
-
* (AGENTS.md §9.7:两份实现必然漂移,而漂移的表现是"某一处少了/多了一条",零报错)。
|
|
1453
|
-
* `enabledNames` 由调用方在**调用期**现读开关得到——开关是 settings 偏好,不许在装配期定格。
|
|
1454
|
-
*/
|
|
1455
|
-
export function selectedSkillsForTask(taskId, enabledNames) {
|
|
1456
|
-
const enabled = new Set(enabledNames)
|
|
1457
|
-
return SELECTED_SKILL_CATALOG.filter((entry) => {
|
|
1458
|
-
if (!enabled.has(entry.name)) return false
|
|
1459
|
-
if (entry.tags.some((tag) => taggedTaskSkills(tag).includes(taskId))) return true
|
|
1460
|
-
// 兜底只在 equity 生效(2026-10-13 决策):一条都挂不上的条目,宁可多给它看一条,
|
|
1461
|
-
// 也不要静默不出现。`fallback: true` 的标签走的就是这条路。
|
|
1462
|
-
return taskId === SELECTED_SKILL_FALLBACK_TASK && !entryRoutesAnywhere(entry)
|
|
1463
|
-
})
|
|
1464
|
-
}
|
|
1465
|
-
|
|
1466
|
-
/** 只靠兜底才看得见的条目(当前应为空)。闸门钉住它:新增孤儿会当场点名,而不是静默消失。 */
|
|
1467
|
-
export function fallbackOnlySkillNames() {
|
|
1468
|
-
return SELECTED_SKILL_CATALOG.filter((entry) => !entryRoutesAnywhere(entry)).map((entry) => entry.name)
|
|
1469
|
-
}
|