@v587d/capital-generation 0.0.0-stage → 2.6.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.
Files changed (117) hide show
  1. package/CHANGELOG.md +794 -0
  2. package/LICENSE +21 -0
  3. package/README.md +116 -2
  4. package/assets/cg-icon.png +0 -0
  5. package/capital-config/client.js +28 -0
  6. package/capital-config/client.src.cjs +388 -0
  7. package/capital-config/index.js +113 -0
  8. package/capital-config/package.json +36 -0
  9. package/capital-watchlist/client.js +182 -0
  10. package/capital-watchlist/client.src.cjs +1229 -0
  11. package/capital-watchlist/index.js +772 -0
  12. package/capital-watchlist/package.json +37 -0
  13. package/chart-ui/README.md +112 -0
  14. package/chart-ui/client.js +16 -0
  15. package/chart-ui/client.src.cjs +126 -0
  16. package/chart-ui/index.js +205 -0
  17. package/chart-ui/package.json +30 -0
  18. package/cordis.patch.yml +72 -0
  19. package/lib/agents/bash-guard.d.ts +55 -0
  20. package/lib/agents/bash-guard.js +162 -0
  21. package/lib/agents/root-tool-policy.d.ts +164 -0
  22. package/lib/agents/root-tool-policy.js +309 -0
  23. package/lib/chart/artifact-ref.d.ts +65 -0
  24. package/lib/chart/artifact-ref.js +107 -0
  25. package/lib/chart/downsample.d.ts +8 -0
  26. package/lib/chart/downsample.js +53 -0
  27. package/lib/chart/errors.d.ts +16 -0
  28. package/lib/chart/errors.js +15 -0
  29. package/lib/chart/events.d.ts +120 -0
  30. package/lib/chart/events.js +471 -0
  31. package/lib/chart/html.d.ts +21 -0
  32. package/lib/chart/html.js +154 -0
  33. package/lib/chart/runtime.d.ts +20 -0
  34. package/lib/chart/runtime.js +270 -0
  35. package/lib/chart/series.d.ts +102 -0
  36. package/lib/chart/series.js +424 -0
  37. package/lib/chart/source-token.d.ts +64 -0
  38. package/lib/chart/source-token.js +217 -0
  39. package/lib/chart/spec.d.ts +58 -0
  40. package/lib/chart/spec.js +265 -0
  41. package/lib/chart/tool.d.ts +86 -0
  42. package/lib/chart/tool.js +288 -0
  43. package/lib/chart/vendor/LICENSE +201 -0
  44. package/lib/chart/vendor/VERSION.json +8 -0
  45. package/lib/chart/vendor/lightweight-charts.standalone.production.js +7 -0
  46. package/lib/data-collector/args.d.ts +38 -0
  47. package/lib/data-collector/args.js +114 -0
  48. package/lib/data-collector/dataset-tools.d.ts +3 -0
  49. package/lib/data-collector/dataset-tools.js +421 -0
  50. package/lib/data-collector/describe.d.ts +99 -0
  51. package/lib/data-collector/describe.js +256 -0
  52. package/lib/data-collector/hub.d.ts +187 -0
  53. package/lib/data-collector/hub.js +469 -0
  54. package/lib/data-collector/query-time.d.ts +58 -0
  55. package/lib/data-collector/query-time.js +101 -0
  56. package/lib/data-collector/query.d.ts +57 -0
  57. package/lib/data-collector/query.js +473 -0
  58. package/lib/data-collector/store.d.ts +499 -0
  59. package/lib/data-collector/store.js +1486 -0
  60. package/lib/data-collector/time-axis.d.ts +169 -0
  61. package/lib/data-collector/time-axis.js +419 -0
  62. package/lib/data-collector/tools.d.ts +32 -0
  63. package/lib/data-collector/tools.js +216 -0
  64. package/lib/index.d.ts +275 -0
  65. package/lib/index.js +458 -0
  66. package/lib/net/eastmoney-client.d.ts +104 -0
  67. package/lib/net/eastmoney-client.js +118 -0
  68. package/lib/net/throttle.d.ts +16 -0
  69. package/lib/net/throttle.js +34 -0
  70. package/lib/ocr/client.d.ts +82 -0
  71. package/lib/ocr/client.js +281 -0
  72. package/lib/ocr/markdown.d.ts +75 -0
  73. package/lib/ocr/markdown.js +209 -0
  74. package/lib/ocr/store.d.ts +119 -0
  75. package/lib/ocr/store.js +226 -0
  76. package/lib/sources/eastmoney-http.d.ts +2 -0
  77. package/lib/sources/eastmoney-http.js +1253 -0
  78. package/lib/sources/fuyao-core.d.ts +52 -0
  79. package/lib/sources/fuyao-core.js +96 -0
  80. package/lib/sources/fuyao-rest.d.ts +14 -0
  81. package/lib/sources/fuyao-rest.js +2057 -0
  82. package/lib/sources/security-code.d.ts +27 -0
  83. package/lib/sources/security-code.js +104 -0
  84. package/lib/sources/security-identity.d.ts +24 -0
  85. package/lib/sources/security-identity.js +89 -0
  86. package/lib/sources/tencent-http.d.ts +2 -0
  87. package/lib/sources/tencent-http.js +1053 -0
  88. package/lib/sources/wind-mcp.d.ts +8 -0
  89. package/lib/sources/wind-mcp.js +593 -0
  90. package/lib/time/tools.d.ts +74 -0
  91. package/lib/time/tools.js +464 -0
  92. package/lib/tool-exec.d.ts +29 -0
  93. package/lib/tool-exec.js +17 -0
  94. package/lib/web-retriever/engines.d.ts +61 -0
  95. package/lib/web-retriever/engines.js +202 -0
  96. package/lib/web-retriever/html-markdown.d.ts +50 -0
  97. package/lib/web-retriever/html-markdown.js +321 -0
  98. package/lib/web-retriever/local-fetch.d.ts +121 -0
  99. package/lib/web-retriever/local-fetch.js +562 -0
  100. package/lib/web-retriever/retriever.d.ts +58 -0
  101. package/lib/web-retriever/retriever.js +94 -0
  102. package/lib/web-retriever/sources.d.ts +235 -0
  103. package/lib/web-retriever/sources.js +961 -0
  104. package/lib/web-retriever/tools.d.ts +50 -0
  105. package/lib/web-retriever/tools.js +1029 -0
  106. package/lib/web-retriever/wind-client.d.ts +69 -0
  107. package/lib/web-retriever/wind-client.js +311 -0
  108. package/locale/en.json +6 -0
  109. package/locale/zh.json +6 -0
  110. package/package.json +76 -4
  111. package/preset/capital-generation/README.md +161 -0
  112. package/preset/capital-generation/agent.patch.yml +509 -0
  113. package/preset/capital-generation/skills/capital-chart-protocol/SKILL.md +137 -0
  114. package/preset/capital-generation/skills/capital-data-protocol/SKILL.md +416 -0
  115. package/preset/capital-generation/skills/capital-orchestration/SKILL.md +174 -0
  116. package/preset/capital-generation/skills/capital-visualization-protocol/SKILL.md +296 -0
  117. package/preset/capital-generation/skills/capital-web-protocol/SKILL.md +240 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Fuyao REST 的最小请求内核:**零 import 的叶子模块**。
