@v587d/capital-generation 0.0.0-stage → 2.6.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 +814 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/assets/cg-icon.png +0 -0
- package/capital-config/client.js +28 -0
- package/capital-config/client.src.cjs +388 -0
- package/capital-config/index.js +113 -0
- package/capital-config/package.json +36 -0
- package/capital-watchlist/client.js +182 -0
- package/capital-watchlist/client.src.cjs +1229 -0
- package/capital-watchlist/index.js +772 -0
- package/capital-watchlist/package.json +37 -0
- package/chart-ui/README.md +112 -0
- package/chart-ui/client.js +16 -0
- package/chart-ui/client.src.cjs +126 -0
- package/chart-ui/index.js +205 -0
- package/chart-ui/package.json +30 -0
- package/cordis.patch.yml +72 -0
- package/lib/agents/bash-guard.d.ts +55 -0
- package/lib/agents/bash-guard.js +162 -0
- package/lib/agents/root-tool-policy.d.ts +164 -0
- package/lib/agents/root-tool-policy.js +309 -0
- package/lib/chart/artifact-ref.d.ts +65 -0
- package/lib/chart/artifact-ref.js +107 -0
- package/lib/chart/downsample.d.ts +8 -0
- package/lib/chart/downsample.js +53 -0
- package/lib/chart/errors.d.ts +16 -0
- package/lib/chart/errors.js +15 -0
- package/lib/chart/events.d.ts +120 -0
- package/lib/chart/events.js +471 -0
- package/lib/chart/html.d.ts +21 -0
- package/lib/chart/html.js +154 -0
- package/lib/chart/runtime.d.ts +20 -0
- package/lib/chart/runtime.js +270 -0
- package/lib/chart/series.d.ts +102 -0
- package/lib/chart/series.js +424 -0
- package/lib/chart/source-token.d.ts +64 -0
- package/lib/chart/source-token.js +217 -0
- package/lib/chart/spec.d.ts +58 -0
- package/lib/chart/spec.js +265 -0
- package/lib/chart/tool.d.ts +86 -0
- package/lib/chart/tool.js +288 -0
- package/lib/chart/vendor/LICENSE +201 -0
- package/lib/chart/vendor/VERSION.json +8 -0
- package/lib/chart/vendor/lightweight-charts.standalone.production.js +7 -0
- package/lib/data-collector/args.d.ts +38 -0
- package/lib/data-collector/args.js +114 -0
- package/lib/data-collector/dataset-tools.d.ts +3 -0
- package/lib/data-collector/dataset-tools.js +421 -0
- package/lib/data-collector/describe.d.ts +99 -0
- package/lib/data-collector/describe.js +256 -0
- package/lib/data-collector/hub.d.ts +187 -0
- package/lib/data-collector/hub.js +469 -0
- package/lib/data-collector/query-time.d.ts +58 -0
- package/lib/data-collector/query-time.js +101 -0
- package/lib/data-collector/query.d.ts +57 -0
- package/lib/data-collector/query.js +473 -0
- package/lib/data-collector/store.d.ts +499 -0
- package/lib/data-collector/store.js +1486 -0
- package/lib/data-collector/time-axis.d.ts +169 -0
- package/lib/data-collector/time-axis.js +419 -0
- package/lib/data-collector/tools.d.ts +32 -0
- package/lib/data-collector/tools.js +216 -0
- package/lib/index.d.ts +275 -0
- package/lib/index.js +458 -0
- package/lib/net/eastmoney-client.d.ts +104 -0
- package/lib/net/eastmoney-client.js +118 -0
- package/lib/net/throttle.d.ts +16 -0
- package/lib/net/throttle.js +34 -0
- package/lib/ocr/client.d.ts +82 -0
- package/lib/ocr/client.js +281 -0
- package/lib/ocr/markdown.d.ts +75 -0
- package/lib/ocr/markdown.js +209 -0
- package/lib/ocr/store.d.ts +119 -0
- package/lib/ocr/store.js +226 -0
- package/lib/sources/eastmoney-http.d.ts +2 -0
- package/lib/sources/eastmoney-http.js +1253 -0
- package/lib/sources/fuyao-core.d.ts +52 -0
- package/lib/sources/fuyao-core.js +96 -0
- package/lib/sources/fuyao-rest.d.ts +14 -0
- package/lib/sources/fuyao-rest.js +2057 -0
- package/lib/sources/security-code.d.ts +27 -0
- package/lib/sources/security-code.js +104 -0
- package/lib/sources/security-identity.d.ts +24 -0
- package/lib/sources/security-identity.js +89 -0
- package/lib/sources/tencent-http.d.ts +2 -0
- package/lib/sources/tencent-http.js +1053 -0
- package/lib/sources/wind-mcp.d.ts +8 -0
- package/lib/sources/wind-mcp.js +593 -0
- package/lib/time/tools.d.ts +74 -0
- package/lib/time/tools.js +464 -0
- package/lib/tool-exec.d.ts +29 -0
- package/lib/tool-exec.js +17 -0
- package/lib/web-retriever/engines.d.ts +61 -0
- package/lib/web-retriever/engines.js +202 -0
- package/lib/web-retriever/html-markdown.d.ts +50 -0
- package/lib/web-retriever/html-markdown.js +321 -0
- package/lib/web-retriever/local-fetch.d.ts +121 -0
- package/lib/web-retriever/local-fetch.js +562 -0
- package/lib/web-retriever/retriever.d.ts +58 -0
- package/lib/web-retriever/retriever.js +94 -0
- package/lib/web-retriever/sources.d.ts +235 -0
- package/lib/web-retriever/sources.js +961 -0
- package/lib/web-retriever/tools.d.ts +50 -0
- package/lib/web-retriever/tools.js +1029 -0
- package/lib/web-retriever/wind-client.d.ts +69 -0
- package/lib/web-retriever/wind-client.js +311 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +84 -4
- package/preset/capital-generation/README.md +161 -0
- package/preset/capital-generation/agent.patch.yml +509 -0
- package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +137 -0
- package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +416 -0
- package/preset/capital-generation/skills/capital-orchestration/SKILL.md +174 -0
- package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +296 -0
- package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +240 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Largest-Triangle-Three-Buckets 下采样:返回**保留下来的行下标**。
|
|
3
|
+
*
|
|
4
|
+
* 为什么返回下标而不是点:一张图上可能同时有主序列、K 线、成交量副图与标记点,
|
|
5
|
+
* 它们必须**共用同一组时间轴**。若各自下采样,同一时刻会在不同子图上错位。
|
|
6
|
+
* 于是只对"主序列"跑一次 LTTB 求下标,再把这组下标套用到所有子序列上。
|
|
7
|
+
*/
|
|
8
|
+
export function largestTriangleThreeBuckets(values, threshold) {
|
|
9
|
+
const count = values.length;
|
|
10
|
+
if (threshold >= count || threshold < 3)
|
|
11
|
+
return Array.from({ length: count }, (_value, index) => index);
|
|
12
|
+
const sampled = [];
|
|
13
|
+
const every = (count - 2) / (threshold - 2);
|
|
14
|
+
let anchor = 0;
|
|
15
|
+
sampled.push(anchor);
|
|
16
|
+
for (let bucket = 0; bucket < threshold - 2; bucket += 1) {
|
|
17
|
+
// 下一个桶的均值,作为三角形的一个顶点。
|
|
18
|
+
const averageStart = Math.floor((bucket + 1) * every) + 1;
|
|
19
|
+
const averageEnd = Math.min(Math.floor((bucket + 2) * every) + 1, count);
|
|
20
|
+
const averageLength = Math.max(averageEnd - averageStart, 1);
|
|
21
|
+
let averageX = 0;
|
|
22
|
+
let averageY = 0;
|
|
23
|
+
for (let index = averageStart; index < averageEnd && index < count; index += 1) {
|
|
24
|
+
averageX += index;
|
|
25
|
+
averageY += values[index];
|
|
26
|
+
}
|
|
27
|
+
averageX /= averageLength;
|
|
28
|
+
averageY /= averageLength;
|
|
29
|
+
// 当前桶里与 anchor、均值构成最大三角形面积的点。
|
|
30
|
+
const rangeStart = Math.floor(bucket * every) + 1;
|
|
31
|
+
const rangeEnd = Math.min(Math.floor((bucket + 1) * every) + 1, count);
|
|
32
|
+
const anchorX = anchor;
|
|
33
|
+
const anchorY = values[anchor];
|
|
34
|
+
let maxArea = -1;
|
|
35
|
+
let maxAreaIndex = Math.min(rangeStart, count - 1);
|
|
36
|
+
for (let index = rangeStart; index < rangeEnd && index < count; index += 1) {
|
|
37
|
+
const area = Math.abs((anchorX - averageX) * (values[index] - anchorY) - (anchorX - index) * (averageY - anchorY)) * 0.5;
|
|
38
|
+
if (area > maxArea) {
|
|
39
|
+
maxArea = area;
|
|
40
|
+
maxAreaIndex = index;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
sampled.push(maxAreaIndex);
|
|
44
|
+
anchor = maxAreaIndex;
|
|
45
|
+
}
|
|
46
|
+
sampled.push(count - 1);
|
|
47
|
+
// 去重并保持升序:LTTB 的桶边界在极端阈值下可能产生重复下标。
|
|
48
|
+
const unique = [];
|
|
49
|
+
for (const index of sampled)
|
|
50
|
+
if (unique.length === 0 || index > unique[unique.length - 1])
|
|
51
|
+
unique.push(index);
|
|
52
|
+
return unique;
|
|
53
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 图表域的错误类型。
|
|
3
|
+
*
|
|
4
|
+
* 错误码是**模型可见契约**的一部分:模型据此修正一次即可重试(见
|
|
5
|
+
* preset/capital-generation/skills/capital-chart-protocol/SKILL.md)。
|
|
6
|
+
* 因此 detail 必须可操作(点名缺哪个字段、可用字段有哪些),而不是笼统的 invalid。
|
|
7
|
+
*/
|
|
8
|
+
export type ChartErrorCode = 'chart_source_invalid' | 'chart_source_expired' | 'chart_source_scope_mismatch' | 'chart_source_not_found' | 'chart_ref_invalid' | 'chart_ref_scope_mismatch' | 'chart_ref_task_mismatch' | 'chart_spec_invalid' | 'chart_field_not_found' | 'chart_no_rows' | 'chart_too_large' | 'chart_write_failed' | 'chart_runtime_unavailable';
|
|
9
|
+
export declare class ChartError extends Error {
|
|
10
|
+
readonly code: ChartErrorCode;
|
|
11
|
+
/** 可选的机器可读补充(如 available 字段名列表),会随错误一起序列化回模型。 */
|
|
12
|
+
readonly details: Record<string, unknown>;
|
|
13
|
+
constructor(code: ChartErrorCode, detail: string, details?: Record<string, unknown>);
|
|
14
|
+
/** 工具边界统一把错误转成结构化信封,让模型能一次修正。 */
|
|
15
|
+
toEnvelope(): Record<string, unknown>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class ChartError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
/** 可选的机器可读补充(如 available 字段名列表),会随错误一起序列化回模型。 */
|
|
4
|
+
details;
|
|
5
|
+
constructor(code, detail, details = {}) {
|
|
6
|
+
super(`${code}: ${detail}`);
|
|
7
|
+
this.name = 'ChartError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.details = details;
|
|
10
|
+
}
|
|
11
|
+
/** 工具边界统一把错误转成结构化信封,让模型能一次修正。 */
|
|
12
|
+
toEnvelope() {
|
|
13
|
+
return { error: this.code, detail: this.message.slice(this.message.indexOf(':') + 2), ...this.details };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { SessionLike } from '../data-collector/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* 登记本轮交付物用的官方事件名。
|
|
4
|
+
*
|
|
5
|
+
* 必须留在 `KNOWN_SESSION_EVENT_TYPES` 内——它是 `dsh-tool-present` 追加的同一类型,
|
|
6
|
+
* 因此在**任何** harness 版本上都能被读回。改这里等于改会话日志契约,
|
|
7
|
+
* `test/chart-turn-events.test.mjs` 有一条断言把它钉在 first-party 词汇表上。
|
|
8
|
+
*/
|
|
9
|
+
export declare const CHART_DELIVERABLE_EVENT = "deliverables/presented";
|
|
10
|
+
/** `callId` 前缀:交付事件里携带的图表句柄(官方契约只要求非空字符串)。 */
|
|
11
|
+
export declare const CHART_CALL_ID_PREFIX = "capital-chart:";
|
|
12
|
+
/** 同一 (session, turn) 的事件上限:防模型循环,超出只告警。 */
|
|
13
|
+
export declare const MAX_CHARTS_PER_TURN = 8;
|
|
14
|
+
/** 向上找根会话的最大跳数(main → data_junior → specialist 只有一跳,留余量)。 */
|
|
15
|
+
export declare const MAX_OWNER_HOPS = 4;
|
|
16
|
+
interface AppendableSession extends SessionLike {
|
|
17
|
+
append(type: string, data: unknown): unknown;
|
|
18
|
+
}
|
|
19
|
+
interface SessionsService {
|
|
20
|
+
get(id: string): unknown;
|
|
21
|
+
}
|
|
22
|
+
/** 宿主 ctx 里本模块用到的部分;focused 结构类型便于单测注入假实现。 */
|
|
23
|
+
export interface ChartEventContext {
|
|
24
|
+
get(name: string): unknown;
|
|
25
|
+
/** 监听会话事件(`turn/start`,仅作**兜底**冲刷)。必须注册在未打 scope 标签的 root context 上。 */
|
|
26
|
+
on?(event: string, listener: (...args: unknown[]) => void): unknown;
|
|
27
|
+
/**
|
|
28
|
+
* 监听 `agent/turn-stopping`:**首选的冲刷时机**。
|
|
29
|
+
*
|
|
30
|
+
* 为什么必须是它而不是 `turn/start`:一轮是否"最终"在事件发生的那一刻不可知——子 Agent 的
|
|
31
|
+
* 结算随时会再触发新一轮。实测(2026-09-20 真机 session `38bad3f9`):图表在 turn 4 与 5 之间
|
|
32
|
+
* 寄存,旧规则在下一次 `turn/start` 立刻冲刷,于是交付行落进了**空的过程轮** turn 5,而主 Agent
|
|
33
|
+
* 写下总结答复的是 turn 6——卡片出现在中间步骤。`agent/turn-stopping` 是官方"该轮即将关闭"的
|
|
34
|
+
* 钩子(`@mode serial`,轮仍打开、可安全 append),在它上面冲刷,交付行就落进**消费这份图的那一轮**。
|
|
35
|
+
*
|
|
36
|
+
* 必须注册在未打 scope 标签的 root context 上:`dsh-scope` 的准入规则会让 standing-scope 的
|
|
37
|
+
* 监听器收不到子 Agent 的事件,而我们要的正是 owner 自己那轮关闭的事实。
|
|
38
|
+
*/
|
|
39
|
+
onTurnStopping?(listener: (...args: unknown[]) => void): unknown;
|
|
40
|
+
effect?(callback: () => unknown, label?: string): unknown;
|
|
41
|
+
/** Root context(未打标签);拿不到时退回自身(宿主平面行即未打标签)。 */
|
|
42
|
+
readonly root?: ChartEventContext;
|
|
43
|
+
logger?: {
|
|
44
|
+
warn(message: string): void;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export interface ChartTurnEventInput {
|
|
48
|
+
/** 出图时 chart_ref 的 owner scope(与 ChartArtifactRegistry 同一套语义)。 */
|
|
49
|
+
ownerSessionId: string;
|
|
50
|
+
chart_id: string;
|
|
51
|
+
title: string;
|
|
52
|
+
/** 工作区相对的 chart.html 路径(官方 preview 按 session.cwd 解析它)。 */
|
|
53
|
+
html_path: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ChartEventPublisher {
|
|
56
|
+
/**
|
|
57
|
+
* 记录一张图。
|
|
58
|
+
* @returns 是否已受理:立即写入、或已寄存等下一个回合都算受理。
|
|
59
|
+
*/
|
|
60
|
+
publish(input: ChartTurnEventInput): boolean;
|
|
61
|
+
/** 诊断:还没拿到回合、寄存中的图表数。 */
|
|
62
|
+
pendingCount?(ownerSessionId?: string): number;
|
|
63
|
+
/**
|
|
64
|
+
* 诊断:最近一次 publish 的逐步结论(给回执/落盘用)。
|
|
65
|
+
*
|
|
66
|
+
* 为什么需要它:交付行"静默不出现"是本项目最难查的故障,而宿主终端并不总能拿到
|
|
67
|
+
* (cordis logger 只进内存;stderr 也可能落在用户看不到的地方)。把结论带回
|
|
68
|
+
* `render_chart` 的回执 / 落盘产物,就能**从磁盘**定位,不必依赖终端。
|
|
69
|
+
*/
|
|
70
|
+
lastTrace?(): string;
|
|
71
|
+
}
|
|
72
|
+
/** 只读:最近一次 publish 轨迹。 */
|
|
73
|
+
export declare function chartEventPublishTrace(): string;
|
|
74
|
+
/**
|
|
75
|
+
* 交付通道的**诊断开关**:`CAPITAL_CHART_TRACE=1` 时才输出进度日志与落盘 trace。
|
|
76
|
+
*
|
|
77
|
+
* 默认关闭——对外发布不该往用户终端刷进度、也不该往 workspace 写调试文件。
|
|
78
|
+
* 排查"图表/交付行不出现"时打开它(见 `deliverable-trace.txt` 与 docs/dev/chart-delivery-events.md §6.3 的说明)。
|
|
79
|
+
*/
|
|
80
|
+
export declare function chartTraceEnabled(): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* 从 owner scope 出发向上走到根会话:用户看的是根会话的对话流,卡片必须挂在它上面。
|
|
83
|
+
* 找不到(会话已回收)时返回 undefined,调用方静默跳过。
|
|
84
|
+
*/
|
|
85
|
+
export declare function resolveOwnerSession(sessions: SessionsService, ownerSessionId: string, maxHops?: number): AppendableSession | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* 官方 `deliverables/presented` 载荷。
|
|
88
|
+
*
|
|
89
|
+
* 形状与 `dsh-tool-present` 逐字段对齐(那边是 `{ turn, callId, files }`,
|
|
90
|
+
* 客户端 `isPresentedData()` 要求 `turn` 是 >=1 的安全整数、`callId` 非空字符串、
|
|
91
|
+
* `files` 是数组)。`files[].path` 必须是**工作区相对**路径:官方打开动作会拿它去
|
|
92
|
+
* `workspaceFiles.stat({ sessionId, workspaceRoot: session.cwd })` 解析,绝对路径过不了
|
|
93
|
+
* 「Presented file has no verified Host path」这一关。
|
|
94
|
+
*
|
|
95
|
+
* `callId` 只是官方契约里的一个非空字符串句柄,没有配对约束(`present` 那边用来关联
|
|
96
|
+
* tool/result),这里借它携带 `chart_id`,便于在日志里把一条交付回溯到具体图表。
|
|
97
|
+
*/
|
|
98
|
+
export declare function buildChartEventPayload(input: ChartTurnEventInput, turn: number): Record<string, unknown>;
|
|
99
|
+
/**
|
|
100
|
+
* 进程内待登记条目的总量上限(安全阀)。
|
|
101
|
+
*
|
|
102
|
+
* 正常流程下条目会在 owner 那一轮关闭时被冲刷清空;但如果冲刷时机始终没接上
|
|
103
|
+
* (上游事件名消失、监听注册失败且 turn/start 也没来),模块级 Map 会一直攒着。
|
|
104
|
+
* 这是纯内存元数据(只有 chart_id / 标题 / 相对路径),上限只为防无界增长,
|
|
105
|
+
* 与 `MAX_CHARTS_PER_TURN` 的"防模型循环"是两件事。
|
|
106
|
+
*/
|
|
107
|
+
export declare const MAX_PENDING_CHARTS = 64;
|
|
108
|
+
/**
|
|
109
|
+
* 只给测试用:清空待登记队列。
|
|
110
|
+
*
|
|
111
|
+
* `pending` 是模块级的(必须跨发布器实例存活,见下方说明),因此进程内所有测试
|
|
112
|
+
* 共享它。测试之间要隔离,就在用例开始时调用一次。
|
|
113
|
+
*/
|
|
114
|
+
export declare function resetChartEventPending(): void;
|
|
115
|
+
export declare function createChartEventPublisher(ctx: ChartEventContext): ChartEventPublisher | undefined;
|
|
116
|
+
/** 只给测试用:丢弃单例缓存(配合 resetChartEventPending 做用例隔离)。 */
|
|
117
|
+
export declare function resetChartEventPublisher(): void;
|
|
118
|
+
/** 出图时的 owner scope:与 chart_ref 同源(specialist 出图时正好是主会话)。 */
|
|
119
|
+
export declare function chartEventOwnerSessionId(session: SessionLike, sourceSession?: SessionLike): string;
|
|
120
|
+
export {};
|