3
+ *
4
+ * 为什么单独一份:host 平面的嵌套包(`capital-watchlist/index.js`)与插件侧的数据能力
5
+ * (`fuyao-rest.ts`)必须共用同一套 base URL、鉴权头、信封 `code` 判定与错误文案——
6
+ * "同一知识只有一份实现"(AGENTS.md §9.7)。这一层一旦被别的模块拖进来,host 半边
7
+ * 就会顺带加载整棵插件依赖树,所以这里不放校验器、能力定义、也不放任何类型依赖。
8
+ *
9
+ * 错误文案逐字保持历史形态(Agent 与用户看到的字符串不能因抽取而漂移);结构化的
10
+ * `kind` / `code` 是给自选股那一类需要映射成自己错误码的消费者用的。
11
+ */
12
+ export declare const DEFAULT_FUYAO_BASE_URL = "https://fuyao.aicubes.cn";
13
+ /** 单值参数长度上限;与历史 `MAX_PARAM_LENGTH` 同值。 */
14
+ export declare const FUYAO_MAX_PARAM_LENGTH = 2048;
15
+ export type FuyaoApiEnvelope = {
16
+ code?: number;
17
+ message?: string;
18
+ request_id?: string;
19
+ data?: unknown;
20
+ };
21
+ export type FuyaoParams = Record<string, unknown>;
22
+ /** 失败归类:`http_429` 与 `code=4001` 都是限流,`closed` 是能力级不可用(重试无意义)。 */
23
+ export type FuyaoFailureKind = 'credential_missing' | 'rate_limited' | 'capability_closed' | 'invalid_parameter' | 'http_error' | 'upstream_error';
24
+ export declare class FuyaoError extends Error {
25
+ readonly kind: FuyaoFailureKind;
26
+ readonly status?: number;
27
+ readonly code?: number;
28
+ readonly requestId?: string;
29
+ constructor(kind: FuyaoFailureKind, message: string, details?: {
30
+ status?: number;
31
+ code?: number;
32
+ requestId?: string;
33
+ });
34
+ }
35
+ export declare function normalizeFuyaoBaseUrl(baseUrl: string): string;
36
+ /** 只带上声明过的参数;类型与长度不符就拒,绝不把拼写错误的键悄悄发上去。 */
37
+ export declare function fuyaoQuery(params: FuyaoParams, allowed: string[]): URLSearchParams;
38
+ /**
39
+ * 发一次 Fuyao 请求并返回信封。调用方自己决定如何消费 `data`;
40
+ * 非 0 信封、非 2xx HTTP、2004 能力封闭都以 `FuyaoError` 抛出,文案与历史一致。
41
+ */
42
+ export declare function fuyaoRequest(input: {
43
+ baseUrl: string;
44
+ apiKey: string | undefined;
45
+ path: string;
46
+ search: URLSearchParams;
47
+ signal: AbortSignal;
48
+ }): Promise<FuyaoApiEnvelope>;
49
+ /** 行数组位置:这些端点的行都在 `data.item` 下(信封里 `data` 可能为 null)。 */
50
+ export declare function fuyaoItems(envelope: FuyaoApiEnvelope): FuyaoParams[];
51
+ /** `data.timestamp`(毫秒);无有效数据时上游给 null,不补零。 */
52
+ export declare function fuyaoTimestamp(envelope: FuyaoApiEnvelope): number | null;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Fuyao REST 的最小请求内核:**零 import 的叶子模块**。
3
+ *
4
+ * 为什么单独一份:host 平面的嵌套包(`capital-watchlist/index.js`)与插件侧的数据能力
5
+ * (`fuyao-rest.ts`)必须共用同一套 base URL、鉴权头、信封 `code` 判定与错误文案——
6
+ * "同一知识只有一份实现"(AGENTS.md §9.7)。这一层一旦被别的模块拖进来,host 半边
7
+ * 就会顺带加载整棵插件依赖树,所以这里不放校验器、能力定义、也不放任何类型依赖。
8
+ *
9
+ * 错误文案逐字保持历史形态(Agent 与用户看到的字符串不能因抽取而漂移);结构化的
10
+ * `kind` / `code` 是给自选股那一类需要映射成自己错误码的消费者用的。
11
+ */
12
+ export const DEFAULT_FUYAO_BASE_URL = 'https://fuyao.aicubes.cn';
13
+ /** 单值参数长度上限;与历史 `MAX_PARAM_LENGTH` 同值。 */
14
+ export const FUYAO_MAX_PARAM_LENGTH = 2048;
15
+ export class FuyaoError extends Error {
16
+ kind;
17
+ status;
18
+ code;
19
+ requestId;
20
+ constructor(kind, message, details = {}) {
21
+ super(message);
22
+ this.name = 'FuyaoError';
23
+ this.kind = kind;
24
+ this.status = details.status;
25
+ this.code = details.code;
26
+ this.requestId = details.requestId;
27
+ }
28
+ }
29
+ export function normalizeFuyaoBaseUrl(baseUrl) {
30
+ return baseUrl.replace(/\/$/, '');
31
+ }
32
+ /** 只带上声明过的参数;类型与长度不符就拒,绝不把拼写错误的键悄悄发上去。 */
33
+ export function fuyaoQuery(params, allowed) {
34
+ const search = new URLSearchParams();
35
+ for (const name of allowed) {
36
+ const value = params[name];
37
+ if (value === undefined)
38
+ continue;
39
+ if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') {
40
+ throw new FuyaoError('invalid_parameter', `parameter ${name} must be a string, a number or a boolean`);
41
+ }
42
+ const encoded = String(value);
43
+ if (encoded.length > FUYAO_MAX_PARAM_LENGTH)
44
+ throw new FuyaoError('invalid_parameter', `parameter ${name} exceeds maximum length`);
45
+ search.set(name, encoded);
46
+ }
47
+ return search;
48
+ }
49
+ /**
50
+ * 发一次 Fuyao 请求并返回信封。调用方自己决定如何消费 `data`;
51
+ * 非 0 信封、非 2xx HTTP、2004 能力封闭都以 `FuyaoError` 抛出,文案与历史一致。
52
+ */
53
+ export async function fuyaoRequest(input) {
54
+ if (!input.apiKey) {
55
+ throw new FuyaoError('credential_missing', 'FUYAO_API_KEY is not configured');
56
+ }
57
+ const query = input.search.toString();
58
+ const response = await fetch(`${normalizeFuyaoBaseUrl(input.baseUrl)}${input.path}${query ? `?${query}` : ''}`, {
59
+ headers: { 'X-api-key': input.apiKey, Accept: 'application/json' },
60
+ signal: input.signal,
61
+ });
62
+ if (response.status === 429) {
63
+ throw new FuyaoError('rate_limited', `Fuyao HTTP error 429`, { status: 429 });
64
+ }
65
+ if (!response.ok)
66
+ throw new FuyaoError('http_error', `Fuyao HTTP error ${response.status}`, { status: response.status });
67
+ const envelope = await response.json();
68
+ // 2004 = 该能力是同花顺 AI 客户端专用,未开放外部接入(实测 capital-flow / high-frequency 均如此)。
69
+ // 这是能力级不可用,不是瞬时故障:错误文案必须让调用方停止重试,否则会白烧配额与回合。
70
+ if (envelope.code === 2004) {
71
+ throw new FuyaoError('capability_closed', 'Fuyao API error 2004: 该数据能力为同花顺 AI 客户端专用,当前未开放外部接入;不要重试,改用其他能力或如实告知用户该能力不可用', { code: 2004, requestId: envelope.request_id });
72
+ }
73
+ // 4001 = 频率超限(官方口径:避免立即连续重试)。
74
+ if (envelope.code === 4001) {
75
+ throw new FuyaoError('rate_limited', `Fuyao API error 4001: ${envelope.message ?? 'request failed'}${envelope.request_id ? ` (request_id: ${envelope.request_id})` : ''}`, { code: 4001, requestId: envelope.request_id });
76
+ }
77
+ // 1002 / 1003 = 参数格式与取值域(自选股要靠它区分"这个标的取不到"与"请求写错了")。
78
+ if (envelope.code === 1002 || envelope.code === 1003) {
79
+ throw new FuyaoError('invalid_parameter', `Fuyao API error ${envelope.code}: ${envelope.message ?? 'request failed'}${envelope.request_id ? ` (request_id: ${envelope.request_id})` : ''}`, { code: envelope.code, requestId: envelope.request_id });
80
+ }
81
+ if (envelope.code !== 0) {
82
+ throw new FuyaoError('upstream_error', `Fuyao API error ${envelope.code ?? 'unknown'}: ${envelope.message ?? 'request failed'}${envelope.request_id ? ` (request_id: ${envelope.request_id})` : ''}`, { code: envelope.code, requestId: envelope.request_id });
83
+ }
84
+ return envelope;
85
+ }
86
+ /** 行数组位置:这些端点的行都在 `data.item` 下(信封里 `data` 可能为 null)。 */
87
+ export function fuyaoItems(envelope) {
88
+ const data = envelope.data;
89
+ const rows = data?.item;
90
+ return Array.isArray(rows) ? rows : [];
91
+ }
92
+ /** `data.timestamp`(毫秒);无有效数据时上游给 null,不补零。 */
93
+ export function fuyaoTimestamp(envelope) {
94
+ const data = envelope.data;
95
+ return typeof data?.timestamp === 'number' ? data.timestamp : null;
96
+ }
@@ -0,0 +1,14 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { DataSource } from '../data-collector/hub.js';
3
+ /** 每次执行时解析 API Key 的注入点:符合 credentials 服务「按次解析、不跨操作缓存」的约定。 */
4
+ export type FuyaoApiKeyResolver = () => Promise<string | undefined>;
5
+ /** 批量代码接口的原始 token 上限(按文档:去重前校验)。 */
6
+ declare const MAX_BATCH_CODES = 100;
7
+ /**
8
+ * 历史 K 线 / 财务时间区间上限:上游规定 end - start 不超过 10 年(超出返回 1003)。
9
+ * 本地用 3660 天(含闰日冗余)保守前置拦截,只挡明显越界,不与上游口径冲突。
10
+ */
11
+ declare const MAX_HISTORY_WINDOW_MS: number;
12
+ export declare function createFuyaoRestSources(resolveApiKey: FuyaoApiKeyResolver, baseUrl?: string): DataSource[];
13
+ export declare function resolveFuyaoApiKey(ctx: Context, credentialRef?: string): Promise<string | undefined>;
14
+ export { MAX_HISTORY_WINDOW_MS, MAX_BATCH_CODES };